blob: 19ed63807647613c362e6e46fe895e863081ebc2 [file] [log] [blame]
Dan Sinclair6e581892020-03-02 15:47:43 -05001// 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
dan sinclair9981b632020-03-25 19:16:36 +000015#include "src/reader/wgsl/parser_impl_test_helper.h"
Dan Sinclair6e581892020-03-02 15:47:43 -050016
17namespace tint {
18namespace reader {
19namespace wgsl {
dan sinclair989cee62020-03-26 15:31:43 +000020namespace {
Dan Sinclair6e581892020-03-02 15:47:43 -050021
Dan Sinclair6e581892020-03-02 15:47:43 -050022TEST_F(ParserImplTest, VariableDecl_Parses) {
Ben Clayton627732c2020-11-18 19:40:00 +000023 auto p = parser("var my_var : f32");
Ben Claytona80511e2020-12-11 13:07:02 +000024 auto v = p->variable_decl();
Ben Claytonab5dfee2020-11-09 19:52:24 +000025 EXPECT_FALSE(p->has_error());
Ben Claytona80511e2020-12-11 13:07:02 +000026 EXPECT_TRUE(v.matched);
27 EXPECT_FALSE(v.errored);
28 EXPECT_EQ(v->name, "my_var");
29 EXPECT_NE(v->type, nullptr);
Antonio Maiorano3751fd22021-04-19 22:51:23 +000030 EXPECT_TRUE(v->type->Is<sem::F32>());
Ben Clayton580d6c72020-11-02 15:25:18 +000031
Ben Claytona80511e2020-12-11 13:07:02 +000032 EXPECT_EQ(v->source.range.begin.line, 1u);
33 EXPECT_EQ(v->source.range.begin.column, 5u);
34 EXPECT_EQ(v->source.range.end.line, 1u);
35 EXPECT_EQ(v->source.range.end.column, 11u);
Dan Sinclair6e581892020-03-02 15:47:43 -050036}
37
38TEST_F(ParserImplTest, VariableDecl_MissingVar) {
Ben Clayton627732c2020-11-18 19:40:00 +000039 auto p = parser("my_var : f32");
dan sinclair9981b632020-03-25 19:16:36 +000040 auto v = p->variable_decl();
Ben Claytonab5dfee2020-11-09 19:52:24 +000041 EXPECT_FALSE(v.matched);
42 EXPECT_FALSE(v.errored);
43 EXPECT_FALSE(p->has_error());
Dan Sinclair6e581892020-03-02 15:47:43 -050044
dan sinclair9981b632020-03-25 19:16:36 +000045 auto t = p->next();
Dan Sinclair6e581892020-03-02 15:47:43 -050046 ASSERT_TRUE(t.IsIdentifier());
47}
48
49TEST_F(ParserImplTest, VariableDecl_InvalidIdentDecl) {
Ben Clayton627732c2020-11-18 19:40:00 +000050 auto p = parser("var my_var f32");
dan sinclair9981b632020-03-25 19:16:36 +000051 auto v = p->variable_decl();
Ben Claytonab5dfee2020-11-09 19:52:24 +000052 EXPECT_FALSE(v.matched);
53 EXPECT_TRUE(v.errored);
54 EXPECT_TRUE(p->has_error());
Ben Claytonab5dfee2020-11-09 19:52:24 +000055 EXPECT_EQ(p->error(), "1:12: expected ':' for variable declaration");
Dan Sinclair6e581892020-03-02 15:47:43 -050056}
57
58TEST_F(ParserImplTest, VariableDecl_WithStorageClass) {
Ben Clayton627732c2020-11-18 19:40:00 +000059 auto p = parser("var<private> my_var : f32");
dan sinclair9981b632020-03-25 19:16:36 +000060 auto v = p->variable_decl();
Ben Claytonab5dfee2020-11-09 19:52:24 +000061 EXPECT_TRUE(v.matched);
62 EXPECT_FALSE(v.errored);
63 EXPECT_FALSE(p->has_error());
Ben Claytona80511e2020-12-11 13:07:02 +000064 EXPECT_EQ(v->name, "my_var");
Antonio Maiorano3751fd22021-04-19 22:51:23 +000065 EXPECT_TRUE(v->type->Is<sem::F32>());
Ben Claytona80511e2020-12-11 13:07:02 +000066 EXPECT_EQ(v->storage_class, ast::StorageClass::kPrivate);
Ben Clayton580d6c72020-11-02 15:25:18 +000067
Ben Claytona80511e2020-12-11 13:07:02 +000068 EXPECT_EQ(v->source.range.begin.line, 1u);
69 EXPECT_EQ(v->source.range.begin.column, 14u);
70 EXPECT_EQ(v->source.range.end.line, 1u);
71 EXPECT_EQ(v->source.range.end.column, 20u);
Dan Sinclair6e581892020-03-02 15:47:43 -050072}
73
74TEST_F(ParserImplTest, VariableDecl_InvalidStorageClass) {
Ben Clayton627732c2020-11-18 19:40:00 +000075 auto p = parser("var<unknown> my_var : f32");
dan sinclair9981b632020-03-25 19:16:36 +000076 auto v = p->variable_decl();
Ben Claytonab5dfee2020-11-09 19:52:24 +000077 EXPECT_FALSE(v.matched);
78 EXPECT_TRUE(v.errored);
79 EXPECT_TRUE(p->has_error());
dan sinclair9981b632020-03-25 19:16:36 +000080 EXPECT_EQ(p->error(), "1:5: invalid storage class for variable decoration");
Dan Sinclair6e581892020-03-02 15:47:43 -050081}
82
dan sinclair989cee62020-03-26 15:31:43 +000083} // namespace
Dan Sinclair6e581892020-03-02 15:47:43 -050084} // namespace wgsl
85} // namespace reader
86} // namespace tint