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()
