IVGCVSW-5804 TfLiteParser fails to correctly parse ArgMinMax

 * Fix for GitHub#523.
 * Updated ParseArgMinMax function to read correct axis data.
 * Improved validation in ParseArgMinMax function.
 * Added ARG_MIN support to TfLiteParser.
 * Added ArgMinMax unit tests for TfLiteParser.

Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: Ib4ce1a7c66e210c47859a130c4896aac958f2654
diff --git a/src/armnnTfLiteParser/test/ArgMinMax.cpp b/src/armnnTfLiteParser/test/ArgMinMax.cpp
new file mode 100644
index 0000000..ad99b48
--- /dev/null
+++ b/src/armnnTfLiteParser/test/ArgMinMax.cpp
@@ -0,0 +1,164 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <boost/test/unit_test.hpp>
+#include "ParserFlatbuffersFixture.hpp"
+#include "../TfLiteParser.hpp"
+
+#include <iostream>
+#include <string>
+
+BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
+
+struct ArgMinMaxFixture : public ParserFlatbuffersFixture
+{
+    explicit ArgMinMaxFixture(const std::string& operatorCode,
+                              const std::string& inputShape,
+                              const std::string& outputShape,
+                              const std::string& axisData)
+    {
+        m_JsonString = R"(
+            {
+                "version": 3,
+                "operator_codes": [ { "builtin_code": )" + operatorCode + R"( } ],
+                "subgraphs": [ {
+                    "tensors": [
+                        {
+                            "shape": )" + inputShape + R"(,
+                            "type": "FLOAT32",
+                            "buffer": 0,
+                            "name": "inputTensor",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        },
+                        {
+                            "shape": )" + outputShape + R"( ,
+                            "type": "INT32",
+                            "buffer": 1,
+                            "name": "outputTensor",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        },
+                        {
+                            "shape": [ 1 ],
+                            "type": "INT32",
+                            "buffer": 2,
+                            "name": "axis",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        },
+                    ],
+                    "inputs": [ 0 ],
+                    "outputs": [ 1 ],
+                    "operators": [
+                        {
+                            "opcode_index": 0,
+                            "inputs": [ 0 , 2 ],
+                            "outputs": [ 1 ],
+                            "custom_options_format": "FLEXBUFFERS"
+                        }
+                    ],
+                } ],
+                "buffers" : [
+                    { },
+                    { },
+                    { "data": )" + axisData + R"(, },
+                ]
+            }
+        )";
+
+        SetupSingleInputSingleOutput("inputTensor", "outputTensor");
+    }
+};
+
+struct SimpleArgMaxFixture : public ArgMinMaxFixture
+{
+    SimpleArgMaxFixture() : ArgMinMaxFixture("ARG_MAX",
+                                             "[ 1, 1, 1, 5 ]",
+                                             "[ 1, 1, 1 ]",
+                                             "[ 3, 0, 0, 0 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseSimpleArgMax, SimpleArgMaxFixture)
+{
+    RunTest<3, armnn::DataType::Float32, armnn::DataType::Signed32>(
+            0,
+            {{ "inputTensor",  { 6.0f, 2.0f, 8.0f, 10.0f, 9.0f } } },
+            {{ "outputTensor", { 3l } } });
+}
+
+struct ArgMaxFixture : public ArgMinMaxFixture
+{
+    ArgMaxFixture() : ArgMinMaxFixture("ARG_MAX",
+                                       "[ 3, 2, 1, 4 ]",
+                                       "[ 2, 1, 4 ]",
+                                       "[ 0, 0, 0, 0 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseArgMax, ArgMaxFixture)
+{
+    RunTest<3, armnn::DataType::Float32, armnn::DataType::Signed32>(
+            0,
+            {{ "inputTensor", { 1.0f,   2.0f,   3.0f,   4.0f,
+                                8.0f,   7.0f,   6.0f,   6.0f,
+                                100.0f, 20.0f,  300.0f, 40.0f,
+                                500.0f, 476.0f, 450.0f, 426.0f,
+                                50.0f,  60.0f,  70.0f,  80.0f,
+                                10.0f,  200.0f, 30.0f,  400.0f } } },
+            {{ "outputTensor", { 1, 2, 1, 2,
+                                 1, 1, 1, 1 } } });
+}
+
+struct SimpleArgMinFixture : public ArgMinMaxFixture
+{
+    SimpleArgMinFixture() : ArgMinMaxFixture("ARG_MIN",
+                                             "[ 1, 1, 1, 5 ]",
+                                             "[ 1, 1, 1 ]",
+                                             "[ 3, 0, 0, 0 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseSimpleArgMin, SimpleArgMinFixture)
+{
+    RunTest<3, armnn::DataType::Float32, armnn::DataType::Signed32>(
+            0,
+            {{ "inputTensor",  { 6.0f, 2.0f, 8.0f, 10.0f, 9.0f } } },
+            {{ "outputTensor", { 1l } } });
+}
+
+struct ArgMinFixture : public ArgMinMaxFixture
+{
+    ArgMinFixture() : ArgMinMaxFixture("ARG_MIN",
+                                       "[ 3, 2, 1, 4 ]",
+                                       "[ 2, 1, 4 ]",
+                                       "[ 0, 0, 0, 0 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseArgMin, ArgMinFixture)
+{
+    RunTest<3, armnn::DataType::Float32, armnn::DataType::Signed32>(
+            0,
+            {{ "inputTensor", { 1.0f,   2.0f,   3.0f,   4.0f,
+                                8.0f,   7.0f,   6.0f,   6.0f,
+                                100.0f, 20.0f,  300.0f, 40.0f,
+                                500.0f, 476.0f, 450.0f, 426.0f,
+                                50.0f,  60.0f,  70.0f,  80.0f,
+                                10.0f,  200.0f, 30.0f,  400.0f } } },
+            {{ "outputTensor", { 0, 0, 0, 0,
+                                 0, 0, 0, 0 } } });
+}
+
+BOOST_AUTO_TEST_SUITE_END()