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 
TestWordScanner()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 
TestHasPrefix()43 void TestHasPrefix() {
44   assert(HasPrefix("foo", "foo"));
45   assert(HasPrefix("foo", "fo"));
46   assert(HasPrefix("foo", ""));
47   assert(!HasPrefix("foo", "fooo"));
48 }
49 
TestHasSuffix()50 void TestHasSuffix() {
51   assert(HasSuffix("bar", "bar"));
52   assert(HasSuffix("bar", "ar"));
53   assert(HasSuffix("bar", ""));
54   assert(!HasSuffix("bar", "bbar"));
55 }
56 
SubstPattern(StringPiece str,StringPiece pat,StringPiece subst)57 string SubstPattern(StringPiece str, StringPiece pat, StringPiece subst) {
58   string r;
59   Pattern(pat).AppendSubst(str, subst, &r);
60   return r;
61 }
62 
TestSubstPattern()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 
TestNoLineBreak()74 void TestNoLineBreak() {
75   assert(NoLineBreak("a\nb") == "a\\nb");
76   assert(NoLineBreak("a\nb\nc") == "a\\nb\\nc");
77 }
78 
TestHasWord()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 
NormalizePath(string s)91 static string NormalizePath(string s) {
92   ::NormalizePath(&s);
93   return s;
94 }
95 
TestNormalizePath()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 
EscapeShell(string s)119 string EscapeShell(string s) {
120   ::EscapeShell(&s);
121   return s;
122 }
123 
TestEscapeShell()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 
TestFindEndOfLine()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 
main()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