IVGCVSW-5829 Segfault in tflite-parser, int8 models

 * Updated ParseSplit TfLiteParser function to read correct axis data.
 * Improved validation in ParseSplit and ParseSplitV function.
 * Added TensorFlow BOOL support to TfLiteParser.
 * Added supported ElementWiseUnary operators to TfLiteParser
   E.g. ABS, LOGICAL_NOT and RSQRT.
 * Removed ParseExp and ParseNeg function implementation in favour
   of reusable ParseElementWiseUnary function.
 * Removed Exp.cpp and Neg.cpp files and moved tests to ElementWiseUnary.cpp.

Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: Ibce36e3ce4d95755dda88abc2ddde1e07e62c5e2
diff --git a/src/armnnTfLiteParser/test/ElementWiseUnary.cpp b/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
new file mode 100644
index 0000000..dc236d2
--- /dev/null
+++ b/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
@@ -0,0 +1,148 @@
+//
+// 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 <string>
+
+BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
+
+struct ElementWiseUnaryFixture : public ParserFlatbuffersFixture
+{
+    explicit ElementWiseUnaryFixture(const std::string& operatorCode,
+                                     const std::string& dataType,
+                                     const std::string& inputShape,
+                                     const std::string& outputShape)
+    {
+        m_JsonString = R"(
+            {
+                "version": 3,
+                "operator_codes": [ { "builtin_code": )" + operatorCode + R"( } ],
+                "subgraphs": [ {
+                    "tensors": [
+                        {
+                            "shape": )" + inputShape + R"(,
+                            "type": )" + dataType + R"( ,
+                            "buffer": 0,
+                            "name": "inputTensor",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        },
+                        {
+                            "shape": )" + outputShape + R"( ,
+                            "type": )" + dataType + R"( ,
+                            "buffer": 1,
+                            "name": "outputTensor",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        }
+                    ],
+                    "inputs": [ 0 ],
+                    "outputs": [ 1 ],
+                    "operators": [
+                        {
+                            "opcode_index": 0,
+                            "inputs": [ 0 ],
+                            "outputs": [ 1 ],
+                            "custom_options_format": "FLEXBUFFERS"
+                        }
+                    ],
+                } ],
+                "buffers" : [
+                    { },
+                    { }
+                ]
+            }
+        )";
+        Setup();
+    }
+};
+
+struct SimpleAbsFixture : public ElementWiseUnaryFixture
+{
+    SimpleAbsFixture() : ElementWiseUnaryFixture("ABS", "FLOAT32", "[ 2, 2 ]", "[ 2, 2 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseAbs, SimpleAbsFixture)
+{
+    std::vector<float> inputValues
+    {
+        -0.1f, 0.2f,
+        0.3f, -0.4f
+    };
+
+    // Calculate output data
+    std::vector<float> expectedOutputValues(inputValues.size());
+    for (unsigned int i = 0; i < inputValues.size(); ++i)
+    {
+        expectedOutputValues[i] = std::abs(inputValues[i]);
+    }
+
+    RunTest<2, armnn::DataType::Float32>(0, {{ "inputTensor", { inputValues } }},
+                                            {{ "outputTensor",{ expectedOutputValues } } });
+}
+
+struct SimpleExpFixture : public ElementWiseUnaryFixture
+{
+    SimpleExpFixture() : ElementWiseUnaryFixture("EXP", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseExp, SimpleExpFixture)
+{
+    RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 0.0f,  1.0f,  2.0f,
+                                                                3.0f,  4.0f,  5.0f} }},
+                                            {{ "outputTensor",{ 1.0f,  2.718281f,  7.3890515f,
+                                                                20.0855185f, 54.5980834f, 148.4129329f} } });
+}
+
+struct SimpleLogicalNotFixture : public ElementWiseUnaryFixture
+{
+    SimpleLogicalNotFixture() : ElementWiseUnaryFixture("LOGICAL_NOT", "BOOL", "[ 1, 1, 1, 4 ]", "[ 1, 1, 1, 4 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseLogicalNot, SimpleLogicalNotFixture)
+{
+    RunTest<4, armnn::DataType::Boolean>(0, {{ "inputTensor", { 0, 1, 0, 1 } }},
+                                            {{ "outputTensor",{ 1, 0, 1, 0 } } });
+}
+
+struct SimpleNegFixture : public ElementWiseUnaryFixture
+{
+    SimpleNegFixture() : ElementWiseUnaryFixture("NEG", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseNeg, SimpleNegFixture)
+{
+    RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 0.0f, 1.0f, -2.0f,
+                                                                20.0855185f, -54.5980834f, 5.0f} }},
+                                            {{ "outputTensor",{ 0.0f, -1.0f, 2.0f,
+                                                                -20.0855185f, 54.5980834f, -5.0f} }});
+}
+
+struct SimpleRsqrtFixture : public ElementWiseUnaryFixture
+{
+    SimpleRsqrtFixture() : ElementWiseUnaryFixture("RSQRT", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseRsqrt, SimpleRsqrtFixture)
+{
+    RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 1.0f, 4.0f, 16.0f,
+                                                                25.0f, 64.0f, 100.0f } }},
+                                            {{ "outputTensor",{ 1.0f, 0.5f, 0.25f,
+                                                                0.2f, 0.125f, 0.1f} }});
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()