//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <boost/test/unit_test.hpp>
#include  "armnnOnnxParser/IOnnxParser.hpp"
#include "google/protobuf/stubs/logging.h"

BOOST_AUTO_TEST_SUITE(OnnxParser)

BOOST_AUTO_TEST_CASE(CreateNetworkFromString)
{
  std::string TestModel = R"(
                          ir_version: 3
                          producer_name:  "CNTK "
                          producer_version:  "2.5.1 "
                          domain:  "ai.cntk "
                          model_version: 1
                          graph {
                            name:  "CNTKGraph "
                            output {
                                 name:  "Output"
                                 type {
                                    tensor_type {
                                      elem_type: FLOAT
                                      shape {
                                        dim {
                                           dim_value: 1
                                        }
                                        dim {
                                           dim_value: 10
                                        }
                                      }
                                    }
                                 }
                             }
                          }
                          opset_import {
                             version: 7
                           })";

    armnnOnnxParser::IOnnxParserPtr parser(armnnOnnxParser::IOnnxParser::Create());

    armnn::INetworkPtr network = parser->CreateNetworkFromString(TestModel.c_str());
    BOOST_TEST(network.get());
}

BOOST_AUTO_TEST_CASE(CreateNetworkFromStringWithNullptr)
{
    armnnOnnxParser::IOnnxParserPtr parser(armnnOnnxParser::IOnnxParser::Create());
    BOOST_CHECK_THROW(parser->CreateNetworkFromString(""), armnn::InvalidArgumentException );
}

BOOST_AUTO_TEST_CASE(CreateNetworkWithInvalidString)
{
    auto silencer = google::protobuf::LogSilencer(); //get rid of errors from protobuf
    armnnOnnxParser::IOnnxParserPtr parser(armnnOnnxParser::IOnnxParser::Create());
    BOOST_CHECK_THROW(parser->CreateNetworkFromString( "I'm not a model so I should raise an error" ),
                      armnn::ParseException );
}

BOOST_AUTO_TEST_SUITE_END()
