| // 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 "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, | |
| spvtest::MakeVector(GetParam().str)}))); | |
| } | |
| // clang-format off | |
| INSTANTIATE_TEST_CASE_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 |