// Copyright 2015 Google Inc. 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/layout/white_space_processing.h"

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

namespace cobalt {
namespace layout {

TEST(CollapseWhiteSpaceTest, Empty) {
  std::string text = "";
  CollapseWhiteSpace(&text);
  EXPECT_EQ("", text);
}

TEST(CollapseWhiteSpaceTest, SingleSpace) {
  std::string text = " ";
  CollapseWhiteSpace(&text);
  EXPECT_EQ(" ", text);
}

TEST(CollapseWhiteSpaceTest, DoubleSpace) {
  std::string text = "  ";
  CollapseWhiteSpace(&text);
  EXPECT_EQ(" ", text);
}

TEST(CollapseWhiteSpaceTest, Word) {
  std::string text = "hello";
  CollapseWhiteSpace(&text);
  EXPECT_EQ("hello", text);
}

TEST(CollapseWhiteSpaceTest, WordSurroundedBySingleSpaces) {
  std::string text = " hello ";
  CollapseWhiteSpace(&text);
  EXPECT_EQ(" hello ", text);
}

TEST(CollapseWhiteSpaceTest, WordSurroundedByDoubleSpaces) {
  std::string text = "  hello  ";
  CollapseWhiteSpace(&text);
  EXPECT_EQ(" hello ", text);
}

TEST(CollapseWhiteSpaceTest, TwoWordsSeparatedBySingleSpace) {
  std::string text = "Hello, world!";
  CollapseWhiteSpace(&text);
  EXPECT_EQ("Hello, world!", text);
}

TEST(CollapseWhiteSpaceTest, TwoWordsSurroundedAndSeparatedByDoubleSpaces) {
  std::string text = "  Hello,  world!  ";
  CollapseWhiteSpace(&text);
  EXPECT_EQ(" Hello, world! ", text);
}

TEST(FindNextNewlineSequenceTest, NoNewlineSequences) {
  std::string text = "Hello, world!";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, CarriageReturnSequence) {
  std::string text = "Hello,\r world!";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 6);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, CRLFSequence) {
  std::string text = "Hello,\r\n world!";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 6);
  EXPECT_EQ(sequence_length, 2);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, LineFeedSequence) {
  std::string text = "Hello,\n world!";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 6);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, NewLineSequenceAtStart) {
  std::string text = "\nHello, world!";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 0);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, ConsecutiveNewLineSequences) {
  std::string text = "Hello,\n\n world!";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 6);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 7);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, NewLineAtEnd) {
  std::string text = "Hello, world!\n";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 13);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

TEST(FindNextNewlineSequenceTest, MultipleNewLineSequences) {
  std::string text = "\nHello,\r\n \nworld!\r";
  size_t start_index = 0;
  size_t sequence_index;
  size_t sequence_length;

  bool foundSequence = FindNextNewlineSequence(
      text, start_index, &sequence_index, &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 0);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 7);
  EXPECT_EQ(sequence_length, 2);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 10);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_TRUE(foundSequence);
  EXPECT_EQ(sequence_index, 17);
  EXPECT_EQ(sequence_length, 1);

  start_index = sequence_index + sequence_length;
  foundSequence = FindNextNewlineSequence(text, start_index, &sequence_index,
                                          &sequence_length);
  EXPECT_FALSE(foundSequence);
  EXPECT_EQ(sequence_index, text.size());
  EXPECT_EQ(sequence_length, 0);
}

}  // namespace layout
}  // namespace cobalt
