• 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/ast/case_statement.h"
16 
17 #include "gtest/gtest-spi.h"
18 #include "src/ast/discard_statement.h"
19 #include "src/ast/if_statement.h"
20 #include "src/ast/test_helper.h"
21 
22 namespace tint {
23 namespace ast {
24 namespace {
25 
26 using CaseStatementTest = TestHelper;
27 
TEST_F(CaseStatementTest,Creation_i32)28 TEST_F(CaseStatementTest, Creation_i32) {
29   CaseSelectorList b;
30   auto* selector = create<SintLiteralExpression>(2);
31   b.push_back(selector);
32 
33   auto* discard = create<DiscardStatement>();
34   auto* body = create<BlockStatement>(StatementList{discard});
35 
36   auto* c = create<CaseStatement>(b, body);
37   ASSERT_EQ(c->selectors.size(), 1u);
38   EXPECT_EQ(c->selectors[0], selector);
39   ASSERT_EQ(c->body->statements.size(), 1u);
40   EXPECT_EQ(c->body->statements[0], discard);
41 }
42 
TEST_F(CaseStatementTest,Creation_u32)43 TEST_F(CaseStatementTest, Creation_u32) {
44   CaseSelectorList b;
45   auto* selector = create<UintLiteralExpression>(2u);
46   b.push_back(selector);
47 
48   auto* discard = create<DiscardStatement>();
49   auto* body = create<BlockStatement>(StatementList{discard});
50 
51   auto* c = create<CaseStatement>(b, body);
52   ASSERT_EQ(c->selectors.size(), 1u);
53   EXPECT_EQ(c->selectors[0], selector);
54   ASSERT_EQ(c->body->statements.size(), 1u);
55   EXPECT_EQ(c->body->statements[0], discard);
56 }
57 
TEST_F(CaseStatementTest,Creation_WithSource)58 TEST_F(CaseStatementTest, Creation_WithSource) {
59   CaseSelectorList b;
60   b.push_back(create<SintLiteralExpression>(2));
61 
62   auto* body = create<BlockStatement>(StatementList{
63       create<DiscardStatement>(),
64   });
65   auto* c = create<CaseStatement>(Source{Source::Location{20, 2}}, b, body);
66   auto src = c->source;
67   EXPECT_EQ(src.range.begin.line, 20u);
68   EXPECT_EQ(src.range.begin.column, 2u);
69 }
70 
TEST_F(CaseStatementTest,IsDefault_WithoutSelectors)71 TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) {
72   auto* body = create<BlockStatement>(StatementList{
73       create<DiscardStatement>(),
74   });
75   auto* c = create<CaseStatement>(CaseSelectorList{}, body);
76   EXPECT_TRUE(c->IsDefault());
77 }
78 
TEST_F(CaseStatementTest,IsDefault_WithSelectors)79 TEST_F(CaseStatementTest, IsDefault_WithSelectors) {
80   CaseSelectorList b;
81   b.push_back(create<SintLiteralExpression>(2));
82 
83   auto* c = create<CaseStatement>(b, create<BlockStatement>(StatementList{}));
84   EXPECT_FALSE(c->IsDefault());
85 }
86 
TEST_F(CaseStatementTest,IsCase)87 TEST_F(CaseStatementTest, IsCase) {
88   auto* c = create<CaseStatement>(CaseSelectorList{},
89                                   create<BlockStatement>(StatementList{}));
90   EXPECT_TRUE(c->Is<CaseStatement>());
91 }
92 
TEST_F(CaseStatementTest,Assert_Null_Body)93 TEST_F(CaseStatementTest, Assert_Null_Body) {
94   EXPECT_FATAL_FAILURE(
95       {
96         ProgramBuilder b;
97         b.create<CaseStatement>(CaseSelectorList{}, nullptr);
98       },
99       "internal compiler error");
100 }
101 
TEST_F(CaseStatementTest,Assert_Null_Selector)102 TEST_F(CaseStatementTest, Assert_Null_Selector) {
103   EXPECT_FATAL_FAILURE(
104       {
105         ProgramBuilder b;
106         b.create<CaseStatement>(CaseSelectorList{nullptr},
107                                 b.create<BlockStatement>(StatementList{}));
108       },
109       "internal compiler error");
110 }
111 
TEST_F(CaseStatementTest,Assert_DifferentProgramID_Call)112 TEST_F(CaseStatementTest, Assert_DifferentProgramID_Call) {
113   EXPECT_FATAL_FAILURE(
114       {
115         ProgramBuilder b1;
116         ProgramBuilder b2;
117         b1.create<CaseStatement>(CaseSelectorList{},
118                                  b2.create<BlockStatement>(StatementList{}));
119       },
120       "internal compiler error");
121 }
122 
TEST_F(CaseStatementTest,Assert_DifferentProgramID_Selector)123 TEST_F(CaseStatementTest, Assert_DifferentProgramID_Selector) {
124   EXPECT_FATAL_FAILURE(
125       {
126         ProgramBuilder b1;
127         ProgramBuilder b2;
128         b1.create<CaseStatement>(
129             CaseSelectorList{b2.create<SintLiteralExpression>(2)},
130             b1.create<BlockStatement>(StatementList{}));
131       },
132       "internal compiler error");
133 }
134 
135 }  // namespace
136 }  // namespace ast
137 }  // namespace tint
138