IVGCVSW-7887 Add TILE End to End tests

  * Fix error in InferOutputShapes

Signed-off-by: Cian McGriskin <cian.mcgriskin@arm.com>
Change-Id: I1b38285d82d22715c6502dc63b7bab981e3258e4
diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt
index bbd1324..7c24f9c 100644
--- a/src/backends/backendsCommon/test/CMakeLists.txt
+++ b/src/backends/backendsCommon/test/CMakeLists.txt
@@ -61,6 +61,7 @@
     StridedSliceAsyncEndToEndTest.hpp
     SubgraphUtilsTest.hpp
     SubtractionEndToEndTestImpl.hpp
+    TileEndToEndTestImpl.hpp
     TransposeEndToEndTestImpl.hpp
     TensorCopyUtils.hpp
     WorkloadFactoryHelper.hpp
diff --git a/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp
new file mode 100644
index 0000000..4047e5a
--- /dev/null
+++ b/src/backends/backendsCommon/test/TileEndToEndTestImpl.hpp
@@ -0,0 +1,61 @@
+//
+// Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+#include "armnn/INetwork.hpp"
+#include "armnnUtils/QuantizeHelper.hpp"
+#include <CommonTestUtils.hpp>
+#include <ResolveType.hpp>
+#include <doctest/doctest.h>
+
+namespace
+{
+using namespace armnn;
+armnn::INetworkPtr CreateTileNetwork(TileDescriptor& descriptor,
+                                     const armnn::TensorInfo& inputInfo,
+                                     const armnn::TensorInfo& outputInfo)
+{
+    INetworkPtr network(INetwork::Create());
+    IConnectableLayer* inputLayer  = network->AddInputLayer(0, "input");
+    IConnectableLayer* tileLayer   = network->AddTileLayer(descriptor, "tile");
+    IConnectableLayer* outputLayer = network->AddOutputLayer(0, "output");
+    Connect(inputLayer,   tileLayer, inputInfo,  0, 0);
+    Connect(tileLayer, outputLayer,  outputInfo, 0, 0);
+    return network;
+}
+
+template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void TileEndToEnd(const std::vector<BackendId>& backends)
+{
+    float   qScale  = 1.0f;
+    int32_t qOffset = 0;
+    bool    qConst  = true;
+
+    const TensorShape inputTensorShape =  { 2, 3 };
+    const TensorShape outputTensorShape = { 4, 6 };
+
+    TensorInfo inputInfo  (inputTensorShape, ArmnnType, qScale, qOffset, qConst);
+    TensorInfo outputInfo (outputTensorShape, ArmnnType,qScale, qOffset);
+
+    std::vector<T> inputData = armnnUtils::QuantizedVector<T>({
+        0.f, 1.f, 2.f,
+        3.f, 4.f, 5.f
+    }, qScale, qOffset);
+
+    std::vector<T> expectedOutputData = armnnUtils::QuantizedVector<T>({
+        0.f, 1.f, 2.f, 0.f, 1.f, 2.f,
+        3.f, 4.f, 5.f, 3.f, 4.f, 5.f,
+        0.f, 1.f, 2.f, 0.f, 1.f, 2.f,
+        3.f, 4.f, 5.f, 3.f, 4.f, 5.f
+    }, qScale, qOffset);
+
+    auto descriptor = armnn::TileDescriptor(std::vector<uint32_t>{ 2, 2 });
+    INetworkPtr network = CreateTileNetwork(descriptor, inputInfo, outputInfo);
+
+    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
\ No newline at end of file