1 /**
2 * Copyright 2019 Huawei Technologies Co., Ltd
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include <string>
17 #include "./securec.h"
18 #include "minddata/dataset/core/data_type.h"
19 #include "common/common.h"
20 #include "gtest/gtest.h"
21 #include <opencv2/opencv.hpp>
22 #include "minddata/dataset/include/dataset/constants.h"
23
24 using namespace mindspore::dataset;
25
26 class MindDataTestDatatype : public UT::Common {
27 public:
28 MindDataTestDatatype() = default;
29 };
30
31
TEST_F(MindDataTestDatatype,TestSizes)32 TEST_F(MindDataTestDatatype, TestSizes) {
33 uint8_t x = DataType::kTypeInfo[DataType::DE_BOOL].sizeInBytes_;
34 DataType d = DataType(DataType::DE_BOOL);
35 ASSERT_EQ(x, 1);
36 ASSERT_EQ(d.SizeInBytes(), x);
37 x = DataType::kTypeInfo[DataType::DE_INT8].sizeInBytes_;
38 d = DataType(DataType::DE_INT8);
39 ASSERT_EQ(x, 1);
40 ASSERT_EQ(d.SizeInBytes(), x);
41 x = DataType::kTypeInfo[DataType::DE_UINT8].sizeInBytes_;
42 d = DataType(DataType::DE_UINT8);
43 ASSERT_EQ(x, 1);
44 ASSERT_EQ(d.SizeInBytes(), x);
45 x = DataType::kTypeInfo[DataType::DE_INT16].sizeInBytes_;
46 d = DataType(DataType::DE_INT16);
47 ASSERT_EQ(x, 2);
48 ASSERT_EQ(d.SizeInBytes(), x);
49 x = DataType::kTypeInfo[DataType::DE_UINT16].sizeInBytes_;
50 d = DataType(DataType::DE_UINT16);
51 ASSERT_EQ(x, 2);
52 ASSERT_EQ(d.SizeInBytes(), x);
53 x = DataType::kTypeInfo[DataType::DE_INT32].sizeInBytes_;
54 d = DataType(DataType::DE_INT32);
55 ASSERT_EQ(x, 4);
56 ASSERT_EQ(d.SizeInBytes(), x);
57 x = DataType::kTypeInfo[DataType::DE_UINT32].sizeInBytes_;
58 d = DataType(DataType::DE_UINT32);
59 ASSERT_EQ(x, 4);
60 ASSERT_EQ(d.SizeInBytes(), x);
61 x = DataType::kTypeInfo[DataType::DE_INT64].sizeInBytes_;
62 d = DataType(DataType::DE_INT64);
63 ASSERT_EQ(x, 8);
64 ASSERT_EQ(d.SizeInBytes(), x);
65 x = DataType::kTypeInfo[DataType::DE_UINT64].sizeInBytes_;
66 d = DataType(DataType::DE_UINT64);
67 ASSERT_EQ(x, 8);
68 ASSERT_EQ(d.SizeInBytes(), x);
69 x = DataType::kTypeInfo[DataType::DE_FLOAT32].sizeInBytes_;
70 d = DataType(DataType::DE_FLOAT32);
71 ASSERT_EQ(x, 4);
72 ASSERT_EQ(d.SizeInBytes(), x);
73 x = DataType::kTypeInfo[DataType::DE_FLOAT64].sizeInBytes_;
74 d = DataType(DataType::DE_FLOAT64);
75 ASSERT_EQ(x, 8);
76 ASSERT_EQ(d.SizeInBytes(), x);
77 }
78
FromDT(DataType d,uint8_t cv_type,std::string str)79 void FromDT(DataType d, uint8_t cv_type, std::string str) {
80 if (d == DataType::DE_UNKNOWN || d == DataType::DE_UINT32 || d == DataType::DE_UINT64 || d == DataType::DE_INT64) {
81 ASSERT_EQ(d.AsCVType(), kCVInvalidType);
82 } else {
83 ASSERT_EQ(d.AsCVType(), cv_type);
84 }
85 ASSERT_EQ(d.ToString(), str);
86 }
87
TEST_F(MindDataTestDatatype,TestConstructors)88 TEST_F(MindDataTestDatatype, TestConstructors) {
89 // Default constructor
90 DataType d;
91 ASSERT_EQ(d, DataType::DE_UNKNOWN);
92 DataType d3 = DataType();
93 ASSERT_EQ(d3, DataType::DE_UNKNOWN);
94
95 // DataType(Type d)
96 DataType d4(DataType::DE_FLOAT32);
97 ASSERT_EQ(d4, DataType::DE_FLOAT32);
98 DataType d5 = DataType(DataType::DE_UINT32);
99 ASSERT_EQ(d5, DataType::DE_UINT32);
100
101 // != operator
102 ASSERT_NE(d4, d5);
103
104 // == operator
105 d5 = DataType(DataType::DE_FLOAT32);
106 ASSERT_EQ(d4, d5);
107 }
108
TEST_F(MindDataTestDatatype,TestFromTypes)109 TEST_F(MindDataTestDatatype, TestFromTypes) {
110 FromDT(DataType(DataType::DE_BOOL), CV_8U, "bool");
111 FromDT(DataType(DataType::DE_UINT8), CV_8U, "uint8");
112 FromDT(DataType(DataType::DE_INT8), CV_8S, "int8");
113 FromDT(DataType(DataType::DE_UINT16), CV_16U, "uint16");
114 FromDT(DataType(DataType::DE_INT16), CV_16S, "int16");
115 FromDT(DataType(DataType::DE_UINT32), 0, "uint32");
116 FromDT(DataType(DataType::DE_INT32), CV_32S, "int32");
117 FromDT(DataType(DataType::DE_UINT64), 0, "uint64");
118 FromDT(DataType(DataType::DE_INT64), 0, "int64");
119 FromDT(DataType(DataType::DE_FLOAT32), CV_32F, "float32");
120 FromDT(DataType(DataType::DE_FLOAT64), CV_64F, "float64");
121 FromDT(DataType(DataType::DE_UNKNOWN), CV_8U, "unknown");
122 }
123
TEST_F(MindDataTestDatatype,TestCompatible)124 TEST_F(MindDataTestDatatype, TestCompatible) {
125 ASSERT_TRUE(DataType(DataType::DE_BOOL).IsCompatible<bool>());
126 ASSERT_TRUE(DataType(DataType::DE_UINT8).IsCompatible<uint8_t>());
127 ASSERT_TRUE(DataType(DataType::DE_INT8).IsCompatible<int8_t>());
128 ASSERT_TRUE(DataType(DataType::DE_UINT16).IsCompatible<uint16_t>());
129 ASSERT_TRUE(DataType(DataType::DE_INT16).IsCompatible<int16_t>());
130 ASSERT_TRUE(DataType(DataType::DE_UINT32).IsCompatible<uint32_t>());
131 ASSERT_TRUE(DataType(DataType::DE_INT32).IsCompatible<int32_t>());
132 ASSERT_TRUE(DataType(DataType::DE_UINT64).IsCompatible<uint64_t>());
133 ASSERT_TRUE(DataType(DataType::DE_INT64).IsCompatible<int64_t>());
134 ASSERT_TRUE(DataType(DataType::DE_FLOAT32).IsCompatible<float>());
135 ASSERT_TRUE(DataType(DataType::DE_FLOAT64).IsCompatible<double>());
136
137 ASSERT_FALSE(DataType(DataType::DE_UINT8).IsCompatible<bool>());
138 ASSERT_FALSE(DataType(DataType::DE_BOOL).IsCompatible<uint8_t>());
139 ASSERT_FALSE(DataType(DataType::DE_UINT8).IsCompatible<int8_t>());
140 ASSERT_FALSE(DataType(DataType::DE_UINT32).IsCompatible<uint16_t>());
141 ASSERT_FALSE(DataType(DataType::DE_INT64).IsCompatible<double>());
142
143 ASSERT_TRUE(DataType(DataType::DE_BOOL).IsLooselyCompatible<bool>());
144 ASSERT_FALSE(DataType(DataType::DE_INT16).IsLooselyCompatible<bool>());
145
146 ASSERT_TRUE(DataType(DataType::DE_UINT8).IsLooselyCompatible<uint8_t>());
147 ASSERT_FALSE(DataType(DataType::DE_UINT64).IsLooselyCompatible<uint8_t>());
148
149 ASSERT_TRUE(DataType(DataType::DE_UINT64).IsLooselyCompatible<uint64_t>());
150 ASSERT_TRUE(DataType(DataType::DE_UINT32).IsLooselyCompatible<uint64_t>());
151 ASSERT_TRUE(DataType(DataType::DE_UINT16).IsLooselyCompatible<uint64_t>());
152 ASSERT_TRUE(DataType(DataType::DE_UINT8).IsLooselyCompatible<uint64_t>());
153
154
155 }
156
TEST_F(MindDataTestDatatype,TestCVTypes)157 TEST_F(MindDataTestDatatype, TestCVTypes) {
158 ASSERT_EQ(DataType::DE_UINT8, DataType::FromCVType(CV_8U).value());
159 ASSERT_EQ(DataType::DE_UINT8, DataType::FromCVType(CV_8UC1).value());
160 ASSERT_EQ(DataType::DE_UINT8, DataType::FromCVType(CV_8UC2).value());
161 ASSERT_EQ(DataType::DE_UINT8, DataType::FromCVType(CV_8UC3).value());
162 ASSERT_EQ(DataType::DE_UINT8, DataType::FromCVType(CV_8UC4).value());
163 ASSERT_EQ(DataType::DE_UINT8, DataType::FromCVType(CV_8UC(5)).value());
164 ASSERT_EQ(DataType::DE_INT8, DataType::FromCVType(CV_8S).value());
165 ASSERT_EQ(DataType::DE_INT8, DataType::FromCVType(CV_8SC1).value());
166 ASSERT_EQ(DataType::DE_INT8, DataType::FromCVType(CV_8SC2).value());
167 ASSERT_EQ(DataType::DE_INT8, DataType::FromCVType(CV_8SC3).value());
168 ASSERT_EQ(DataType::DE_INT8, DataType::FromCVType(CV_8SC(5)).value());
169 ASSERT_EQ(DataType::DE_UINT16, DataType::FromCVType(CV_16U).value());
170 ASSERT_EQ(DataType::DE_UINT16, DataType::FromCVType(CV_16UC1).value());
171 ASSERT_EQ(DataType::DE_UINT16, DataType::FromCVType(CV_16UC2).value());
172 ASSERT_EQ(DataType::DE_UINT16, DataType::FromCVType(CV_16UC3).value());
173 ASSERT_EQ(DataType::DE_UINT16, DataType::FromCVType(CV_16UC4).value());
174 ASSERT_EQ(DataType::DE_UINT16, DataType::FromCVType(CV_16UC(5)).value());
175 ASSERT_EQ(DataType::DE_INT16, DataType::FromCVType(CV_16S).value());
176 ASSERT_EQ(DataType::DE_INT16, DataType::FromCVType(CV_16SC1).value());
177 ASSERT_EQ(DataType::DE_INT16, DataType::FromCVType(CV_16SC2).value());
178 ASSERT_EQ(DataType::DE_INT16, DataType::FromCVType(CV_16SC3).value());
179 ASSERT_EQ(DataType::DE_INT16, DataType::FromCVType(CV_16SC(5)).value());
180 ASSERT_EQ(DataType::DE_INT32, DataType::FromCVType(CV_32S).value());
181 ASSERT_EQ(DataType::DE_INT32, DataType::FromCVType(CV_32SC1).value());
182 ASSERT_EQ(DataType::DE_INT32, DataType::FromCVType(CV_32SC2).value());
183 ASSERT_EQ(DataType::DE_INT32, DataType::FromCVType(CV_32SC3).value());
184 ASSERT_EQ(DataType::DE_INT32, DataType::FromCVType(CV_32SC(5)).value());
185 ASSERT_EQ(DataType::DE_FLOAT32, DataType::FromCVType(CV_32F).value());
186 ASSERT_EQ(DataType::DE_FLOAT32, DataType::FromCVType(CV_32FC1).value());
187 ASSERT_EQ(DataType::DE_FLOAT32, DataType::FromCVType(CV_32FC2).value());
188 ASSERT_EQ(DataType::DE_FLOAT32, DataType::FromCVType(CV_32FC3).value());
189 ASSERT_EQ(DataType::DE_FLOAT32, DataType::FromCVType(CV_32FC(5)).value());
190 ASSERT_EQ(DataType::DE_FLOAT64, DataType::FromCVType(CV_64F).value());
191 ASSERT_EQ(DataType::DE_FLOAT64, DataType::FromCVType(CV_64FC1).value());
192 ASSERT_EQ(DataType::DE_FLOAT64, DataType::FromCVType(CV_64FC2).value());
193 ASSERT_EQ(DataType::DE_FLOAT64, DataType::FromCVType(CV_64FC3).value());
194 ASSERT_EQ(DataType::DE_FLOAT64, DataType::FromCVType(CV_64FC(5)).value());
195 }
196