Home | History | Annotate | Download | only in test
      1 // Copyright (c) 2017 Google 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 // Tests for unique type declaration rules validator.
     16 
     17 #include <string>
     18 
     19 #include "source/text.h"
     20 #include "source/text_handler.h"
     21 #include "test/test_fixture.h"
     22 
     23 namespace spvtools {
     24 namespace {
     25 
     26 using spvtest::ScopedContext;
     27 
     28 // Converts code to binary and then back to text.
     29 spv_result_t ToBinaryAndBack(
     30     const std::string& before, std::string* after,
     31     uint32_t text_to_binary_options = SPV_TEXT_TO_BINARY_OPTION_NONE,
     32     uint32_t binary_to_text_options = SPV_BINARY_TO_TEXT_OPTION_NONE,
     33     spv_target_env env = SPV_ENV_UNIVERSAL_1_0) {
     34   ScopedContext ctx(env);
     35   spv_binary binary;
     36   spv_text text;
     37 
     38   spv_result_t result =
     39       spvTextToBinaryWithOptions(ctx.context, before.c_str(), before.size(),
     40                                  text_to_binary_options, &binary, nullptr);
     41   if (result != SPV_SUCCESS) {
     42     return result;
     43   }
     44 
     45   result = spvBinaryToText(ctx.context, binary->code, binary->wordCount,
     46                            binary_to_text_options, &text, nullptr);
     47   if (result != SPV_SUCCESS) {
     48     return result;
     49   }
     50 
     51   *after = std::string(text->str, text->length);
     52 
     53   spvBinaryDestroy(binary);
     54   spvTextDestroy(text);
     55 
     56   return SPV_SUCCESS;
     57 }
     58 
     59 TEST(ToBinaryAndBack, DontPreserveNumericIds) {
     60   const std::string before =
     61       R"(OpCapability Addresses
     62 OpCapability Kernel
     63 OpCapability GenericPointer
     64 OpCapability Linkage
     65 OpMemoryModel Physical32 OpenCL
     66 %i32 = OpTypeInt 32 1
     67 %u32 = OpTypeInt 32 0
     68 %f32 = OpTypeFloat 32
     69 %200 = OpTypeVoid
     70 %300 = OpTypeFunction %200
     71 %main = OpFunction %200 None %300
     72 %entry = OpLabel
     73 %100 = OpConstant %u32 100
     74 %1 = OpConstant %u32 200
     75 %2 = OpConstant %u32 300
     76 OpReturn
     77 OpFunctionEnd
     78 )";
     79 
     80   const std::string expected =
     81       R"(OpCapability Addresses
     82 OpCapability Kernel
     83 OpCapability GenericPointer
     84 OpCapability Linkage
     85 OpMemoryModel Physical32 OpenCL
     86 %1 = OpTypeInt 32 1
     87 %2 = OpTypeInt 32 0
     88 %3 = OpTypeFloat 32
     89 %4 = OpTypeVoid
     90 %5 = OpTypeFunction %4
     91 %6 = OpFunction %4 None %5
     92 %7 = OpLabel
     93 %8 = OpConstant %2 100
     94 %9 = OpConstant %2 200
     95 %10 = OpConstant %2 300
     96 OpReturn
     97 OpFunctionEnd
     98 )";
     99 
    100   std::string after;
    101   EXPECT_EQ(SPV_SUCCESS,
    102             ToBinaryAndBack(before, &after, SPV_TEXT_TO_BINARY_OPTION_NONE,
    103                             SPV_BINARY_TO_TEXT_OPTION_NO_HEADER));
    104 
    105   EXPECT_EQ(expected, after);
    106 }
    107 
    108 TEST(TextHandler, PreserveNumericIds) {
    109   const std::string before =
    110       R"(OpCapability Addresses
    111 OpCapability Kernel
    112 OpCapability GenericPointer
    113 OpCapability Linkage
    114 OpMemoryModel Physical32 OpenCL
    115 %i32 = OpTypeInt 32 1
    116 %u32 = OpTypeInt 32 0
    117 %f32 = OpTypeFloat 32
    118 %200 = OpTypeVoid
    119 %300 = OpTypeFunction %200
    120 %main = OpFunction %200 None %300
    121 %entry = OpLabel
    122 %100 = OpConstant %u32 100
    123 %1 = OpConstant %u32 200
    124 %2 = OpConstant %u32 300
    125 OpReturn
    126 OpFunctionEnd
    127 )";
    128 
    129   const std::string expected =
    130       R"(OpCapability Addresses
    131 OpCapability Kernel
    132 OpCapability GenericPointer
    133 OpCapability Linkage
    134 OpMemoryModel Physical32 OpenCL
    135 %3 = OpTypeInt 32 1
    136 %4 = OpTypeInt 32 0
    137 %5 = OpTypeFloat 32
    138 %200 = OpTypeVoid
    139 %300 = OpTypeFunction %200
    140 %6 = OpFunction %200 None %300
    141 %7 = OpLabel
    142 %100 = OpConstant %4 100
    143 %1 = OpConstant %4 200
    144 %2 = OpConstant %4 300
    145 OpReturn
    146 OpFunctionEnd
    147 )";
    148 
    149   std::string after;
    150   EXPECT_EQ(SPV_SUCCESS,
    151             ToBinaryAndBack(before, &after,
    152                             SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS,
    153                             SPV_BINARY_TO_TEXT_OPTION_NO_HEADER));
    154 
    155   EXPECT_EQ(expected, after);
    156 }
    157 
    158 }  // namespace
    159 }  // namespace spvtools
    160