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