1 // Copyright 2018 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/vkscript/datum_type_parser.h"
16 
17 #include "gtest/gtest.h"
18 #include "src/format.h"
19 
20 namespace amber {
21 namespace vkscript {
22 namespace {
23 
AllCompsAreType(Format * fmt,FormatMode mode,uint8_t num_bits)24 bool AllCompsAreType(Format* fmt, FormatMode mode, uint8_t num_bits) {
25   for (auto& seg : fmt->GetSegments()) {
26     if (seg.IsPadding())
27       continue;
28     if (seg.GetNumBits() != num_bits)
29       return false;
30     if (seg.GetFormatMode() != mode)
31       return false;
32   }
33 
34   return true;
35 }
36 
37 }  // namespace
38 
39 using DatumTypeParserTest = testing::Test;
40 
TEST_F(DatumTypeParserTest,EmptyType)41 TEST_F(DatumTypeParserTest, EmptyType) {
42   DatumTypeParser tp;
43   auto type = tp.Parse("");
44   ASSERT_TRUE(type == nullptr);
45 }
46 
TEST_F(DatumTypeParserTest,InvalidType)47 TEST_F(DatumTypeParserTest, InvalidType) {
48   DatumTypeParser tp;
49   auto type = tp.Parse("INVALID");
50   ASSERT_TRUE(type == nullptr);
51 }
52 
53 struct DatumTypeData {
54   const char* name;
55   FormatMode type;
56   uint8_t num_bits;
57   uint32_t column_count;
58   uint32_t row_count;
59 };
60 
61 using DatumTypeDataTest = testing::TestWithParam<DatumTypeData>;
62 
TEST_P(DatumTypeDataTest,Parser)63 TEST_P(DatumTypeDataTest, Parser) {
64   const auto& test_data = GetParam();
65 
66   DatumTypeParser tp;
67   auto type = tp.Parse(test_data.name);
68 
69   ASSERT_TRUE(type != nullptr);
70   Format fmt(type.get());
71   EXPECT_TRUE(AllCompsAreType(&fmt, test_data.type, test_data.num_bits));
72   EXPECT_EQ(test_data.column_count, type->ColumnCount());
73   EXPECT_EQ(test_data.row_count, type->RowCount());
74 }
75 
76 INSTANTIATE_TEST_SUITE_P(
77     DatumTypeParserTest1,
78     DatumTypeDataTest,
79     testing::Values(DatumTypeData{"int", FormatMode::kSInt, 32, 1, 1},
80                     DatumTypeData{"uint", FormatMode::kUInt, 32, 1, 1},
81                     DatumTypeData{"int8_t", FormatMode::kSInt, 8, 1, 1},
82                     DatumTypeData{"uint8_t", FormatMode::kUInt, 8, 1, 1},
83                     DatumTypeData{"int16_t", FormatMode::kSInt, 16, 1, 1},
84                     DatumTypeData{"uint16_t", FormatMode::kUInt, 16, 1, 1},
85                     DatumTypeData{"int64_t", FormatMode::kSInt, 64, 1, 1},
86                     DatumTypeData{"uint64_t", FormatMode::kUInt, 64, 1, 1},
87                     DatumTypeData{"float", FormatMode::kSFloat, 32, 1, 1},
88                     DatumTypeData{"double", FormatMode::kSFloat, 64, 1, 1},
89                     DatumTypeData{"vec2", FormatMode::kSFloat, 32, 1, 2},
90                     DatumTypeData{"vec3", FormatMode::kSFloat, 32, 1, 3},
91                     DatumTypeData{"vec4", FormatMode::kSFloat, 32, 1, 4},
92                     DatumTypeData{"dvec2", FormatMode::kSFloat, 64, 1, 2},
93                     DatumTypeData{"dvec3", FormatMode::kSFloat, 64, 1, 3},
94                     DatumTypeData{"dvec4", FormatMode::kSFloat, 64, 1, 4},
95                     DatumTypeData{"ivec2", FormatMode::kSInt, 32, 1, 2},
96                     DatumTypeData{"ivec3", FormatMode::kSInt, 32, 1, 3},
97                     DatumTypeData{"ivec4", FormatMode::kSInt, 32, 1, 4},
98                     DatumTypeData{"uvec2", FormatMode::kUInt, 32, 1, 2},
99                     DatumTypeData{"uvec3", FormatMode::kUInt, 32, 1, 3},
100                     DatumTypeData{"uvec4", FormatMode::kUInt, 32, 1, 4},
101                     DatumTypeData{"i8vec2", FormatMode::kSInt, 8, 1, 2},
102                     DatumTypeData{"i8vec3", FormatMode::kSInt, 8, 1, 3},
103                     DatumTypeData{"i8vec4", FormatMode::kSInt, 8, 1, 4},
104                     DatumTypeData{"u8vec2", FormatMode::kUInt, 8, 1, 2},
105                     DatumTypeData{"u8vec3", FormatMode::kUInt, 8, 1, 3},
106                     DatumTypeData{"u8vec4", FormatMode::kUInt, 8, 1, 4},
107                     DatumTypeData{"i16vec2", FormatMode::kSInt, 16, 1,
108                                   2}));  // NOLINT(whitespace/parens)
109 
110 INSTANTIATE_TEST_SUITE_P(
111     DatumTypeParserTest2,
112     DatumTypeDataTest,
113     testing::Values(DatumTypeData{"i16vec3", FormatMode::kSInt, 16, 1, 3},
114                     DatumTypeData{"i16vec4", FormatMode::kSInt, 16, 1, 4},
115                     DatumTypeData{"u16vec2", FormatMode::kUInt, 16, 1, 2},
116                     DatumTypeData{"u16vec3", FormatMode::kUInt, 16, 1, 3},
117                     DatumTypeData{"u16vec4", FormatMode::kUInt, 16, 1, 4},
118                     DatumTypeData{"i64vec2", FormatMode::kSInt, 64, 1, 2},
119                     DatumTypeData{"i64vec3", FormatMode::kSInt, 64, 1, 3},
120                     DatumTypeData{"i64vec4", FormatMode::kSInt, 64, 1, 4},
121                     DatumTypeData{"u64vec2", FormatMode::kUInt, 64, 1, 2},
122                     DatumTypeData{"u64vec3", FormatMode::kUInt, 64, 1, 3},
123                     DatumTypeData{"u64vec4", FormatMode::kUInt, 64, 1, 4},
124                     DatumTypeData{"mat2", FormatMode::kSFloat, 32, 2, 2},
125                     DatumTypeData{"mat2x2", FormatMode::kSFloat, 32, 2, 2},
126                     DatumTypeData{"mat2x3", FormatMode::kSFloat, 32, 2, 3},
127                     DatumTypeData{"mat2x4", FormatMode::kSFloat, 32, 2, 4},
128                     DatumTypeData{"mat3", FormatMode::kSFloat, 32, 3, 3},
129                     DatumTypeData{"mat3x2", FormatMode::kSFloat, 32, 3, 2},
130                     DatumTypeData{"mat3x3", FormatMode::kSFloat, 32, 3, 3},
131                     DatumTypeData{"mat3x4", FormatMode::kSFloat, 32, 3, 4},
132                     DatumTypeData{"mat4", FormatMode::kSFloat, 32, 4, 4},
133                     DatumTypeData{"mat4x2", FormatMode::kSFloat, 32, 4, 2},
134                     DatumTypeData{"mat4x3", FormatMode::kSFloat, 32, 4, 3},
135                     DatumTypeData{"mat4x4", FormatMode::kSFloat, 32, 4, 4},
136                     DatumTypeData{"dmat2", FormatMode::kSFloat, 64, 2, 2},
137                     DatumTypeData{"dmat2x2", FormatMode::kSFloat, 64, 2, 2},
138                     DatumTypeData{"dmat2x3", FormatMode::kSFloat, 64, 2, 3},
139                     DatumTypeData{"dmat2x4", FormatMode::kSFloat, 64, 2, 4},
140                     DatumTypeData{"dmat3", FormatMode::kSFloat, 64, 3, 3},
141                     DatumTypeData{"dmat3x2", FormatMode::kSFloat, 64, 3, 2},
142                     DatumTypeData{"dmat3x3", FormatMode::kSFloat, 64, 3, 3},
143                     DatumTypeData{"dmat3x4", FormatMode::kSFloat, 64, 3, 4},
144                     DatumTypeData{"dmat4", FormatMode::kSFloat, 64, 4, 4},
145                     DatumTypeData{"dmat4x2", FormatMode::kSFloat, 64, 4, 2},
146                     DatumTypeData{"dmat4x3", FormatMode::kSFloat, 64, 4, 3},
147                     DatumTypeData{"dmat4x4", FormatMode::kSFloat, 64, 4,
148                                   4}));  // NOLINT(whitespace/parens)
149 
150 struct DatumFormatData {
151   std::string name;
152   FormatType format_type;
153 };
154 
155 using DatumTypeTestFormat = testing::TestWithParam<DatumFormatData>;
TEST_P(DatumTypeTestFormat,ToFormat)156 TEST_P(DatumTypeTestFormat, ToFormat) {
157   auto test_data = GetParam();
158 
159   DatumTypeParser tp;
160   auto type = tp.Parse(test_data.name);
161 
162   ASSERT_TRUE(type != nullptr) << test_data.name;
163 
164   Format fmt(type.get());
165   ASSERT_EQ(test_data.format_type, fmt.GetFormatType()) << test_data.name;
166 }
167 
168 INSTANTIATE_TEST_SUITE_P(
169     DatumTypeFormat1,
170     DatumTypeTestFormat,
171     testing::Values(
172         DatumFormatData{"int", FormatType::kR32_SINT},
173         DatumFormatData{"uint", FormatType::kR32_UINT},
174         DatumFormatData{"int8_t", FormatType::kR8_SINT},
175         DatumFormatData{"uint8_t", FormatType::kR8_UINT},
176         DatumFormatData{"int16_t", FormatType::kR16_SINT},
177         DatumFormatData{"uint16_t", FormatType::kR16_UINT},
178         DatumFormatData{"int64_t", FormatType::kR64_SINT},
179         DatumFormatData{"uint64_t", FormatType::kR64_UINT},
180         DatumFormatData{"float", FormatType::kR32_SFLOAT},
181         DatumFormatData{"double", FormatType::kR64_SFLOAT},
182         DatumFormatData{"vec2", FormatType::kR32G32_SFLOAT},
183         DatumFormatData{"vec3", FormatType::kR32G32B32_SFLOAT},
184         DatumFormatData{"vec4", FormatType::kR32G32B32A32_SFLOAT},
185         DatumFormatData{"dvec2", FormatType::kR64G64_SFLOAT},
186         DatumFormatData{"dvec3", FormatType::kR64G64B64_SFLOAT},
187         DatumFormatData{"dvec4", FormatType::kR64G64B64A64_SFLOAT},
188         DatumFormatData{"ivec2", FormatType::kR32G32_SINT},
189         DatumFormatData{"ivec3", FormatType::kR32G32B32_SINT},
190         DatumFormatData{"ivec4", FormatType::kR32G32B32A32_SINT},
191         DatumFormatData{"uvec2", FormatType::kR32G32_UINT},
192         DatumFormatData{"uvec3", FormatType::kR32G32B32_UINT},
193         DatumFormatData{"uvec4", FormatType::kR32G32B32A32_UINT},
194         DatumFormatData{"i8vec2", FormatType::kR8G8_SINT},
195         DatumFormatData{"i8vec3", FormatType::kR8G8B8_SINT},
196         DatumFormatData{"i8vec4", FormatType::kR8G8B8A8_SINT},
197         DatumFormatData{"u8vec2", FormatType::kR8G8_UINT},
198         DatumFormatData{"u8vec3", FormatType::kR8G8B8_UINT},
199         DatumFormatData{"u8vec4", FormatType::kR8G8B8A8_UINT},
200         DatumFormatData{
201             "i16vec2",
202             FormatType::kR16G16_SINT}));  // NOLINT(whitespace/parens)
203 
204 INSTANTIATE_TEST_SUITE_P(
205     DatumTypeFormat2,
206     DatumTypeTestFormat,
207     testing::Values(DatumFormatData{"i16vec3", FormatType::kR16G16B16_SINT},
208                     DatumFormatData{"i16vec4", FormatType::kR16G16B16A16_SINT},
209                     DatumFormatData{"u16vec2", FormatType::kR16G16_UINT},
210                     DatumFormatData{"u16vec3", FormatType::kR16G16B16_UINT},
211                     DatumFormatData{"u16vec4", FormatType::kR16G16B16A16_UINT},
212                     DatumFormatData{"i64vec2", FormatType::kR64G64_SINT},
213                     DatumFormatData{"i64vec3", FormatType::kR64G64B64_SINT},
214                     DatumFormatData{"i64vec4", FormatType::kR64G64B64A64_SINT},
215                     DatumFormatData{"u64vec2", FormatType::kR64G64_UINT},
216                     DatumFormatData{"u64vec3", FormatType::kR64G64B64_UINT},
217                     DatumFormatData{"u64vec4", FormatType::kR64G64B64A64_UINT},
218                     DatumFormatData{"mat2", FormatType::kUnknown},
219                     DatumFormatData{"mat2x2", FormatType::kUnknown},
220                     DatumFormatData{"mat2x3", FormatType::kUnknown},
221                     DatumFormatData{"mat2x4", FormatType::kUnknown},
222                     DatumFormatData{"mat3", FormatType::kUnknown},
223                     DatumFormatData{"mat3x2", FormatType::kUnknown},
224                     DatumFormatData{"mat3x3", FormatType::kUnknown},
225                     DatumFormatData{"mat3x4", FormatType::kUnknown},
226                     DatumFormatData{"mat4", FormatType::kUnknown},
227                     DatumFormatData{"mat4x2", FormatType::kUnknown},
228                     DatumFormatData{"mat4x3", FormatType::kUnknown},
229                     DatumFormatData{"mat4x4", FormatType::kUnknown},
230                     DatumFormatData{"dmat2", FormatType::kUnknown},
231                     DatumFormatData{"dmat2x2", FormatType::kUnknown},
232                     DatumFormatData{"dmat2x3", FormatType::kUnknown},
233                     DatumFormatData{"dmat2x4", FormatType::kUnknown},
234                     DatumFormatData{"dmat3", FormatType::kUnknown},
235                     DatumFormatData{"dmat3x2", FormatType::kUnknown},
236                     DatumFormatData{"dmat3x3", FormatType::kUnknown},
237                     DatumFormatData{"dmat3x4", FormatType::kUnknown},
238                     DatumFormatData{"dmat4", FormatType::kUnknown},
239                     DatumFormatData{"dmat4x2", FormatType::kUnknown},
240                     DatumFormatData{"dmat4x3", FormatType::kUnknown},
241                     DatumFormatData{
242                         "dmat4x4",
243                         FormatType::kUnknown}));  // NOLINT(whitespace/parens)
244 
245 }  // namespace vkscript
246 }  // namespace amber
247