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

#include <sstream>

Y
Yi Wang 已提交
19 20 21 22
#include "gtest/gtest.h"

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

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

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

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

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

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

TEST(StringPiece, HasPrefixSuffix) {
99 100
  using paddle::string::HasPrefix;
  using paddle::string::HasSuffix;
Y
Yi Wang 已提交
101
  {
102
    paddle::string::Piece s;
Y
Yi Wang 已提交
103 104 105 106 107 108
    EXPECT_FALSE(HasPrefix(s, "something"));
    EXPECT_TRUE(HasPrefix(s, ""));
    EXPECT_FALSE(HasSuffix(s, "something"));
    EXPECT_TRUE(HasSuffix(s, ""));
  }
  {
109
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
110 111 112 113 114 115 116 117 118
    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 已提交
119 120
  }
}
Y
Yi Wang 已提交
121 122

TEST(StringPiece, SkipPrefixSuffix) {
123 124
  using paddle::string::SkipPrefix;
  using paddle::string::SkipSuffix;
Y
Yi Wang 已提交
125
  {
126
    paddle::string::Piece s;
Y
Yi Wang 已提交
127 128 129 130 131 132 133
    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);
  }
  {
134
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
    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) {
150 151
  using paddle::string::TrimPrefix;
  using paddle::string::TrimSuffix;
Y
Yi Wang 已提交
152
  {
153
    paddle::string::Piece s;
Y
Yi Wang 已提交
154 155 156 157 158 159 160
    EXPECT_EQ("", TrimPrefix(s, ""));
    EXPECT_EQ("", TrimPrefix(s, "something"));

    EXPECT_EQ("", TrimSuffix(s, ""));
    EXPECT_EQ("", TrimSuffix(s, "something"));
  }
  {
161
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
    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) {
177
  using paddle::string::Contains;
Y
Yi Wang 已提交
178
  {
179
    paddle::string::Piece s;
Y
Yi Wang 已提交
180 181 182 183
    EXPECT_FALSE(Contains(s, ""));
    EXPECT_FALSE(Contains(s, "something"));
  }
  {
184
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
185 186 187 188 189 190 191 192 193 194 195
    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) {
196 197
  using paddle::string::Index;
  auto npos = paddle::string::Piece::npos;
Y
Yi Wang 已提交
198
  {
199
    paddle::string::Piece s;
Y
Yi Wang 已提交
200 201 202 203
    EXPECT_EQ(npos, Index(s, ""));
    EXPECT_EQ(npos, Index(s, "something"));
  }
  {
204
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
205 206 207 208 209 210 211 212 213 214 215
    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) {
216 217
  using paddle::string::Find;
  auto npos = paddle::string::Piece::npos;
Y
Yi Wang 已提交
218
  {
219
    paddle::string::Piece s;
Y
Yi Wang 已提交
220 221 222
    EXPECT_EQ(npos, Find(s, 'a', 0U));
  }
  {
223
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
224 225 226 227 228 229 230 231 232
    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) {
233 234
  using paddle::string::RFind;
  auto npos = paddle::string::Piece::npos;
Y
Yi Wang 已提交
235
  {
236
    paddle::string::Piece s;
Y
Yi Wang 已提交
237 238 239
    EXPECT_EQ(npos, RFind(s, 'a', 0U));
  }
  {
240
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
241 242 243 244 245 246 247 248 249
    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) {
250
  using paddle::string::SubStr;
Y
Yi Wang 已提交
251
  {
252
    paddle::string::Piece s;
Y
Yi Wang 已提交
253 254 255 256 257
    EXPECT_EQ("", SubStr(s, 0, 0));
    EXPECT_EQ("", SubStr(s, 0, 1));
    EXPECT_EQ("", SubStr(s, 1, 0));
  }
  {
258
    paddle::string::Piece s("app");
Y
Yi Wang 已提交
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
    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) {
282
  using paddle::string::Piece;
Y
Yi Wang 已提交
283 284

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

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

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