• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <string>
16 #include <vector>
17 
18 #include "gmock/gmock.h"
19 #include "source/instruction.h"
20 #include "source/util/string_utils.h"
21 #include "test/unit_spirv.h"
22 
23 namespace spvtools {
24 namespace {
25 
26 using spvtest::AutoText;
27 using spvtest::Concatenate;
28 using ::testing::Eq;
29 
30 struct EncodeStringCase {
31   std::string str;
32   std::vector<uint32_t> initial_contents;
33 };
34 
35 using EncodeStringTest = ::testing::TestWithParam<EncodeStringCase>;
36 
TEST_P(EncodeStringTest,Sample)37 TEST_P(EncodeStringTest, Sample) {
38   AssemblyContext context(AutoText(""), nullptr);
39   spv_instruction_t inst;
40   inst.words = GetParam().initial_contents;
41   ASSERT_EQ(SPV_SUCCESS,
42             context.binaryEncodeString(GetParam().str.c_str(), &inst));
43   // We already trust MakeVector
44   EXPECT_THAT(inst.words, Eq(Concatenate({GetParam().initial_contents,
45                                           utils::MakeVector(GetParam().str)})));
46 }
47 
48 // clang-format off
49 INSTANTIATE_TEST_SUITE_P(
50     BinaryEncodeString, EncodeStringTest,
51     ::testing::ValuesIn(std::vector<EncodeStringCase>{
52       // Use cases that exercise at least one to two words,
53       // and both empty and non-empty initial contents.
54       {"", {}},
55       {"", {1,2,3}},
56       {"a", {}},
57       {"a", {4}},
58       {"ab", {4}},
59       {"abc", {}},
60       {"abc", {18}},
61       {"abcd", {}},
62       {"abcd", {22}},
63       {"abcde", {4}},
64       {"abcdef", {}},
65       {"abcdef", {99,42}},
66       {"abcdefg", {}},
67       {"abcdefg", {101}},
68       {"abcdefgh", {}},
69       {"abcdefgh", {102, 103, 104}},
70       // A very long string, encoded after an initial word.
71       // SPIR-V limits strings to 65535 characters.
72       {std::string(65535, 'a'), {1}},
73     }));
74 // clang-format on
75 
76 }  // namespace
77 }  // namespace spvtools
78