• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 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/hlsl/test_helper.h"
17 
18 namespace tint {
19 namespace writer {
20 namespace hlsl {
21 namespace {
22 
23 using ::testing::HasSubstr;
24 
25 using HlslGeneratorImplTest_Constructor = TestHelper;
26 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Bool)27 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Int)36 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_UInt)45 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Float)54 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Float)64 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Bool)73 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Int)82 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Uint)91 TEST_F(HlslGeneratorImplTest_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(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec)100 TEST_F(HlslGeneratorImplTest_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("float3(1.0f, 2.0f, 3.0f)"));
107 }
108 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_Empty)109 TEST_F(HlslGeneratorImplTest_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("float3(0.0f, 0.0f, 0.0f)"));
116 }
117 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Float_Literal)118 TEST_F(HlslGeneratorImplTest_Constructor,
119        EmitConstructor_Type_Vec_SingleScalar_Float_Literal) {
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("float3((2.0f).xxx)"));
126 }
127 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Float_Var)128 TEST_F(HlslGeneratorImplTest_Constructor,
129        EmitConstructor_Type_Vec_SingleScalar_Float_Var) {
130   auto* var = Var("v", nullptr, Expr(2.0f));
131   auto* cast = vec3<f32>(var);
132   WrapInFunction(var, cast);
133 
134   GeneratorImpl& gen = Build();
135 
136   ASSERT_TRUE(gen.Generate()) << gen.error();
137   EXPECT_THAT(gen.result(), HasSubstr(R"(float v = 2.0f;
138   const float3 tint_symbol = float3((v).xxx);)"));
139 }
140 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Bool_Literal)141 TEST_F(HlslGeneratorImplTest_Constructor,
142        EmitConstructor_Type_Vec_SingleScalar_Bool_Literal) {
143   WrapInFunction(vec3<bool>(true));
144 
145   GeneratorImpl& gen = Build();
146 
147   ASSERT_TRUE(gen.Generate()) << gen.error();
148   EXPECT_THAT(gen.result(), HasSubstr("bool3((true).xxx)"));
149 }
150 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Bool_Var)151 TEST_F(HlslGeneratorImplTest_Constructor,
152        EmitConstructor_Type_Vec_SingleScalar_Bool_Var) {
153   auto* var = Var("v", nullptr, Expr(true));
154   auto* cast = vec3<bool>(var);
155   WrapInFunction(var, cast);
156 
157   GeneratorImpl& gen = Build();
158 
159   ASSERT_TRUE(gen.Generate()) << gen.error();
160   EXPECT_THAT(gen.result(), HasSubstr(R"(bool v = true;
161   const bool3 tint_symbol = bool3((v).xxx);)"));
162 }
163 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_Int)164 TEST_F(HlslGeneratorImplTest_Constructor,
165        EmitConstructor_Type_Vec_SingleScalar_Int) {
166   WrapInFunction(vec3<i32>(2));
167 
168   GeneratorImpl& gen = Build();
169 
170   ASSERT_TRUE(gen.Generate()) << gen.error();
171   EXPECT_THAT(gen.result(), HasSubstr("int3((2).xxx)"));
172 }
173 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Vec_SingleScalar_UInt)174 TEST_F(HlslGeneratorImplTest_Constructor,
175        EmitConstructor_Type_Vec_SingleScalar_UInt) {
176   WrapInFunction(vec3<u32>(2u));
177 
178   GeneratorImpl& gen = Build();
179 
180   ASSERT_TRUE(gen.Generate()) << gen.error();
181   EXPECT_THAT(gen.result(), HasSubstr("uint3((2u).xxx)"));
182 }
183 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Mat)184 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Mat) {
185   WrapInFunction(
186       mat2x3<f32>(vec3<f32>(1.f, 2.f, 3.f), vec3<f32>(3.f, 4.f, 5.f)));
187 
188   GeneratorImpl& gen = Build();
189 
190   ASSERT_TRUE(gen.Generate()) << gen.error();
191 
192   EXPECT_THAT(
193       gen.result(),
194       HasSubstr(
195           "float2x3(float3(1.0f, 2.0f, 3.0f), float3(3.0f, 4.0f, 5.0f))"));
196 }
197 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Mat_Empty)198 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Mat_Empty) {
199   WrapInFunction(mat2x3<f32>());
200 
201   GeneratorImpl& gen = Build();
202 
203   ASSERT_TRUE(gen.Generate()) << gen.error();
204 
205   EXPECT_THAT(gen.result(),
206               HasSubstr("float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)"));
207 }
208 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Array)209 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Array) {
210   WrapInFunction(Construct(ty.array(ty.vec3<f32>(), 3),
211                            vec3<f32>(1.f, 2.f, 3.f), vec3<f32>(4.f, 5.f, 6.f),
212                            vec3<f32>(7.f, 8.f, 9.f)));
213 
214   GeneratorImpl& gen = Build();
215 
216   ASSERT_TRUE(gen.Generate()) << gen.error();
217   EXPECT_THAT(gen.result(),
218               HasSubstr("{float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f),"
219                         " float3(7.0f, 8.0f, 9.0f)}"));
220 }
221 
222 // TODO(bclayton): Zero-init arrays
TEST_F(HlslGeneratorImplTest_Constructor,DISABLED_EmitConstructor_Type_Array_Empty)223 TEST_F(HlslGeneratorImplTest_Constructor,
224        DISABLED_EmitConstructor_Type_Array_Empty) {
225   WrapInFunction(Construct(ty.array(ty.vec3<f32>(), 3)));
226 
227   GeneratorImpl& gen = Build();
228 
229   ASSERT_TRUE(gen.Generate()) << gen.error();
230   EXPECT_THAT(gen.result(),
231               HasSubstr("{float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f),"
232                         " float3(0.0f, 0.0f, 0.0f)}"));
233 }
234 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Struct)235 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Struct) {
236   auto* str = Structure("S", {
237                                  Member("a", ty.i32()),
238                                  Member("b", ty.f32()),
239                                  Member("c", ty.vec3<i32>()),
240                              });
241 
242   WrapInFunction(Construct(ty.Of(str), 1, 2.0f, vec3<i32>(3, 4, 5)));
243 
244   GeneratorImpl& gen = SanitizeAndBuild();
245 
246   ASSERT_TRUE(gen.Generate()) << gen.error();
247   EXPECT_THAT(gen.result(), HasSubstr("{1, 2.0f, int3(3, 4, 5)}"));
248 }
249 
TEST_F(HlslGeneratorImplTest_Constructor,EmitConstructor_Type_Struct_Empty)250 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Struct_Empty) {
251   auto* str = Structure("S", {
252                                  Member("a", ty.i32()),
253                                  Member("b", ty.f32()),
254                                  Member("c", ty.vec3<i32>()),
255                              });
256 
257   WrapInFunction(Construct(ty.Of(str)));
258 
259   GeneratorImpl& gen = SanitizeAndBuild();
260 
261   ASSERT_TRUE(gen.Generate()) << gen.error();
262   EXPECT_THAT(gen.result(), HasSubstr("(S)0"));
263 }
264 
265 }  // namespace
266 }  // namespace hlsl
267 }  // namespace writer
268 }  // namespace tint
269