#include <string>
#include "gmock/gmock.h"
#include "test/link/linker_fixture.h"
namespace spvtools {
namespace {
using ::testing::HasSubstr;
using BinaryVersion = spvtest::LinkerTest;
spvtest::Binary CreateBinary(uint32_t version) {
return {
static_cast<uint32_t>(spv::MagicNumber),
version,
SPV_GENERATOR_WORD(SPV_GENERATOR_KHRONOS, 0),
1u,
0u,
static_cast<uint32_t>(spv::Op::OpCapability) | 2u << spv::WordCountShift,
static_cast<uint32_t>(spv::Capability::Shader),
static_cast<uint32_t>(spv::Op::OpMemoryModel) | 3u << spv::WordCountShift,
static_cast<uint32_t>(spv::AddressingModel::Logical),
static_cast<uint32_t>(spv::MemoryModel::Simple)
};
}
TEST_F(BinaryVersion, Match) {
spvtest::Binaries binaries = {
CreateBinary(SPV_SPIRV_VERSION_WORD(1, 3)),
CreateBinary(SPV_SPIRV_VERSION_WORD(1, 3)),
};
spvtest::Binary linked_binary;
ASSERT_EQ(SPV_SUCCESS, Link(binaries, &linked_binary)) << GetErrorMessage();
EXPECT_THAT(GetErrorMessage(), std::string());
EXPECT_EQ(SPV_SPIRV_VERSION_WORD(1, 3), linked_binary[1]);
}
TEST_F(BinaryVersion, Mismatch) {
spvtest::Binaries binaries = {
CreateBinary(SPV_SPIRV_VERSION_WORD(1, 3)),
CreateBinary(SPV_SPIRV_VERSION_WORD(1, 5)),
};
spvtest::Binary linked_binary;
ASSERT_EQ(SPV_ERROR_INTERNAL, Link(binaries, &linked_binary))
<< GetErrorMessage();
EXPECT_THAT(GetErrorMessage(),
HasSubstr("Conflicting SPIR-V versions: 1.3 (input modules 1 "
"through 1) vs 1.5 (input module 2)."));
}
TEST_F(BinaryVersion, UseHighest) {
spvtest::Binaries binaries = {
CreateBinary(SPV_SPIRV_VERSION_WORD(1, 3)),
CreateBinary(SPV_SPIRV_VERSION_WORD(1, 5)),
};
LinkerOptions options;
options.SetUseHighestVersion(true);
spvtest::Binary linked_binary;
ASSERT_EQ(SPV_SUCCESS, Link(binaries, &linked_binary, options))
<< GetErrorMessage();
EXPECT_THAT(GetErrorMessage(), std::string());
EXPECT_EQ(SPV_SPIRV_VERSION_WORD(1, 5), linked_binary[1]);
}
}
}