Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 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 | |
Ben Clayton | 8454d82 | 2021-03-10 11:41:49 +0000 | [diff] [blame] | 17 | #include "gtest/gtest-spi.h" |
dan sinclair | 8f3c635 | 2020-07-25 14:33:50 +0000 | [diff] [blame] | 18 | #include "src/ast/discard_statement.h" |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 19 | #include "src/ast/if_statement.h" |
Ben Clayton | 10d5c6a | 2020-11-13 21:58:28 +0000 | [diff] [blame] | 20 | #include "src/ast/test_helper.h" |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 21 | |
| 22 | namespace tint { |
| 23 | namespace ast { |
dan sinclair | 989cee6 | 2020-03-26 15:31:43 +0000 | [diff] [blame] | 24 | namespace { |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 25 | |
Ben Clayton | 10d5c6a | 2020-11-13 21:58:28 +0000 | [diff] [blame] | 26 | using CaseStatementTest = TestHelper; |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 27 | |
dan sinclair | 579d33c | 2020-06-02 20:12:02 +0000 | [diff] [blame] | 28 | TEST_F(CaseStatementTest, Creation_i32) { |
dan sinclair | 1aadbd4 | 2020-06-01 16:56:46 +0000 | [diff] [blame] | 29 | CaseSelectorList b; |
Ben Clayton | 5c9a80b | 2021-11-10 19:23:07 +0000 | [diff] [blame] | 30 | auto* selector = create<SintLiteralExpression>(2); |
Ben Clayton | 4bfe461 | 2020-11-16 16:41:47 +0000 | [diff] [blame] | 31 | b.push_back(selector); |
dan sinclair | 1aadbd4 | 2020-06-01 16:56:46 +0000 | [diff] [blame] | 32 | |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 33 | auto* discard = create<DiscardStatement>(); |
| 34 | auto* body = create<BlockStatement>(StatementList{discard}); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 35 | |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 36 | auto* c = create<CaseStatement>(b, body); |
Ben Clayton | 4f3ff57 | 2021-10-15 17:33:10 +0000 | [diff] [blame] | 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); |
dan sinclair | 579d33c | 2020-06-02 20:12:02 +0000 | [diff] [blame] | 41 | } |
| 42 | |
| 43 | TEST_F(CaseStatementTest, Creation_u32) { |
dan sinclair | 579d33c | 2020-06-02 20:12:02 +0000 | [diff] [blame] | 44 | CaseSelectorList b; |
Ben Clayton | 5c9a80b | 2021-11-10 19:23:07 +0000 | [diff] [blame] | 45 | auto* selector = create<UintLiteralExpression>(2u); |
Ben Clayton | 4bfe461 | 2020-11-16 16:41:47 +0000 | [diff] [blame] | 46 | b.push_back(selector); |
dan sinclair | 579d33c | 2020-06-02 20:12:02 +0000 | [diff] [blame] | 47 | |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 48 | auto* discard = create<DiscardStatement>(); |
| 49 | auto* body = create<BlockStatement>(StatementList{discard}); |
dan sinclair | 579d33c | 2020-06-02 20:12:02 +0000 | [diff] [blame] | 50 | |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 51 | auto* c = create<CaseStatement>(b, body); |
Ben Clayton | 4f3ff57 | 2021-10-15 17:33:10 +0000 | [diff] [blame] | 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); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 56 | } |
| 57 | |
| 58 | TEST_F(CaseStatementTest, Creation_WithSource) { |
dan sinclair | 1aadbd4 | 2020-06-01 16:56:46 +0000 | [diff] [blame] | 59 | CaseSelectorList b; |
Ben Clayton | 5c9a80b | 2021-11-10 19:23:07 +0000 | [diff] [blame] | 60 | b.push_back(create<SintLiteralExpression>(2)); |
dan sinclair | 1aadbd4 | 2020-06-01 16:56:46 +0000 | [diff] [blame] | 61 | |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 62 | auto* body = create<BlockStatement>(StatementList{ |
| 63 | create<DiscardStatement>(), |
| 64 | }); |
| 65 | auto* c = create<CaseStatement>(Source{Source::Location{20, 2}}, b, body); |
Ben Clayton | 4f3ff57 | 2021-10-15 17:33:10 +0000 | [diff] [blame] | 66 | auto src = c->source; |
Ben Clayton | 5bee67f | 2020-10-30 20:44:53 +0000 | [diff] [blame] | 67 | EXPECT_EQ(src.range.begin.line, 20u); |
| 68 | EXPECT_EQ(src.range.begin.column, 2u); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 69 | } |
| 70 | |
dan sinclair | 1d69915 | 2020-06-02 17:18:56 +0000 | [diff] [blame] | 71 | TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) { |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 72 | auto* body = create<BlockStatement>(StatementList{ |
| 73 | create<DiscardStatement>(), |
| 74 | }); |
| 75 | auto* c = create<CaseStatement>(CaseSelectorList{}, body); |
| 76 | EXPECT_TRUE(c->IsDefault()); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 77 | } |
| 78 | |
dan sinclair | 1d69915 | 2020-06-02 17:18:56 +0000 | [diff] [blame] | 79 | TEST_F(CaseStatementTest, IsDefault_WithSelectors) { |
dan sinclair | 1aadbd4 | 2020-06-01 16:56:46 +0000 | [diff] [blame] | 80 | CaseSelectorList b; |
Ben Clayton | 5c9a80b | 2021-11-10 19:23:07 +0000 | [diff] [blame] | 81 | b.push_back(create<SintLiteralExpression>(2)); |
dan sinclair | 1aadbd4 | 2020-06-01 16:56:46 +0000 | [diff] [blame] | 82 | |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 83 | auto* c = create<CaseStatement>(b, create<BlockStatement>(StatementList{})); |
| 84 | EXPECT_FALSE(c->IsDefault()); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | TEST_F(CaseStatementTest, IsCase) { |
Ben Clayton | 1523f5c | 2020-12-14 22:30:57 +0000 | [diff] [blame] | 88 | auto* c = create<CaseStatement>(CaseSelectorList{}, |
| 89 | create<BlockStatement>(StatementList{})); |
| 90 | EXPECT_TRUE(c->Is<CaseStatement>()); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 91 | } |
| 92 | |
Ben Clayton | f0c816a | 2021-04-15 17:47:23 +0000 | [diff] [blame] | 93 | TEST_F(CaseStatementTest, Assert_Null_Body) { |
Ben Clayton | 8454d82 | 2021-03-10 11:41:49 +0000 | [diff] [blame] | 94 | EXPECT_FATAL_FAILURE( |
| 95 | { |
| 96 | ProgramBuilder b; |
| 97 | b.create<CaseStatement>(CaseSelectorList{}, nullptr); |
| 98 | }, |
| 99 | "internal compiler error"); |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 100 | } |
| 101 | |
Ben Clayton | f0c816a | 2021-04-15 17:47:23 +0000 | [diff] [blame] | 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 | |
| 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 | |
| 123 | TEST_F(CaseStatementTest, Assert_DifferentProgramID_Selector) { |
| 124 | EXPECT_FATAL_FAILURE( |
| 125 | { |
| 126 | ProgramBuilder b1; |
| 127 | ProgramBuilder b2; |
Ben Clayton | 5c9a80b | 2021-11-10 19:23:07 +0000 | [diff] [blame] | 128 | b1.create<CaseStatement>( |
| 129 | CaseSelectorList{b2.create<SintLiteralExpression>(2)}, |
| 130 | b1.create<BlockStatement>(StatementList{})); |
Ben Clayton | f0c816a | 2021-04-15 17:47:23 +0000 | [diff] [blame] | 131 | }, |
| 132 | "internal compiler error"); |
| 133 | } |
| 134 | |
dan sinclair | 989cee6 | 2020-03-26 15:31:43 +0000 | [diff] [blame] | 135 | } // namespace |
Dan Sinclair | a659b21 | 2020-03-06 14:28:01 +0000 | [diff] [blame] | 136 | } // namespace ast |
| 137 | } // namespace tint |