• 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,IfStmt)22 TEST_F(ParserImplTest, IfStmt) {
23   auto p = parser("if (a == 4) { a = b; c = d; }");
24   auto e = p->if_stmt();
25   EXPECT_TRUE(e.matched);
26   EXPECT_FALSE(e.errored);
27   EXPECT_FALSE(p->has_error()) << p->error();
28   ASSERT_NE(e.value, nullptr);
29 
30   ASSERT_TRUE(e->Is<ast::IfStatement>());
31   ASSERT_NE(e->condition, nullptr);
32   ASSERT_TRUE(e->condition->Is<ast::BinaryExpression>());
33   EXPECT_EQ(e->body->statements.size(), 2u);
34   EXPECT_EQ(e->else_statements.size(), 0u);
35 }
36 
TEST_F(ParserImplTest,IfStmt_WithElse)37 TEST_F(ParserImplTest, IfStmt_WithElse) {
38   auto p = parser("if (a == 4) { a = b; c = d; } elseif(c) { d = 2; } else {}");
39   auto e = p->if_stmt();
40   EXPECT_TRUE(e.matched);
41   EXPECT_FALSE(e.errored);
42   EXPECT_FALSE(p->has_error()) << p->error();
43   ASSERT_NE(e.value, nullptr);
44 
45   ASSERT_TRUE(e->Is<ast::IfStatement>());
46   ASSERT_NE(e->condition, nullptr);
47   ASSERT_TRUE(e->condition->Is<ast::BinaryExpression>());
48   EXPECT_EQ(e->body->statements.size(), 2u);
49 
50   ASSERT_EQ(e->else_statements.size(), 2u);
51   ASSERT_NE(e->else_statements[0]->condition, nullptr);
52   ASSERT_TRUE(
53       e->else_statements[0]->condition->Is<ast::IdentifierExpression>());
54   EXPECT_EQ(e->else_statements[0]->body->statements.size(), 1u);
55 
56   ASSERT_EQ(e->else_statements[1]->condition, nullptr);
57   EXPECT_EQ(e->else_statements[1]->body->statements.size(), 0u);
58 }
59 
TEST_F(ParserImplTest,IfStmt_InvalidCondition)60 TEST_F(ParserImplTest, IfStmt_InvalidCondition) {
61   auto p = parser("if (a = 3) {}");
62   auto e = p->if_stmt();
63   EXPECT_FALSE(e.matched);
64   EXPECT_TRUE(e.errored);
65   EXPECT_EQ(e.value, nullptr);
66   EXPECT_TRUE(p->has_error());
67   EXPECT_EQ(p->error(), "1:7: expected ')'");
68 }
69 
TEST_F(ParserImplTest,IfStmt_MissingCondition)70 TEST_F(ParserImplTest, IfStmt_MissingCondition) {
71   auto p = parser("if {}");
72   auto e = p->if_stmt();
73   EXPECT_FALSE(e.matched);
74   EXPECT_TRUE(e.errored);
75   EXPECT_EQ(e.value, nullptr);
76   EXPECT_TRUE(p->has_error());
77   EXPECT_EQ(p->error(), "1:4: expected '('");
78 }
79 
TEST_F(ParserImplTest,IfStmt_InvalidBody)80 TEST_F(ParserImplTest, IfStmt_InvalidBody) {
81   auto p = parser("if (a) { fn main() {}}");
82   auto e = p->if_stmt();
83   EXPECT_FALSE(e.matched);
84   EXPECT_TRUE(e.errored);
85   EXPECT_EQ(e.value, nullptr);
86   EXPECT_TRUE(p->has_error());
87   EXPECT_EQ(p->error(), "1:10: expected '}'");
88 }
89 
TEST_F(ParserImplTest,IfStmt_MissingBody)90 TEST_F(ParserImplTest, IfStmt_MissingBody) {
91   auto p = parser("if (a)");
92   auto e = p->if_stmt();
93   EXPECT_FALSE(e.matched);
94   EXPECT_TRUE(e.errored);
95   EXPECT_EQ(e.value, nullptr);
96   EXPECT_TRUE(p->has_error());
97   EXPECT_EQ(p->error(), "1:7: expected '{'");
98 }
99 
TEST_F(ParserImplTest,IfStmt_InvalidElseif)100 TEST_F(ParserImplTest, IfStmt_InvalidElseif) {
101   auto p = parser("if (a) {} elseif (a) { fn main() -> a{}}");
102   auto e = p->if_stmt();
103   EXPECT_FALSE(e.matched);
104   EXPECT_TRUE(e.errored);
105   EXPECT_EQ(e.value, nullptr);
106   EXPECT_TRUE(p->has_error());
107   EXPECT_EQ(p->error(), "1:24: expected '}'");
108 }
109 
TEST_F(ParserImplTest,IfStmt_InvalidElse)110 TEST_F(ParserImplTest, IfStmt_InvalidElse) {
111   auto p = parser("if (a) {} else { fn main() -> a{}}");
112   auto e = p->if_stmt();
113   EXPECT_FALSE(e.matched);
114   EXPECT_TRUE(e.errored);
115   EXPECT_EQ(e.value, nullptr);
116   EXPECT_TRUE(p->has_error());
117   EXPECT_EQ(p->error(), "1:18: expected '}'");
118 }
119 
120 }  // namespace
121 }  // namespace wgsl
122 }  // namespace reader
123 }  // namespace tint
124