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 "src/ast/override_decoration.h"
16 #include "src/ast/struct_block_decoration.h"
17 #include "src/writer/wgsl/test_helper.h"
18
19 namespace tint {
20 namespace writer {
21 namespace wgsl {
22 namespace {
23
24 using WgslGeneratorImplTest = TestHelper;
25
TEST_F(WgslGeneratorImplTest,EmitVariable)26 TEST_F(WgslGeneratorImplTest, EmitVariable) {
27 auto* v = Global("a", ty.f32(), ast::StorageClass::kPrivate);
28
29 GeneratorImpl& gen = Build();
30
31 std::stringstream out;
32 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
33 EXPECT_EQ(out.str(), R"(var<private> a : f32;)");
34 }
35
TEST_F(WgslGeneratorImplTest,EmitVariable_StorageClass)36 TEST_F(WgslGeneratorImplTest, EmitVariable_StorageClass) {
37 auto* v = Global("a", ty.f32(), ast::StorageClass::kPrivate);
38
39 GeneratorImpl& gen = Build();
40
41 std::stringstream out;
42 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
43 EXPECT_EQ(out.str(), R"(var<private> a : f32;)");
44 }
45
TEST_F(WgslGeneratorImplTest,EmitVariable_Access_Read)46 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_Read) {
47 auto* s = Structure("S", {Member("a", ty.i32())},
48 {create<ast::StructBlockDecoration>()});
49 auto* v =
50 Global("a", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kRead,
51 ast::DecorationList{
52 create<ast::BindingDecoration>(0),
53 create<ast::GroupDecoration>(0),
54 });
55
56 GeneratorImpl& gen = Build();
57
58 std::stringstream out;
59 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
60 EXPECT_EQ(out.str(), R"([[binding(0), group(0)]] var<storage, read> a : S;)");
61 }
62
TEST_F(WgslGeneratorImplTest,EmitVariable_Access_Write)63 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_Write) {
64 auto* s = Structure("S", {Member("a", ty.i32())},
65 {create<ast::StructBlockDecoration>()});
66 auto* v =
67 Global("a", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kWrite,
68 ast::DecorationList{
69 create<ast::BindingDecoration>(0),
70 create<ast::GroupDecoration>(0),
71 });
72
73 GeneratorImpl& gen = Build();
74
75 std::stringstream out;
76 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
77 EXPECT_EQ(out.str(),
78 R"([[binding(0), group(0)]] var<storage, write> a : S;)");
79 }
80
TEST_F(WgslGeneratorImplTest,EmitVariable_Access_ReadWrite)81 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_ReadWrite) {
82 auto* s = Structure("S", {Member("a", ty.i32())},
83 {create<ast::StructBlockDecoration>()});
84 auto* v = Global("a", ty.Of(s), ast::StorageClass::kStorage,
85 ast::Access::kReadWrite,
86 ast::DecorationList{
87 create<ast::BindingDecoration>(0),
88 create<ast::GroupDecoration>(0),
89 });
90
91 GeneratorImpl& gen = Build();
92
93 std::stringstream out;
94 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
95 EXPECT_EQ(out.str(),
96 R"([[binding(0), group(0)]] var<storage, read_write> a : S;)");
97 }
98
TEST_F(WgslGeneratorImplTest,EmitVariable_Decorated)99 TEST_F(WgslGeneratorImplTest, EmitVariable_Decorated) {
100 auto* v = Global("a", ty.sampler(ast::SamplerKind::kSampler),
101 ast::StorageClass::kNone, nullptr,
102 ast::DecorationList{
103 create<ast::GroupDecoration>(1),
104 create<ast::BindingDecoration>(2),
105 });
106
107 GeneratorImpl& gen = Build();
108
109 std::stringstream out;
110 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
111 EXPECT_EQ(out.str(), R"([[group(1), binding(2)]] var a : sampler;)");
112 }
113
TEST_F(WgslGeneratorImplTest,EmitVariable_Constructor)114 TEST_F(WgslGeneratorImplTest, EmitVariable_Constructor) {
115 auto* v = Global("a", ty.f32(), ast::StorageClass::kPrivate, Expr(1.0f));
116
117 GeneratorImpl& gen = Build();
118
119 std::stringstream out;
120 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
121 EXPECT_EQ(out.str(), R"(var<private> a : f32 = 1.0;)");
122 }
123
TEST_F(WgslGeneratorImplTest,EmitVariable_Const)124 TEST_F(WgslGeneratorImplTest, EmitVariable_Const) {
125 auto* v = Const("a", ty.f32(), Expr(1.0f));
126 WrapInFunction(Decl(v));
127
128 GeneratorImpl& gen = Build();
129
130 std::stringstream out;
131 ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
132 EXPECT_EQ(out.str(), R"(let a : f32 = 1.0;)");
133 }
134
135 } // namespace
136 } // namespace wgsl
137 } // namespace writer
138 } // namespace tint
139