// 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/module.h" #include #include #include "gmock/gmock.h" #include "src/ast/entry_point.h" #include "src/ast/function.h" #include "src/ast/import.h" #include "src/ast/type/f32_type.h" #include "src/ast/variable.h" namespace tint { namespace ast { namespace { using ModuleTest = testing::Test; TEST_F(ModuleTest, Creation) { Module m; EXPECT_EQ(m.imports().size(), 0); } TEST_F(ModuleTest, ToStrEmitsPreambleAndPostamble) { Module m; const auto str = m.to_str(); const auto expected = "Module{\n}\n"; EXPECT_EQ(str, expected); } TEST_F(ModuleTest, Imports) { Module m; m.AddImport(std::make_unique("GLSL.std.430", "std::glsl")); m.AddImport(std::make_unique("OpenCL.debug.100", "std::debug")); EXPECT_EQ(2, m.imports().size()); EXPECT_EQ("std::glsl", m.imports()[0]->name()); } TEST_F(ModuleTest, ToStrWithImport) { Module m; m.AddImport(std::make_unique("GLSL.std.430", "std::glsl")); const auto str = m.to_str(); EXPECT_EQ(str, R"(Module{ Import{"GLSL.std.430" as std::glsl} } )"); } TEST_F(ModuleTest, LookupImport) { Module m; auto i = std::make_unique("GLSL.std.430", "std::glsl"); m.AddImport(std::move(i)); m.AddImport(std::make_unique("OpenCL.debug.100", "std::debug")); auto import = m.FindImportByName("std::glsl"); ASSERT_NE(nullptr, import); EXPECT_EQ(import->path(), "GLSL.std.430"); EXPECT_EQ(import->name(), "std::glsl"); } TEST_F(ModuleTest, LookupImportMissing) { Module m; EXPECT_EQ(nullptr, m.FindImportByName("Missing")); } TEST_F(ModuleTest, IsValid_Empty) { Module m; EXPECT_TRUE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Import) { Module m; m.AddImport(std::make_unique("GLSL.std.430", "std::glsl")); EXPECT_TRUE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Null_Import) { Module m; m.AddImport(nullptr); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Invalid_Import) { Module m; m.AddImport(std::make_unique()); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_GlobalVariable) { type::F32Type f32; auto var = std::make_unique("var", StorageClass::kInput, &f32); Module m; m.AddGlobalVariable(std::move(var)); EXPECT_TRUE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Null_GlobalVariable) { Module m; m.AddGlobalVariable(nullptr); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Invalid_GlobalVariable) { auto var = std::make_unique("var", StorageClass::kInput, nullptr); Module m; m.AddGlobalVariable(std::move(var)); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_EntryPoint) { Module m; m.AddEntryPoint( std::make_unique(PipelineStage::kVertex, "main", "vtx_main")); EXPECT_TRUE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Null_EntryPoint) { Module m; m.AddEntryPoint(nullptr); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Invalid_EntryPoint) { Module m; m.AddEntryPoint(std::make_unique()); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Alias) { type::F32Type f32; type::AliasType alias("alias", &f32); Module m; m.AddAliasType(&alias); EXPECT_TRUE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Null_Alias) { Module m; m.AddAliasType(nullptr); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Function) { type::F32Type f32; auto func = std::make_unique( "main", std::vector>(), &f32); Module m; m.AddFunction(std::move(func)); EXPECT_TRUE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Null_Function) { Module m; m.AddFunction(nullptr); EXPECT_FALSE(m.IsValid()); } TEST_F(ModuleTest, IsValid_Invalid_Function) { auto func = std::make_unique(); Module m; m.AddFunction(std::move(func)); EXPECT_FALSE(m.IsValid()); } } // namespace } // namespace ast } // namespace tint