1 // Copyright 2021 The Tint 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 "gmock/gmock.h"
16 #include "src/writer/glsl/test_helper.h"
17
18 namespace tint {
19 namespace writer {
20 namespace glsl {
21 namespace {
22
23 using ::testing::HasSubstr;
24
25 using GlslGeneratorImplTest_Constructor = TestHelper;
26
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Bool)27 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Bool) {
28 WrapInFunction(Expr(false));
29
30 GeneratorImpl& gen = Build();
31
32 ASSERT_TRUE(gen.Generate()) << gen.error();
33 EXPECT_THAT(gen.result(), HasSubstr("false"));
34 }
35
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Int)36 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Int) {
37 WrapInFunction(Expr(-12345));
38
39 GeneratorImpl& gen = Build();
40
41 ASSERT_TRUE(gen.Generate()) << gen.error();
42 EXPECT_THAT(gen.result(), HasSubstr("-12345"));
43 }
44
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_UInt)45 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_UInt) {
46 WrapInFunction(Expr(56779u));
47
48 GeneratorImpl& gen = Build();
49
50 ASSERT_TRUE(gen.Generate()) << gen.error();
51 EXPECT_THAT(gen.result(), HasSubstr("56779u"));
52 }
53
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Float)54 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Float) {
55 // Use a number close to 1<<30 but whose decimal representation ends in 0.
56 WrapInFunction(Expr(static_cast<float>((1 << 30) - 4)));
57
58 GeneratorImpl& gen = Build();
59
60 ASSERT_TRUE(gen.Generate()) << gen.error();
61 EXPECT_THAT(gen.result(), HasSubstr("1073741824.0f"));
62 }
63
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Float)64 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Float) {
65 WrapInFunction(Construct<f32>(-1.2e-5f));
66
67 GeneratorImpl& gen = Build();
68
69 ASSERT_TRUE(gen.Generate()) << gen.error();
70 EXPECT_THAT(gen.result(), HasSubstr("float(-0.000012f)"));
71 }
72
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Bool)73 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Bool) {
74 WrapInFunction(Construct<bool>(true));
75
76 GeneratorImpl& gen = Build();
77
78 ASSERT_TRUE(gen.Generate()) << gen.error();
79 EXPECT_THAT(gen.result(), HasSubstr("bool(true)"));
80 }
81
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Int)82 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Int) {
83 WrapInFunction(Construct<i32>(-12345));
84
85 GeneratorImpl& gen = Build();
86
87 ASSERT_TRUE(gen.Generate()) << gen.error();
88 EXPECT_THAT(gen.result(), HasSubstr("int(-12345)"));
89 }
90
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Uint)91 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Uint) {
92 WrapInFunction(Construct<u32>(12345u));
93
94 GeneratorImpl& gen = Build();
95
96 ASSERT_TRUE(gen.Generate()) << gen.error();
97 EXPECT_THAT(gen.result(), HasSubstr("uint(12345u)"));
98 }
99
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec)100 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Vec) {
101 WrapInFunction(vec3<f32>(1.f, 2.f, 3.f));
102
103 GeneratorImpl& gen = Build();
104
105 ASSERT_TRUE(gen.Generate()) << gen.error();
106 EXPECT_THAT(gen.result(), HasSubstr("vec3(1.0f, 2.0f, 3.0f)"));
107 }
108
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_Empty)109 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Vec_Empty) {
110 WrapInFunction(vec3<f32>());
111
112 GeneratorImpl& gen = Build();
113
114 ASSERT_TRUE(gen.Generate()) << gen.error();
115 EXPECT_THAT(gen.result(), HasSubstr("vec3(0.0f, 0.0f, 0.0f)"));
116 }
117
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Float)118 TEST_F(GlslGeneratorImplTest_Constructor,
119 EmitConstructor_Type_Vec_SingleScalar_Float) {
120 WrapInFunction(vec3<f32>(2.0f));
121
122 GeneratorImpl& gen = Build();
123
124 ASSERT_TRUE(gen.Generate()) << gen.error();
125 EXPECT_THAT(gen.result(), HasSubstr("vec3(2.0f)"));
126 }
127
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Bool)128 TEST_F(GlslGeneratorImplTest_Constructor,
129 EmitConstructor_Type_Vec_SingleScalar_Bool) {
130 WrapInFunction(vec3<bool>(true));
131
132 GeneratorImpl& gen = Build();
133
134 ASSERT_TRUE(gen.Generate()) << gen.error();
135 EXPECT_THAT(gen.result(), HasSubstr("bvec3(true)"));
136 }
137
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Int)138 TEST_F(GlslGeneratorImplTest_Constructor,
139 EmitConstructor_Type_Vec_SingleScalar_Int) {
140 WrapInFunction(vec3<i32>(2));
141
142 GeneratorImpl& gen = Build();
143
144 ASSERT_TRUE(gen.Generate()) << gen.error();
145 EXPECT_THAT(gen.result(), HasSubstr("ivec3(2)"));
146 }
147
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_UInt)148 TEST_F(GlslGeneratorImplTest_Constructor,
149 EmitConstructor_Type_Vec_SingleScalar_UInt) {
150 WrapInFunction(vec3<u32>(2u));
151
152 GeneratorImpl& gen = Build();
153
154 ASSERT_TRUE(gen.Generate()) << gen.error();
155 EXPECT_THAT(gen.result(), HasSubstr("uvec3(2u)"));
156 }
157
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Mat)158 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Mat) {
159 WrapInFunction(
160 mat2x3<f32>(vec3<f32>(1.f, 2.f, 3.f), vec3<f32>(3.f, 4.f, 5.f)));
161
162 GeneratorImpl& gen = Build();
163
164 ASSERT_TRUE(gen.Generate()) << gen.error();
165
166 EXPECT_THAT(
167 gen.result(),
168 HasSubstr("mat2x3(vec3(1.0f, 2.0f, 3.0f), vec3(3.0f, 4.0f, 5.0f))"));
169 }
170
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Mat_Empty)171 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Mat_Empty) {
172 WrapInFunction(mat2x3<f32>());
173
174 GeneratorImpl& gen = Build();
175
176 ASSERT_TRUE(gen.Generate()) << gen.error();
177
178 EXPECT_THAT(gen.result(),
179 HasSubstr("mat2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)"));
180 }
181
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Array)182 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Array) {
183 WrapInFunction(Construct(ty.array(ty.vec3<f32>(), 3),
184 vec3<f32>(1.f, 2.f, 3.f), vec3<f32>(4.f, 5.f, 6.f),
185 vec3<f32>(7.f, 8.f, 9.f)));
186
187 GeneratorImpl& gen = Build();
188
189 ASSERT_TRUE(gen.Generate()) << gen.error();
190 EXPECT_THAT(gen.result(), HasSubstr("vec3[3](vec3(1.0f, 2.0f, 3.0f), "
191 "vec3(4.0f, 5.0f, 6.0f), "
192 "vec3(7.0f, 8.0f, 9.0f))"));
193 }
194
195 // TODO(bclayton): Zero-init arrays
TEST_F(GlslGeneratorImplTest_Constructor,DISABLED_EmitConstructor_Type_Array_Empty)196 TEST_F(GlslGeneratorImplTest_Constructor,
197 DISABLED_EmitConstructor_Type_Array_Empty) {
198 WrapInFunction(Construct(ty.array(ty.vec3<f32>(), 3)));
199
200 GeneratorImpl& gen = Build();
201
202 ASSERT_TRUE(gen.Generate()) << gen.error();
203 EXPECT_THAT(gen.result(),
204 HasSubstr("{vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f),"
205 " vec3(0.0f, 0.0f, 0.0f)}"));
206 }
207
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Struct)208 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Struct) {
209 auto* str = Structure("S", {
210 Member("a", ty.i32()),
211 Member("b", ty.f32()),
212 Member("c", ty.vec3<i32>()),
213 });
214
215 WrapInFunction(Construct(ty.Of(str), 1, 2.0f, vec3<i32>(3, 4, 5)));
216
217 GeneratorImpl& gen = SanitizeAndBuild();
218
219 ASSERT_TRUE(gen.Generate()) << gen.error();
220 EXPECT_THAT(gen.result(), HasSubstr("S(1, 2.0f, ivec3(3, 4, 5))"));
221 }
222
TEST_F(GlslGeneratorImplTest_Constructor,EmitConstructor_Type_Struct_Empty)223 TEST_F(GlslGeneratorImplTest_Constructor, EmitConstructor_Type_Struct_Empty) {
224 auto* str = Structure("S", {
225 Member("a", ty.i32()),
226 Member("b", ty.f32()),
227 Member("c", ty.vec3<i32>()),
228 });
229
230 WrapInFunction(Construct(ty.Of(str)));
231
232 GeneratorImpl& gen = SanitizeAndBuild();
233
234 ASSERT_TRUE(gen.Generate()) << gen.error();
235 EXPECT_THAT(gen.result(), HasSubstr("S(0"));
236 }
237
238 } // namespace
239 } // namespace glsl
240 } // namespace writer
241 } // namespace tint
242