blob: 2bb0e1ed2c91f617d2b38033743747e73aa9bc2a [file] [log] [blame]
// Copyright 2014 The Chromium OS 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 "chromeos-dbus-bindings/indented_text.h"
#include <string>
#include <vector>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using std::string;
using std::vector;
using testing::ElementsAre;
using testing::Test;
namespace chromeos_dbus_bindings {
class IndentedTextTest : public Test {
protected:
size_t GetOffset() const { return text_.offset_; }
const vector<size_t>& GetHistory() const { return text_.offset_history_; }
IndentedText text_;
};
TEST_F(IndentedTextTest, Constructor) {
EXPECT_EQ("", text_.GetContents());
EXPECT_EQ(0, GetOffset());
EXPECT_TRUE(GetHistory().empty());
}
TEST_F(IndentedTextTest, AddLine) {
const char kTestString0[] = "test";
text_.AddLine(kTestString0);
EXPECT_EQ(string(kTestString0) + "\n", text_.GetContents());
EXPECT_EQ(0, GetOffset());
EXPECT_TRUE(GetHistory().empty());
const char kTestString1[] = "me";
text_.AddLine(kTestString1);
EXPECT_EQ(string(kTestString0) + "\n" + kTestString1 + "\n",
text_.GetContents());
EXPECT_EQ(0, GetOffset());
EXPECT_TRUE(GetHistory().empty());
}
TEST_F(IndentedTextTest, AddLineWithOffset) {
const char kTestString[] = "test";
const int kShift = 4;
text_.AddLineWithOffset(kTestString, kShift);
EXPECT_EQ(string(kShift, ' ') + kTestString + "\n", text_.GetContents());
}
TEST_F(IndentedTextTest, AddLineAndPushOffsetTo) {
text_.AddLineAndPushOffsetTo("foo(bar(baz", 2, '(');
EXPECT_THAT(GetHistory(), ElementsAre(8));
}
TEST_F(IndentedTextTest, AddBlock) {
IndentedText block0;
const char kTestString[] = "test";
block0.AddLineWithOffset(kTestString, 10);
block0.AddLineWithOffset(kTestString, 20);
IndentedText block1;
block1.AddLineWithOffset(kTestString, 5);
block1.AddLineWithOffset(kTestString, 15);
text_.AddBlock(block0);
text_.AddBlock(block1);
EXPECT_EQ(block0.GetContents() + block1.GetContents(), text_.GetContents());
}
TEST_F(IndentedTextTest, AddBlockWithOffset) {
const char kTestString[] = "test";
IndentedText block;
const int kOffset0 = 0;
block.AddLineWithOffset(kTestString, kOffset0);
const int kOffset1 = 4;
block.AddLineWithOffset(kTestString, kOffset1);
const int kOffset2 = 20;
text_.AddBlockWithOffset(block, kOffset2);
EXPECT_EQ(string(kOffset2 + kOffset0, ' ') + kTestString + "\n" +
string(kOffset2 + kOffset1, ' ') + kTestString + "\n",
text_.GetContents());
}
TEST_F(IndentedTextTest, PushPop) {
const char kTestString[] = "test";
text_.AddLine(kTestString);
const int kShift0 = 2;
text_.PushOffset(kShift0);
EXPECT_EQ(2, GetOffset());
EXPECT_THAT(GetHistory(), ElementsAre(kShift0));
text_.AddLine(kTestString);
const int kShift1 = 4;
text_.PushOffset(kShift1);
EXPECT_EQ(kShift0 + kShift1, GetOffset());
EXPECT_THAT(GetHistory(), ElementsAre(kShift0, kShift1));
text_.AddLine(kTestString);
text_.PopOffset();
text_.AddLine(kTestString);
EXPECT_EQ(2, GetOffset());
EXPECT_THAT(GetHistory(), ElementsAre(kShift0));
text_.PopOffset();
text_.AddLine(kTestString);
EXPECT_EQ(0, GetOffset());
EXPECT_TRUE(GetHistory().empty());
EXPECT_EQ(string(kTestString) + "\n" +
string(kShift0, ' ') + kTestString + "\n" +
string(kShift0 + kShift1, ' ') + kTestString + "\n" +
string(kShift0, ' ') + kTestString + "\n" +
string(kTestString) + "\n",
text_.GetContents());
}
TEST_F(IndentedTextTest, Reset) {
text_.PushOffset(10);
text_.AddLine("test");
EXPECT_NE("", text_.GetContents());
EXPECT_NE(0, GetOffset());
EXPECT_FALSE(GetHistory().empty());
text_.Reset();
EXPECT_EQ("", text_.GetContents());
EXPECT_EQ(0, GetOffset());
EXPECT_TRUE(GetHistory().empty());
}
TEST_F(IndentedTextTest, AddComments_Empty) {
text_.AddComments("");
EXPECT_EQ("", text_.GetContents());
}
TEST_F(IndentedTextTest, AddComments_WhitespaceOnly) {
text_.AddComments(" \n \t \n");
EXPECT_EQ("", text_.GetContents());
}
TEST_F(IndentedTextTest, AddComments_EmptyLines) {
string comment_block = R"(
line1
line2
)";
text_.AddComments(comment_block);
EXPECT_EQ("// line1\n"
"//\n"
"// line2\n", text_.GetContents());
}
TEST_F(IndentedTextTest, AddComments_Indentation) {
string comment_block = R"(
line1
- bullet1
line2
- bullet2
line3
)";
text_.AddComments(comment_block);
EXPECT_EQ("// line1\n"
"// - bullet1\n"
"// line2\n"
"// - bullet2\n"
"// line3\n", text_.GetContents());
}
} // namespace chromeos_dbus_bindings