IVGCVSW-7836 Add ReverseV2 End-to-End Tests

  * create implementation header
  * add copyright notice
  * add pragma once and anonymous namespace
  * create network function declaration
  * complete body of network function
  * create end-to-end function declaration
  * complete body of end-to-end function
  * add references to tests for supported data types

Signed-off-by: Declan-ARM <decmce01@arm.com>
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I376e48efd8b6ca9e0e0b05b516be599c0acdbd16
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp
index 7efca9d..aa6bb84 100644
--- a/src/backends/backendsCommon/WorkloadData.cpp
+++ b/src/backends/backendsCommon/WorkloadData.cpp
@@ -1656,7 +1656,9 @@
         DataType::Float32,
         DataType::QAsymmS8,
         DataType::QAsymmU8,
-        DataType::QSymmS16
+        DataType::QSymmS8,
+        DataType::QSymmS16,
+        DataType::Signed32
     };
 
     ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
diff --git a/src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp b/src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp
new file mode 100644
index 0000000..b36d2ee
--- /dev/null
+++ b/src/backends/backendsCommon/test/ReverseV2EndToEndTestImpl.hpp
@@ -0,0 +1,72 @@
+//
+// Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+namespace
+{
+
+armnn::INetworkPtr CreateReverseV2Network(const armnn::TensorInfo& inputInfo,
+                                          const armnn::TensorInfo& axisInfo,
+                                          const armnn::TensorInfo& outputInfo,
+                                          const std::vector<int32_t>& axisData)
+{
+    using namespace armnn;
+
+    INetworkPtr network(INetwork::Create());
+
+    IConnectableLayer* inputLayer   = network->AddInputLayer(0, "input");
+    IConnectableLayer* axisLayer    = network->AddConstantLayer(ConstTensor(axisInfo, axisData));
+    IConnectableLayer* reverseLayer = network->AddReverseV2Layer("reverseV2");
+    IConnectableLayer* outputLayer  = network->AddOutputLayer(0, "output");
+
+    Connect(inputLayer,   reverseLayer, inputInfo,  0, 0);
+    Connect(axisLayer,    reverseLayer, axisInfo,   0, 1);
+    Connect(reverseLayer, outputLayer,  outputInfo, 0, 0);
+
+    return network;
+}
+
+template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void ReverseV2EndToEnd(const std::vector<BackendId>& backends)
+{
+    float   qScale  = 1.0f;
+    int32_t qOffset = 0;
+    bool    qConst  = true;
+
+    TensorInfo inputInfo  ( { 2, 3, 4 }, ArmnnType,          qScale, qOffset, qConst);
+    TensorInfo axisInfo   ( { 1 }      , DataType::Signed32, qScale, qOffset, qConst);
+    TensorInfo outputInfo ( { 2, 3, 4 }, ArmnnType,          qScale, qOffset);
+
+    std::vector<T> inputData = armnnUtils::QuantizedVector<T>({
+         1,  2,  3,  4,
+         5,  6 , 7,  8,
+         9, 10, 11, 12,
+        13, 14, 15, 16,
+        17, 18, 19, 20,
+        21, 22, 23, 24
+    }, qScale, qOffset);
+
+    std::vector<int32_t> axisData = { 1 };
+
+    std::vector<T> expectedOutputData = armnnUtils::QuantizedVector<T>({
+         9, 10, 11, 12,
+         5,  6,  7 , 8,
+         1,  2,  3,  4,
+        21, 22, 23, 24,
+        17, 18, 19, 20,
+        13, 14, 15, 16
+    }, qScale, qOffset);
+
+    INetworkPtr network = CreateReverseV2Network(inputInfo, axisInfo, outputInfo, axisData);
+
+    std::map<int, std::vector<T>> inputTensor          = { { 0, inputData  } };
+    std::map<int, std::vector<T>> expectedOutputTensor = { { 0, expectedOutputData } };
+
+    EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network), inputTensor, expectedOutputTensor, backends);
+}
+
+} // anonymous namespace
+
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index 9d396e5..2e845a8 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -2373,14 +2373,16 @@
 {
     bool supported = true;
     // ReverseV2 is data type agnostic so it can support all the types in the Reference backend
-    std::array<DataType,6> supportedTypes =
+    std::array<DataType,8> supportedTypes =
     {
         DataType::BFloat16,
         DataType::Float32,
         DataType::Float16,
         DataType::QAsymmS8,
         DataType::QAsymmU8,
-        DataType::QSymmS16
+        DataType::QSymmS8,
+        DataType::QSymmS16,
+        DataType::Signed32
     };
 
     supported &= CheckSupportRule(TypeAnyOf(input0, supportedTypes), reasonIfUnsupported,
diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp
index 6f05ba7..fc62a89 100644
--- a/src/backends/reference/test/RefEndToEndTests.cpp
+++ b/src/backends/reference/test/RefEndToEndTests.cpp
@@ -32,6 +32,7 @@
 #include <backendsCommon/test/ReduceEndToEndTestImpl.hpp>
 #include <backendsCommon/test/ReshapeEndToEndTestImpl.hpp>
 #include <backendsCommon/test/ResizeEndToEndTestImpl.hpp>
+#include <backendsCommon/test/ReverseV2EndToEndTestImpl.hpp>
 #include <backendsCommon/test/SpaceToDepthEndToEndTestImpl.hpp>
 #include <backendsCommon/test/SplitterEndToEndTestImpl.hpp>
 #include <backendsCommon/test/StridedSliceAsyncEndToEndTest.hpp>
@@ -1322,6 +1323,42 @@
     ResizeNearestNeighborEndToEnd<armnn::DataType::QSymmS16>(defaultBackends, armnn::DataLayout::NHWC);
 }
 
+// ReverseV2
+TEST_CASE("RefReverseV2EndToEndFloat16Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::Float16>(defaultBackends);
+}
+
+TEST_CASE("RefReverseV2EndToEndFloat32Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::Float32>(defaultBackends);
+}
+
+TEST_CASE("RefReverseV2EndToEndQAsymmS8Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::QAsymmS8>(defaultBackends);
+}
+
+TEST_CASE("RefReverseV2EndToEndQAsymmU8Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::QAsymmU8>(defaultBackends);
+}
+
+TEST_CASE("RefReverseV2EndToEndQSymmS8Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::QSymmS8>(defaultBackends);
+}
+
+TEST_CASE("RefReverseV2EndToEndQSymmS16Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::QSymmS16>(defaultBackends);
+}
+
+TEST_CASE("RefReverseV2EndToEndSigned32Test")
+{
+    ReverseV2EndToEnd<armnn::DataType::Signed32>(defaultBackends);
+}
+
 // InstanceNormalization
 TEST_CASE("RefInstanceNormalizationNhwcEndToEndTest1")
 {