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