123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- // 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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_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_SUITE_P(TextToBinaryTestDebug, OpModuleProcessedTest,
- ::testing::Values("", "foo bar this and that"));
- } // namespace
- } // namespace spvtools
|