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