• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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