1 // Copyright (c) 2016 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 #include <string>
16 #include <vector>
17
18 #include "gtest/gtest.h"
19 #include "test/opt/pass_utils.h"
20
21 namespace spvtools {
22 namespace opt {
23 namespace {
24
TEST(JoinAllInsts,Cases)25 TEST(JoinAllInsts, Cases) {
26 EXPECT_EQ("", JoinAllInsts({}));
27 EXPECT_EQ("a\n", JoinAllInsts({"a"}));
28 EXPECT_EQ("a\nb\n", JoinAllInsts({"a", "b"}));
29 EXPECT_EQ("a\nb\nc\n", JoinAllInsts({"a", "b", "c"}));
30 EXPECT_EQ("hello,\nworld!\n\n\n", JoinAllInsts({"hello,", "world!", "\n"}));
31 }
32
TEST(JoinNonDebugInsts,Cases)33 TEST(JoinNonDebugInsts, Cases) {
34 EXPECT_EQ("", JoinNonDebugInsts({}));
35 EXPECT_EQ("a\n", JoinNonDebugInsts({"a"}));
36 EXPECT_EQ("", JoinNonDebugInsts({"OpName"}));
37 EXPECT_EQ("a\nb\n", JoinNonDebugInsts({"a", "b"}));
38 EXPECT_EQ("", JoinNonDebugInsts({"OpName", "%1 = OpString \"42\""}));
39 EXPECT_EQ("Opstring\n", JoinNonDebugInsts({"OpName", "Opstring"}));
40 EXPECT_EQ("the only remaining string\n",
41 JoinNonDebugInsts(
42 {"OpSourceContinued", "OpSource", "OpSourceExtension",
43 "lgtm OpName", "hello OpMemberName", "this is a OpString",
44 "lonely OpLine", "happy OpNoLine", "OpModuleProcessed",
45 "the only remaining string"}));
46 }
47
48 struct SubstringReplacementTestCase {
49 const char* orig_str;
50 const char* find_substr;
51 const char* replace_substr;
52 const char* expected_str;
53 bool replace_should_succeed;
54 };
55
56 using FindAndReplaceTest =
57 ::testing::TestWithParam<SubstringReplacementTestCase>;
58
TEST_P(FindAndReplaceTest,SubstringReplacement)59 TEST_P(FindAndReplaceTest, SubstringReplacement) {
60 auto process = std::string(GetParam().orig_str);
61 EXPECT_EQ(GetParam().replace_should_succeed,
62 FindAndReplace(&process, GetParam().find_substr,
63 GetParam().replace_substr))
64 << "Original string: " << GetParam().orig_str
65 << " replace: " << GetParam().find_substr
66 << " to: " << GetParam().replace_substr
67 << " should returns: " << GetParam().replace_should_succeed;
68 EXPECT_STREQ(GetParam().expected_str, process.c_str())
69 << "Original string: " << GetParam().orig_str
70 << " replace: " << GetParam().find_substr
71 << " to: " << GetParam().replace_substr
72 << " expected string: " << GetParam().expected_str;
73 }
74
75 INSTANTIATE_TEST_CASE_P(
76 SubstringReplacement, FindAndReplaceTest,
77 ::testing::ValuesIn(std::vector<SubstringReplacementTestCase>({
78 // orig string, find substring, replace substring, expected string,
79 // replacement happened
80 {"", "", "", "", false},
81 {"", "b", "", "", false},
82 {"", "", "c", "", false},
83 {"", "a", "b", "", false},
84
85 {"a", "", "c", "a", false},
86 {"a", "b", "c", "a", false},
87 {"a", "b", "", "a", false},
88 {"a", "a", "", "", true},
89 {"a", "a", "b", "b", true},
90
91 {"ab", "a", "b", "bb", true},
92 {"ab", "a", "", "b", true},
93 {"ab", "b", "", "a", true},
94 {"ab", "ab", "", "", true},
95 {"ab", "ab", "cd", "cd", true},
96 {"bc", "abc", "efg", "bc", false},
97
98 {"abc", "ab", "bc", "bcc", true},
99 {"abc", "ab", "", "c", true},
100 {"abc", "bc", "", "a", true},
101 {"abc", "bc", "d", "ad", true},
102 {"abc", "a", "123", "123bc", true},
103 {"abc", "ab", "a", "ac", true},
104 {"abc", "a", "aab", "aabbc", true},
105 {"abc", "abcd", "efg", "abc", false},
106 })));
107
108 } // namespace
109 } // namespace opt
110 } // namespace spvtools
111