• 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,ParamList_Single)22 TEST_F(ParserImplTest, ParamList_Single) {
23   auto p = parser("a : i32");
24 
25   auto e = p->expect_param_list();
26   ASSERT_FALSE(p->has_error()) << p->error();
27   ASSERT_FALSE(e.errored);
28   EXPECT_EQ(e.value.size(), 1u);
29 
30   EXPECT_EQ(e.value[0]->symbol, p->builder().Symbols().Get("a"));
31   EXPECT_TRUE(e.value[0]->type->Is<ast::I32>());
32   EXPECT_TRUE(e.value[0]->is_const);
33 
34   ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
35   ASSERT_EQ(e.value[0]->source.range.begin.column, 1u);
36   ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
37   ASSERT_EQ(e.value[0]->source.range.end.column, 2u);
38 }
39 
TEST_F(ParserImplTest,ParamList_Multiple)40 TEST_F(ParserImplTest, ParamList_Multiple) {
41   auto p = parser("a : i32, b: f32, c: vec2<f32>");
42 
43   auto e = p->expect_param_list();
44   ASSERT_FALSE(p->has_error()) << p->error();
45   ASSERT_FALSE(e.errored);
46   EXPECT_EQ(e.value.size(), 3u);
47 
48   EXPECT_EQ(e.value[0]->symbol, p->builder().Symbols().Get("a"));
49   EXPECT_TRUE(e.value[0]->type->Is<ast::I32>());
50   EXPECT_TRUE(e.value[0]->is_const);
51 
52   ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
53   ASSERT_EQ(e.value[0]->source.range.begin.column, 1u);
54   ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
55   ASSERT_EQ(e.value[0]->source.range.end.column, 2u);
56 
57   EXPECT_EQ(e.value[1]->symbol, p->builder().Symbols().Get("b"));
58   EXPECT_TRUE(e.value[1]->type->Is<ast::F32>());
59   EXPECT_TRUE(e.value[1]->is_const);
60 
61   ASSERT_EQ(e.value[1]->source.range.begin.line, 1u);
62   ASSERT_EQ(e.value[1]->source.range.begin.column, 10u);
63   ASSERT_EQ(e.value[1]->source.range.end.line, 1u);
64   ASSERT_EQ(e.value[1]->source.range.end.column, 11u);
65 
66   EXPECT_EQ(e.value[2]->symbol, p->builder().Symbols().Get("c"));
67   ASSERT_TRUE(e.value[2]->type->Is<ast::Vector>());
68   ASSERT_TRUE(e.value[2]->type->As<ast::Vector>()->type->Is<ast::F32>());
69   EXPECT_EQ(e.value[2]->type->As<ast::Vector>()->width, 2u);
70   EXPECT_TRUE(e.value[2]->is_const);
71 
72   ASSERT_EQ(e.value[2]->source.range.begin.line, 1u);
73   ASSERT_EQ(e.value[2]->source.range.begin.column, 18u);
74   ASSERT_EQ(e.value[2]->source.range.end.line, 1u);
75   ASSERT_EQ(e.value[2]->source.range.end.column, 19u);
76 }
77 
TEST_F(ParserImplTest,ParamList_Empty)78 TEST_F(ParserImplTest, ParamList_Empty) {
79   auto p = parser("");
80   auto e = p->expect_param_list();
81   ASSERT_FALSE(p->has_error());
82   ASSERT_FALSE(e.errored);
83   EXPECT_EQ(e.value.size(), 0u);
84 }
85 
TEST_F(ParserImplTest,ParamList_TrailingComma)86 TEST_F(ParserImplTest, ParamList_TrailingComma) {
87   auto p = parser("a : i32,");
88   auto e = p->expect_param_list();
89   ASSERT_FALSE(p->has_error());
90   ASSERT_FALSE(e.errored);
91   EXPECT_EQ(e.value.size(), 1u);
92 }
93 
TEST_F(ParserImplTest,ParamList_Decorations)94 TEST_F(ParserImplTest, ParamList_Decorations) {
95   auto p = parser(
96       "[[builtin(position)]] coord : vec4<f32>, "
97       "[[location(1)]] loc1 : f32");
98 
99   auto e = p->expect_param_list();
100   ASSERT_FALSE(p->has_error()) << p->error();
101   ASSERT_FALSE(e.errored);
102   ASSERT_EQ(e.value.size(), 2u);
103 
104   EXPECT_EQ(e.value[0]->symbol, p->builder().Symbols().Get("coord"));
105   ASSERT_TRUE(e.value[0]->type->Is<ast::Vector>());
106   EXPECT_TRUE(e.value[0]->type->As<ast::Vector>()->type->Is<ast::F32>());
107   EXPECT_EQ(e.value[0]->type->As<ast::Vector>()->width, 4u);
108   EXPECT_TRUE(e.value[0]->is_const);
109   auto decos0 = e.value[0]->decorations;
110   ASSERT_EQ(decos0.size(), 1u);
111   EXPECT_TRUE(decos0[0]->Is<ast::BuiltinDecoration>());
112   EXPECT_EQ(decos0[0]->As<ast::BuiltinDecoration>()->builtin,
113             ast::Builtin::kPosition);
114 
115   ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
116   ASSERT_EQ(e.value[0]->source.range.begin.column, 23u);
117   ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
118   ASSERT_EQ(e.value[0]->source.range.end.column, 28u);
119 
120   EXPECT_EQ(e.value[1]->symbol, p->builder().Symbols().Get("loc1"));
121   EXPECT_TRUE(e.value[1]->type->Is<ast::F32>());
122   EXPECT_TRUE(e.value[1]->is_const);
123   auto decos1 = e.value[1]->decorations;
124   ASSERT_EQ(decos1.size(), 1u);
125   EXPECT_TRUE(decos1[0]->Is<ast::LocationDecoration>());
126   EXPECT_EQ(decos1[0]->As<ast::LocationDecoration>()->value, 1u);
127 
128   ASSERT_EQ(e.value[1]->source.range.begin.line, 1u);
129   ASSERT_EQ(e.value[1]->source.range.begin.column, 58u);
130   ASSERT_EQ(e.value[1]->source.range.end.line, 1u);
131   ASSERT_EQ(e.value[1]->source.range.end.column, 62u);
132 }
133 
134 }  // namespace
135 }  // namespace wgsl
136 }  // namespace reader
137 }  // namespace tint
138