// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/url_pattern_index/string_splitter.h"

#include <string>
#include <vector>

#include "base/strings/string_piece.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace url_pattern_index {

namespace {
bool IsTestSeparator(char c) {
  return c == ' ' || c == '\t' || c == ',';
}
}

TEST(StringSplitterTest, SplitWithEmptyResult) {
  const char* const kStrings[] = {
      "", " ", "\t", ",", " \t ", ",,,,", "\t\t\t",
  };

  for (const char* string : kStrings) {
    auto splitter = CreateStringSplitter(string, IsTestSeparator);
    // Explicitly verify both operator== and operator!=.
    EXPECT_TRUE(splitter.begin() == splitter.end());
    EXPECT_FALSE(splitter.begin() != splitter.end());
  }
}

TEST(StringSplitterTest, SplitOneWord) {
  const char* const kLongStrings[] = {
      "word",     " word ",   " word",   "word ",   ",word,",
      "\tword\t", "  word  ", "word   ", "   word", ", word, \t",
  };
  const char* const kShortStrings[] = {
      "w", " w ", " w", "w ", "  w  ", "  w", "w  ", ", w, ", "w, \t",
  };

  const char kLongWord[] = "word";
  const char kShortWord[] = "w";

  auto expect_word = [](const char* text, const char* word) {
    auto splitter = CreateStringSplitter(text, IsTestSeparator);
    // Explicitly verify both operator== and operator!=.
    EXPECT_TRUE(splitter.begin() != splitter.end());
    EXPECT_FALSE(splitter.begin() == splitter.end());

    EXPECT_EQ(splitter.end(), ++splitter.begin());
    EXPECT_EQ(word, *splitter.begin());

    auto iterator = splitter.begin();
    EXPECT_EQ(splitter.begin(), iterator++);
    EXPECT_EQ(splitter.end(), iterator);
  };

  for (const char* string : kLongStrings)
    expect_word(string, kLongWord);
  for (const char* string : kShortStrings)
    expect_word(string, kShortWord);
}

TEST(StringSplitterTest, SplitThreeWords) {
  const char* const kStrings[] = {
      "one two three",     " one two three ",   "   one  two, three",
      "one,two\t\t three", "one, two, three, ",
  };
  const std::vector<base::StringPiece> kResults = {
      "one", "two", "three",
  };

  for (const char* string : kStrings) {
    auto splitter = CreateStringSplitter(string, IsTestSeparator);
    std::vector<base::StringPiece> tokens(splitter.begin(), splitter.end());
    EXPECT_EQ(kResults, tokens);
  }
}

}  // namespace url_pattern_index
