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,VariableDecl_Parses)22 TEST_F(ParserImplTest, VariableDecl_Parses) {
23 auto p = parser("var my_var : f32");
24 auto v = p->variable_decl();
25 EXPECT_FALSE(p->has_error());
26 EXPECT_TRUE(v.matched);
27 EXPECT_FALSE(v.errored);
28 EXPECT_EQ(v->name, "my_var");
29 EXPECT_NE(v->type, nullptr);
30 EXPECT_TRUE(v->type->Is<ast::F32>());
31
32 EXPECT_EQ(v->source.range, (Source::Range{{1u, 5u}, {1u, 11u}}));
33 EXPECT_EQ(v->type->source.range, (Source::Range{{1u, 14u}, {1u, 17u}}));
34 }
35
TEST_F(ParserImplTest,VariableDecl_Inferred_Parses)36 TEST_F(ParserImplTest, VariableDecl_Inferred_Parses) {
37 auto p = parser("var my_var = 1.0");
38 auto v = p->variable_decl(/*allow_inferred = */ true);
39 EXPECT_FALSE(p->has_error());
40 EXPECT_TRUE(v.matched);
41 EXPECT_FALSE(v.errored);
42 EXPECT_EQ(v->name, "my_var");
43 EXPECT_EQ(v->type, nullptr);
44
45 EXPECT_EQ(v->source.range, (Source::Range{{1u, 5u}, {1u, 11u}}));
46 }
47
TEST_F(ParserImplTest,VariableDecl_MissingVar)48 TEST_F(ParserImplTest, VariableDecl_MissingVar) {
49 auto p = parser("my_var : f32");
50 auto v = p->variable_decl();
51 EXPECT_FALSE(v.matched);
52 EXPECT_FALSE(v.errored);
53 EXPECT_FALSE(p->has_error());
54
55 auto t = p->next();
56 ASSERT_TRUE(t.IsIdentifier());
57 }
58
TEST_F(ParserImplTest,VariableDecl_InvalidIdentDecl)59 TEST_F(ParserImplTest, VariableDecl_InvalidIdentDecl) {
60 auto p = parser("var my_var f32");
61 auto v = p->variable_decl();
62 EXPECT_FALSE(v.matched);
63 EXPECT_TRUE(v.errored);
64 EXPECT_TRUE(p->has_error());
65 EXPECT_EQ(p->error(), "1:12: expected ':' for variable declaration");
66 }
67
TEST_F(ParserImplTest,VariableDecl_WithStorageClass)68 TEST_F(ParserImplTest, VariableDecl_WithStorageClass) {
69 auto p = parser("var<private> my_var : f32");
70 auto v = p->variable_decl();
71 EXPECT_TRUE(v.matched);
72 EXPECT_FALSE(v.errored);
73 EXPECT_FALSE(p->has_error());
74 EXPECT_EQ(v->name, "my_var");
75 EXPECT_TRUE(v->type->Is<ast::F32>());
76 EXPECT_EQ(v->storage_class, ast::StorageClass::kPrivate);
77
78 EXPECT_EQ(v->source.range.begin.line, 1u);
79 EXPECT_EQ(v->source.range.begin.column, 14u);
80 EXPECT_EQ(v->source.range.end.line, 1u);
81 EXPECT_EQ(v->source.range.end.column, 20u);
82 }
83
TEST_F(ParserImplTest,VariableDecl_InvalidStorageClass)84 TEST_F(ParserImplTest, VariableDecl_InvalidStorageClass) {
85 auto p = parser("var<unknown> my_var : f32");
86 auto v = p->variable_decl();
87 EXPECT_FALSE(v.matched);
88 EXPECT_TRUE(v.errored);
89 EXPECT_TRUE(p->has_error());
90 EXPECT_EQ(p->error(), "1:5: invalid storage class for variable declaration");
91 }
92
93 } // namespace
94 } // namespace wgsl
95 } // namespace reader
96 } // namespace tint
97