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,ArgumentExpressionList_Parses)22 TEST_F(ParserImplTest, ArgumentExpressionList_Parses) {
23 auto p = parser("(a)");
24 auto e = p->expect_argument_expression_list("argument list");
25 ASSERT_FALSE(p->has_error()) << p->error();
26 ASSERT_FALSE(e.errored);
27
28 ASSERT_EQ(e.value.size(), 1u);
29 ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
30 }
31
TEST_F(ParserImplTest,ArgumentExpressionList_ParsesEmptyList)32 TEST_F(ParserImplTest, ArgumentExpressionList_ParsesEmptyList) {
33 auto p = parser("()");
34 auto e = p->expect_argument_expression_list("argument list");
35 ASSERT_FALSE(p->has_error()) << p->error();
36 ASSERT_FALSE(e.errored);
37
38 ASSERT_EQ(e.value.size(), 0u);
39 }
40
TEST_F(ParserImplTest,ArgumentExpressionList_ParsesMultiple)41 TEST_F(ParserImplTest, ArgumentExpressionList_ParsesMultiple) {
42 auto p = parser("(a, -33, 1+2)");
43 auto e = p->expect_argument_expression_list("argument list");
44 ASSERT_FALSE(p->has_error()) << p->error();
45 ASSERT_FALSE(e.errored);
46
47 ASSERT_EQ(e.value.size(), 3u);
48 ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
49 ASSERT_TRUE(e.value[1]->Is<ast::LiteralExpression>());
50 ASSERT_TRUE(e.value[2]->Is<ast::BinaryExpression>());
51 }
52
TEST_F(ParserImplTest,ArgumentExpressionList_TrailingComma)53 TEST_F(ParserImplTest, ArgumentExpressionList_TrailingComma) {
54 auto p = parser("(a, 42,)");
55 auto e = p->expect_argument_expression_list("argument list");
56 ASSERT_FALSE(p->has_error()) << p->error();
57 ASSERT_FALSE(e.errored);
58
59 ASSERT_EQ(e.value.size(), 2u);
60 ASSERT_TRUE(e.value[0]->Is<ast::IdentifierExpression>());
61 ASSERT_TRUE(e.value[1]->Is<ast::LiteralExpression>());
62 }
63
TEST_F(ParserImplTest,ArgumentExpressionList_HandlesMissingLeftParen)64 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingLeftParen) {
65 auto p = parser("a)");
66 auto e = p->expect_argument_expression_list("argument list");
67 ASSERT_TRUE(p->has_error());
68 ASSERT_TRUE(e.errored);
69 EXPECT_EQ(p->error(), "1:1: expected '(' for argument list");
70 }
71
TEST_F(ParserImplTest,ArgumentExpressionList_HandlesMissingRightParen)72 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingRightParen) {
73 auto p = parser("(a");
74 auto e = p->expect_argument_expression_list("argument list");
75 ASSERT_TRUE(p->has_error());
76 ASSERT_TRUE(e.errored);
77 EXPECT_EQ(p->error(), "1:3: expected ')' for argument list");
78 }
79
TEST_F(ParserImplTest,ArgumentExpressionList_HandlesMissingExpression_0)80 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingExpression_0) {
81 auto p = parser("(,)");
82 auto e = p->expect_argument_expression_list("argument list");
83 ASSERT_TRUE(p->has_error());
84 ASSERT_TRUE(e.errored);
85 EXPECT_EQ(p->error(), "1:2: expected ')' for argument list");
86 }
87
TEST_F(ParserImplTest,ArgumentExpressionList_HandlesMissingExpression_1)88 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingExpression_1) {
89 auto p = parser("(a, ,)");
90 auto e = p->expect_argument_expression_list("argument list");
91 ASSERT_TRUE(p->has_error());
92 ASSERT_TRUE(e.errored);
93 EXPECT_EQ(p->error(), "1:5: expected ')' for argument list");
94 }
95
TEST_F(ParserImplTest,ArgumentExpressionList_HandlesInvalidExpression)96 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesInvalidExpression) {
97 auto p = parser("(if(a) {})");
98 auto e = p->expect_argument_expression_list("argument list");
99 ASSERT_TRUE(p->has_error());
100 ASSERT_TRUE(e.errored);
101 EXPECT_EQ(p->error(), "1:2: expected ')' for argument list");
102 }
103
104 } // namespace
105 } // namespace wgsl
106 } // namespace reader
107 } // namespace tint
108