Add test for assignment statement. This CL adds unit tests for the assignment statement methods. Change-Id: I4aea8f22b530bf43b7dfdc2b82b5414cf6590fea Bug: tint:11 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/16341 Commit-Queue: Sarah Mashayekhi <sarahmashay@google.com> Reviewed-by: Sarah Mashayekhi <sarahmashay@google.com>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a79ceba..a246ee2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt
@@ -195,6 +195,7 @@ set(TINT_TEST_SRCS ast/array_accessor_expression_test.cc ast/as_expression_test.cc + ast/assignment_statement_test.cc ast/binding_decoration_test.cc ast/bool_literal_test.cc ast/builtin_decoration_test.cc
diff --git a/src/ast/assignment_statement.cc b/src/ast/assignment_statement.cc index 8fe711b..47b5543 100644 --- a/src/ast/assignment_statement.cc +++ b/src/ast/assignment_statement.cc
@@ -17,6 +17,8 @@ namespace tint { namespace ast { +AssignmentStatement::AssignmentStatement() : Statement() {} + AssignmentStatement::AssignmentStatement(std::unique_ptr<Expression> lhs, std::unique_ptr<Expression> rhs) : Statement(), lhs_(std::move(lhs)), rhs_(std::move(rhs)) {} @@ -29,16 +31,19 @@ AssignmentStatement::~AssignmentStatement() = default; bool AssignmentStatement::IsValid() const { - return lhs_ != nullptr && rhs_ != nullptr; + if (lhs_ == nullptr || !lhs_->IsValid()) + return false; + if (rhs_ == nullptr || !rhs_->IsValid()) + return false; + + return true; } void AssignmentStatement::to_str(std::ostream& out, size_t indent) const { make_indent(out, indent); out << "Assignment{" << std::endl; lhs_->to_str(out, indent + 2); - out << std::endl; rhs_->to_str(out, indent + 2); - out << std::endl; make_indent(out, indent); out << "}" << std::endl; }
diff --git a/src/ast/assignment_statement.h b/src/ast/assignment_statement.h index 6441874..4f6e6b8 100644 --- a/src/ast/assignment_statement.h +++ b/src/ast/assignment_statement.h
@@ -29,6 +29,8 @@ class AssignmentStatement : public Statement { public: /// Constructor + AssignmentStatement(); + /// Constructor /// @param lhs the left side of the expression /// @param rhs the right side of the expression AssignmentStatement(std::unique_ptr<Expression> lhs,
diff --git a/src/ast/assignment_statement_test.cc b/src/ast/assignment_statement_test.cc new file mode 100644 index 0000000..132ee6f --- /dev/null +++ b/src/ast/assignment_statement_test.cc
@@ -0,0 +1,109 @@ +// 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/assignment_statement.h" + +#include "gtest/gtest.h" +#include "src/ast/identifier_expression.h" + +namespace tint { +namespace ast { + +using AssignmentStatementTest = testing::Test; + +TEST_F(AssignmentStatementTest, Creation) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + + auto lhs_ptr = lhs.get(); + auto rhs_ptr = rhs.get(); + + AssignmentStatement stmt(std::move(lhs), std::move(rhs)); + EXPECT_EQ(stmt.lhs(), lhs_ptr); + EXPECT_EQ(stmt.rhs(), rhs_ptr); +} + +TEST_F(AssignmentStatementTest, CreationWithSource) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + + AssignmentStatement stmt(Source{20, 2}, std::move(lhs), std::move(rhs)); + auto src = stmt.source(); + EXPECT_EQ(src.line, 20); + EXPECT_EQ(src.column, 2); +} + +TEST_F(AssignmentStatementTest, IsAssign) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + + AssignmentStatement stmt(std::move(lhs), std::move(rhs)); + EXPECT_TRUE(stmt.IsAssign()); +} + +TEST_F(AssignmentStatementTest, IsValid) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + + AssignmentStatement stmt(std::move(lhs), std::move(rhs)); + EXPECT_TRUE(stmt.IsValid()); +} + +TEST_F(AssignmentStatementTest, IsValid_MissingLHS) { + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + + AssignmentStatement stmt; + stmt.set_rhs(std::move(rhs)); + EXPECT_FALSE(stmt.IsValid()); +} + +TEST_F(AssignmentStatementTest, IsValid_MissingRHS) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + + AssignmentStatement stmt; + stmt.set_lhs(std::move(lhs)); + EXPECT_FALSE(stmt.IsValid()); +} + +TEST_F(AssignmentStatementTest, IsValid_InvalidLHS) { + auto lhs = std::make_unique<ast::IdentifierExpression>(""); + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + AssignmentStatement stmt(std::move(lhs), std::move(rhs)); + EXPECT_FALSE(stmt.IsValid()); +} + +TEST_F(AssignmentStatementTest, IsValid_InvalidRHS) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + auto rhs = std::make_unique<ast::IdentifierExpression>(""); + AssignmentStatement stmt(std::move(lhs), std::move(rhs)); + EXPECT_FALSE(stmt.IsValid()); +} + +TEST_F(AssignmentStatementTest, ToStr) { + auto lhs = std::make_unique<ast::IdentifierExpression>("lhs"); + auto rhs = std::make_unique<ast::IdentifierExpression>("rhs"); + + AssignmentStatement stmt(std::move(lhs), std::move(rhs)); + std::ostringstream out; + stmt.to_str(out, 2); + + EXPECT_EQ(out.str(), R"( Assignment{ + Identifier{lhs} + Identifier{rhs} + } +)"); +} + +} // namespace ast +} // namespace tint