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/fallthrough_statement.h"
16 #include "src/writer/hlsl/test_helper.h"
17
18 namespace tint {
19 namespace writer {
20 namespace hlsl {
21 namespace {
22
23 using HlslGeneratorImplTest_Case = TestHelper;
24
TEST_F(HlslGeneratorImplTest_Case,Emit_Case)25 TEST_F(HlslGeneratorImplTest_Case, Emit_Case) {
26 auto* s = Switch(1, Case(Expr(5), Block(create<ast::BreakStatement>())),
27 DefaultCase());
28 WrapInFunction(s);
29
30 GeneratorImpl& gen = Build();
31
32 gen.increment_indent();
33
34 ASSERT_TRUE(gen.EmitCase(s, 0)) << gen.error();
35 EXPECT_EQ(gen.result(), R"( case 5: {
36 break;
37 }
38 )");
39 }
40
TEST_F(HlslGeneratorImplTest_Case,Emit_Case_BreaksByDefault)41 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_BreaksByDefault) {
42 auto* s = Switch(1, Case(Expr(5), Block()), DefaultCase());
43 WrapInFunction(s);
44
45 GeneratorImpl& gen = Build();
46
47 gen.increment_indent();
48
49 ASSERT_TRUE(gen.EmitCase(s, 0)) << gen.error();
50 EXPECT_EQ(gen.result(), R"( case 5: {
51 break;
52 }
53 )");
54 }
55
TEST_F(HlslGeneratorImplTest_Case,Emit_Case_WithFallthrough)56 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_WithFallthrough) {
57 auto* s =
58 Switch(1, //
59 Case(Expr(4), Block(create<ast::FallthroughStatement>())), //
60 Case(Expr(5), Block(create<ast::ReturnStatement>())), //
61 DefaultCase());
62 WrapInFunction(s);
63
64 GeneratorImpl& gen = Build();
65
66 gen.increment_indent();
67
68 ASSERT_TRUE(gen.EmitCase(s, 0)) << gen.error();
69 EXPECT_EQ(gen.result(), R"( case 4: {
70 /* fallthrough */
71 {
72 return;
73 }
74 break;
75 }
76 )");
77 }
78
TEST_F(HlslGeneratorImplTest_Case,Emit_Case_MultipleSelectors)79 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_MultipleSelectors) {
80 auto* s =
81 Switch(1, Case({Expr(5), Expr(6)}, Block(create<ast::BreakStatement>())),
82 DefaultCase());
83 WrapInFunction(s);
84
85 GeneratorImpl& gen = Build();
86
87 gen.increment_indent();
88
89 ASSERT_TRUE(gen.EmitCase(s, 0)) << gen.error();
90 EXPECT_EQ(gen.result(), R"( case 5:
91 case 6: {
92 break;
93 }
94 )");
95 }
96
TEST_F(HlslGeneratorImplTest_Case,Emit_Case_Default)97 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_Default) {
98 auto* s = Switch(1, DefaultCase(Block(create<ast::BreakStatement>())));
99 WrapInFunction(s);
100
101 GeneratorImpl& gen = Build();
102
103 gen.increment_indent();
104
105 ASSERT_TRUE(gen.EmitCase(s, 0)) << gen.error();
106 EXPECT_EQ(gen.result(), R"( default: {
107 break;
108 }
109 )");
110 }
111
112 } // namespace
113 } // namespace hlsl
114 } // namespace writer
115 } // namespace tint
116