blob: 61c8b66c520a943cec74fee3f808b7097002f411 [file] [log] [blame]
dan sinclair45101592020-07-08 20:52:46 +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
Ben Claytonb8ea5912021-04-19 16:52:42 +000015#include "gmock/gmock.h"
dan sinclair45101592020-07-08 20:52:46 +000016#include "src/ast/variable_decl_statement.h"
dan sinclair196e0972020-11-13 18:13:24 +000017#include "src/writer/msl/test_helper.h"
dan sinclair45101592020-07-08 20:52:46 +000018
19namespace tint {
20namespace writer {
21namespace msl {
22namespace {
23
Ben Claytonb8ea5912021-04-19 16:52:42 +000024using ::testing::HasSubstr;
25
dan sinclair196e0972020-11-13 18:13:24 +000026using MslGeneratorImplTest = TestHelper;
dan sinclair45101592020-07-08 20:52:46 +000027
28TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement) {
Ben Clayton37571bc2021-02-16 23:57:01 +000029 auto* var = Var("a", ty.f32(), ast::StorageClass::kNone);
Ben Clayton43073d82021-04-22 13:50:53 +000030 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +000031 WrapInFunction(stmt);
dan sinclair45101592020-07-08 20:52:46 +000032
Ben Claytonf12054e2021-01-21 16:15:00 +000033 GeneratorImpl& gen = Build();
34
dan sinclair196e0972020-11-13 18:13:24 +000035 gen.increment_indent();
dan sinclair45101592020-07-08 20:52:46 +000036
Ben Claytone6e70412021-01-05 15:29:29 +000037 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
dan sinclair987376c2021-01-12 04:34:53 +000038 EXPECT_EQ(gen.result(), " float a = 0.0f;\n");
dan sinclair45101592020-07-08 20:52:46 +000039}
40
dan sinclaircbe06682020-07-30 22:26:46 +000041TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const) {
James Price08df57a2021-05-06 13:37:13 +000042 auto* var = Const("a", ty.f32(), Construct(ty.f32()));
Ben Clayton43073d82021-04-22 13:50:53 +000043 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +000044 WrapInFunction(stmt);
dan sinclaircbe06682020-07-30 22:26:46 +000045
Ben Claytonf12054e2021-01-21 16:15:00 +000046 GeneratorImpl& gen = Build();
47
dan sinclair196e0972020-11-13 18:13:24 +000048 gen.increment_indent();
dan sinclaircbe06682020-07-30 22:26:46 +000049
Ben Claytone6e70412021-01-05 15:29:29 +000050 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
James Price6c582772021-05-20 16:45:47 +000051 EXPECT_EQ(gen.result(), " float const a = float();\n");
dan sinclaircbe06682020-07-30 22:26:46 +000052}
53
dan sinclair45101592020-07-08 20:52:46 +000054TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Array) {
Ben Claytonc6ed25c2021-05-04 19:02:01 +000055 auto* var = Var("a", ty.array<f32, 5>(), ast::StorageClass::kNone);
Ben Clayton43073d82021-04-22 13:50:53 +000056 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +000057 WrapInFunction(stmt);
dan sinclair45101592020-07-08 20:52:46 +000058
Ben Claytonf12054e2021-01-21 16:15:00 +000059 GeneratorImpl& gen = Build();
60
dan sinclair196e0972020-11-13 18:13:24 +000061 gen.increment_indent();
dan sinclair45101592020-07-08 20:52:46 +000062
Ben Claytone6e70412021-01-05 15:29:29 +000063 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
dan sinclair987376c2021-01-12 04:34:53 +000064 EXPECT_EQ(gen.result(), " float a[5] = {0.0f};\n");
dan sinclair45101592020-07-08 20:52:46 +000065}
66
dan sinclairf367ead2020-09-24 14:33:24 +000067TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Struct) {
Ben Claytonba6ab5e2021-05-07 14:49:34 +000068 auto* s = Structure("S", {
69 Member("a", ty.f32()),
70 Member("b", ty.f32()),
71 });
dan sinclairf367ead2020-09-24 14:33:24 +000072
Ben Clayton8758f102021-06-09 14:32:14 +000073 auto* var = Var("a", ty.Of(s), ast::StorageClass::kNone);
Ben Clayton43073d82021-04-22 13:50:53 +000074 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +000075 WrapInFunction(stmt);
dan sinclair45101592020-07-08 20:52:46 +000076
Ben Claytonf12054e2021-01-21 16:15:00 +000077 GeneratorImpl& gen = Build();
78
dan sinclair196e0972020-11-13 18:13:24 +000079 gen.increment_indent();
dan sinclair45101592020-07-08 20:52:46 +000080
Ben Claytone6e70412021-01-05 15:29:29 +000081 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
dan sinclair987376c2021-01-12 04:34:53 +000082 EXPECT_EQ(gen.result(), R"( S a = {};
dan sinclairf367ead2020-09-24 14:33:24 +000083)");
84}
85
86TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Vector) {
Ben Claytonf6c84e42021-05-12 21:08:22 +000087 auto* var = Var("a", ty.vec2<f32>());
Ben Clayton43073d82021-04-22 13:50:53 +000088 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +000089 WrapInFunction(stmt);
dan sinclairf367ead2020-09-24 14:33:24 +000090
Ben Claytonf12054e2021-01-21 16:15:00 +000091 GeneratorImpl& gen = Build();
92
dan sinclair196e0972020-11-13 18:13:24 +000093 gen.increment_indent();
dan sinclairf367ead2020-09-24 14:33:24 +000094
Ben Claytone6e70412021-01-05 15:29:29 +000095 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
dan sinclair987376c2021-01-12 04:34:53 +000096 EXPECT_EQ(gen.result(), " float2 a = 0.0f;\n");
dan sinclairf367ead2020-09-24 14:33:24 +000097}
98
99TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Matrix) {
Ben Claytonf6c84e42021-05-12 21:08:22 +0000100 auto* var = Var("a", ty.mat3x2<f32>());
dan sinclairf367ead2020-09-24 14:33:24 +0000101
Ben Clayton43073d82021-04-22 13:50:53 +0000102 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +0000103 WrapInFunction(stmt);
dan sinclairf367ead2020-09-24 14:33:24 +0000104
Ben Claytonf12054e2021-01-21 16:15:00 +0000105 GeneratorImpl& gen = Build();
106
dan sinclair196e0972020-11-13 18:13:24 +0000107 gen.increment_indent();
dan sinclairf367ead2020-09-24 14:33:24 +0000108
Ben Claytone6e70412021-01-05 15:29:29 +0000109 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
James Price94867592021-05-19 11:15:58 +0000110 EXPECT_EQ(gen.result(), " float3x2 a = float3x2(0.0f);\n");
dan sinclair45101592020-07-08 20:52:46 +0000111}
112
James Price7a47fa82021-05-26 15:41:02 +0000113TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Private) {
Ben Claytonb8ea5912021-04-19 16:52:42 +0000114 Global("a", ty.f32(), ast::StorageClass::kPrivate);
115
116 WrapInFunction(Expr("a"));
dan sinclair45101592020-07-08 20:52:46 +0000117
James Price7a47fa82021-05-26 15:41:02 +0000118 GeneratorImpl& gen = SanitizeAndBuild();
Ben Claytonf12054e2021-01-21 16:15:00 +0000119
dan sinclair196e0972020-11-13 18:13:24 +0000120 gen.increment_indent();
dan sinclair45101592020-07-08 20:52:46 +0000121
Ben Claytonb8ea5912021-04-19 16:52:42 +0000122 ASSERT_TRUE(gen.Generate()) << gen.error();
James Price2940c702021-06-11 12:29:56 +0000123 EXPECT_THAT(gen.result(), HasSubstr("thread float tint_symbol_1 = 0.0f;\n"));
dan sinclair45101592020-07-08 20:52:46 +0000124}
125
James Price7a47fa82021-05-26 15:41:02 +0000126TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_Private) {
127 GlobalConst("initializer", ty.f32(), Expr(0.f));
Ben Claytonb8ea5912021-04-19 16:52:42 +0000128 Global("a", ty.f32(), ast::StorageClass::kPrivate, Expr("initializer"));
129
130 WrapInFunction(Expr("a"));
dan sinclair45101592020-07-08 20:52:46 +0000131
James Price7a47fa82021-05-26 15:41:02 +0000132 GeneratorImpl& gen = SanitizeAndBuild();
Ben Claytonf12054e2021-01-21 16:15:00 +0000133
Ben Claytonb8ea5912021-04-19 16:52:42 +0000134 ASSERT_TRUE(gen.Generate()) << gen.error();
James Price7a47fa82021-05-26 15:41:02 +0000135 EXPECT_THAT(gen.result(),
James Price2940c702021-06-11 12:29:56 +0000136 HasSubstr("thread float tint_symbol_1 = initializer;\n"));
James Price7a47fa82021-05-26 15:41:02 +0000137}
138
139TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Workgroup) {
140 Global("a", ty.f32(), ast::StorageClass::kWorkgroup);
141
142 WrapInFunction(Expr("a"));
143
144 GeneratorImpl& gen = SanitizeAndBuild();
145
146 gen.increment_indent();
147
148 ASSERT_TRUE(gen.Generate()) << gen.error();
Ben Clayton75db82c2021-06-18 22:44:31 +0000149 EXPECT_THAT(gen.result(), HasSubstr("threadgroup float tint_symbol_2;\n"));
dan sinclair45101592020-07-08 20:52:46 +0000150}
151
152TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroVec) {
Ben Clayton1637cbb2021-01-05 15:44:39 +0000153 auto* zero_vec = vec3<f32>();
dan sinclair45101592020-07-08 20:52:46 +0000154
Ben Claytonf6c84e42021-05-12 21:08:22 +0000155 auto* var = Var("a", ty.vec3<f32>(), ast::StorageClass::kNone, zero_vec);
Ben Clayton43073d82021-04-22 13:50:53 +0000156 auto* stmt = Decl(var);
Ben Clayton401b96b2021-02-03 17:19:59 +0000157 WrapInFunction(stmt);
dan sinclair45101592020-07-08 20:52:46 +0000158
Ben Claytonf12054e2021-01-21 16:15:00 +0000159 GeneratorImpl& gen = Build();
160
Ben Claytone6e70412021-01-05 15:29:29 +0000161 ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
James Price6c582772021-05-20 16:45:47 +0000162 EXPECT_EQ(gen.result(), R"(float3 a = float3();
dan sinclair45101592020-07-08 20:52:46 +0000163)");
164}
165
166} // namespace
167} // namespace msl
168} // namespace writer
169} // namespace tint