blob: d7a4371548d41b4d343d8cd9c5cb616c1ae4afa9 [file] [log] [blame]
telsoa01c577f2c2018-08-31 09:22:23 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa01c577f2c2018-08-31 09:22:23 +01004//
5
6#include <boost/test/unit_test.hpp>
7#include "ParserFlatbuffersFixture.hpp"
8#include "../TfLiteParser.hpp"
9
10BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
11
12struct EmptyNetworkFixture : public ParserFlatbuffersFixture
13{
14 explicit EmptyNetworkFixture() {
15 m_JsonString = R"(
16 {
17 "version": 3,
18 "operator_codes": [],
19 "subgraphs": [ {} ]
20 })";
21 }
22};
23
24BOOST_FIXTURE_TEST_CASE(EmptyNetworkHasNoInputsAndOutputs, EmptyNetworkFixture)
25{
26 Setup();
27 BOOST_TEST(m_Parser->GetSubgraphCount() == 1);
28 BOOST_TEST(m_Parser->GetSubgraphInputTensorNames(0).size() == 0);
29 BOOST_TEST(m_Parser->GetSubgraphOutputTensorNames(0).size() == 0);
30}
31
32struct MissingTensorsFixture : public ParserFlatbuffersFixture
33{
34 explicit MissingTensorsFixture()
35 {
36 m_JsonString = R"(
37 {
38 "version": 3,
39 "operator_codes": [],
40 "subgraphs": [{
41 "inputs" : [ 0, 1 ],
42 "outputs" : [ 2, 3 ],
43 }]
44 })";
45 }
46};
47
48BOOST_FIXTURE_TEST_CASE(MissingTensorsThrowException, MissingTensorsFixture)
49{
50 // this throws because it cannot do the input output tensor connections
51 BOOST_CHECK_THROW(Setup(), armnn::ParseException);
52}
53
54struct InvalidTensorsFixture : public ParserFlatbuffersFixture
55{
56 explicit InvalidTensorsFixture()
57 {
58 m_JsonString = R"(
59 {
60 "version": 3,
61 "operator_codes": [ ],
62 "subgraphs": [{
Narumol Prangnawarat4818d462019-04-17 11:22:38 +010063 "tensors": [ {
Matthew Jacksondba634f2019-08-15 15:14:18 +010064 "shape": [ 1, 1, 1, 1, 1, 1 ],
Narumol Prangnawarat4818d462019-04-17 11:22:38 +010065 "type": "FLOAT32",
66 "name": "In",
67 "buffer": 0
68 }, {
Matthew Jacksondba634f2019-08-15 15:14:18 +010069 "shape": [ 1, 1, 1, 1, 1, 1 ],
Narumol Prangnawarat4818d462019-04-17 11:22:38 +010070 "type": "FLOAT32",
71 "name": "Out",
72 "buffer": 1
73 }],
74 "inputs" : [ 0 ],
75 "outputs" : [ 1 ],
telsoa01c577f2c2018-08-31 09:22:23 +010076 }]
77 })";
78 }
79};
80
81BOOST_FIXTURE_TEST_CASE(InvalidTensorsThrowException, InvalidTensorsFixture)
82{
Narumol Prangnawarat4818d462019-04-17 11:22:38 +010083 // Tensor numDimensions must be less than or equal to MaxNumOfTensorDimensions
Matthew Jacksondba634f2019-08-15 15:14:18 +010084 static_assert(armnn::MaxNumOfTensorDimensions == 5, "Please update InvalidTensorsFixture");
telsoa01c577f2c2018-08-31 09:22:23 +010085 BOOST_CHECK_THROW(Setup(), armnn::InvalidArgumentException);
86}
87
88struct ValidTensorsFixture : public ParserFlatbuffersFixture
89{
90 explicit ValidTensorsFixture()
91 {
92 m_JsonString = R"(
93 {
94 "version": 3,
95 "operator_codes": [ { "builtin_code": "AVERAGE_POOL_2D" } ],
96 "subgraphs": [{
97 "tensors": [ {
98 "shape": [ 1, 1, 1, 1 ],
99 "type": "FLOAT32",
100 "name": "In",
101 "buffer": 0,
102 }, {
103 "shape": [ 1, 1, 1, 1 ],
104 "type": "FLOAT32",
105 "name": "Out",
106 "buffer": 1,
107 }],
108 "inputs" : [ 0 ],
109 "outputs" : [ 1 ],
110 "operators": [{
111 "opcode_index": 0,
112 "inputs": [ 0 ],
113 "outputs": [ 1 ],
114 "builtin_options_type": "Pool2DOptions",
115 "builtin_options":
116 {
117 "padding": "VALID",
118 "stride_w": 1,
119 "stride_h": 1,
120 "filter_width": 1,
121 "filter_height": 1,
122 "fused_activation_function": "NONE"
123 },
124 "custom_options_format": "FLEXBUFFERS"
125 }]
126 }]
127 })";
128 }
129};
130
131BOOST_FIXTURE_TEST_CASE(GetValidInputOutputTensorNames, ValidTensorsFixture)
132{
133 Setup();
134 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0).size(), 1u);
135 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0).size(), 1u);
136 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0)[0], "In");
137 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0)[0], "Out");
138}
139
140BOOST_FIXTURE_TEST_CASE(ThrowIfSubgraphIdInvalidForInOutNames, ValidTensorsFixture)
141{
142 Setup();
143
144 // these throw because of the invalid subgraph id
145 BOOST_CHECK_THROW(m_Parser->GetSubgraphInputTensorNames(1), armnn::ParseException);
146 BOOST_CHECK_THROW(m_Parser->GetSubgraphOutputTensorNames(1), armnn::ParseException);
147}
148
Narumol Prangnawarat4818d462019-04-17 11:22:38 +0100149struct Rank0TensorFixture : public ParserFlatbuffersFixture
150{
151 explicit Rank0TensorFixture()
152 {
153 m_JsonString = R"(
154 {
155 "version": 3,
156 "operator_codes": [ { "builtin_code": "MINIMUM" } ],
157 "subgraphs": [{
158 "tensors": [ {
159 "shape": [ ],
160 "type": "FLOAT32",
161 "name": "In0",
162 "buffer": 0,
163 }, {
164 "shape": [ ],
165 "type": "FLOAT32",
166 "name": "In1",
167 "buffer": 1,
168 }, {
169 "shape": [ ],
170 "type": "FLOAT32",
171 "name": "Out",
172 "buffer": 2,
173 }],
174 "inputs" : [ 0, 1 ],
175 "outputs" : [ 2 ],
176 "operators": [{
177 "opcode_index": 0,
178 "inputs": [ 0, 1 ],
179 "outputs": [ 2 ],
180 "custom_options_format": "FLEXBUFFERS"
181 }]
182 }]
183 }
184 )";
185 }
186};
187
188BOOST_FIXTURE_TEST_CASE(Rank0Tensor, Rank0TensorFixture)
189{
190 Setup();
191 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0).size(), 2u);
192 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0).size(), 1u);
193 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0)[0], "In0");
194 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphInputTensorNames(0)[1], "In1");
195 BOOST_CHECK_EQUAL(m_Parser->GetSubgraphOutputTensorNames(0)[0], "Out");
196}
197
telsoa01c577f2c2018-08-31 09:22:23 +0100198BOOST_AUTO_TEST_SUITE_END()