IVGCVSW-1988: Refactor backend-specific unit tests

Change-Id: I8eca81d2e0780390eaa837c186ffe1c7d41fdebe
diff --git a/src/armnn/test/CreateWorkload.hpp b/src/armnn/test/CreateWorkload.hpp
index ada6027..fed9dd6 100644
--- a/src/armnn/test/CreateWorkload.hpp
+++ b/src/armnn/test/CreateWorkload.hpp
@@ -9,6 +9,7 @@
 #include <boost/cast.hpp>
 
 #include <backends/WorkloadData.hpp>
+#include <backends/WorkloadFactory.hpp>
 #include <backends/CpuTensorHandle.hpp>
 
 #include <Graph.hpp>
diff --git a/src/armnn/test/CreateWorkloadClNeon.hpp b/src/armnn/test/CreateWorkloadClNeon.hpp
index a18e85d..56de085 100644
--- a/src/armnn/test/CreateWorkloadClNeon.hpp
+++ b/src/armnn/test/CreateWorkloadClNeon.hpp
@@ -5,6 +5,8 @@
 #pragma once
 
 #include "CreateWorkload.hpp"
+
+#include <backends/MemCopyWorkload.hpp>
 #include <backends/reference/RefWorkloadFactory.hpp>
 
 #if ARMCOMPUTECL_ENABLED
diff --git a/src/armnn/test/JsonPrinterTests.cpp b/src/armnn/test/JsonPrinterTests.cpp
index 9c24fda..44609ea 100644
--- a/src/armnn/test/JsonPrinterTests.cpp
+++ b/src/armnn/test/JsonPrinterTests.cpp
@@ -14,7 +14,7 @@
 #include <armnn/Descriptors.hpp>
 #include <armnn/IRuntime.hpp>
 #include <armnn/INetwork.hpp>
-#include <backends/test/ClContextControlFixture.hpp>
+#include <backends/cl/test/ClContextControlFixture.hpp>
 #include <backends/cl/ClWorkloadFactory.hpp>
 
 BOOST_FIXTURE_TEST_SUITE(JsonPrinterTests, ClProfilingContextControlFixture)
diff --git a/src/backends/cl/CMakeLists.txt b/src/backends/cl/CMakeLists.txt
index a7ce893..04da6dd 100644
--- a/src/backends/cl/CMakeLists.txt
+++ b/src/backends/cl/CMakeLists.txt
@@ -15,7 +15,8 @@
 )
 
 if(ARMCOMPUTECL)
-    add_subdirectory(workloads test)
+    add_subdirectory(workloads)
+    add_subdirectory(test)
 endif()
 
 add_library(armnnClBackend STATIC ${armnnClBackend_sources})
diff --git a/src/backends/cl/backend.cmake b/src/backends/cl/backend.cmake
index 1af88e3..f8a1c1c 100644
--- a/src/backends/cl/backend.cmake
+++ b/src/backends/cl/backend.cmake
@@ -6,6 +6,7 @@
 if(ARMCOMPUTECL)
     add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/cl)
     list(APPEND armnnLibraries armnnClBackend armnnClBackendWorkloads)
+    list(APPEND armnnUnitTestLibraries armnnClBackendUnitTests)
 else()
     message("CL backend is disabled")
     add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/cl)
diff --git a/src/backends/cl/test/CMakeLists.txt b/src/backends/cl/test/CMakeLists.txt
index e69de29..795a7dc 100644
--- a/src/backends/cl/test/CMakeLists.txt
+++ b/src/backends/cl/test/CMakeLists.txt
@@ -0,0 +1,16 @@
+#
+# Copyright © 2017 Arm Ltd. All rights reserved.
+# SPDX-License-Identifier: MIT
+#
+
+list(APPEND armnnClBackendUnitTests_sources
+    ClContextControlFixture.hpp
+    ClCreateWorkloadTests.cpp
+    ClLayerSupportTests.cpp
+    ClLayerTests.cpp
+)
+
+add_library(armnnClBackendUnitTests STATIC ${armnnClBackendUnitTests_sources})
+target_include_directories(armnnClBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src)
+target_include_directories(armnnClBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(armnnClBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
\ No newline at end of file
diff --git a/src/backends/test/ClContextControlFixture.hpp b/src/backends/cl/test/ClContextControlFixture.hpp
similarity index 100%
rename from src/backends/test/ClContextControlFixture.hpp
rename to src/backends/cl/test/ClContextControlFixture.hpp
diff --git a/src/backends/test/CreateWorkloadCl.cpp b/src/backends/cl/test/ClCreateWorkloadTests.cpp
similarity index 99%
rename from src/backends/test/CreateWorkloadCl.cpp
rename to src/backends/cl/test/ClCreateWorkloadTests.cpp
index d56bad2..659ba82 100644
--- a/src/backends/test/CreateWorkloadCl.cpp
+++ b/src/backends/cl/test/ClCreateWorkloadTests.cpp
@@ -2,14 +2,16 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
-#include <backends/cl/ClWorkloadFactory.hpp>
-#include <backends/reference/RefWorkloadFactory.hpp>
-#include <backends/MemCopyWorkload.hpp>
-#include <backends/cl/workloads/ClWorkloadUtils.hpp>
-#include <backends/cl/workloads/ClWorkloads.hpp>
-#include <backends/cl/ClTensorHandle.hpp>
+
 #include "ClContextControlFixture.hpp"
 
+#include <backends/MemCopyWorkload.hpp>
+#include <backends/cl/ClTensorHandle.hpp>
+#include <backends/cl/ClWorkloadFactory.hpp>
+#include <backends/cl/workloads/ClWorkloads.hpp>
+#include <backends/cl/workloads/ClWorkloadUtils.hpp>
+#include <backends/reference/RefWorkloadFactory.hpp>
+
 #include <test/CreateWorkloadClNeon.hpp>
 
 boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle*                    tensorHandle,
diff --git a/src/backends/cl/test/ClLayerSupportTests.cpp b/src/backends/cl/test/ClLayerSupportTests.cpp
new file mode 100644
index 0000000..513366e
--- /dev/null
+++ b/src/backends/cl/test/ClLayerSupportTests.cpp
@@ -0,0 +1,104 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <armnn/layers/ConvertFp16ToFp32Layer.hpp>
+#include <armnn/layers/ConvertFp32ToFp16Layer.hpp>
+#include <armnn/test/TensorHelpers.hpp>
+
+#include <backends/CpuTensorHandle.hpp>
+#include <backends/cl/ClWorkloadFactory.hpp>
+#include <backends/cl/test/ClContextControlFixture.hpp>
+#include <backends/test/IsLayerSupportedTestImpl.hpp>
+#include <backends/test/LayerTests.hpp>
+
+#include <boost/test/unit_test.hpp>
+
+#include <string>
+
+BOOST_AUTO_TEST_SUITE(ClLayerSupport)
+
+BOOST_FIXTURE_TEST_CASE(IsLayerSupportedFloat16Cl, ClContextControlFixture)
+{
+    armnn::ClWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::ClWorkloadFactory, armnn::DataType::Float16>(&factory);
+}
+
+BOOST_FIXTURE_TEST_CASE(IsLayerSupportedFloat32Cl, ClContextControlFixture)
+{
+    armnn::ClWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::ClWorkloadFactory, armnn::DataType::Float32>(&factory);
+}
+
+BOOST_FIXTURE_TEST_CASE(IsLayerSupportedUint8Cl, ClContextControlFixture)
+{
+    armnn::ClWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::ClWorkloadFactory, armnn::DataType::QuantisedAsymm8>(&factory);
+}
+
+BOOST_FIXTURE_TEST_CASE(IsConvertFp16ToFp32SupportedCl, ClContextControlFixture)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float16, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(result);
+}
+
+BOOST_FIXTURE_TEST_CASE(IsConvertFp16ToFp32SupportedFp32InputCl, ClContextControlFixture)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Input should be Float16");
+}
+
+BOOST_FIXTURE_TEST_CASE(IsConvertFp16ToFp32SupportedFp16OutputCl, ClContextControlFixture)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Output should be Float32");
+}
+
+BOOST_FIXTURE_TEST_CASE(IsConvertFp32ToFp16SupportedCl, ClContextControlFixture)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float32, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(result);
+}
+
+BOOST_FIXTURE_TEST_CASE(IsConvertFp32ToFp16SupportedFp16InputCl, ClContextControlFixture)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Input should be Float32");
+}
+
+BOOST_FIXTURE_TEST_CASE(IsConvertFp32ToFp16SupportedFp32OutputCl, ClContextControlFixture)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Output should be Float16");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/backends/test/ArmComputeCl.cpp b/src/backends/cl/test/ClLayerTests.cpp
similarity index 98%
rename from src/backends/test/ArmComputeCl.cpp
rename to src/backends/cl/test/ClLayerTests.cpp
index f4ead34..ab63ba4 100644
--- a/src/backends/test/ArmComputeCl.cpp
+++ b/src/backends/cl/test/ClLayerTests.cpp
@@ -2,24 +2,27 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
-#include <boost/test/unit_test.hpp>
+
+#include "ClContextControlFixture.hpp"
+
 #include "test/TensorHelpers.hpp"
-#include "LayerTests.hpp"
+#include "test/UnitTests.hpp"
 
 #include <backends/CpuTensorHandle.hpp>
+#include <backends/cl/ClLayerSupport.hpp>
 #include <backends/cl/ClWorkloadFactory.hpp>
 #include <backends/cl/workloads/ClWorkloadUtils.hpp>
 #include <backends/reference/RefWorkloadFactory.hpp>
-#include <backends/cl/ClLayerSupport.hpp>
-#include "ActivationFixture.hpp"
-#include "ClContextControlFixture.hpp"
+#include <backends/test/ActivationFixture.hpp>
+#include <backends/test/LayerTests.hpp>
 
 #include <arm_compute/core/CL/CLKernelLibrary.h>
 #include <arm_compute/runtime/CL/CLScheduler.h>
-#include <string>
-#include <iostream>
 
-#include "test/UnitTests.hpp"
+#include <boost/test/unit_test.hpp>
+
+#include <iostream>
+#include <string>
 
 BOOST_FIXTURE_TEST_SUITE(Compute_ArmComputeCl, ClContextControlFixture)
 using FactoryType = armnn::ClWorkloadFactory;
diff --git a/src/backends/neon/CMakeLists.txt b/src/backends/neon/CMakeLists.txt
index c6492bc..93c7955 100644
--- a/src/backends/neon/CMakeLists.txt
+++ b/src/backends/neon/CMakeLists.txt
@@ -14,7 +14,8 @@
         NeonTensorHandle.hpp
     )
 
-    add_subdirectory(workloads test)
+    add_subdirectory(workloads)
+    add_subdirectory(test)
 else()
     list(APPEND armnnNeonBackend_sources
         NeonLayerSupport.cpp
diff --git a/src/backends/neon/backend.cmake b/src/backends/neon/backend.cmake
index 5f02c84..0240d52 100644
--- a/src/backends/neon/backend.cmake
+++ b/src/backends/neon/backend.cmake
@@ -6,6 +6,7 @@
 if(ARMCOMPUTENEON)
     add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/neon)
     list(APPEND armnnLibraries armnnNeonBackend armnnNeonBackendWorkloads)
+    list(APPEND armnnUnitTestLibraries armnnNeonBackendUnitTests)
 else()
     message("NEON backend is disabled")
     add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/neon)
diff --git a/src/backends/neon/test/CMakeLists.txt b/src/backends/neon/test/CMakeLists.txt
index f41a074..82156f3 100644
--- a/src/backends/neon/test/CMakeLists.txt
+++ b/src/backends/neon/test/CMakeLists.txt
@@ -2,3 +2,14 @@
 # Copyright © 2017 Arm Ltd. All rights reserved.
 # SPDX-License-Identifier: MIT
 #
+
+list(APPEND armnnNeonBackendUnitTests_sources
+    NeonCreateWorkloadTests.cpp
+    NeonLayerSupportTests.cpp
+    NeonLayerTests.cpp
+)
+
+add_library(armnnNeonBackendUnitTests STATIC ${armnnNeonBackendUnitTests_sources})
+target_include_directories(armnnNeonBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src)
+target_include_directories(armnnNeonBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(armnnNeonBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
\ No newline at end of file
diff --git a/src/backends/test/CreateWorkloadNeon.cpp b/src/backends/neon/test/NeonCreateWorkloadTests.cpp
similarity index 99%
rename from src/backends/test/CreateWorkloadNeon.cpp
rename to src/backends/neon/test/NeonCreateWorkloadTests.cpp
index b2ec563..d1a5b2a 100644
--- a/src/backends/test/CreateWorkloadNeon.cpp
+++ b/src/backends/neon/test/NeonCreateWorkloadTests.cpp
@@ -2,13 +2,14 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
+
+#include <armnn/test/CreateWorkloadClNeon.hpp>
+
+#include <backends/MemCopyWorkload.hpp>
 #include <backends/neon/NeonWorkloadFactory.hpp>
 #include <backends/neon/NeonTensorHandle.hpp>
 #include <backends/neon/workloads/NeonWorkloadUtils.hpp>
 #include <backends/neon/workloads/NeonWorkloads.hpp>
-#include <backends/MemCopyWorkload.hpp>
-
-#include "test/CreateWorkloadClNeon.hpp"
 
 BOOST_AUTO_TEST_SUITE(CreateWorkloadNeon)
 
diff --git a/src/backends/neon/test/NeonLayerSupportTests.cpp b/src/backends/neon/test/NeonLayerSupportTests.cpp
new file mode 100644
index 0000000..db7897f
--- /dev/null
+++ b/src/backends/neon/test/NeonLayerSupportTests.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <armnn/layers/ConvertFp16ToFp32Layer.hpp>
+#include <armnn/layers/ConvertFp32ToFp16Layer.hpp>
+#include <armnn/test/TensorHelpers.hpp>
+
+#include <backends/CpuTensorHandle.hpp>
+#include <backends/neon/NeonWorkloadFactory.hpp>
+#include <backends/test/IsLayerSupportedTestImpl.hpp>
+#include <backends/test/LayerTests.hpp>
+
+#include <boost/test/unit_test.hpp>
+
+#include <string>
+
+BOOST_AUTO_TEST_SUITE(NeonLayerSupport)
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat16Neon)
+{
+    armnn::NeonWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::DataType::Float16>(&factory);
+}
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat32Neon)
+{
+    armnn::NeonWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::DataType::Float32>(&factory);
+}
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedUint8Neon)
+{
+    armnn::NeonWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::DataType::QuantisedAsymm8>(&factory);
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedNeon)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float16, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(result);
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedNeon)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float32, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(result);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/backends/test/ArmComputeNeon.cpp b/src/backends/neon/test/NeonLayerTests.cpp
similarity index 98%
rename from src/backends/test/ArmComputeNeon.cpp
rename to src/backends/neon/test/NeonLayerTests.cpp
index 045aa30..2d4ee99 100644
--- a/src/backends/test/ArmComputeNeon.cpp
+++ b/src/backends/neon/test/NeonLayerTests.cpp
@@ -2,21 +2,20 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
-#include <boost/test/unit_test.hpp>
 
-#include "test/TensorHelpers.hpp"
-#include "LayerTests.hpp"
+#include <armnn/test/TensorHelpers.hpp>
+#include <armnn/test/UnitTests.hpp>
 
 #include <backends/CpuTensorHandle.hpp>
 #include <backends/neon/NeonLayerSupport.hpp>
 #include <backends/neon/NeonWorkloadFactory.hpp>
 #include <backends/reference/RefWorkloadFactory.hpp>
+#include <backends/test/ActivationFixture.hpp>
+#include <backends/test/LayerTests.hpp>
 #include <backends/test/TensorCopyUtils.hpp>
-#include "ActivationFixture.hpp"
+#include <backends/test/WorkloadTestUtils.hpp>
 
-#include "WorkloadTestUtils.hpp"
-
-#include "test/UnitTests.hpp"
+#include <boost/test/unit_test.hpp>
 
 BOOST_AUTO_TEST_SUITE(Compute_ArmComputeNeon)
 using FactoryType = armnn::NeonWorkloadFactory;
diff --git a/src/backends/reference/CMakeLists.txt b/src/backends/reference/CMakeLists.txt
index 9810cf8..5aa3fc2 100644
--- a/src/backends/reference/CMakeLists.txt
+++ b/src/backends/reference/CMakeLists.txt
@@ -17,5 +17,5 @@
 target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
 target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
 
-add_subdirectory(workloads test)
-
+add_subdirectory(workloads)
+add_subdirectory(test)
diff --git a/src/backends/reference/backend.cmake b/src/backends/reference/backend.cmake
index 95e72a4..5ae088a 100644
--- a/src/backends/reference/backend.cmake
+++ b/src/backends/reference/backend.cmake
@@ -5,3 +5,4 @@
 
 add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/reference)
 list(APPEND armnnLibraries armnnRefBackend armnnRefBackendWorkloads)
+list(APPEND armnnUnitTestLibraries armnnRefBackendUnitTests)
diff --git a/src/backends/reference/test/CMakeLists.txt b/src/backends/reference/test/CMakeLists.txt
index f41a074..8f86f86 100644
--- a/src/backends/reference/test/CMakeLists.txt
+++ b/src/backends/reference/test/CMakeLists.txt
@@ -2,3 +2,14 @@
 # Copyright © 2017 Arm Ltd. All rights reserved.
 # SPDX-License-Identifier: MIT
 #
+
+list(APPEND armnnRefBackendUnitTests_sources
+    RefCreateWorkloadTests.cpp
+    RefLayerSupportTests.cpp
+    RefLayerTests.cpp
+)
+
+add_library(armnnRefBackendUnitTests STATIC ${armnnRefBackendUnitTests_sources})
+target_include_directories(armnnRefBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src)
+target_include_directories(armnnRefBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(armnnRefBackendUnitTests PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
\ No newline at end of file
diff --git a/src/backends/test/CreateWorkloadRef.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp
similarity index 99%
rename from src/backends/test/CreateWorkloadRef.cpp
rename to src/backends/reference/test/RefCreateWorkloadTests.cpp
index c30093d..e88fbed 100644
--- a/src/backends/test/CreateWorkloadRef.cpp
+++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp
@@ -2,11 +2,12 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
+
+#include <armnn/test/CreateWorkload.hpp>
+
+#include <backends/CpuTensorHandle.hpp>
 #include <backends/reference/RefWorkloadFactory.hpp>
 #include <backends/reference/workloads/RefWorkloads.hpp>
-#include <backends/CpuTensorHandle.hpp>
-
-#include "test/CreateWorkload.hpp"
 
 namespace
 {
diff --git a/src/backends/reference/test/RefLayerSupportTests.cpp b/src/backends/reference/test/RefLayerSupportTests.cpp
new file mode 100644
index 0000000..be3f3f8
--- /dev/null
+++ b/src/backends/reference/test/RefLayerSupportTests.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <armnn/layers/ConvertFp16ToFp32Layer.hpp>
+#include <armnn/layers/ConvertFp32ToFp16Layer.hpp>
+#include <armnn/test/TensorHelpers.hpp>
+
+#include <backends/CpuTensorHandle.hpp>
+#include <backends/reference/RefWorkloadFactory.hpp>
+#include <backends/test/LayerTests.hpp>
+#include <backends/test/IsLayerSupportedTestImpl.hpp>
+
+#include <boost/test/unit_test.hpp>
+
+#include <string>
+
+namespace
+{
+
+bool LayerTypeMatchesTest()
+{
+    return LayerTypeMatchesTestImpl<armnn::LayerType::FirstLayer>(Tag<armnn::LayerType::FirstLayer>());
+};
+
+} // anonymous namespace
+
+BOOST_AUTO_TEST_SUITE(RefLayerSupported)
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedLayerTypeMatches)
+{
+    LayerTypeMatchesTest();
+}
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat16Reference)
+{
+    armnn::RefWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::RefWorkloadFactory, armnn::DataType::Float16>(&factory);
+}
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat32Reference)
+{
+    armnn::RefWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::RefWorkloadFactory, armnn::DataType::Float32>(&factory);
+}
+
+BOOST_AUTO_TEST_CASE(IsLayerSupportedUint8Reference)
+{
+    armnn::RefWorkloadFactory factory;
+    IsLayerSupportedTests<armnn::RefWorkloadFactory, armnn::DataType::QuantisedAsymm8>(&factory);
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedReference)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float16, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(result);
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedFp32InputReference)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float32 data type input");
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedFp16OutputReference)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
+      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float16 data type output");
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedReference)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float32, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(result);
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedFp16InputReference)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float16 data type input");
+}
+
+BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedFp32OutputReference)
+{
+    std::string reasonIfUnsupported;
+
+    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
+      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
+
+    BOOST_CHECK(!result);
+    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float32 data type output");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/backends/test/Reference.cpp b/src/backends/reference/test/RefLayerTests.cpp
similarity index 99%
rename from src/backends/test/Reference.cpp
rename to src/backends/reference/test/RefLayerTests.cpp
index 05ebf2e..de2c2fe 100644
--- a/src/backends/test/Reference.cpp
+++ b/src/backends/reference/test/RefLayerTests.cpp
@@ -2,14 +2,14 @@
 // Copyright © 2017 Arm Ltd. All rights reserved.
 // SPDX-License-Identifier: MIT
 //
-#include <boost/test/unit_test.hpp>
 
-#include "LayerTests.hpp"
 #include "test/TensorHelpers.hpp"
+#include "test/UnitTests.hpp"
 
 #include <backends/reference/RefWorkloadFactory.hpp>
+#include <backends/test/LayerTests.hpp>
 
-#include "test/UnitTests.hpp"
+#include <boost/test/unit_test.hpp>
 
 BOOST_AUTO_TEST_SUITE(Compute_Reference)
 using FactoryType = armnn::RefWorkloadFactory;
diff --git a/src/backends/test/ActivationFixture.hpp b/src/backends/test/ActivationFixture.hpp
index d9d4ca7..5028b25 100644
--- a/src/backends/test/ActivationFixture.hpp
+++ b/src/backends/test/ActivationFixture.hpp
@@ -7,6 +7,11 @@
 #include "TensorCopyUtils.hpp"
 #include "WorkloadTestUtils.hpp"
 
+#include <armnn/test/TensorHelpers.hpp>
+
+#include <boost/numeric/conversion/cast.hpp>
+#include <boost/multi_array.hpp>
+
 struct ActivationFixture
 {
     ActivationFixture()
diff --git a/src/backends/test/IsLayerSupportedTest.cpp b/src/backends/test/IsLayerSupportedTest.cpp
deleted file mode 100644
index 089822d..0000000
--- a/src/backends/test/IsLayerSupportedTest.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include <boost/test/unit_test.hpp>
-
-#include <test/TensorHelpers.hpp>
-#include "LayerTests.hpp"
-
-#include <backends/CpuTensorHandle.hpp>
-#include <backends/reference/RefWorkloadFactory.hpp>
-#include <backends/neon/NeonWorkloadFactory.hpp>
-
-#include <string>
-#include <iostream>
-#include <backends/cl/ClWorkloadFactory.hpp>
-
-#include "IsLayerSupportedTestImpl.hpp"
-#include <backends/test/ClContextControlFixture.hpp>
-
-#include <layers/ConvertFp16ToFp32Layer.hpp>
-#include <layers/ConvertFp32ToFp16Layer.hpp>
-
-BOOST_AUTO_TEST_SUITE(IsLayerSupported)
-
-BOOST_AUTO_TEST_CASE(IsLayerSupportedLayerTypeMatches)
-{
-    LayerTypeMatchesTest();
-}
-
-BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat16Reference)
-{
-    armnn::RefWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::RefWorkloadFactory, armnn::DataType::Float16>(&factory);
-}
-
-BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat32Reference)
-{
-    armnn::RefWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::RefWorkloadFactory, armnn::DataType::Float32>(&factory);
-}
-
-BOOST_AUTO_TEST_CASE(IsLayerSupportedUint8Reference)
-{
-    armnn::RefWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::RefWorkloadFactory, armnn::DataType::QuantisedAsymm8>(&factory);
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedReference)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float16, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(result);
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedFp32InputReference)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float32 data type input");
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedFp16OutputReference)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float16 data type output");
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedReference)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float32, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(result);
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedFp16InputReference)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float16 data type input");
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedFp32OutputReference)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::RefWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Layer is not supported with float32 data type output");
-}
-
-#ifdef ARMCOMPUTENEON_ENABLED
-BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat16Neon)
-{
-    armnn::NeonWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::DataType::Float16>(&factory);
-}
-
-BOOST_AUTO_TEST_CASE(IsLayerSupportedFloat32Neon)
-{
-    armnn::NeonWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::DataType::Float32>(&factory);
-}
-
-BOOST_AUTO_TEST_CASE(IsLayerSupportedUint8Neon)
-{
-    armnn::NeonWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::DataType::QuantisedAsymm8>(&factory);
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp16ToFp32SupportedNeon)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float16, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(result);
-}
-
-BOOST_AUTO_TEST_CASE(IsConvertFp32ToFp16SupportedNeon)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::NeonWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float32, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(result);
-}
-#endif //#ifdef ARMCOMPUTENEON_ENABLED.
-
-
-#ifdef ARMCOMPUTECL_ENABLED
-
-BOOST_FIXTURE_TEST_CASE(IsLayerSupportedFloat16Cl, ClContextControlFixture)
-{
-    armnn::ClWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::ClWorkloadFactory, armnn::DataType::Float16>(&factory);
-}
-
-BOOST_FIXTURE_TEST_CASE(IsLayerSupportedFloat32Cl, ClContextControlFixture)
-{
-    armnn::ClWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::ClWorkloadFactory, armnn::DataType::Float32>(&factory);
-}
-
-BOOST_FIXTURE_TEST_CASE(IsLayerSupportedUint8Cl, ClContextControlFixture)
-{
-    armnn::ClWorkloadFactory factory;
-    IsLayerSupportedTests<armnn::ClWorkloadFactory, armnn::DataType::QuantisedAsymm8>(&factory);
-}
-
-BOOST_FIXTURE_TEST_CASE(IsConvertFp16ToFp32SupportedCl, ClContextControlFixture)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float16, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(result);
-}
-
-BOOST_FIXTURE_TEST_CASE(IsConvertFp16ToFp32SupportedFp32InputCl, ClContextControlFixture)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Input should be Float16");
-}
-
-BOOST_FIXTURE_TEST_CASE(IsConvertFp16ToFp32SupportedFp16OutputCl, ClContextControlFixture)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp16ToFp32Layer,
-      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Output should be Float32");
-}
-
-BOOST_FIXTURE_TEST_CASE(IsConvertFp32ToFp16SupportedCl, ClContextControlFixture)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float32, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(result);
-}
-
-BOOST_FIXTURE_TEST_CASE(IsConvertFp32ToFp16SupportedFp16InputCl, ClContextControlFixture)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float16, armnn::DataType::Float16>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Input should be Float32");
-}
-
-BOOST_FIXTURE_TEST_CASE(IsConvertFp32ToFp16SupportedFp32OutputCl, ClContextControlFixture)
-{
-    std::string reasonIfUnsupported;
-
-    bool result = IsConvertLayerSupportedTests<armnn::ClWorkloadFactory, armnn::ConvertFp32ToFp16Layer,
-      armnn::DataType::Float32, armnn::DataType::Float32>(reasonIfUnsupported);
-
-    BOOST_CHECK(!result);
-    BOOST_CHECK_EQUAL(reasonIfUnsupported, "Output should be Float16");
-}
-#endif //#ifdef ARMCOMPUTECL_ENABLED.
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/backends/test/IsLayerSupportedTestImpl.hpp b/src/backends/test/IsLayerSupportedTestImpl.hpp
index 0f31c8e..867f7f2 100644
--- a/src/backends/test/IsLayerSupportedTestImpl.hpp
+++ b/src/backends/test/IsLayerSupportedTestImpl.hpp
@@ -537,11 +537,6 @@
         LayerTypeMatchesTestImpl<NextType(Type)>(Tag<NextType(Type)>());
 };
 
-bool LayerTypeMatchesTest()
-{
-    return LayerTypeMatchesTestImpl<armnn::LayerType::FirstLayer>(Tag<armnn::LayerType::FirstLayer>());
-};
-
 template<typename FactoryType, typename LayerType, armnn::DataType InputDataType , armnn::DataType OutputDataType>
 bool IsConvertLayerSupportedTests(std::string& reasonIfUnsupported)
 {
diff --git a/src/backends/test/LayerTests.cpp b/src/backends/test/LayerTests.cpp
index 17f3ae1..d88db06 100644
--- a/src/backends/test/LayerTests.cpp
+++ b/src/backends/test/LayerTests.cpp
@@ -39,7 +39,7 @@
 #include "ConvertFp16ToFp32TestImpl.hpp"
 #include "ConvertFp32ToFp16TestImpl.hpp"
 
-#include "ClContextControlFixture.hpp"
+#include <backends/cl/test/ClContextControlFixture.hpp>
 
 // 3-channel 16x8 image used as common input data for a number of Conv2d tests.
 static std::vector<float> ConvInput3x8x16({