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