// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// 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.

#include "cobalt/base/token.h"

#include <algorithm>
#include <vector>

#include "testing/gtest/include/gtest/gtest.h"

#include "base/logging.h"
#include "starboard/string.h"

namespace base {
namespace {

TEST(TokenTest, Create) {
  std::string kTestString = "test";

  Token empty;
  EXPECT_EQ(empty, "");

  Token non_empty(kTestString);
  EXPECT_EQ(non_empty, kTestString);
}

TEST(TokenTest, CompareEqual) {
  std::string kTestString = "test";

  Token empty_1;
  Token empty_2("");
  EXPECT_EQ(empty_1, empty_2);

  Token non_empty_1(kTestString);
  Token non_empty_2(kTestString);
  EXPECT_EQ(non_empty_1, non_empty_2);
}

TEST(TokenTest, CompareUnqual) {
  std::string kTestString = "test";

  Token empty;
  Token non_empty(kTestString);
  EXPECT_NE(empty, non_empty);
}

TEST(TokenTest, CompareSorted) {
  std::vector<Token> tokens;

  // Tokens constructed in no particular order so the storage isn't in order.
  tokens.push_back(Token("Cobalt"));
  tokens.push_back(Token("Chrome"));
  tokens.push_back(Token("Firefox"));
  tokens.push_back(Token("Mozilla"));
  tokens.push_back(Token("Navigator"));
  tokens.push_back(Token("Safari"));
  tokens.push_back(Token("Explorer"));
  tokens.push_back(Token("Opera"));

  // Sort the vector so we iterate it alphabetically.
  std::sort(tokens.begin(), tokens.end(),
            [](const Token& l, const Token& r) -> bool {
              return SbStringCompareAll(l.c_str(), r.c_str()) < 0;
            });

  // The natural order of the tokens is not alphabetical.
  Token prev_token;
  bool first = true;
  bool in_order = true;
  for (const auto token : tokens) {
    if (!first) {
      in_order &= (prev_token < token);
    }
    prev_token = token;
    first = false;
  }
  EXPECT_FALSE(in_order);

  // The order of the tokens should be alphabetical using a sort scope.
  Token::ScopedAlphabeticalSorting sort_scope;
  first = true;
  for (const auto token : tokens) {
    if (!first) {
      EXPECT_LT(prev_token, token);
    }
    prev_token = token;
    first = false;
  }
}

TEST(TokenTest, Collision) {
  const char kTestString[] = "abcdefghijklmnopqrstuvwxyz";
  const uint32 kExtraTokens = 100;
  const uint32 kTotalTokens =
      Token::kHashSlotCount * Token::kStringsPerSlot + kExtraTokens;
  Token empty;

  std::string s = kTestString;
  std::vector<Token> tokens_1;
  for (uint32 i = 0; i < kTotalTokens; ++i) {
    tokens_1.push_back(Token(s));
    // 26! is greater than 10^26, which is large enough for the loop.
    std::next_permutation(s.begin(), s.end());
  }

  s = kTestString;
  std::vector<Token> tokens_2;
  for (uint32 i = 0; i < kTotalTokens; ++i) {
    tokens_2.push_back(Token(s));
    // 26! is greater than 10^26, which is large enough for the loop.
    std::next_permutation(s.begin(), s.end());
  }

  s = kTestString;
  EXPECT_EQ(empty, std::string());
  for (uint32 i = 0; i < kTotalTokens; ++i) {
    EXPECT_EQ(tokens_1[i], s);
    EXPECT_EQ(tokens_1[i], tokens_2[i]);
    std::next_permutation(s.begin(), s.end());
  }
}

}  // namespace
}  // namespace base
