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/struct_block_decoration.h"
16 #include "src/reader/wgsl/parser_impl_test_helper.h"
17
18 namespace tint {
19 namespace reader {
20 namespace wgsl {
21 namespace {
22
TEST_F(ParserImplTest,VariableIdentDecl_Parses)23 TEST_F(ParserImplTest, VariableIdentDecl_Parses) {
24 auto p = parser("my_var : f32");
25 auto decl = p->expect_variable_ident_decl("test");
26 ASSERT_FALSE(p->has_error()) << p->error();
27 ASSERT_FALSE(decl.errored);
28 ASSERT_EQ(decl->name, "my_var");
29 ASSERT_NE(decl->type, nullptr);
30 ASSERT_TRUE(decl->type->Is<ast::F32>());
31
32 EXPECT_EQ(decl->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
33 EXPECT_EQ(decl->type->source.range, (Source::Range{{1u, 10u}, {1u, 13u}}));
34 }
35
TEST_F(ParserImplTest,VariableIdentDecl_Inferred_Parses)36 TEST_F(ParserImplTest, VariableIdentDecl_Inferred_Parses) {
37 auto p = parser("my_var = 1.0");
38 auto decl = p->expect_variable_ident_decl("test", /*allow_inferred = */ true);
39 ASSERT_FALSE(p->has_error()) << p->error();
40 ASSERT_FALSE(decl.errored);
41 ASSERT_EQ(decl->name, "my_var");
42 ASSERT_EQ(decl->type, nullptr);
43
44 EXPECT_EQ(decl->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
45 }
46
TEST_F(ParserImplTest,VariableIdentDecl_MissingIdent)47 TEST_F(ParserImplTest, VariableIdentDecl_MissingIdent) {
48 auto p = parser(": f32");
49 auto decl = p->expect_variable_ident_decl("test");
50 ASSERT_TRUE(p->has_error());
51 ASSERT_TRUE(decl.errored);
52 ASSERT_EQ(p->error(), "1:1: expected identifier for test");
53 }
54
TEST_F(ParserImplTest,VariableIdentDecl_MissingColon)55 TEST_F(ParserImplTest, VariableIdentDecl_MissingColon) {
56 auto p = parser("my_var f32");
57 auto decl = p->expect_variable_ident_decl("test");
58 ASSERT_TRUE(p->has_error());
59 ASSERT_TRUE(decl.errored);
60 ASSERT_EQ(p->error(), "1:8: expected ':' for test");
61 }
62
TEST_F(ParserImplTest,VariableIdentDecl_MissingType)63 TEST_F(ParserImplTest, VariableIdentDecl_MissingType) {
64 auto p = parser("my_var :");
65 auto decl = p->expect_variable_ident_decl("test");
66 ASSERT_TRUE(p->has_error());
67 ASSERT_TRUE(decl.errored);
68 ASSERT_EQ(p->error(), "1:9: invalid type for test");
69 }
70
TEST_F(ParserImplTest,VariableIdentDecl_InvalidIdent)71 TEST_F(ParserImplTest, VariableIdentDecl_InvalidIdent) {
72 auto p = parser("123 : f32");
73 auto decl = p->expect_variable_ident_decl("test");
74 ASSERT_TRUE(p->has_error());
75 ASSERT_TRUE(decl.errored);
76 ASSERT_EQ(p->error(), "1:1: expected identifier for test");
77 }
78
TEST_F(ParserImplTest,VariableIdentDecl_NonAccessDecoFail)79 TEST_F(ParserImplTest, VariableIdentDecl_NonAccessDecoFail) {
80 auto p = parser("my_var : [[stride(1)]] S");
81
82 auto* mem = Member("a", ty.i32(), ast::DecorationList{});
83 ast::StructMemberList members;
84 members.push_back(mem);
85
86 auto* block_deco = create<ast::StructBlockDecoration>();
87 ast::DecorationList decos;
88 decos.push_back(block_deco);
89
90 auto decl = p->expect_variable_ident_decl("test");
91 ASSERT_TRUE(p->has_error());
92 ASSERT_TRUE(decl.errored);
93 ASSERT_EQ(p->error(), "1:12: unexpected decorations");
94 }
95
TEST_F(ParserImplTest,VariableIdentDecl_DecorationMissingRightBlock)96 TEST_F(ParserImplTest, VariableIdentDecl_DecorationMissingRightBlock) {
97 auto p = parser("my_var : [[stride(4) S");
98 auto decl = p->expect_variable_ident_decl("test");
99 ASSERT_TRUE(p->has_error());
100 ASSERT_TRUE(decl.errored);
101 ASSERT_EQ(p->error(), "1:22: expected ']]' for decoration list");
102 }
103
TEST_F(ParserImplTest,VariableIdentDecl_DecorationMissingRightParen)104 TEST_F(ParserImplTest, VariableIdentDecl_DecorationMissingRightParen) {
105 auto p = parser("my_var : [[stride(4]] S");
106 auto decl = p->expect_variable_ident_decl("test");
107 ASSERT_TRUE(p->has_error());
108 ASSERT_TRUE(decl.errored);
109 ASSERT_EQ(p->error(), "1:20: expected ')' for stride decoration");
110 }
111
TEST_F(ParserImplTest,VariableIdentDecl_DecorationMissingLeftParen)112 TEST_F(ParserImplTest, VariableIdentDecl_DecorationMissingLeftParen) {
113 auto p = parser("my_var : [[stride 4)]] S");
114 auto decl = p->expect_variable_ident_decl("test");
115 ASSERT_TRUE(p->has_error());
116 ASSERT_TRUE(decl.errored);
117 ASSERT_EQ(p->error(), "1:19: expected '(' for stride decoration");
118 }
119
TEST_F(ParserImplTest,VariableIdentDecl_DecorationEmpty)120 TEST_F(ParserImplTest, VariableIdentDecl_DecorationEmpty) {
121 auto p = parser("my_var : [[]] S");
122 auto decl = p->expect_variable_ident_decl("test");
123 ASSERT_TRUE(p->has_error());
124 ASSERT_TRUE(decl.errored);
125 ASSERT_EQ(p->error(), "1:12: empty decoration list");
126 }
127
128 } // namespace
129 } // namespace wgsl
130 } // namespace reader
131 } // namespace tint
132