blob: a46161b68a20c8b6cebc688047beb2ad3ee9edfa [file] [log] [blame]
Dan Sinclaira659b212020-03-06 14:28:01 +00001// 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
Ben Clayton8454d822021-03-10 11:41:49 +000017#include "gtest/gtest-spi.h"
dan sinclair8f3c6352020-07-25 14:33:50 +000018#include "src/ast/discard_statement.h"
Dan Sinclaira659b212020-03-06 14:28:01 +000019#include "src/ast/if_statement.h"
Ben Clayton10d5c6a2020-11-13 21:58:28 +000020#include "src/ast/test_helper.h"
Dan Sinclaira659b212020-03-06 14:28:01 +000021
22namespace tint {
23namespace ast {
dan sinclair989cee62020-03-26 15:31:43 +000024namespace {
Dan Sinclaira659b212020-03-06 14:28:01 +000025
Ben Clayton10d5c6a2020-11-13 21:58:28 +000026using CaseStatementTest = TestHelper;
Dan Sinclaira659b212020-03-06 14:28:01 +000027
dan sinclair579d33c2020-06-02 20:12:02 +000028TEST_F(CaseStatementTest, Creation_i32) {
dan sinclair1aadbd42020-06-01 16:56:46 +000029 CaseSelectorList b;
Ben Clayton5c9a80b2021-11-10 19:23:07 +000030 auto* selector = create<SintLiteralExpression>(2);
Ben Clayton4bfe4612020-11-16 16:41:47 +000031 b.push_back(selector);
dan sinclair1aadbd42020-06-01 16:56:46 +000032
Ben Clayton1523f5c2020-12-14 22:30:57 +000033 auto* discard = create<DiscardStatement>();
34 auto* body = create<BlockStatement>(StatementList{discard});
Dan Sinclaira659b212020-03-06 14:28:01 +000035
Ben Clayton1523f5c2020-12-14 22:30:57 +000036 auto* c = create<CaseStatement>(b, body);
Ben Clayton4f3ff572021-10-15 17:33:10 +000037 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);
dan sinclair579d33c2020-06-02 20:12:02 +000041}
42
43TEST_F(CaseStatementTest, Creation_u32) {
dan sinclair579d33c2020-06-02 20:12:02 +000044 CaseSelectorList b;
Ben Clayton5c9a80b2021-11-10 19:23:07 +000045 auto* selector = create<UintLiteralExpression>(2u);
Ben Clayton4bfe4612020-11-16 16:41:47 +000046 b.push_back(selector);
dan sinclair579d33c2020-06-02 20:12:02 +000047
Ben Clayton1523f5c2020-12-14 22:30:57 +000048 auto* discard = create<DiscardStatement>();
49 auto* body = create<BlockStatement>(StatementList{discard});
dan sinclair579d33c2020-06-02 20:12:02 +000050
Ben Clayton1523f5c2020-12-14 22:30:57 +000051 auto* c = create<CaseStatement>(b, body);
Ben Clayton4f3ff572021-10-15 17:33:10 +000052 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);
Dan Sinclaira659b212020-03-06 14:28:01 +000056}
57
58TEST_F(CaseStatementTest, Creation_WithSource) {
dan sinclair1aadbd42020-06-01 16:56:46 +000059 CaseSelectorList b;
Ben Clayton5c9a80b2021-11-10 19:23:07 +000060 b.push_back(create<SintLiteralExpression>(2));
dan sinclair1aadbd42020-06-01 16:56:46 +000061
Ben Clayton1523f5c2020-12-14 22:30:57 +000062 auto* body = create<BlockStatement>(StatementList{
63 create<DiscardStatement>(),
64 });
65 auto* c = create<CaseStatement>(Source{Source::Location{20, 2}}, b, body);
Ben Clayton4f3ff572021-10-15 17:33:10 +000066 auto src = c->source;
Ben Clayton5bee67f2020-10-30 20:44:53 +000067 EXPECT_EQ(src.range.begin.line, 20u);
68 EXPECT_EQ(src.range.begin.column, 2u);
Dan Sinclaira659b212020-03-06 14:28:01 +000069}
70
dan sinclair1d699152020-06-02 17:18:56 +000071TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) {
Ben Clayton1523f5c2020-12-14 22:30:57 +000072 auto* body = create<BlockStatement>(StatementList{
73 create<DiscardStatement>(),
74 });
75 auto* c = create<CaseStatement>(CaseSelectorList{}, body);
76 EXPECT_TRUE(c->IsDefault());
Dan Sinclaira659b212020-03-06 14:28:01 +000077}
78
dan sinclair1d699152020-06-02 17:18:56 +000079TEST_F(CaseStatementTest, IsDefault_WithSelectors) {
dan sinclair1aadbd42020-06-01 16:56:46 +000080 CaseSelectorList b;
Ben Clayton5c9a80b2021-11-10 19:23:07 +000081 b.push_back(create<SintLiteralExpression>(2));
dan sinclair1aadbd42020-06-01 16:56:46 +000082
Ben Clayton1523f5c2020-12-14 22:30:57 +000083 auto* c = create<CaseStatement>(b, create<BlockStatement>(StatementList{}));
84 EXPECT_FALSE(c->IsDefault());
Dan Sinclaira659b212020-03-06 14:28:01 +000085}
86
87TEST_F(CaseStatementTest, IsCase) {
Ben Clayton1523f5c2020-12-14 22:30:57 +000088 auto* c = create<CaseStatement>(CaseSelectorList{},
89 create<BlockStatement>(StatementList{}));
90 EXPECT_TRUE(c->Is<CaseStatement>());
Dan Sinclaira659b212020-03-06 14:28:01 +000091}
92
Ben Claytonf0c816a2021-04-15 17:47:23 +000093TEST_F(CaseStatementTest, Assert_Null_Body) {
Ben Clayton8454d822021-03-10 11:41:49 +000094 EXPECT_FATAL_FAILURE(
95 {
96 ProgramBuilder b;
97 b.create<CaseStatement>(CaseSelectorList{}, nullptr);
98 },
99 "internal compiler error");
Dan Sinclaira659b212020-03-06 14:28:01 +0000100}
101
Ben Claytonf0c816a2021-04-15 17:47:23 +0000102TEST_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
112TEST_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
123TEST_F(CaseStatementTest, Assert_DifferentProgramID_Selector) {
124 EXPECT_FATAL_FAILURE(
125 {
126 ProgramBuilder b1;
127 ProgramBuilder b2;
Ben Clayton5c9a80b2021-11-10 19:23:07 +0000128 b1.create<CaseStatement>(
129 CaseSelectorList{b2.create<SintLiteralExpression>(2)},
130 b1.create<BlockStatement>(StatementList{}));
Ben Claytonf0c816a2021-04-15 17:47:23 +0000131 },
132 "internal compiler error");
133}
134
dan sinclair989cee62020-03-26 15:31:43 +0000135} // namespace
Dan Sinclaira659b212020-03-06 14:28:01 +0000136} // namespace ast
137} // namespace tint