1 // Copyright 2015 Google Inc. All rights reserved 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 // +build ignore 16 17 #include "strutil.h" 18 19 #include <assert.h> 20 21 #include <string> 22 #include <vector> 23 24 #include "string_piece.h" 25 #include "testutil.h" 26 27 using namespace std; 28 29 namespace { 30 31 void TestWordScanner() { 32 vector<StringPiece> ss; 33 for (StringPiece tok : WordScanner("foo bar baz hogeeeeeeeeeeeeeeee")) { 34 ss.push_back(tok); 35 } 36 assert(ss.size() == 4LU); 37 ASSERT_EQ(ss[0], "foo"); 38 ASSERT_EQ(ss[1], "bar"); 39 ASSERT_EQ(ss[2], "baz"); 40 ASSERT_EQ(ss[3], "hogeeeeeeeeeeeeeeee"); 41 } 42 43 void TestHasPrefix() { 44 assert(HasPrefix("foo", "foo")); 45 assert(HasPrefix("foo", "fo")); 46 assert(HasPrefix("foo", "")); 47 assert(!HasPrefix("foo", "fooo")); 48 } 49 50 void TestHasSuffix() { 51 assert(HasSuffix("bar", "bar")); 52 assert(HasSuffix("bar", "ar")); 53 assert(HasSuffix("bar", "")); 54 assert(!HasSuffix("bar", "bbar")); 55 } 56 57 string SubstPattern(StringPiece str, StringPiece pat, StringPiece subst) { 58 string r; 59 Pattern(pat).AppendSubst(str, subst, &r); 60 return r; 61 } 62 63 void TestSubstPattern() { 64 ASSERT_EQ(SubstPattern("x.c", "%.c", "%.o"), "x.o"); 65 ASSERT_EQ(SubstPattern("c.x", "c.%", "o.%"), "o.x"); 66 ASSERT_EQ(SubstPattern("x.c.c", "%.c", "%.o"), "x.c.o"); 67 ASSERT_EQ(SubstPattern("x.x y.c", "%.c", "%.o"), "x.x y.o"); 68 ASSERT_EQ(SubstPattern("x.%.c", "%.%.c", "OK"), "OK"); 69 ASSERT_EQ(SubstPattern("x.c", "x.c", "OK"), "OK"); 70 ASSERT_EQ(SubstPattern("x.c.c", "x.c", "XX"), "x.c.c"); 71 ASSERT_EQ(SubstPattern("x.x.c", "x.c", "XX"), "x.x.c"); 72 } 73 74 void TestNoLineBreak() { 75 assert(NoLineBreak("a\nb") == "a\\nb"); 76 assert(NoLineBreak("a\nb\nc") == "a\\nb\\nc"); 77 } 78 79 void TestHasWord() { 80 assert(HasWord("foo bar baz", "bar")); 81 assert(HasWord("foo bar baz", "foo")); 82 assert(HasWord("foo bar baz", "baz")); 83 assert(!HasWord("foo bar baz", "oo")); 84 assert(!HasWord("foo bar baz", "ar")); 85 assert(!HasWord("foo bar baz", "ba")); 86 assert(!HasWord("foo bar baz", "az")); 87 assert(!HasWord("foo bar baz", "ba")); 88 assert(!HasWord("foo bar baz", "fo")); 89 } 90 91 static string NormalizePath(string s) { 92 ::NormalizePath(&s); 93 return s; 94 } 95 96 void TestNormalizePath() { 97 ASSERT_EQ(NormalizePath(""), ""); 98 ASSERT_EQ(NormalizePath("."), ""); 99 ASSERT_EQ(NormalizePath("/"), "/"); 100 ASSERT_EQ(NormalizePath("/tmp"), "/tmp"); 101 ASSERT_EQ(NormalizePath("////tmp////"), "/tmp"); 102 ASSERT_EQ(NormalizePath("a////b"), "a/b"); 103 ASSERT_EQ(NormalizePath("a//.//b"), "a/b"); 104 ASSERT_EQ(NormalizePath("a////b//../c/////"), "a/c"); 105 ASSERT_EQ(NormalizePath("../foo"), "../foo"); 106 ASSERT_EQ(NormalizePath("./foo"), "foo"); 107 ASSERT_EQ(NormalizePath("x/y/..//../foo"), "foo"); 108 ASSERT_EQ(NormalizePath("x/../../foo"), "../foo"); 109 ASSERT_EQ(NormalizePath("/../foo"), "/foo"); 110 ASSERT_EQ(NormalizePath("/../../foo"), "/foo"); 111 ASSERT_EQ(NormalizePath("/a/../../foo"), "/foo"); 112 ASSERT_EQ(NormalizePath("/a/b/.."), "/a"); 113 ASSERT_EQ(NormalizePath("../../a/b"), "../../a/b"); 114 ASSERT_EQ(NormalizePath("../../../a/b"), "../../../a/b"); 115 ASSERT_EQ(NormalizePath(".././../a/b"), "../../a/b"); 116 ASSERT_EQ(NormalizePath("./../../a/b"), "../../a/b"); 117 } 118 119 string EscapeShell(string s) { 120 ::EscapeShell(&s); 121 return s; 122 } 123 124 void TestEscapeShell() { 125 ASSERT_EQ(EscapeShell(""), ""); 126 ASSERT_EQ(EscapeShell("foo"), "foo"); 127 ASSERT_EQ(EscapeShell("foo$`\\baz\"bar"), "foo\\$\\`\\\\baz\\\"bar"); 128 ASSERT_EQ(EscapeShell("$$"), "\\$$"); 129 ASSERT_EQ(EscapeShell("$$$"), "\\$$\\$"); 130 ASSERT_EQ(EscapeShell("\\\n"), "\\\\\n"); 131 } 132 133 void TestFindEndOfLine() { 134 size_t lf_cnt = 0; 135 ASSERT_EQ(FindEndOfLine("foo", 0, &lf_cnt), 3); 136 char buf[10] = {'f', 'o', '\\', '\0', 'x', 'y'}; 137 ASSERT_EQ(FindEndOfLine(StringPiece(buf, 6), 0, &lf_cnt), 3); 138 ASSERT_EQ(FindEndOfLine(StringPiece(buf, 2), 0, &lf_cnt), 2); 139 } 140 141 } // namespace 142 143 int main() { 144 TestWordScanner(); 145 TestHasPrefix(); 146 TestHasSuffix(); 147 TestSubstPattern(); 148 TestNoLineBreak(); 149 TestHasWord(); 150 TestNormalizePath(); 151 TestEscapeShell(); 152 TestFindEndOfLine(); 153 assert(!g_failed); 154 } 155