• 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/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