piece_test.cc 7.4 KB
Newer Older
1
//  Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
D
dzhwinter 已提交
2 3 4 5 6 7 8 9 10 11 12 13
//
// 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.
Y
Yi Wang 已提交
14

15
#include "paddle/utils/string/piece.h"
Y
Yi Wang 已提交
16

Y
Yi Wang 已提交
17 18 19 20
#include "gtest/gtest.h"

TEST(StringPiece, Construct) {
  {
21
    paddle::string::Piece s;
Y
Yi Wang 已提交
22 23 24 25
    EXPECT_EQ(NULL, s.data());
    EXPECT_EQ(0U, s.len());
  }
  {
26 27 28 29
    EXPECT_THROW(paddle::string::Piece s(NULL, 10000U), std::invalid_argument);
  }
  {
    paddle::string::Piece s(NULL);
Y
Yi Wang 已提交
30 31 32 33 34
    EXPECT_EQ(0U, s.len());
  }
  {
    std::string a;
    EXPECT_EQ(0U, a.size());
35
    paddle::string::Piece s(a);
Y
Yi Wang 已提交
36 37 38 39 40
    EXPECT_EQ(0U, s.len());
  }
}

TEST(StringPiece, CopyAndAssign) {
41
  paddle::string::Piece empty;
Y
Yi Wang 已提交
42 43
  EXPECT_EQ(0U, empty.len());

44 45
  paddle::string::Piece a("hello");
  paddle::string::Piece b = a;
Y
Yi Wang 已提交
46 47 48 49
  EXPECT_EQ(b.len(), strlen("hello"));
  EXPECT_EQ(a, b);

  std::string storage("hello");
50
  paddle::string::Piece c(storage);
Y
Yi Wang 已提交
51 52 53
  EXPECT_EQ(a, c);
  EXPECT_NE(a.data(), c.data());
}
Y
Yi Wang 已提交
54

Y
Yi Wang 已提交
55
TEST(StringPiece, Compare) {
Y
Yi Wang 已提交
56
  {
57 58
    paddle::string::Piece a("hello");
    paddle::string::Piece b("world");
Y
Yi Wang 已提交
59 60 61 62 63 64
    EXPECT_TRUE(a != b);
    EXPECT_FALSE(a == b);
    EXPECT_TRUE(a < b);
    EXPECT_TRUE(a <= b);
    EXPECT_FALSE(a > b);
    EXPECT_FALSE(a >= b);
Y
Yi Wang 已提交
65 66
    EXPECT_LT(Compare(a, b), 0);
    EXPECT_GT(Compare(b, a), 0);
Y
Yi Wang 已提交
67 68
  }
  {
69
    paddle::string::Piece a, b;
Y
Yi Wang 已提交
70 71 72 73 74 75
    EXPECT_TRUE(a == b);
    EXPECT_FALSE(a != b);
    EXPECT_FALSE(a < b);
    EXPECT_FALSE(a > b);
    EXPECT_TRUE(a <= b);
    EXPECT_TRUE(a >= b);
Y
Yi Wang 已提交
76 77 78 79 80 81 82
    EXPECT_EQ(0, Compare(a, b));
    EXPECT_EQ(0, Compare(b, a));
  }
}

TEST(StringPiece, ToString) {
  {
83
    paddle::string::Piece s;
Y
Yi Wang 已提交
84 85 86
    EXPECT_EQ(std::string(""), s.ToString());
  }
  {
87
    paddle::string::Piece s(NULL);
Y
Yi Wang 已提交
88 89 90
    EXPECT_EQ(std::string(""), s.ToString());
  }
  {
91
    paddle::string::Piece s("hello");
Y
Yi Wang 已提交
92 93 94 95 96
    EXPECT_EQ(std::string("hello"), s.ToString());
  }
}

TEST(StringPiece, HasPrefixSuffix) {
97 98
  using paddle::string::HasPrefix;
  using paddle::string::HasSuffix;
Y
Yi Wang 已提交
99
  {
100
    paddle::string::Piece s;
Y
Yi Wang 已提交
101 102 103 104 105 106
    EXPECT_FALSE(HasPrefix(s, "something"));
    EXPECT_TRUE(HasPrefix(s, ""));
    EXPECT_FALSE(HasSuffix(s, "something"));
    EXPECT_TRUE(HasSuffix(s, ""));
  }
  {
107
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
108 109 110 111 112 113 114 115 116
    EXPECT_TRUE(HasPrefix(s, ""));
    EXPECT_TRUE(HasPrefix(s, "a"));
    EXPECT_TRUE(HasPrefix(s, "ap"));
    EXPECT_TRUE(HasPrefix(s, "app"));

    EXPECT_TRUE(HasSuffix(s, ""));
    EXPECT_TRUE(HasSuffix(s, "p"));
    EXPECT_TRUE(HasSuffix(s, "pp"));
    EXPECT_TRUE(HasSuffix(s, "app"));
Y
Yi Wang 已提交
117 118
  }
}
Y
Yi Wang 已提交
119 120

TEST(StringPiece, SkipPrefixSuffix) {
121 122
  using paddle::string::SkipPrefix;
  using paddle::string::SkipSuffix;
Y
Yi Wang 已提交
123
  {
124
    paddle::string::Piece s;
Y
Yi Wang 已提交
125 126 127 128 129 130 131
    EXPECT_EQ("", SkipPrefix(s, 0));
    EXPECT_THROW(SkipPrefix(s, 1), std::invalid_argument);

    EXPECT_EQ("", SkipSuffix(s, 0));
    EXPECT_THROW(SkipSuffix(s, 1), std::invalid_argument);
  }
  {
132
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
    EXPECT_EQ("app", SkipPrefix(s, 0));
    EXPECT_EQ("pp", SkipPrefix(s, 1));
    EXPECT_EQ("p", SkipPrefix(s, 2));
    EXPECT_EQ("", SkipPrefix(s, 3));
    EXPECT_THROW(SkipPrefix(s, 4), std::invalid_argument);

    EXPECT_EQ("app", SkipSuffix(s, 0));
    EXPECT_EQ("ap", SkipSuffix(s, 1));
    EXPECT_EQ("a", SkipSuffix(s, 2));
    EXPECT_EQ("", SkipSuffix(s, 3));
    EXPECT_THROW(SkipSuffix(s, 4), std::invalid_argument);
  }
}

TEST(StringPiece, TrimPrefixSuffix) {
148 149
  using paddle::string::TrimPrefix;
  using paddle::string::TrimSuffix;
Y
Yi Wang 已提交
150
  {
151
    paddle::string::Piece s;
Y
Yi Wang 已提交
152 153 154 155 156 157 158
    EXPECT_EQ("", TrimPrefix(s, ""));
    EXPECT_EQ("", TrimPrefix(s, "something"));

    EXPECT_EQ("", TrimSuffix(s, ""));
    EXPECT_EQ("", TrimSuffix(s, "something"));
  }
  {
159
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
    EXPECT_EQ("app", TrimPrefix(s, ""));
    EXPECT_EQ("pp", TrimPrefix(s, "a"));
    EXPECT_EQ("p", TrimPrefix(s, "ap"));
    EXPECT_EQ("", TrimPrefix(s, "app"));
    EXPECT_EQ("app", TrimPrefix(s, "something"));

    EXPECT_EQ("app", TrimSuffix(s, ""));
    EXPECT_EQ("ap", TrimSuffix(s, "p"));
    EXPECT_EQ("a", TrimSuffix(s, "pp"));
    EXPECT_EQ("", TrimSuffix(s, "app"));
    EXPECT_EQ("app", TrimSuffix(s, "something"));
  }
}

TEST(StringPiece, Contains) {
175
  using paddle::string::Contains;
Y
Yi Wang 已提交
176
  {
177
    paddle::string::Piece s;
Y
Yi Wang 已提交
178 179 180 181
    EXPECT_FALSE(Contains(s, ""));
    EXPECT_FALSE(Contains(s, "something"));
  }
  {
182
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
183 184 185 186 187 188 189 190 191 192 193
    EXPECT_TRUE(Contains(s, ""));
    EXPECT_TRUE(Contains(s, "a"));
    EXPECT_TRUE(Contains(s, "p"));
    EXPECT_TRUE(Contains(s, "ap"));
    EXPECT_TRUE(Contains(s, "pp"));
    EXPECT_TRUE(Contains(s, "app"));
    EXPECT_FALSE(Contains(s, "something"));
  }
}

TEST(StringPiece, Index) {
194 195
  using paddle::string::Index;
  auto npos = paddle::string::Piece::npos;
Y
Yi Wang 已提交
196
  {
197
    paddle::string::Piece s;
Y
Yi Wang 已提交
198 199 200 201
    EXPECT_EQ(npos, Index(s, ""));
    EXPECT_EQ(npos, Index(s, "something"));
  }
  {
202
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
203 204 205 206 207 208 209 210 211 212 213
    EXPECT_EQ(0U, Index(s, ""));
    EXPECT_EQ(0U, Index(s, "a"));
    EXPECT_EQ(1U, Index(s, "p"));
    EXPECT_EQ(0U, Index(s, "ap"));
    EXPECT_EQ(1U, Index(s, "pp"));
    EXPECT_EQ(0U, Index(s, "app"));
    EXPECT_EQ(npos, Index(s, "something"));
  }
}

TEST(StringPiece, Find) {
214 215
  using paddle::string::Find;
  auto npos = paddle::string::Piece::npos;
Y
Yi Wang 已提交
216
  {
217
    paddle::string::Piece s;
Y
Yi Wang 已提交
218 219 220
    EXPECT_EQ(npos, Find(s, 'a', 0U));
  }
  {
221
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
222 223 224 225 226 227 228 229 230
    EXPECT_EQ(0U, Find(s, 'a', 0U));
    EXPECT_EQ(1U, Find(s, 'p', 0U));
    EXPECT_EQ(1U, Find(s, 'p', 1U));
    EXPECT_EQ(2U, Find(s, 'p', 2U));
    EXPECT_EQ(npos, Find(s, 'z', 2U));
  }
}

TEST(StringPiece, RFind) {
231 232
  using paddle::string::RFind;
  auto npos = paddle::string::Piece::npos;
Y
Yi Wang 已提交
233
  {
234
    paddle::string::Piece s;
Y
Yi Wang 已提交
235 236 237
    EXPECT_EQ(npos, RFind(s, 'a', 0U));
  }
  {
238
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
239 240 241 242 243 244 245 246 247
    EXPECT_EQ(2U, RFind(s, 'p', 2U));
    EXPECT_EQ(0U, RFind(s, 'a', 2U));
    EXPECT_EQ(1U, RFind(s, 'p', 1U));
    EXPECT_EQ(0U, RFind(s, 'a', 0));
    EXPECT_EQ(npos, RFind(s, 'z', 2U));
  }
}

TEST(StringPiece, SubStr) {
248
  using paddle::string::SubStr;
Y
Yi Wang 已提交
249
  {
250
    paddle::string::Piece s;
Y
Yi Wang 已提交
251 252 253 254 255
    EXPECT_EQ("", SubStr(s, 0, 0));
    EXPECT_EQ("", SubStr(s, 0, 1));
    EXPECT_EQ("", SubStr(s, 1, 0));
  }
  {
256
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
    EXPECT_EQ("", SubStr(s, 0, 0));
    EXPECT_EQ("", SubStr(s, 1, 0));
    EXPECT_EQ("", SubStr(s, 2, 0));
    EXPECT_EQ("", SubStr(s, 3, 0));

    EXPECT_EQ("a", SubStr(s, 0, 1));
    EXPECT_EQ("p", SubStr(s, 1, 1));
    EXPECT_EQ("p", SubStr(s, 2, 1));
    EXPECT_EQ("", SubStr(s, 3, 1));

    EXPECT_EQ("ap", SubStr(s, 0, 2));
    EXPECT_EQ("pp", SubStr(s, 1, 2));
    EXPECT_EQ("p", SubStr(s, 2, 2));
    EXPECT_EQ("", SubStr(s, 3, 2));

    EXPECT_EQ("app", SubStr(s, 0, 3));
    EXPECT_EQ("pp", SubStr(s, 1, 3));
    EXPECT_EQ("p", SubStr(s, 2, 3));
    EXPECT_EQ("", SubStr(s, 3, 3));
  }
}

TEST(StringPiece, StreamOutput) {
280
  using paddle::string::Piece;
Y
Yi Wang 已提交
281 282

  std::stringstream o;
283
  o << paddle::string::Piece();
Y
Yi Wang 已提交
284 285
  EXPECT_EQ("", o.str());

286
  o << paddle::string::Piece("hello");
Y
Yi Wang 已提交
287 288
  EXPECT_EQ("hello", o.str());

289
  o << paddle::string::Piece();
Y
Yi Wang 已提交
290 291
  EXPECT_EQ("hello", o.str());
}