diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 86166c6ad4..c47a190aa2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -249,6 +249,7 @@ set(TINT_TEST_SRCS ast/unary_method_expression_test.cc ast/unary_op_expression_test.cc ast/unless_statement_test.cc + ast/variable_statement_test.cc ast/variable_test.cc reader/wgsl/lexer_test.cc reader/wgsl/parser_test.cc diff --git a/src/ast/variable_statement.cc b/src/ast/variable_statement.cc index a1955758c3..ec88f5c1b7 100644 --- a/src/ast/variable_statement.cc +++ b/src/ast/variable_statement.cc @@ -17,6 +17,8 @@ namespace tint { namespace ast { +VariableStatement::VariableStatement() : Statement() {} + VariableStatement::VariableStatement(std::unique_ptr variable) : Statement(), variable_(std::move(variable)) {} @@ -27,12 +29,12 @@ VariableStatement::VariableStatement(const Source& source, VariableStatement::~VariableStatement() = default; bool VariableStatement::IsValid() const { - return variable_ != nullptr; + return variable_ != nullptr && variable_->IsValid(); } void VariableStatement::to_str(std::ostream& out, size_t indent) const { make_indent(out, indent); - out << "Variable{" << std::endl; + out << "VariableStatement{" << std::endl; variable_->to_str(out, indent + 2); make_indent(out, indent); out << "}" << std::endl; diff --git a/src/ast/variable_statement.h b/src/ast/variable_statement.h index 17e0742c18..0464369524 100644 --- a/src/ast/variable_statement.h +++ b/src/ast/variable_statement.h @@ -28,6 +28,8 @@ namespace ast { /// A variable statement class VariableStatement : public Statement { public: + /// Constructor + VariableStatement(); /// Constructor /// @param variable the variable explicit VariableStatement(std::unique_ptr variable); diff --git a/src/ast/variable_statement_test.cc b/src/ast/variable_statement_test.cc new file mode 100644 index 0000000000..a7b56c1b85 --- /dev/null +++ b/src/ast/variable_statement_test.cc @@ -0,0 +1,87 @@ +// Copyright 2020 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/ast/variable_statement.h" + +#include "gtest/gtest.h" +#include "src/ast/type/f32_type.h" +#include "src/ast/variable.h" + +namespace tint { +namespace ast { + +using VariableStatementTest = testing::Test; + +TEST_F(VariableStatementTest, Creation) { + type::F32Type f32; + auto var = std::make_unique("a", StorageClass::kNone, &f32); + auto var_ptr = var.get(); + + VariableStatement stmt(std::move(var)); + EXPECT_EQ(stmt.variable(), var_ptr); +} + +TEST_F(VariableStatementTest, Creation_WithSource) { + type::F32Type f32; + auto var = std::make_unique("a", StorageClass::kNone, &f32); + + VariableStatement stmt(Source{20, 2}, std::move(var)); + auto src = stmt.source(); + EXPECT_EQ(src.line, 20); + EXPECT_EQ(src.column, 2); +} + +TEST_F(VariableStatementTest, IsVariable) { + VariableStatement s; + EXPECT_TRUE(s.IsVariable()); +} + +TEST_F(VariableStatementTest, IsValid) { + type::F32Type f32; + auto var = std::make_unique("a", StorageClass::kNone, &f32); + VariableStatement stmt(std::move(var)); + EXPECT_TRUE(stmt.IsValid()); +} + +TEST_F(VariableStatementTest, IsValid_InvalidVariable) { + type::F32Type f32; + auto var = std::make_unique("", StorageClass::kNone, &f32); + VariableStatement stmt(std::move(var)); + EXPECT_FALSE(stmt.IsValid()); +} + +TEST_F(VariableStatementTest, IsValid_NullVariable) { + VariableStatement stmt; + EXPECT_FALSE(stmt.IsValid()); +} + +TEST_F(VariableStatementTest, ToStr) { + type::F32Type f32; + auto var = std::make_unique("a", StorageClass::kNone, &f32); + + VariableStatement stmt(Source{20, 2}, std::move(var)); + std::ostringstream out; + stmt.to_str(out, 2); + EXPECT_EQ(out.str(), R"( VariableStatement{ + Variable{ + a + none + __f32 + } + } +)"); +} + +} // namespace ast +} // namespace tint