• 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 "src/reader/wgsl/parser_impl_test_helper.h"
16 
17 namespace tint {
18 namespace reader {
19 namespace wgsl {
20 namespace {
21 
TEST_F(ParserImplTest,StructMember_Parses)22 TEST_F(ParserImplTest, StructMember_Parses) {
23   auto p = parser("a : i32;");
24 
25   auto& builder = p->builder();
26 
27   auto decos = p->decoration_list();
28   EXPECT_FALSE(decos.errored);
29   EXPECT_FALSE(decos.matched);
30   EXPECT_EQ(decos.value.size(), 0u);
31 
32   auto m = p->expect_struct_member(decos.value);
33   ASSERT_FALSE(p->has_error());
34   ASSERT_FALSE(m.errored);
35   ASSERT_NE(m.value, nullptr);
36 
37   EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
38   EXPECT_TRUE(m->type->Is<ast::I32>());
39   EXPECT_EQ(m->decorations.size(), 0u);
40 
41   EXPECT_EQ(m->source.range, (Source::Range{{1u, 1u}, {1u, 2u}}));
42   EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 5u}, {1u, 8u}}));
43 }
44 
TEST_F(ParserImplTest,StructMember_ParsesWithAlignDecoration)45 TEST_F(ParserImplTest, StructMember_ParsesWithAlignDecoration) {
46   auto p = parser("[[align(2)]] a : i32;");
47 
48   auto& builder = p->builder();
49 
50   auto decos = p->decoration_list();
51   EXPECT_FALSE(decos.errored);
52   EXPECT_TRUE(decos.matched);
53   EXPECT_EQ(decos.value.size(), 1u);
54 
55   auto m = p->expect_struct_member(decos.value);
56   ASSERT_FALSE(p->has_error());
57   ASSERT_FALSE(m.errored);
58   ASSERT_NE(m.value, nullptr);
59 
60   EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
61   EXPECT_TRUE(m->type->Is<ast::I32>());
62   EXPECT_EQ(m->decorations.size(), 1u);
63   EXPECT_TRUE(m->decorations[0]->Is<ast::StructMemberAlignDecoration>());
64   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberAlignDecoration>()->align,
65             2u);
66 
67   EXPECT_EQ(m->source.range, (Source::Range{{1u, 14u}, {1u, 15u}}));
68   EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 18u}, {1u, 21u}}));
69 }
70 
TEST_F(ParserImplTest,StructMember_ParsesWithSizeDecoration)71 TEST_F(ParserImplTest, StructMember_ParsesWithSizeDecoration) {
72   auto p = parser("[[size(2)]] a : i32;");
73 
74   auto& builder = p->builder();
75 
76   auto decos = p->decoration_list();
77   EXPECT_FALSE(decos.errored);
78   EXPECT_TRUE(decos.matched);
79   EXPECT_EQ(decos.value.size(), 1u);
80 
81   auto m = p->expect_struct_member(decos.value);
82   ASSERT_FALSE(p->has_error());
83   ASSERT_FALSE(m.errored);
84   ASSERT_NE(m.value, nullptr);
85 
86   EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
87   EXPECT_TRUE(m->type->Is<ast::I32>());
88   EXPECT_EQ(m->decorations.size(), 1u);
89   EXPECT_TRUE(m->decorations[0]->Is<ast::StructMemberSizeDecoration>());
90   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberSizeDecoration>()->size, 2u);
91 
92   EXPECT_EQ(m->source.range, (Source::Range{{1u, 13u}, {1u, 14u}}));
93   EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 17u}, {1u, 20u}}));
94 }
95 
TEST_F(ParserImplTest,StructMember_ParsesWithDecoration)96 TEST_F(ParserImplTest, StructMember_ParsesWithDecoration) {
97   auto p = parser("[[size(2)]] a : i32;");
98 
99   auto& builder = p->builder();
100 
101   auto decos = p->decoration_list();
102   EXPECT_FALSE(decos.errored);
103   EXPECT_TRUE(decos.matched);
104   EXPECT_EQ(decos.value.size(), 1u);
105 
106   auto m = p->expect_struct_member(decos.value);
107   ASSERT_FALSE(p->has_error());
108   ASSERT_FALSE(m.errored);
109   ASSERT_NE(m.value, nullptr);
110 
111   EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
112   EXPECT_TRUE(m->type->Is<ast::I32>());
113   EXPECT_EQ(m->decorations.size(), 1u);
114   EXPECT_TRUE(m->decorations[0]->Is<ast::StructMemberSizeDecoration>());
115   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberSizeDecoration>()->size, 2u);
116 
117   EXPECT_EQ(m->source.range, (Source::Range{{1u, 13u}, {1u, 14u}}));
118   EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 17u}, {1u, 20u}}));
119 }
120 
TEST_F(ParserImplTest,StructMember_ParsesWithMultipleDecorations)121 TEST_F(ParserImplTest, StructMember_ParsesWithMultipleDecorations) {
122   auto p = parser(R"([[size(2)]]
123 [[align(4)]] a : i32;)");
124 
125   auto& builder = p->builder();
126 
127   auto decos = p->decoration_list();
128   EXPECT_FALSE(decos.errored);
129   EXPECT_TRUE(decos.matched);
130   EXPECT_EQ(decos.value.size(), 2u);
131 
132   auto m = p->expect_struct_member(decos.value);
133   ASSERT_FALSE(p->has_error());
134   ASSERT_FALSE(m.errored);
135   ASSERT_NE(m.value, nullptr);
136 
137   EXPECT_EQ(m->symbol, builder.Symbols().Get("a"));
138   EXPECT_TRUE(m->type->Is<ast::I32>());
139   EXPECT_EQ(m->decorations.size(), 2u);
140   EXPECT_TRUE(m->decorations[0]->Is<ast::StructMemberSizeDecoration>());
141   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberSizeDecoration>()->size, 2u);
142   EXPECT_TRUE(m->decorations[1]->Is<ast::StructMemberAlignDecoration>());
143   EXPECT_EQ(m->decorations[1]->As<ast::StructMemberAlignDecoration>()->align,
144             4u);
145 
146   EXPECT_EQ(m->source.range, (Source::Range{{2u, 14u}, {2u, 15u}}));
147   EXPECT_EQ(m->type->source.range, (Source::Range{{2u, 18u}, {2u, 21u}}));
148 }
149 
TEST_F(ParserImplTest,StructMember_InvalidDecoration)150 TEST_F(ParserImplTest, StructMember_InvalidDecoration) {
151   auto p = parser("[[size(nan)]] a : i32;");
152   auto decos = p->decoration_list();
153   EXPECT_TRUE(decos.errored);
154   EXPECT_FALSE(decos.matched);
155 
156   auto m = p->expect_struct_member(decos.value);
157   ASSERT_FALSE(m.errored);
158   ASSERT_NE(m.value, nullptr);
159 
160   ASSERT_TRUE(p->has_error());
161   EXPECT_EQ(p->error(),
162             "1:8: expected signed integer literal for size decoration");
163 }
164 
TEST_F(ParserImplTest,StructMember_MissingSemicolon)165 TEST_F(ParserImplTest, StructMember_MissingSemicolon) {
166   auto p = parser("a : i32");
167   auto decos = p->decoration_list();
168   EXPECT_FALSE(decos.errored);
169   EXPECT_FALSE(decos.matched);
170 
171   auto m = p->expect_struct_member(decos.value);
172   ASSERT_TRUE(p->has_error());
173   ASSERT_TRUE(m.errored);
174   ASSERT_EQ(m.value, nullptr);
175   EXPECT_EQ(p->error(), "1:8: expected ';' for struct member");
176 }
177 
178 }  // namespace
179 }  // namespace wgsl
180 }  // namespace reader
181 }  // namespace tint
182