|  | // 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. | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "gmock/gmock.h" | 
|  | #include "source/instruction.h" | 
|  | #include "source/util/string_utils.h" | 
|  | #include "test/unit_spirv.h" | 
|  |  | 
|  | namespace spvtools { | 
|  | namespace { | 
|  |  | 
|  | using spvtest::AutoText; | 
|  | using spvtest::Concatenate; | 
|  | using ::testing::Eq; | 
|  |  | 
|  | struct EncodeStringCase { | 
|  | std::string str; | 
|  | std::vector<uint32_t> initial_contents; | 
|  | }; | 
|  |  | 
|  | using EncodeStringTest = ::testing::TestWithParam<EncodeStringCase>; | 
|  |  | 
|  | TEST_P(EncodeStringTest, Sample) { | 
|  | AssemblyContext context(AutoText(""), nullptr); | 
|  | spv_instruction_t inst; | 
|  | inst.words = GetParam().initial_contents; | 
|  | ASSERT_EQ(SPV_SUCCESS, | 
|  | context.binaryEncodeString(GetParam().str.c_str(), &inst)); | 
|  | // We already trust MakeVector | 
|  | EXPECT_THAT(inst.words, Eq(Concatenate({GetParam().initial_contents, | 
|  | utils::MakeVector(GetParam().str)}))); | 
|  | } | 
|  |  | 
|  | // clang-format off | 
|  | INSTANTIATE_TEST_SUITE_P( | 
|  | BinaryEncodeString, EncodeStringTest, | 
|  | ::testing::ValuesIn(std::vector<EncodeStringCase>{ | 
|  | // Use cases that exercise at least one to two words, | 
|  | // and both empty and non-empty initial contents. | 
|  | {"", {}}, | 
|  | {"", {1,2,3}}, | 
|  | {"a", {}}, | 
|  | {"a", {4}}, | 
|  | {"ab", {4}}, | 
|  | {"abc", {}}, | 
|  | {"abc", {18}}, | 
|  | {"abcd", {}}, | 
|  | {"abcd", {22}}, | 
|  | {"abcde", {4}}, | 
|  | {"abcdef", {}}, | 
|  | {"abcdef", {99,42}}, | 
|  | {"abcdefg", {}}, | 
|  | {"abcdefg", {101}}, | 
|  | {"abcdefgh", {}}, | 
|  | {"abcdefgh", {102, 103, 104}}, | 
|  | // A very long string, encoded after an initial word. | 
|  | // SPIR-V limits strings to 65535 characters. | 
|  | {std::string(65535, 'a'), {1}}, | 
|  | })); | 
|  | // clang-format on | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace spvtools |