diff --git a/CMakeLists.txt b/CMakeLists.txt index 16f34dbc..710716b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,7 +153,9 @@ if (TARGET gtest) ${gtest_SOURCE_DIR}/include) add_executable(UnitSPIRV + ${CMAKE_CURRENT_SOURCE_DIR}/test/TestFixture.h ${CMAKE_CURRENT_SOURCE_DIR}/test/UnitSPIRV.h + ${CMAKE_CURRENT_SOURCE_DIR}/test/BinaryEndianness.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test/FixWord.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test/BinaryHeaderGet.cpp diff --git a/test/TestFixture.h b/test/TestFixture.h new file mode 100644 index 00000000..af69d83e --- /dev/null +++ b/test/TestFixture.h @@ -0,0 +1,66 @@ +// Copyright (c) 2015 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and/or associated documentation files (the +// "Materials"), to deal in the Materials without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Materials, and to +// permit persons to whom the Materials are furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS +// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS +// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT +// https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + +#include "UnitSPIRV.h" + +// Common setup for TextToBinary tests. SetText() should be called to populate +// the actual test text. +class TextToBinaryTest : public ::testing::Test { + public: + TextToBinaryTest() + : opcodeTable(nullptr), + operandTable(nullptr), + diagnostic(nullptr), + text(), + binary(nullptr) {} + + virtual void SetUp() { + ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableGet(&opcodeTable)); + ASSERT_EQ(SPV_SUCCESS, spvOperandTableGet(&operandTable)); + ASSERT_EQ(SPV_SUCCESS, spvExtInstTableGet(&extInstTable)); + char textStr[] = "substitute the text member variable with your test"; + text = {textStr, strlen(textStr)}; + } + + virtual void TearDown() { + if (diagnostic) spvDiagnosticDestroy(diagnostic); + } + + void SetText(const std::string& code) { + textString = code; + text.str = textString.c_str(); + text.length = textString.size(); + } + + spv_opcode_table opcodeTable; + spv_operand_table operandTable; + spv_ext_inst_table extInstTable; + spv_diagnostic diagnostic; + + std::string textString; + spv_text_t text; + spv_binary binary; +}; diff --git a/test/TextToBinary.cpp b/test/TextToBinary.cpp index d986fad8..bb909ae0 100644 --- a/test/TextToBinary.cpp +++ b/test/TextToBinary.cpp @@ -24,6 +24,7 @@ // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +#include "TestFixture.h" #include "UnitSPIRV.h" union char_word_t { @@ -200,40 +201,6 @@ OpTypeVector %15 4 2 ASSERT_EQ(2, binary->code[instIndex++]); } -class TextToBinaryTest : public ::testing::Test { - public: - TextToBinaryTest() - : binary(nullptr), - text(), - opcodeTable(nullptr), - operandTable(nullptr), - diagnostic(nullptr) {} - - virtual void SetUp() { - char textStr[] = - "OpEntryPoint Kernel 0\n" - "OpExecutionMode 0 LocalSizeHint 1 1 1\n"; - text.str = textStr; - text.length = strlen(textStr); - ASSERT_EQ(SPV_SUCCESS, spvOpcodeTableGet(&opcodeTable)); - ASSERT_EQ(SPV_SUCCESS, spvOperandTableGet(&operandTable)); - ASSERT_EQ(SPV_SUCCESS, spvExtInstTableGet(&extInstTable)); - } - - virtual void TearDown() { - if (diagnostic) { - spvDiagnosticDestroy(diagnostic); - } - } - - spv_binary binary; - spv_text_t text; - spv_opcode_table opcodeTable; - spv_operand_table operandTable; - spv_ext_inst_table extInstTable; - spv_diagnostic diagnostic; -}; - TEST_F(TextToBinaryTest, InvalidText) { spv_text_t text = {nullptr, 0}; spv_binary binary; @@ -243,6 +210,7 @@ TEST_F(TextToBinaryTest, InvalidText) { } TEST_F(TextToBinaryTest, InvalidTable) { + SetText("OpEntryPoint Kernel 0\nOpExecutionMode 0 LocalSizeHint 1 1 1\n"); ASSERT_EQ(SPV_ERROR_INVALID_TABLE, spvTextToBinary(&text, nullptr, operandTable, extInstTable, &binary, &diagnostic)); @@ -255,12 +223,14 @@ TEST_F(TextToBinaryTest, InvalidTable) { } TEST_F(TextToBinaryTest, InvalidPointer) { + SetText("OpEntryPoint Kernel 0\nOpExecutionMode 0 LocalSizeHint 1 1 1\n"); ASSERT_EQ(SPV_ERROR_INVALID_POINTER, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, nullptr, &diagnostic)); } TEST_F(TextToBinaryTest, InvalidDiagnostic) { + SetText("OpEntryPoint Kernel 0\nOpExecutionMode 0 LocalSizeHint 1 1 1\n"); spv_binary binary; ASSERT_EQ(SPV_ERROR_INVALID_DIAGNOSTIC, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, @@ -268,10 +238,7 @@ TEST_F(TextToBinaryTest, InvalidDiagnostic) { } TEST_F(TextToBinaryTest, InvalidPrefix) { - const char *spirv = R"( -Invalid)"; - text.str = spirv; - text.length = strlen(spirv); + SetText("Invalid"); ASSERT_EQ(SPV_ERROR_INVALID_TEXT, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, &binary, &diagnostic)); @@ -281,11 +248,7 @@ Invalid)"; } TEST_F(TextToBinaryTest, ImmediateIntOpCode) { - const char *spirv = R"( -!0x00FF00FF -)"; - text.str = spirv; - text.length = strlen(spirv); + SetText("!0x00FF00FF"); ASSERT_EQ(SPV_SUCCESS, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, &binary, &diagnostic)); EXPECT_EQ(0x00FF00FF, binary->code[5]); @@ -296,10 +259,7 @@ TEST_F(TextToBinaryTest, ImmediateIntOpCode) { } TEST_F(TextToBinaryTest, ImmediateIntOperand) { - const char *spirv = R"( -OpCapability !0x00FF00FF)"; - text.str = spirv; - text.length = strlen(spirv); + SetText("OpCapability !0x00FF00FF"); EXPECT_EQ(SPV_SUCCESS, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, &binary, &diagnostic)); EXPECT_EQ(0x00FF00FF, binary->code[6]); @@ -310,7 +270,7 @@ OpCapability !0x00FF00FF)"; } TEST_F(TextToBinaryTest, ExtInst) { - const char *spirv = R"( + SetText(R"( OpCapability Shader OpExtInstImport %glsl450 "GLSL.std.450" OpMemoryModel Logical Simple @@ -324,9 +284,7 @@ OpLabel %lbMain OpExtInst $float %result $glsl450 round $const1.5 OpReturn OpFunctionEnd -)"; - text.str = spirv; - text.length = strlen(spirv); +)"); EXPECT_EQ(SPV_SUCCESS, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, &binary, &diagnostic)); if (binary) { @@ -338,11 +296,7 @@ OpFunctionEnd } TEST_F(TextToBinaryTest, StringSpace) { - const char *spirv = R"( -OpSourceExtension "string with spaces" -)"; - text.str = spirv; - text.length = strlen(spirv); + SetText("OpSourceExtension \"string with spaces\""); EXPECT_EQ(SPV_SUCCESS, spvTextToBinary(&text, opcodeTable, operandTable, extInstTable, &binary, &diagnostic)); if (binary) {