blob: 045005162e1eddbdbfb8498d2a16a1030c8c04bd [file] [log] [blame]
// Copyright 2018 The Amber 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/script.h"
#include <utility>
#include "gtest/gtest.h"
#include "src/make_unique.h"
#include "src/shader.h"
namespace amber {
namespace {
class ScriptProxy : public Script {
public:
ScriptProxy() = default;
~ScriptProxy() override = default;
};
} // namespace
using ScriptTest = testing::Test;
TEST_F(ScriptTest, GetShaderInfo) {
ScriptProxy sp;
auto shader = MakeUnique<Shader>(kShaderTypeVertex);
shader->SetName("Shader1");
shader->SetFormat(kShaderFormatGlsl);
shader->SetData("This is my shader data");
sp.AddShader(std::move(shader));
shader = MakeUnique<Shader>(kShaderTypeFragment);
shader->SetName("Shader2");
shader->SetFormat(kShaderFormatSpirvAsm);
shader->SetData("More shader data");
sp.AddShader(std::move(shader));
auto info = sp.GetShaderInfo();
ASSERT_EQ(2U, info.size());
EXPECT_EQ("Shader1", info[0].shader_name);
EXPECT_EQ(kShaderFormatGlsl, info[0].format);
EXPECT_EQ(kShaderTypeVertex, info[0].type);
EXPECT_EQ("This is my shader data", info[0].shader_source);
EXPECT_TRUE(info[0].optimizations.empty());
EXPECT_EQ("Shader2", info[1].shader_name);
EXPECT_EQ(kShaderFormatSpirvAsm, info[1].format);
EXPECT_EQ(kShaderTypeFragment, info[1].type);
EXPECT_EQ("More shader data", info[1].shader_source);
EXPECT_TRUE(info[1].optimizations.empty());
}
TEST_F(ScriptTest, GetShaderInfoNoShaders) {
ScriptProxy sp;
auto info = sp.GetShaderInfo();
EXPECT_TRUE(info.empty());
}
TEST_F(ScriptTest, AddShader) {
auto shader = MakeUnique<Shader>(kShaderTypeVertex);
shader->SetName("My Shader");
Script s;
Result r = s.AddShader(std::move(shader));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
}
TEST_F(ScriptTest, AddDuplicateShader) {
auto shader1 = MakeUnique<Shader>(kShaderTypeVertex);
shader1->SetName("My Shader");
Script s;
Result r = s.AddShader(std::move(shader1));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
auto shader2 = MakeUnique<Shader>(kShaderTypeFragment);
shader2->SetName("My Shader");
r = s.AddShader(std::move(shader2));
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("duplicate shader name provided", r.Error());
}
TEST_F(ScriptTest, GetShader) {
auto shader = MakeUnique<Shader>(kShaderTypeVertex);
shader->SetName("My Shader");
auto* ptr = shader.get();
Script s;
Result r = s.AddShader(std::move(shader));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
EXPECT_EQ(ptr, s.GetShader("My Shader"));
}
TEST_F(ScriptTest, GetMissingShader) {
Script s;
EXPECT_TRUE(s.GetShader("My Shader") == nullptr);
}
TEST_F(ScriptTest, GetShadersEmpty) {
Script s;
const auto& shaders = s.GetShaders();
EXPECT_TRUE(shaders.empty());
}
TEST_F(ScriptTest, GetShaders) {
auto shader1 = MakeUnique<Shader>(kShaderTypeVertex);
shader1->SetName("My Shader");
const auto* ptr1 = shader1.get();
Script s;
Result r = s.AddShader(std::move(shader1));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
auto shader2 = MakeUnique<Shader>(kShaderTypeFragment);
shader2->SetName("My Fragment");
const auto* ptr2 = shader2.get();
r = s.AddShader(std::move(shader2));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
const auto& shaders = s.GetShaders();
ASSERT_EQ(2U, shaders.size());
EXPECT_EQ(ptr1, shaders[0].get());
EXPECT_EQ(ptr2, shaders[1].get());
}
TEST_F(ScriptTest, AddPipeline) {
auto pipeline = MakeUnique<Pipeline>(PipelineType::kCompute);
pipeline->SetName("my_pipeline");
Script s;
Result r = s.AddPipeline(std::move(pipeline));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
}
TEST_F(ScriptTest, AddDuplicatePipeline) {
auto pipeline1 = MakeUnique<Pipeline>(PipelineType::kCompute);
pipeline1->SetName("my_pipeline");
Script s;
Result r = s.AddPipeline(std::move(pipeline1));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
auto pipeline2 = MakeUnique<Pipeline>(PipelineType::kGraphics);
pipeline2->SetName("my_pipeline");
r = s.AddPipeline(std::move(pipeline2));
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("duplicate pipeline name provided", r.Error());
}
TEST_F(ScriptTest, GetPipeline) {
auto pipeline = MakeUnique<Pipeline>(PipelineType::kCompute);
pipeline->SetName("my_pipeline");
const auto* ptr = pipeline.get();
Script s;
Result r = s.AddPipeline(std::move(pipeline));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
EXPECT_EQ(ptr, s.GetPipeline("my_pipeline"));
}
TEST_F(ScriptTest, GetMissingPipeline) {
Script s;
EXPECT_TRUE(s.GetPipeline("my_pipeline") == nullptr);
}
TEST_F(ScriptTest, GetPipelinesEmpty) {
Script s;
const auto& pipelines = s.GetPipelines();
EXPECT_TRUE(pipelines.empty());
}
TEST_F(ScriptTest, GetPipelines) {
auto pipeline1 = MakeUnique<Pipeline>(PipelineType::kCompute);
pipeline1->SetName("my_pipeline1");
const auto* ptr1 = pipeline1.get();
Script s;
Result r = s.AddPipeline(std::move(pipeline1));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
auto pipeline2 = MakeUnique<Pipeline>(PipelineType::kGraphics);
pipeline2->SetName("my_pipeline2");
const auto* ptr2 = pipeline2.get();
r = s.AddPipeline(std::move(pipeline2));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
const auto& pipelines = s.GetPipelines();
ASSERT_EQ(2U, pipelines.size());
EXPECT_EQ(ptr1, pipelines[0].get());
EXPECT_EQ(ptr2, pipelines[1].get());
}
TEST_F(ScriptTest, AddBuffer) {
auto buffer = MakeUnique<Buffer>(BufferType::kStorage);
buffer->SetName("my_buffer");
Script s;
Result r = s.AddBuffer(std::move(buffer));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
}
TEST_F(ScriptTest, AddDuplicateBuffer) {
auto buffer1 = MakeUnique<Buffer>(BufferType::kStorage);
buffer1->SetName("my_buffer");
Script s;
Result r = s.AddBuffer(std::move(buffer1));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
auto buffer2 = MakeUnique<Buffer>(BufferType::kUniform);
buffer2->SetName("my_buffer");
r = s.AddBuffer(std::move(buffer2));
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("duplicate buffer name provided", r.Error());
}
TEST_F(ScriptTest, GetBuffer) {
auto buffer = MakeUnique<Buffer>(BufferType::kStorage);
buffer->SetName("my_buffer");
const auto* ptr = buffer.get();
Script s;
Result r = s.AddBuffer(std::move(buffer));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
EXPECT_EQ(ptr, s.GetBuffer("my_buffer"));
}
TEST_F(ScriptTest, GetMissingBuffer) {
Script s;
EXPECT_TRUE(s.GetBuffer("my_buffer") == nullptr);
}
TEST_F(ScriptTest, GetBuffersEmpty) {
Script s;
const auto& buffers = s.GetBuffers();
EXPECT_TRUE(buffers.empty());
}
TEST_F(ScriptTest, GetBuffers) {
auto buffer1 = MakeUnique<Buffer>(BufferType::kStorage);
buffer1->SetName("my_buffer1");
const auto* ptr1 = buffer1.get();
Script s;
Result r = s.AddBuffer(std::move(buffer1));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
auto buffer2 = MakeUnique<Buffer>(BufferType::kUniform);
buffer2->SetName("my_buffer2");
const auto* ptr2 = buffer2.get();
r = s.AddBuffer(std::move(buffer2));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
const auto& buffers = s.GetBuffers();
ASSERT_EQ(2U, buffers.size());
EXPECT_EQ(ptr1, buffers[0].get());
EXPECT_EQ(ptr2, buffers[1].get());
}
TEST_F(ScriptTest, IdentifiesDeviceExtensions) {
Script s;
s.AddRequiredExtension("VK_KHR_16bit_storage");
EXPECT_TRUE(s.GetRequiredInstanceExtensions().empty());
ASSERT_EQ(1U, s.GetRequiredDeviceExtensions().size());
EXPECT_EQ("VK_KHR_16bit_storage", s.GetRequiredDeviceExtensions()[0]);
}
TEST_F(ScriptTest,
IdentifesInstanceExt_VK_KHR_get_physical_device_properties2) {
Script s;
s.AddRequiredExtension("VK_KHR_get_physical_device_properties2");
EXPECT_TRUE(s.GetRequiredDeviceExtensions().empty());
ASSERT_EQ(1U, s.GetRequiredInstanceExtensions().size());
EXPECT_EQ("VK_KHR_get_physical_device_properties2",
s.GetRequiredInstanceExtensions()[0]);
}
TEST_F(ScriptTest, AddType) {
Script s;
Result r = s.AddType("my_type", type::Number::Float(32));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
}
TEST_F(ScriptTest, AddDuplicateType) {
Script s;
Result r = s.AddType("my_type", type::Number::Uint(8));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
r = s.AddType("my_type", type::Number::Uint(8));
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("duplicate type name provided", r.Error());
}
TEST_F(ScriptTest, GetType) {
auto type = type::Number::Uint(8);
auto* ptr = type.get();
Script s;
Result r = s.AddType("my_type", std::move(type));
ASSERT_TRUE(r.IsSuccess()) << r.Error();
EXPECT_TRUE(ptr->Equal(s.GetType("my_type")));
}
TEST_F(ScriptTest, GetMissingType) {
Script s;
EXPECT_TRUE(s.GetPipeline("my_type") == nullptr);
}
} // namespace amber