diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp
index 85b3e1b..2556a3e 100755
--- a/src/backends/backendsCommon/test/LayerTests.cpp
+++ b/src/backends/backendsCommon/test/LayerTests.cpp
@@ -66,6 +66,24 @@
 // 2-channel bias used by a number of Conv2d tests.
 static std::vector<float> Bias2({0, 2});
 
+armnn::TensorShape GetTestTensorShape(unsigned int numberOfBatches,
+                                      unsigned int numberOfChannels,
+                                      unsigned int height,
+                                      unsigned int width,
+                                      const armnn::DataLayoutIndexed& dataLayout)
+{
+    switch (dataLayout.GetDataLayout())
+    {
+        case armnn::DataLayout::NCHW:
+            return armnn::TensorShape({numberOfBatches, numberOfChannels, height, width});
+        case armnn::DataLayout::NHWC:
+            return armnn::TensorShape({numberOfBatches, height, width, numberOfChannels});
+        default:
+            throw armnn::InvalidArgumentException("unknown data layout ["
+                                                  + std::to_string(static_cast<int>(dataLayout.GetDataLayout())) + "]");
+    }
+}
+
 // Helper function that returns either Bias2 or an empty vector depending on whether bias is enabled.
 template<typename T>
 boost::multi_array<T, 1> GetBias2(bool biasEnabled, float qScale, int32_t qOffset)
@@ -3396,21 +3414,38 @@
                                                   const armnn::TensorShape& inputOutputTensorShape,
                                                   const std::vector<float>& inputValues,
                                                   const std::vector<float>& expectedOutputValues,
-                                                  armnn::DataLayout dataLayout)
+                                                  const armnn::DataLayoutIndexed& layout)
 {
     const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32);
     const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32);
 
-    auto inputTensor = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(inputValues));
+    // at this point if we require it permute the input data
+    const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
+    std::vector<float> inputData = inputValues;
+    if (layout.GetDataLayout() == armnn::DataLayout::NHWC)
+    {
+        std::vector<float> tmp(inputData.size());
+        armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data());
+        inputData = tmp;
+    }
+
+    auto inputTensor = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(inputData));
 
     LayerTestResult<float, 4> result(outputTensorInfo);
-    result.outputExpected = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(expectedOutputValues));
+    std::vector<float> expectedOutputData = expectedOutputValues;
+    if (layout.GetDataLayout() == armnn::DataLayout::NHWC)
+    {
+        std::vector<float> tmp(expectedOutputData.size());
+        armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, expectedOutputData.data(), tmp.data());
+        expectedOutputData = tmp;
+    }
+    result.outputExpected = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(expectedOutputData));
 
     std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
 
     armnn::L2NormalizationQueueDescriptor descriptor;
-    descriptor.m_Parameters.m_DataLayout = dataLayout;
+    descriptor.m_Parameters.m_DataLayout = layout.GetDataLayout();
     armnn::WorkloadInfo info;
 
     AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
@@ -3848,14 +3883,21 @@
   return Pad4dTestCommon<float>(workloadFactory, 0.0f, 0);
 }
 
-LayerTestResult<float, 4> L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization1dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 1
     // Height: 1
     // Channels: 10
     // BatchSize: 1
+    unsigned int numberOfBatches = 1;
+    unsigned int numberOfChannels = 10;
+    unsigned int height = 1;
+    unsigned int width = 1;
 
-    const armnn::TensorShape inputOutputShape{ 1, 10, 1, 1 };
+
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (1) x Width (1)
@@ -3905,50 +3947,23 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
+                                   inputValues, expectedOutputValues, layout);
 }
 
-LayerTestResult<float, 4> L2Normalization1dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 1
-    // Height: 1
-    // Channels: 10
-    // BatchSize: 1
-
-    const armnn::TensorShape inputOutputShape{ 1, 1, 1, 10 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (1) x Channel (10)
-        1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f
-    };
-    const float approxInvL2Norm = 0.050964719f;
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (1) x Channel (10)
-         1.0f * approxInvL2Norm,
-         2.0f * approxInvL2Norm,
-         3.0f * approxInvL2Norm,
-         4.0f * approxInvL2Norm,
-         5.0f * approxInvL2Norm,
-         6.0f * approxInvL2Norm,
-         7.0f * approxInvL2Norm,
-         8.0f * approxInvL2Norm,
-         9.0f * approxInvL2Norm,
-        10.0f * approxInvL2Norm
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
-}
-
-LayerTestResult<float, 4> L2Normalization2dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization2dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 5
     // Height: 1
     // Channels: 2
     // BatchSize: 1
+    unsigned int numberOfBatches = 1;
+    unsigned int numberOfChannels = 2;
+    unsigned int height = 1;
+    unsigned int width = 5;
 
-    const armnn::TensorShape inputOutputShape{ 1, 2, 1, 5 };
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (1) x Width (5)
@@ -3975,53 +3990,23 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
+                                   inputValues, expectedOutputValues, layout);
 }
 
-LayerTestResult<float, 4> L2Normalization2dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 5
-    // Height: 1
-    // Channels: 2
-    // BatchSize: 1
-
-    const armnn::TensorShape inputOutputShape{ 1, 1, 5, 2 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (5) x Channel (2)
-        1.0f,  2.0f,
-        3.0f,  4.0f,
-        5.0f,  6.0f,
-        7.0f,  8.0f,
-        9.0f, 10.0f
-    };
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (5) x Channel (2)
-        1.0f * CalcInvL2Norm({ 1.0f,  2.0f }),
-        2.0f * CalcInvL2Norm({ 1.0f,  2.0f }),
-        3.0f * CalcInvL2Norm({ 3.0f,  4.0f }),
-        4.0f * CalcInvL2Norm({ 3.0f,  4.0f }),
-        5.0f * CalcInvL2Norm({ 5.0f,  6.0f }),
-        6.0f * CalcInvL2Norm({ 5.0f,  6.0f }),
-        7.0f * CalcInvL2Norm({ 7.0f,  8.0f }),
-        8.0f * CalcInvL2Norm({ 7.0f,  8.0f }),
-        9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
-       10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
-}
-
-LayerTestResult<float, 4> L2Normalization3dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization3dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 3
     // Height: 4
     // Channels: 2
     // BatchSize: 1
+    unsigned int numberOfBatches = 1;
+    unsigned int numberOfChannels = 2;
+    unsigned int height = 4;
+    unsigned int width = 3;
 
-    const armnn::TensorShape inputOutputShape{ 1, 2, 4, 3 };
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (4) x Width (3)
@@ -4068,86 +4053,23 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
+                                   inputValues, expectedOutputValues, layout);
 }
 
-LayerTestResult<float, 4> L2Normalization3dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 3
-    // Height: 4
-    // Channels: 2
-    // BatchSize: 1
-
-    const armnn::TensorShape inputOutputShape{ 1, 4, 3, 2 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (2)
-        119.0f, 110.0f,
-         21.0f, 140.0f,
-        150.0f,  73.0f,
-
-        // Batch 0, Height 1, Width (3) x Channel (2)
-        149.0f, 211.0f,
-         32.0f, 212.0f,
-        179.0f,  89.0f,
-
-        // Batch 0, Height 2, Width (3) x Channel (2)
-         15.0f,  24.0f,
-        227.0f, 138.0f,
-        141.0f, 188.0f,
-
-        // Batch 0, Height 3, Width (3) x Channel (2)
-        147.0f, 162.0f,
-        199.0f,  12.0f,
-        220.0f, 161.0f
-    };
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (2)
-        119.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
-        110.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
-         21.0f * CalcInvL2Norm({  21.0f, 140.0f }),
-        140.0f * CalcInvL2Norm({  21.0f, 140.0f }),
-        150.0f * CalcInvL2Norm({ 150.0f,  73.0f }),
-         73.0f * CalcInvL2Norm({ 150.0f,  73.0f }),
-
-        // Batch 0, Height 1, Width (3) x Channel (2)
-        149.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
-        211.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
-         32.0f * CalcInvL2Norm({  32.0f, 212.0f }),
-        212.0f * CalcInvL2Norm({  32.0f, 212.0f }),
-        179.0f * CalcInvL2Norm({ 179.0f,  89.0f }),
-         89.0f * CalcInvL2Norm({ 179.0f,  89.0f }),
-
-        // Batch 0, Height 2, Width (3) x Channel (2)
-         15.0f * CalcInvL2Norm({  15.0f,  24.0f }),
-         24.0f * CalcInvL2Norm({  15.0f,  24.0f }),
-        227.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
-        138.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
-        141.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
-        188.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
-
-        // Batch 0, Height 3, Width (3) x Channel (2)
-        147.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
-        162.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
-        199.0f * CalcInvL2Norm({ 199.0f,  12.0f }),
-         12.0f * CalcInvL2Norm({ 199.0f,  12.0f }),
-        220.0f * CalcInvL2Norm({ 220.0f, 161.0f }),
-        161.0f * CalcInvL2Norm({ 220.0f, 161.0f })
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
-}
-
-LayerTestResult<float, 4> L2Normalization4dTest(armnn::IWorkloadFactory& workloadFactory)
+LayerTestResult<float, 4> L2Normalization4dTest(armnn::IWorkloadFactory& workloadFactory,
+                                                const armnn::DataLayoutIndexed& layout)
 {
     // Width: 3
     // Height: 4
     // Channels: 3
     // BatchSize: 2
+    unsigned int numberOfBatches = 2;
+    unsigned int numberOfChannels = 3;
+    unsigned int height = 4;
+    unsigned int width = 3;
 
-    const armnn::TensorShape inputOutputShape{ 2, 3, 4, 3 };
+    const armnn::TensorShape inputOutputShape = GetTestTensorShape(
+            numberOfBatches, numberOfChannels, height, width, layout);
     std::vector<float> inputValues
     {
         // Batch 0, Channel 0, Height (4) x Width (3)
@@ -4274,152 +4196,7 @@
     };
 
     return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NCHW);
-}
-
-LayerTestResult<float, 4> L2Normalization4dNhwcTest(armnn::IWorkloadFactory& workloadFactory)
-{
-    // Width: 3
-    // Height: 4
-    // Channels: 3
-    // BatchSize: 2
-
-    const armnn::TensorShape inputOutputShape{ 2, 4, 3, 3 };
-    std::vector<float> inputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (3)
-        235.0f, 113.0f,  56.0f,
-         46.0f,  95.0f, 170.0f,
-        178.0f, 202.0f, 162.0f,
-
-        // Batch 0, Height 1, Width (3) x Channel (3)
-        100.0f,  77.0f, 194.0f,
-        123.0f, 114.0f,  89.0f,
-         19.0f,  71.0f, 254.0f,
-
-        // Batch 0, Height 2, Width (3) x Channel (3)
-        172.0f, 122.0f,  12.0f,
-         74.0f, 246.0f, 209.0f,
-        250.0f, 166.0f, 200.0f,
-
-        // Batch 0, Height 3, Width (3) x Channel (3)
-          6.0f,  82.0f,   1.0f,
-        195.0f,  28.0f,  64.0f,
-         80.0f,  37.0f,  54.0f,
-
-        // Batch 1, Height 0, Width (3) x Channel (3)
-         67.0f, 239.0f,  97.0f,
-         90.0f, 104.0f, 145.0f,
-         49.0f, 199.0f, 215.0f,
-
-        // Batch 1, Height 1, Width (3) x Channel (3)
-          7.0f,  17.0f, 115.0f,
-        163.0f, 124.0f, 116.0f,
-         18.0f, 153.0f, 238.0f,
-
-        // Batch 1, Height 2, Width (3) x Channel (3)
-         25.0f, 222.0f, 226.0f,
-        117.0f, 217.0f,  16.0f,
-        103.0f,  75.0f, 132.0f,
-
-        // Batch 1, Height 3, Width (3) x Channel (3)
-        247.0f,  32.0f,  92.0f,
-         59.0f, 126.0f, 125.0f,
-        189.0f,  21.0f,  88.0f
-    };
-    std::vector<float> expectedOutputValues
-    {
-        // Batch 0, Height 0, Width (3) x Channel (3)
-        235.0f * CalcInvL2Norm({ 235.0f, 113.0f,  56.0f }),
-        113.0f * CalcInvL2Norm({ 235.0f, 113.0f,  56.0f }),
-         56.0f * CalcInvL2Norm({ 235.0f, 113.0f,  56.0f }),
-         46.0f * CalcInvL2Norm({  46.0f,  95.0f, 170.0f }),
-         95.0f * CalcInvL2Norm({  46.0f,  95.0f, 170.0f }),
-        170.0f * CalcInvL2Norm({  46.0f,  95.0f, 170.0f }),
-        178.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
-        202.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
-        162.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
-
-        // Batch 0, Height 1, Width (3) x Channel (3)
-        100.0f * CalcInvL2Norm({ 100.0f,  77.0f, 194.0f }),
-         77.0f * CalcInvL2Norm({ 100.0f,  77.0f, 194.0f }),
-        194.0f * CalcInvL2Norm({ 100.0f,  77.0f, 194.0f }),
-        123.0f * CalcInvL2Norm({ 123.0f, 114.0f,  89.0f }),
-        114.0f * CalcInvL2Norm({ 123.0f, 114.0f,  89.0f }),
-         89.0f * CalcInvL2Norm({ 123.0f, 114.0f,  89.0f }),
-         19.0f * CalcInvL2Norm({  19.0f,  71.0f, 254.0f }),
-         71.0f * CalcInvL2Norm({  19.0f,  71.0f, 254.0f }),
-        254.0f * CalcInvL2Norm({  19.0f,  71.0f, 254.0f }),
-
-        // Batch 0, Height 2, Width (3) x Channel (3)
-        172.0f * CalcInvL2Norm({ 172.0f, 122.0f,  12.0f }),
-        122.0f * CalcInvL2Norm({ 172.0f, 122.0f,  12.0f }),
-         12.0f * CalcInvL2Norm({ 172.0f, 122.0f,  12.0f }),
-         74.0f * CalcInvL2Norm({  74.0f, 246.0f, 209.0f }),
-        246.0f * CalcInvL2Norm({  74.0f, 246.0f, 209.0f }),
-        209.0f * CalcInvL2Norm({  74.0f, 246.0f, 209.0f }),
-        250.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
-        166.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
-        200.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
-
-        // Batch 0, Height 3, Width (3) x Channel (3)
-          6.0f * CalcInvL2Norm({   6.0f,  82.0f,   1.0f }),
-         82.0f * CalcInvL2Norm({   6.0f,  82.0f,   1.0f }),
-          1.0f * CalcInvL2Norm({   6.0f,  82.0f,   1.0f }),
-        195.0f * CalcInvL2Norm({ 195.0f,  28.0f,  64.0f }),
-         28.0f * CalcInvL2Norm({ 195.0f,  28.0f,  64.0f }),
-         64.0f * CalcInvL2Norm({ 195.0f,  28.0f,  64.0f }),
-         80.0f * CalcInvL2Norm({  80.0f,  37.0f,  54.0f }),
-         37.0f * CalcInvL2Norm({  80.0f,  37.0f,  54.0f }),
-         54.0f * CalcInvL2Norm({  80.0f,  37.0f,  54.0f }),
-
-        // Batch 1, Height 0, Width (3) x Channel (3)
-         67.0f * CalcInvL2Norm({  67.0f, 239.0f,  97.0f }),
-        239.0f * CalcInvL2Norm({  67.0f, 239.0f,  97.0f }),
-         97.0f * CalcInvL2Norm({  67.0f, 239.0f,  97.0f }),
-         90.0f * CalcInvL2Norm({  90.0f, 104.0f, 145.0f }),
-        104.0f * CalcInvL2Norm({  90.0f, 104.0f, 145.0f }),
-        145.0f * CalcInvL2Norm({  90.0f, 104.0f, 145.0f }),
-         49.0f * CalcInvL2Norm({  49.0f, 199.0f, 215.0f }),
-        199.0f * CalcInvL2Norm({  49.0f, 199.0f, 215.0f }),
-        215.0f * CalcInvL2Norm({  49.0f, 199.0f, 215.0f }),
-
-        // Batch 1, Height 1, Width (3) x Channel (3)
-          7.0f * CalcInvL2Norm({   7.0f,  17.0f, 115.0f }),
-         17.0f * CalcInvL2Norm({   7.0f,  17.0f, 115.0f }),
-        115.0f * CalcInvL2Norm({   7.0f,  17.0f, 115.0f }),
-        163.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
-        124.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
-        116.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
-         18.0f * CalcInvL2Norm({  18.0f, 153.0f, 238.0f }),
-        153.0f * CalcInvL2Norm({  18.0f, 153.0f, 238.0f }),
-        238.0f * CalcInvL2Norm({  18.0f, 153.0f, 238.0f }),
-
-        // Batch 1, Height 2, Width (3) x Channel (3)
-         25.0f * CalcInvL2Norm({  25.0f, 222.0f, 226.0f }),
-        222.0f * CalcInvL2Norm({  25.0f, 222.0f, 226.0f }),
-        226.0f * CalcInvL2Norm({  25.0f, 222.0f, 226.0f }),
-        117.0f * CalcInvL2Norm({ 117.0f, 217.0f,  16.0f }),
-        217.0f * CalcInvL2Norm({ 117.0f, 217.0f,  16.0f }),
-         16.0f * CalcInvL2Norm({ 117.0f, 217.0f,  16.0f }),
-        103.0f * CalcInvL2Norm({ 103.0f,  75.0f, 132.0f }),
-         75.0f * CalcInvL2Norm({ 103.0f,  75.0f, 132.0f }),
-        132.0f * CalcInvL2Norm({ 103.0f,  75.0f, 132.0f }),
-
-        // Batch 1, Height 3, Width (3) x Channel (3)
-        247.0f * CalcInvL2Norm({ 247.0f,  32.0f,  92.0f }),
-         32.0f * CalcInvL2Norm({ 247.0f,  32.0f,  92.0f }),
-         92.0f * CalcInvL2Norm({ 247.0f,  32.0f,  92.0f }),
-         59.0f * CalcInvL2Norm({  59.0f, 126.0f, 125.0f }),
-        126.0f * CalcInvL2Norm({  59.0f, 126.0f, 125.0f }),
-        125.0f * CalcInvL2Norm({  59.0f, 126.0f, 125.0f }),
-        189.0f * CalcInvL2Norm({ 189.0f,  21.0f,  88.0f }),
-         21.0f * CalcInvL2Norm({ 189.0f,  21.0f,  88.0f }),
-         88.0f * CalcInvL2Norm({ 189.0f,  21.0f,  88.0f })
-    };
-
-    return L2NormalizationTestImpl(workloadFactory, inputOutputShape,
-                                   inputValues, expectedOutputValues, armnn::DataLayout::NHWC);
+                                   inputValues, expectedOutputValues, layout);
 }
 
 template <typename T>
