IVGCVSW-2657: New Mobilenet Timings test which includes quantisation and softmax
Signed-off-by: David Monahan <david.monahan@arm.com>

Change-Id: Ieeb6ead55a3af851eea666334e41c3c9c3e3803b
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index b7a6d74..a0e4bf8 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -183,6 +183,12 @@
         ImagePreprocessor.cpp)
     TfLiteParserTest(TfLiteVGG16Quantized-Armnn "${TfLiteVGG16Quantized-Armnn_sources}")
 
+    set(TfLiteMobileNetQuantizedSoftmax-Armnn_sources
+        TfLiteMobileNetQuantizedSoftmax-Armnn/TfLiteMobileNetQuantizedSoftmax-Armnn.cpp
+        ImagePreprocessor.hpp
+        ImagePreprocessor.cpp)
+    TfLiteParserTest(TfLiteMobileNetQuantizedSoftmax-Armnn "${TfLiteMobileNetQuantizedSoftmax-Armnn_sources}")
+
     set(TfLiteInceptionV3Quantized-Armnn_sources
         TfLiteInceptionV3Quantized-Armnn/TfLiteInceptionV3Quantized-Armnn.cpp
         ImagePreprocessor.hpp
@@ -202,9 +208,9 @@
     TfLiteParserTest(TfLiteResNetV2-Armnn "${TfLiteResNetV2-Armnn_sources}")
 
     set(TfLiteResNetV2-50-Quantized-Armnn_sources
-            TfLiteResNetV2-50-Quantized-Armnn/TfLiteResNetV2-50-Quantized-Armnn.cpp
-            ImagePreprocessor.hpp
-            ImagePreprocessor.cpp)
+        TfLiteResNetV2-50-Quantized-Armnn/TfLiteResNetV2-50-Quantized-Armnn.cpp
+        ImagePreprocessor.hpp
+        ImagePreprocessor.cpp)
     TfLiteParserTest(TfLiteResNetV2-50-Quantized-Armnn "${TfLiteResNetV2-50-Quantized-Armnn_sources}")
 
     set(TfLiteMnasNet-Armnn_sources
diff --git a/tests/TfLiteMobileNetQuantizedSoftmax-Armnn/TfLiteMobileNetQuantizedSoftmax-Armnn.cpp b/tests/TfLiteMobileNetQuantizedSoftmax-Armnn/TfLiteMobileNetQuantizedSoftmax-Armnn.cpp
new file mode 100644
index 0000000..4d99e9e
--- /dev/null
+++ b/tests/TfLiteMobileNetQuantizedSoftmax-Armnn/TfLiteMobileNetQuantizedSoftmax-Armnn.cpp
@@ -0,0 +1,67 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#include "../InferenceTest.hpp"
+#include "../ImagePreprocessor.hpp"
+#include "armnnTfLiteParser/ITfLiteParser.hpp"
+
+using namespace armnnTfLiteParser;
+
+int main(int argc, char* argv[])
+{
+    int retVal = EXIT_FAILURE;
+    try
+    {
+        // Coverity fix: The following code may throw an exception of type std::length_error.
+        std::vector<ImageSet> imageSet =
+                {
+                        {"Dog.jpg", 795},
+                        {"Cat.jpg", 592},
+                        {"shark.jpg", 436},
+                };
+
+        armnn::TensorShape inputTensorShape({ 1, 128, 128, 3 });
+
+        using DataType = uint8_t;
+        using DatabaseType = ImagePreprocessor<DataType>;
+        using ParserType = armnnTfLiteParser::ITfLiteParser;
+        using ModelType = InferenceModel<ParserType, DataType>;
+
+        // Coverity fix: ClassifierInferenceTestMain() may throw uncaught exceptions.
+        retVal = armnn::test::ClassifierInferenceTestMain<DatabaseType,
+                ParserType>(
+                argc, argv,
+                "mobilenet_v1_0.25_128_quant.tflite", // model name
+                true,                      // model is binary
+                "input",      // input tensor name
+                "MobilenetV1/Predictions/Reshape_1",        // output tensor name
+                { 0, 1, 2 },               // test images to test with as above
+                [&imageSet](const char* dataDir, const ModelType & model) {
+                    // we need to get the input quantization parameters from
+                    // the parsed model
+                    auto inputBinding = model.GetInputBindingInfo();
+                    return DatabaseType(
+                            dataDir,
+                            128,
+                            128,
+                            imageSet,
+                            inputBinding.second.GetQuantizationScale(),
+                            inputBinding.second.GetQuantizationOffset(),
+                            {{0, 0, 0}},
+                            {{1, 1, 1}},
+                            DatabaseType::DataFormat::NCHW,
+                            1);
+                },
+                &inputTensorShape);
+    }
+    catch (const std::exception& e)
+    {
+        // Coverity fix: BOOST_LOG_TRIVIAL (typically used to report errors) may throw an
+        // exception of type std::length_error.
+        // Using stderr instead in this context as there is no point in nesting try-catch blocks here.
+        std::cerr << "WARNING: " << *argv << ": An error has occurred when running "
+                                             "the classifier inference tests: " << e.what() << std::endl;
+    }
+    return retVal;
+}
diff --git a/tests/TfLiteMobileNetQuantizedSoftmax-Armnn/Validation.txt b/tests/TfLiteMobileNetQuantizedSoftmax-Armnn/Validation.txt
new file mode 100644
index 0000000..2725ade
--- /dev/null
+++ b/tests/TfLiteMobileNetQuantizedSoftmax-Armnn/Validation.txt
@@ -0,0 +1,201 @@
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
+795
+592
+436
\ No newline at end of file