Home | History | Annotate | Download | only in test
      1 // Copyright (c) 2015-2016 The Khronos Group Inc.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 // Assembler tests for instructions in the "Debug" section of the
     16 // SPIR-V spec.
     17 
     18 #include <string>
     19 #include <vector>
     20 
     21 #include "gmock/gmock.h"
     22 #include "test/test_fixture.h"
     23 #include "test/unit_spirv.h"
     24 
     25 namespace spvtools {
     26 namespace {
     27 
     28 using spvtest::MakeInstruction;
     29 using spvtest::MakeVector;
     30 using spvtest::TextToBinaryTest;
     31 using ::testing::Eq;
     32 
     33 // Test OpSource
     34 
     35 // A single test case for OpSource
     36 struct LanguageCase {
     37   uint32_t get_language_value() const {
     38     return static_cast<uint32_t>(language_value);
     39   }
     40   const char* language_name;
     41   SpvSourceLanguage language_value;
     42   uint32_t version;
     43 };
     44 
     45 // clang-format off
     46 // The list of OpSource cases to use.
     47 const LanguageCase kLanguageCases[] = {
     48 #define CASE(NAME, VERSION) \
     49   { #NAME, SpvSourceLanguage##NAME, VERSION }
     50   CASE(Unknown, 0),
     51   CASE(Unknown, 999),
     52   CASE(ESSL, 310),
     53   CASE(GLSL, 450),
     54   CASE(OpenCL_C, 120),
     55   CASE(OpenCL_C, 200),
     56   CASE(OpenCL_C, 210),
     57   CASE(OpenCL_CPP, 210),
     58   CASE(HLSL, 5),
     59   CASE(HLSL, 6),
     60 #undef CASE
     61 };
     62 // clang-format on
     63 
     64 using OpSourceTest =
     65     spvtest::TextToBinaryTestBase<::testing::TestWithParam<LanguageCase>>;
     66 
     67 TEST_P(OpSourceTest, AnyLanguage) {
     68   const std::string input = std::string("OpSource ") +
     69                             GetParam().language_name + " " +
     70                             std::to_string(GetParam().version);
     71   EXPECT_THAT(CompiledInstructions(input),
     72               Eq(MakeInstruction(SpvOpSource, {GetParam().get_language_value(),
     73                                                GetParam().version})));
     74 }
     75 
     76 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpSourceTest,
     77                         ::testing::ValuesIn(kLanguageCases), );
     78 
     79 TEST_F(OpSourceTest, WrongLanguage) {
     80   EXPECT_THAT(CompileFailure("OpSource xxyyzz 12345"),
     81               Eq("Invalid source language 'xxyyzz'."));
     82 }
     83 
     84 TEST_F(TextToBinaryTest, OpSourceAcceptsOptionalFileId) {
     85   // In the grammar, the file id is an OperandOptionalId.
     86   const std::string input = "OpSource GLSL 450 %file_id";
     87   EXPECT_THAT(
     88       CompiledInstructions(input),
     89       Eq(MakeInstruction(SpvOpSource, {SpvSourceLanguageGLSL, 450, 1})));
     90 }
     91 
     92 TEST_F(TextToBinaryTest, OpSourceAcceptsOptionalSourceText) {
     93   std::string fake_source = "To be or not to be";
     94   const std::string input =
     95       "OpSource GLSL 450 %file_id \"" + fake_source + "\"";
     96   EXPECT_THAT(CompiledInstructions(input),
     97               Eq(MakeInstruction(SpvOpSource, {SpvSourceLanguageGLSL, 450, 1},
     98                                  MakeVector(fake_source))));
     99 }
    100 
    101 // Test OpSourceContinued
    102 
    103 using OpSourceContinuedTest =
    104     spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>;
    105 
    106 TEST_P(OpSourceContinuedTest, AnyExtension) {
    107   // TODO(dneto): utf-8, quoting, escaping
    108   const std::string input =
    109       std::string("OpSourceContinued \"") + GetParam() + "\"";
    110   EXPECT_THAT(
    111       CompiledInstructions(input),
    112       Eq(MakeInstruction(SpvOpSourceContinued, MakeVector(GetParam()))));
    113 }
    114 
    115 // TODO(dneto): utf-8, quoting, escaping
    116 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpSourceContinuedTest,
    117                         ::testing::ValuesIn(std::vector<const char*>{
    118                             "", "foo bar this and that"}), );
    119 
    120 // Test OpSourceExtension
    121 
    122 using OpSourceExtensionTest =
    123     spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>;
    124 
    125 TEST_P(OpSourceExtensionTest, AnyExtension) {
    126   // TODO(dneto): utf-8, quoting, escaping
    127   const std::string input =
    128       std::string("OpSourceExtension \"") + GetParam() + "\"";
    129   EXPECT_THAT(
    130       CompiledInstructions(input),
    131       Eq(MakeInstruction(SpvOpSourceExtension, MakeVector(GetParam()))));
    132 }
    133 
    134 // TODO(dneto): utf-8, quoting, escaping
    135 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpSourceExtensionTest,
    136                         ::testing::ValuesIn(std::vector<const char*>{
    137                             "", "foo bar this and that"}), );
    138 
    139 TEST_F(TextToBinaryTest, OpLine) {
    140   EXPECT_THAT(CompiledInstructions("OpLine %srcfile 42 99"),
    141               Eq(MakeInstruction(SpvOpLine, {1, 42, 99})));
    142 }
    143 
    144 TEST_F(TextToBinaryTest, OpNoLine) {
    145   EXPECT_THAT(CompiledInstructions("OpNoLine"),
    146               Eq(MakeInstruction(SpvOpNoLine, {})));
    147 }
    148 
    149 using OpStringTest =
    150     spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>;
    151 
    152 TEST_P(OpStringTest, AnyString) {
    153   // TODO(dneto): utf-8, quoting, escaping
    154   const std::string input =
    155       std::string("%result = OpString \"") + GetParam() + "\"";
    156   EXPECT_THAT(CompiledInstructions(input),
    157               Eq(MakeInstruction(SpvOpString, {1}, MakeVector(GetParam()))));
    158 }
    159 
    160 // TODO(dneto): utf-8, quoting, escaping
    161 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpStringTest,
    162                         ::testing::ValuesIn(std::vector<const char*>{
    163                             "", "foo bar this and that"}), );
    164 
    165 using OpNameTest =
    166     spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>;
    167 
    168 TEST_P(OpNameTest, AnyString) {
    169   const std::string input =
    170       std::string("OpName %target \"") + GetParam() + "\"";
    171   EXPECT_THAT(CompiledInstructions(input),
    172               Eq(MakeInstruction(SpvOpName, {1}, MakeVector(GetParam()))));
    173 }
    174 
    175 // UTF-8, quoting, escaping, etc. are covered in the StringLiterals tests in
    176 // BinaryToText.Literal.cpp.
    177 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpNameTest,
    178                         ::testing::Values("", "foo bar this and that"), );
    179 
    180 using OpMemberNameTest =
    181     spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>;
    182 
    183 TEST_P(OpMemberNameTest, AnyString) {
    184   // TODO(dneto): utf-8, quoting, escaping
    185   const std::string input =
    186       std::string("OpMemberName %type 42 \"") + GetParam() + "\"";
    187   EXPECT_THAT(
    188       CompiledInstructions(input),
    189       Eq(MakeInstruction(SpvOpMemberName, {1, 42}, MakeVector(GetParam()))));
    190 }
    191 
    192 // TODO(dneto): utf-8, quoting, escaping
    193 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpMemberNameTest,
    194                         ::testing::ValuesIn(std::vector<const char*>{
    195                             "", "foo bar this and that"}), );
    196 
    197 // TODO(dneto): Parse failures?
    198 
    199 using OpModuleProcessedTest =
    200     spvtest::TextToBinaryTestBase<::testing::TestWithParam<const char*>>;
    201 
    202 TEST_P(OpModuleProcessedTest, AnyString) {
    203   const std::string input =
    204       std::string("OpModuleProcessed \"") + GetParam() + "\"";
    205   EXPECT_THAT(
    206       CompiledInstructions(input, SPV_ENV_UNIVERSAL_1_1),
    207       Eq(MakeInstruction(SpvOpModuleProcessed, MakeVector(GetParam()))));
    208 }
    209 
    210 INSTANTIATE_TEST_CASE_P(TextToBinaryTestDebug, OpModuleProcessedTest,
    211                         ::testing::Values("", "foo bar this and that"), );
    212 
    213 }  // namespace
    214 }  // namespace spvtools
    215