Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / tests / unit / inference_engine_tests / precision_test.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <gtest/gtest.h>
6 #include <ie_precision.hpp>
7 #include "ie_common.h"
8
9 using namespace InferenceEngine;
10
11 class PrecisionTests : public ::testing::Test {};
12
13 TEST_F(PrecisionTests, ShowsCorrectPrecisionNames) {
14     ASSERT_STREQ(Precision(Precision::FP16).name(),  "FP16" );
15     ASSERT_STREQ(Precision(Precision::FP32).name(),  "FP32" );
16     ASSERT_STREQ(Precision(Precision::I16).name() ,  "I16"  );
17     ASSERT_STREQ(Precision(Precision::I32).name() ,  "I32"  );
18     ASSERT_STREQ(Precision(Precision::U16).name() ,  "U16"  );
19     ASSERT_STREQ(Precision(Precision::I8).name()  ,  "I8"   );
20     ASSERT_STREQ(Precision(Precision::Q78).name() ,  "Q78"  );
21     ASSERT_STREQ(Precision(Precision::U8).name()  ,  "U8"   );
22     ASSERT_STREQ(Precision(Precision::MIXED).name(), "MIXED");
23     ASSERT_STREQ(Precision(Precision::UNSPECIFIED).name(), "UNSPECIFIED");
24     ASSERT_STREQ(Precision(static_cast<Precision::ePrecision >(-3)).name(), "UNSPECIFIED");
25     ASSERT_STREQ(Precision(1, "Custom Name").name(), "Custom Name");
26 }
27
28 TEST_F(PrecisionTests, sizeIsCorrect) {
29     ASSERT_EQ(Precision(Precision::FP16).size(), 2);
30     ASSERT_EQ(Precision(Precision::FP32).size(), 4);
31     ASSERT_EQ(Precision(Precision::I32).size(), 4);
32     ASSERT_EQ(Precision(Precision::I16).size(), 2);
33     ASSERT_EQ(Precision(Precision::U16).size(), 2);
34     ASSERT_EQ(Precision(Precision::I8).size(), 1);
35     ASSERT_EQ(Precision(Precision::Q78).size(), 2);
36     ASSERT_EQ(Precision(Precision::U8).size(), 1);
37     ASSERT_EQ(Precision(10*8).size(), 10);
38     ASSERT_ANY_THROW(Precision(Precision::MIXED).size());
39     ASSERT_ANY_THROW(Precision(Precision::UNSPECIFIED).size());
40 }
41
42 TEST_F(PrecisionTests, is_float) {
43     ASSERT_TRUE(Precision(Precision::FP16).is_float());
44     ASSERT_TRUE(Precision(Precision::FP32).is_float());
45     ASSERT_FALSE(Precision(Precision::I32).is_float());
46     ASSERT_FALSE(Precision(Precision::I16).is_float());
47     ASSERT_FALSE(Precision(Precision::U16).is_float());
48     ASSERT_FALSE(Precision(Precision::I8).is_float());
49     ASSERT_FALSE(Precision(Precision::Q78).is_float());
50     ASSERT_FALSE(Precision(Precision::U8).is_float());
51     ASSERT_FALSE(Precision(Precision::MIXED).is_float());
52     ASSERT_FALSE(Precision(10).is_float());
53     ASSERT_FALSE(Precision(static_cast<Precision::ePrecision >(-3)).is_float());
54     ASSERT_FALSE(Precision(Precision::UNSPECIFIED).is_float());
55 }
56
57 TEST_F(PrecisionTests, constructFromSTR) {
58     ASSERT_EQ(Precision(Precision::FP16), Precision::FromStr("FP16"));
59     ASSERT_EQ(Precision(Precision::FP32),  Precision::FromStr("FP32" ));
60     ASSERT_EQ(Precision(Precision::I32),  Precision::FromStr("I32" ));
61     ASSERT_EQ(Precision(Precision::I16),  Precision::FromStr("I16"  ));
62     ASSERT_EQ(Precision(Precision::U16),  Precision::FromStr("U16"  ));
63     ASSERT_EQ(Precision(Precision::I8),  Precision::FromStr("I8"   ));
64     ASSERT_EQ(Precision(Precision::Q78),  Precision::FromStr("Q78"  ));
65     ASSERT_EQ(Precision(Precision::U8),  Precision::FromStr("U8"));
66     ASSERT_EQ(Precision(Precision::MIXED), Precision::FromStr("MIXED"));
67     ASSERT_EQ(Precision(static_cast<Precision::ePrecision >(-3)), Precision::FromStr("UNSPECIFIED"));
68     ASSERT_EQ(Precision(Precision::UNSPECIFIED), Precision::FromStr("UNSPECIFIED"));
69 }
70
71 TEST_F(PrecisionTests, canCompareCustomPrecisions) {
72     Precision p (12);
73     Precision p1 (12, "XXX");
74     ASSERT_FALSE(p == p1);
75
76     std::string d;
77     d.push_back('X');
78     d.push_back('X');
79     d.push_back('X');
80     Precision p2 (12, d.c_str());
81     ASSERT_TRUE(p2 == p1);
82
83     Precision p3 (13, "XXX");
84     ASSERT_FALSE(p3 == p1);
85
86     Precision p4 (13);
87     ASSERT_FALSE(p4 == p);
88
89     Precision p5 (12);
90     ASSERT_TRUE(p5 == p);
91 }
92
93
94 TEST_F(PrecisionTests, canUseInIfs) {
95     Precision p;
96     ASSERT_TRUE(!p);
97     p = Precision::FP32;
98     ASSERT_FALSE(!p);
99     ASSERT_TRUE(p);
100     p = Precision(static_cast<Precision::ePrecision >(-3));
101     ASSERT_TRUE(!p);
102 }
103
104 TEST_F(PrecisionTests, canCreateFromStruct) {
105     struct X {
106         int a;
107         int b;
108     };
109     auto precision = Precision::fromType<X>();
110     ASSERT_EQ(precision.size(), sizeof(X));
111 }
112
113 TEST_F(PrecisionTests, canCreateMoreThan255bitsPrecisions) {
114     struct Y {
115         uint8_t a[257];
116     };
117
118     ASSERT_NO_THROW(Precision::fromType<Y>());
119     ASSERT_EQ(Precision::fromType<Y>().size(), 257);
120 }