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/reader/wgsl/parser_impl_test_helper.h"
16
17 namespace tint {
18 namespace reader {
19 namespace wgsl {
20 namespace {
21
TEST_F(ParserImplTest,StructBodyDecl_Parses)22 TEST_F(ParserImplTest, StructBodyDecl_Parses) {
23 auto p = parser("{a : i32;}");
24
25 auto& builder = p->builder();
26
27 auto m = p->expect_struct_body_decl();
28 ASSERT_FALSE(p->has_error());
29 ASSERT_FALSE(m.errored);
30 ASSERT_EQ(m.value.size(), 1u);
31
32 const auto* mem = m.value[0];
33 EXPECT_EQ(mem->symbol, builder.Symbols().Get("a"));
34 EXPECT_TRUE(mem->type->Is<ast::I32>());
35 EXPECT_EQ(mem->decorations.size(), 0u);
36 }
37
TEST_F(ParserImplTest,StructBodyDecl_ParsesEmpty)38 TEST_F(ParserImplTest, StructBodyDecl_ParsesEmpty) {
39 auto p = parser("{}");
40 auto m = p->expect_struct_body_decl();
41 ASSERT_FALSE(p->has_error());
42 ASSERT_FALSE(m.errored);
43 ASSERT_EQ(m.value.size(), 0u);
44 }
45
TEST_F(ParserImplTest,StructBodyDecl_InvalidAlign)46 TEST_F(ParserImplTest, StructBodyDecl_InvalidAlign) {
47 auto p = parser(R"(
48 {
49 [[align(nan)]] a : i32;
50 })");
51 auto m = p->expect_struct_body_decl();
52 ASSERT_TRUE(p->has_error());
53 ASSERT_TRUE(m.errored);
54 EXPECT_EQ(p->error(),
55 "3:11: expected signed integer literal for align decoration");
56 }
57
TEST_F(ParserImplTest,StructBodyDecl_InvalidSize)58 TEST_F(ParserImplTest, StructBodyDecl_InvalidSize) {
59 auto p = parser(R"(
60 {
61 [[size(nan)]] a : i32;
62 })");
63 auto m = p->expect_struct_body_decl();
64 ASSERT_TRUE(p->has_error());
65 ASSERT_TRUE(m.errored);
66 EXPECT_EQ(p->error(),
67 "3:10: expected signed integer literal for size decoration");
68 }
69
TEST_F(ParserImplTest,StructBodyDecl_MissingClosingBracket)70 TEST_F(ParserImplTest, StructBodyDecl_MissingClosingBracket) {
71 auto p = parser("{a : i32;");
72 auto m = p->expect_struct_body_decl();
73 ASSERT_TRUE(p->has_error());
74 ASSERT_TRUE(m.errored);
75 EXPECT_EQ(p->error(), "1:10: expected '}' for struct declaration");
76 }
77
TEST_F(ParserImplTest,StructBodyDecl_InvalidToken)78 TEST_F(ParserImplTest, StructBodyDecl_InvalidToken) {
79 auto p = parser(R"(
80 {
81 a : i32;
82 1.23
83 } )");
84 auto m = p->expect_struct_body_decl();
85 ASSERT_TRUE(p->has_error());
86 ASSERT_TRUE(m.errored);
87 EXPECT_EQ(p->error(), "4:3: expected identifier for struct member");
88 }
89
90 } // namespace
91 } // namespace wgsl
92 } // namespace reader
93 } // namespace tint
94