1676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka/*
2676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * Copyright (C) 2017 The Android Open Source Project
3676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka *
4676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * you may not use this file except in compliance with the License.
6676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * You may obtain a copy of the License at
7676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka *
8676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka *
10676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * Unless required by applicable law or agreed to in writing, software
11676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * See the License for the specific language governing permissions and
14676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka * limitations under the License.
15676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka */
16676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
17676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka#include "StringPiece.h"
18676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
191d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include <gtest/gtest.h>
201d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka
21676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonakanamespace minikin {
22676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
23676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo NonakaTEST(StringPieceTest, basics) {
24676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
25676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s(nullptr);
26676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(nullptr, s.data());
27676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(0u, s.size());
28676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(s.empty());
29676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
30676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
31676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("");
32676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
33676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(0u, s.size());
34676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(s.empty());
35676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
36676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
37676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("", 0);
38676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
39676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(0u, s.size());
40676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(s.empty());
41676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
42676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
43676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("abcde");
44676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
45676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(5u, s.size());
46676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(s.empty());
47676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("abcde", s);
48676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE("abc", s);
49676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
50676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
51676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("abcde", 5);
52676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
53676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(5u, s.size());
54676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(s.empty());
55676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("abcde", s);
56676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE("abc", s);
57676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
58676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
59676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("abcde", 3);
60676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
61676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(3u, s.size());
62676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(s.empty());
63676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("abc", s);
64676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE("abcde", s);
65676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
66676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
67676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        const char* kText = "abcde";
68676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s(kText + 2, 3);
69676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
70676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(3u, s.size());
71676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(s.empty());
72676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("cde", s);
73676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE("abcde", s);
74676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
75676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
76676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        const char* kText = "abcde";
77676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s(kText + 2);
78676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE(nullptr, s.data());
79676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ(3u, s.size());
80676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(s.empty());
81676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("cde", s);
82676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_NE("abcde", s);
83676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
84676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka}
85676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
86676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo NonakaTEST(StringPieceTest, substr) {
87676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    StringPiece s("abcde");
88676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ("", s.substr(0, 0));
89676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ("a", s.substr(0, 1));
90676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ("abc", s.substr(0, 3));
91676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ("cde", s.substr(2, 3));
92676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ("", s.substr(2, 0));
93676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ("", s.substr(5, 0));
94676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka}
95676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
96676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo NonakaTEST(StringPieceTest, find) {
97676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    StringPiece s("mississippi");
98676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(1u, s.find(0, 'i'));
99676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(1u, s.find(1, 'i'));
100676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(4u, s.find(2, 'i'));
101676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(4u, s.find(3, 'i'));
102676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(4u, s.find(4, 'i'));
103676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(7u, s.find(5, 'i'));
104676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(7u, s.find(6, 'i'));
105676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(7u, s.find(7, 'i'));
106676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(10u, s.find(8, 'i'));
107676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(10u, s.find(9, 'i'));
108676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(10u, s.find(10, 'i'));
109676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(11u, s.find(11, 'i'));
110676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
111676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(11u, s.find(12, 'i'));  // search index is out of bounds.
112676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka}
113676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
114676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo NonakaTEST(StringPieceTest, find_empty) {
115676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    StringPiece s("");
116676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    EXPECT_EQ(0u, s.find(0, 'a'));
117676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka}
118676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
119676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo NonakaTEST(SplitIteratorTest, split) {
120676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
121676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("");
122676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        SplitIterator it(s, ',');
123676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(it.hasNext());
124676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
125676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
126676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("abcde");
127676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        SplitIterator it(s, ',');
128676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
129676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("abcde", it.next());
130676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(it.hasNext());
131676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
132676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
133676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s("a,bb,ccc,dddd,eeeee");
134676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        SplitIterator it(s, ',');
135676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
136676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("a", it.next());
137676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
138676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("bb", it.next());
139676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
140676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("ccc", it.next());
141676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
142676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("dddd", it.next());
143676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
144676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("eeeee", it.next());
145676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(it.hasNext());
146676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
147676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
148676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s(",,,,");
149676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        SplitIterator it(s, ',');
150676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
151676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
152676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
153676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
154676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
155676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
156676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
157676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
158676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
159676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
160676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(it.hasNext());
161676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
162676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    {
163676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        StringPiece s(",a,,b,");
164676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        SplitIterator it(s, ',');
165676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
166676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
167676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
168676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("a", it.next());
169676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
170676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
171676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
172676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("b", it.next());
173676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_TRUE(it.hasNext());
174676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_EQ("", it.next());
175676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka        EXPECT_FALSE(it.hasNext());
176676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka    }
177676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka}
178676f8390ed8fa260f2f9685820b8d3dfbd08e8d3Seigo Nonaka
1796c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka}  // namespace minikin
180