| // Copyright (c) 2015-2016 The Khronos Group Inc. |
| // |
| // 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. |
| |
| // Assembler tests for instructions in the "Debug" section of the |
| // SPIR-V spec. |
| |
| #include <string> |
| #include <vector> |
| |
| #include "gmock/gmock.h" |
| #include "test/test_fixture.h" |
| #include "test/unit_spirv.h" |
| |
| namespace spvtools { |
| namespace { |
| |
| using spvtest::MakeInstruction; |
| using spvtest::MakeVector; |
| using spvtest::TextToBinaryTest; |
| using ::testing::Eq; |
| |
| // Test OpSource |
| |
| // A single test case for OpSource |
| struct LanguageCase { |
| uint32_t get_language_value() const { |
| return static_cast<uint32_t>(language_value); |
| } |
| const char* language_name; |
| SpvSourceLanguage language_value; |
| uint32_t version; |
| }; |
| |
| // clang-format off |
| // The list of OpSource cases to use. |
| const LanguageCase kLanguageCases[] = { |
| #define CASE(NAME, VERSION) \ |
| { #NAME, SpvSourceLanguage##NAME, VERSION } |
| CASE(Unknown, 0), |
| CASE(Unknown, 999), |
| CASE(ESSL, 310), |
| CASE(GLSL, 450), |
| CASE(OpenCL_C, 120), |
| CASE(OpenCL_C, 200), |
| CASE(OpenCL_C, 210), |
| CASE(OpenCL_CPP, 210), |
| CASE(HLSL, 5), |
| CASE(HLSL, 6), |
| #undef CASE |
| }; |
| // clang-format on |
| |
| using OpSourceTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<LanguageCase>>; |
| |
| TEST_P(OpSourceTest, AnyLanguage) { |
| const std::string input = std::string("OpSource ") + |
| GetParam().language_name + " " + |
| std::to_string(GetParam().version); |
| EXPECT_THAT(CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpSource, {GetParam().get_language_value(), |
| GetParam().version}))); |
| } |
| |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpSourceTest, |
| ::testing::ValuesIn(kLanguageCases), ); |
| |
| TEST_F(OpSourceTest, WrongLanguage) { |
| EXPECT_THAT(CompileFailure("OpSource xxyyzz 12345"), |
| Eq("Invalid source language 'xxyyzz'.")); |
| } |
| |
| TEST_F(TextToBinaryTest, OpSourceAcceptsOptionalFileId) { |
| // In the grammar, the file id is an OperandOptionalId. |
| const std::string input = "OpSource GLSL 450 %file_id"; |
| EXPECT_THAT( |
| CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpSource, {SpvSourceLanguageGLSL, 450, 1}))); |
| } |
| |
| TEST_F(TextToBinaryTest, OpSourceAcceptsOptionalSourceText) { |
| std::string fake_source = "To be or not to be"; |
| const std::string input = |
| "OpSource GLSL 450 %file_id \"" + fake_source + "\""; |
| EXPECT_THAT(CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpSource, {SpvSourceLanguageGLSL, 450, 1}, |
| MakeVector(fake_source)))); |
| } |
| |
| // Test OpSourceContinued |
| |
| using OpSourceContinuedTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>; |
| |
| TEST_P(OpSourceContinuedTest, AnyExtension) { |
| // TODO(dneto): utf-8, quoting, escaping |
| const std::string input = |
| std::string("OpSourceContinued \"") + GetParam() + "\""; |
| EXPECT_THAT( |
| CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpSourceContinued, MakeVector(GetParam())))); |
| } |
| |
| // TODO(dneto): utf-8, quoting, escaping |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpSourceContinuedTest, |
| ::testing::ValuesIn(std::vector<const char*>{ |
| "", "foo bar this and that"}), ); |
| |
| // Test OpSourceExtension |
| |
| using OpSourceExtensionTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>; |
| |
| TEST_P(OpSourceExtensionTest, AnyExtension) { |
| // TODO(dneto): utf-8, quoting, escaping |
| const std::string input = |
| std::string("OpSourceExtension \"") + GetParam() + "\""; |
| EXPECT_THAT( |
| CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpSourceExtension, MakeVector(GetParam())))); |
| } |
| |
| // TODO(dneto): utf-8, quoting, escaping |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpSourceExtensionTest, |
| ::testing::ValuesIn(std::vector<const char*>{ |
| "", "foo bar this and that"}), ); |
| |
| TEST_F(TextToBinaryTest, OpLine) { |
| EXPECT_THAT(CompiledInstructions("OpLine %srcfile 42 99"), |
| Eq(MakeInstruction(SpvOpLine, {1, 42, 99}))); |
| } |
| |
| TEST_F(TextToBinaryTest, OpNoLine) { |
| EXPECT_THAT(CompiledInstructions("OpNoLine"), |
| Eq(MakeInstruction(SpvOpNoLine, {}))); |
| } |
| |
| using OpStringTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>; |
| |
| TEST_P(OpStringTest, AnyString) { |
| // TODO(dneto): utf-8, quoting, escaping |
| const std::string input = |
| std::string("%result = OpString \"") + GetParam() + "\""; |
| EXPECT_THAT(CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpString, {1}, MakeVector(GetParam())))); |
| } |
| |
| // TODO(dneto): utf-8, quoting, escaping |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpStringTest, |
| ::testing::ValuesIn(std::vector<const char*>{ |
| "", "foo bar this and that"}), ); |
| |
| using OpNameTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>; |
| |
| TEST_P(OpNameTest, AnyString) { |
| const std::string input = |
| std::string("OpName %target \"") + GetParam() + "\""; |
| EXPECT_THAT(CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpName, {1}, MakeVector(GetParam())))); |
| } |
| |
| // UTF-8, quoting, escaping, etc. are covered in the StringLiterals tests in |
| // BinaryToText.Literal.cpp. |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpNameTest, |
| ::testing::Values("", "foo bar this and that"), ); |
| |
| using OpMemberNameTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>; |
| |
| TEST_P(OpMemberNameTest, AnyString) { |
| // TODO(dneto): utf-8, quoting, escaping |
| const std::string input = |
| std::string("OpMemberName %type 42 \"") + GetParam() + "\""; |
| EXPECT_THAT( |
| CompiledInstructions(input), |
| Eq(MakeInstruction(SpvOpMemberName, {1, 42}, MakeVector(GetParam())))); |
| } |
| |
| // TODO(dneto): utf-8, quoting, escaping |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpMemberNameTest, |
| ::testing::ValuesIn(std::vector<const char*>{ |
| "", "foo bar this and that"}), ); |
| |
| // TODO(dneto): Parse failures? |
| |
| using OpModuleProcessedTest = |
| spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>; |
| |
| TEST_P(OpModuleProcessedTest, AnyString) { |
| const std::string input = |
| std::string("OpModuleProcessed \"") + GetParam() + "\""; |
| EXPECT_THAT( |
| CompiledInstructions(input, SPV_ENV_UNIVERSAL_1_1), |
| Eq(MakeInstruction(SpvOpModuleProcessed, MakeVector(GetParam())))); |
| } |
| |
| INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpModuleProcessedTest, |
| ::testing::Values("", "foo bar this and that"), ); |
| |
| } // namespace |
| } // namespace spvtools |