1 // Copyright (C) 2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <gtest/gtest.h>
6 #include <tests_common.hpp>
7 #include <ie_parameter.hpp>
8 #include <ie_layouts.h>
10 using namespace InferenceEngine;
12 class DestructorTest {
18 DestructorTest(const DestructorTest& c) {
22 DestructorTest(const DestructorTest&& c) {
30 static size_t destructorCount;
31 static size_t constructorCount;
33 size_t DestructorTest::destructorCount = 0;
34 size_t DestructorTest::constructorCount = 0;
36 class ParameterTests : public TestsCommon {
38 void SetUp() override {
40 DestructorTest::destructorCount = 0;
41 DestructorTest::constructorCount = 0;
45 TEST_F(ParameterTests, ParameterAsInt) {
47 ASSERT_TRUE(p.is<int>());
52 TEST_F(ParameterTests, ParameterAsUInt) {
54 ASSERT_TRUE(p.is<unsigned int>());
55 ASSERT_FALSE(p.is<size_t>());
56 unsigned int test = p;
60 TEST_F(ParameterTests, ParameterAsSize_t) {
63 ASSERT_TRUE(p.is<size_t>());
68 TEST_F(ParameterTests, ParameterAsFloat) {
70 ASSERT_TRUE(p.is<float>());
75 TEST_F(ParameterTests, ParameterAsString) {
76 std::string ref = "test";
79 ASSERT_TRUE(p.is<std::string>());
83 TEST_F(ParameterTests, ParameterAsStringInLine) {
86 ASSERT_TRUE(p.is<std::string>());
87 ASSERT_EQ("test", test);
90 TEST_F(ParameterTests, IntParameterAsString) {
92 ASSERT_TRUE(p.is<int>());
93 ASSERT_FALSE(p.is<std::string>());
94 ASSERT_THROW(std::string test = p, std::bad_cast);
95 ASSERT_THROW(std::string test = p.as<std::string>(), std::bad_cast);
98 TEST_F(ParameterTests, StringParameterAsInt) {
100 ASSERT_FALSE(p.is<int>());
101 ASSERT_TRUE(p.is<std::string>());
102 ASSERT_THROW(int test = p, std::bad_cast);
103 ASSERT_THROW(int test = p.as<int>(), std::bad_cast);
106 TEST_F(ParameterTests, ParameterAsTensorDesc) {
107 TensorDesc ref(Precision::FP32, {1, 3, 2, 2}, Layout::NCHW);
109 ASSERT_TRUE(p.is<TensorDesc>());
111 ASSERT_EQ(ref, test);
114 TEST_F(ParameterTests, ParameterAsInts) {
115 std::vector<int> ref = {1, 2, 3, 4, 5};
117 ASSERT_TRUE(p.is<std::vector<int>>());
118 std::vector<int> test = p;
119 ASSERT_EQ(ref.size(), test.size());
120 for (size_t i = 0; i < ref.size(); i++) {
121 ASSERT_EQ(ref[i], test[i]);
125 TEST_F(ParameterTests, ParameterAsUInts) {
126 std::vector<unsigned int> ref = {1, 2, 3, 4, 5};
128 ASSERT_TRUE(p.is<std::vector<unsigned int>>());
129 std::vector<unsigned int> test = p;
130 ASSERT_EQ(ref.size(), test.size());
131 for (size_t i = 0; i < ref.size(); i++) {
132 ASSERT_EQ(ref[i], test[i]);
136 TEST_F(ParameterTests, ParameterAsSize_ts) {
137 std::vector<size_t> ref = {1, 2, 3, 4, 5};
139 ASSERT_TRUE(p.is<std::vector<size_t>>());
140 std::vector<size_t> test = p;
141 ASSERT_EQ(ref.size(), test.size());
142 for (size_t i = 0; i < ref.size(); i++) {
143 ASSERT_EQ(ref[i], test[i]);
147 TEST_F(ParameterTests, ParameterAsFloats) {
148 std::vector<float> ref = {1, 2, 3, 4, 5};
150 ASSERT_TRUE(p.is<std::vector<float>>());
151 std::vector<float> test = p;
152 ASSERT_EQ(ref.size(), test.size());
153 for (size_t i = 0; i < ref.size(); i++) {
154 ASSERT_EQ(ref[i], test[i]);
158 TEST_F(ParameterTests, ParameterAsStrings) {
159 std::vector<std::string> ref = {"test1", "test2", "test3", "test4", "test1"};
161 ASSERT_TRUE(p.is<std::vector<std::string>>());
162 std::vector<std::string> test = p;
163 ASSERT_EQ(ref.size(), test.size());
164 for (size_t i = 0; i < ref.size(); i++) {
165 ASSERT_EQ(ref[i], test[i]);
169 TEST_F(ParameterTests, ParameterAsMapOfParameters) {
170 std::map<std::string, Parameter> refMap;
171 refMap["testParamInt"] = 4;
172 refMap["testParamString"] = "test";
173 Parameter p = refMap;
174 bool isMap = p.is<std::map<std::string, Parameter>>();
176 std::map<std::string, Parameter> testMap = p;
178 ASSERT_NE(testMap.find("testParamInt"), testMap.end());
179 ASSERT_NE(testMap.find("testParamString"), testMap.end());
181 int testInt = testMap["testParamInt"];
182 std::string testString = testMap["testParamString"];
184 ASSERT_EQ(refMap["testParamInt"].as<int>(), testInt);
185 ASSERT_EQ(refMap["testParamString"].as<std::string>(), testString);
188 TEST_F(ParameterTests, ParameterNotEmpty) {
190 ASSERT_FALSE(p.empty());
193 TEST_F(ParameterTests, ParameterEmpty) {
195 ASSERT_TRUE(p.empty());
198 TEST_F(ParameterTests, ParameterClear) {
200 ASSERT_FALSE(p.empty());
202 ASSERT_TRUE(p.empty());
205 TEST_F(ParameterTests, ParametersNotEqualByType) {
207 Parameter p2 = "string";
208 ASSERT_TRUE(p1 != p2);
209 ASSERT_FALSE(p1 == p2);
212 TEST_F(ParameterTests, ParametersNotEqualByValue) {
215 ASSERT_TRUE(p1 != p2);
216 ASSERT_FALSE(p1 == p2);
219 TEST_F(ParameterTests, ParametersEqual) {
222 ASSERT_TRUE(p1 == p2);
223 ASSERT_FALSE(p1 != p2);
226 TEST_F(ParameterTests, CompareParametersWithoutEqualOperator) {
229 TestClass(int test, int* testPtr): test(test), testPtr(testPtr) {}
236 TestClass a(2, (int *)0x234);
237 TestClass b(2, (int *)0x234);
238 TestClass c(3, (int *)0x234);
243 ASSERT_THROW(bool equal = parA == parB, details::InferenceEngineException);
244 ASSERT_THROW(bool equal = parA != parB, details::InferenceEngineException);
245 ASSERT_THROW(bool equal = parA == parC, details::InferenceEngineException);
246 ASSERT_THROW(bool equal = parA != parC, details::InferenceEngineException);
249 TEST_F(ParameterTests, ParameterRemovedRealObject) {
250 ASSERT_EQ(0, DestructorTest::constructorCount);
251 ASSERT_EQ(0, DestructorTest::destructorCount);
256 ASSERT_EQ(2, DestructorTest::constructorCount);
257 ASSERT_EQ(2, DestructorTest::destructorCount);
260 TEST_F(ParameterTests, ParameterRemovedRealObjectWithDuplication) {
261 ASSERT_EQ(0, DestructorTest::constructorCount);
262 ASSERT_EQ(0, DestructorTest::destructorCount);
266 ASSERT_EQ(0, DestructorTest::destructorCount);
268 ASSERT_EQ(2, DestructorTest::destructorCount);
270 ASSERT_EQ(4, DestructorTest::constructorCount);
271 ASSERT_EQ(4, DestructorTest::destructorCount);
274 TEST_F(ParameterTests, ParameterRemovedRealObjectPointerWithDuplication) {
275 ASSERT_EQ(0, DestructorTest::constructorCount);
276 ASSERT_EQ(0, DestructorTest::destructorCount);
278 auto * t = new DestructorTest();
280 ASSERT_EQ(1, DestructorTest::constructorCount);
281 ASSERT_EQ(0, DestructorTest::destructorCount);
283 ASSERT_TRUE(p.is<DestructorTest *>());
284 DestructorTest* t2 = p;
285 ASSERT_EQ(0, DestructorTest::destructorCount);
287 auto * t3 = p.as<DestructorTest *>();
290 ASSERT_EQ(1, DestructorTest::constructorCount);
291 ASSERT_EQ(1, DestructorTest::destructorCount);