1// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chromeos-dbus-bindings/indented_text.h"
6
7#include <string>
8#include <vector>
9
10#include <gmock/gmock.h>
11#include <gtest/gtest.h>
12
13using std::string;
14using std::vector;
15using testing::ElementsAre;
16using testing::Test;
17
18namespace chromeos_dbus_bindings {
19
20class IndentedTextTest : public Test {
21 protected:
22  size_t GetOffset() const { return text_.offset_; }
23  const vector<size_t>& GetHistory() const { return text_.offset_history_; }
24  IndentedText text_;
25};
26
27TEST_F(IndentedTextTest, Constructor) {
28  EXPECT_EQ("", text_.GetContents());
29  EXPECT_EQ(0u, GetOffset());
30  EXPECT_TRUE(GetHistory().empty());
31}
32
33TEST_F(IndentedTextTest, AddLine) {
34  const char kTestString0[] = "test";
35  text_.AddLine(kTestString0);
36  EXPECT_EQ(string(kTestString0) + "\n", text_.GetContents());
37  EXPECT_EQ(0u, GetOffset());
38  EXPECT_TRUE(GetHistory().empty());
39
40  const char kTestString1[] = "me";
41  text_.AddLine(kTestString1);
42  EXPECT_EQ(string(kTestString0) + "\n" + kTestString1 + "\n",
43            text_.GetContents());
44  EXPECT_EQ(0u, GetOffset());
45  EXPECT_TRUE(GetHistory().empty());
46}
47
48TEST_F(IndentedTextTest, AddLineWithOffset) {
49  const char kTestString[] = "test";
50  const int kShift = 4;
51  text_.AddLineWithOffset(kTestString, kShift);
52  EXPECT_EQ(string(kShift, ' ') + kTestString + "\n", text_.GetContents());
53}
54
55TEST_F(IndentedTextTest, AddLineAndPushOffsetTo) {
56  text_.AddLineAndPushOffsetTo("foo(bar(baz", 2, '(');
57  EXPECT_THAT(GetHistory(), ElementsAre(8));
58}
59
60TEST_F(IndentedTextTest, AddBlock) {
61  IndentedText block0;
62  const char kTestString[] = "test";
63  block0.AddLineWithOffset(kTestString, 10);
64  block0.AddLineWithOffset(kTestString, 20);
65  IndentedText block1;
66  block1.AddLineWithOffset(kTestString, 5);
67  block1.AddLineWithOffset(kTestString, 15);
68  text_.AddBlock(block0);
69  text_.AddBlock(block1);
70  EXPECT_EQ(block0.GetContents() + block1.GetContents(), text_.GetContents());
71}
72
73TEST_F(IndentedTextTest, AddBlockWithOffset) {
74  const char kTestString[] = "test";
75  IndentedText block;
76  const size_t kOffset0 = 0;
77  block.AddLineWithOffset(kTestString, kOffset0);
78  const size_t kOffset1 = 4;
79  block.AddLineWithOffset(kTestString, kOffset1);
80  const size_t kOffset2 = 20;
81  text_.AddBlockWithOffset(block, kOffset2);
82  EXPECT_EQ(string(kOffset2 + kOffset0, ' ') + kTestString + "\n" +
83            string(kOffset2 + kOffset1, ' ') + kTestString + "\n",
84            text_.GetContents());
85}
86
87TEST_F(IndentedTextTest, PushPop) {
88  const char kTestString[] = "test";
89  text_.AddLine(kTestString);
90
91  const size_t kShift0 = 2;
92  text_.PushOffset(kShift0);
93  EXPECT_EQ(2u, GetOffset());
94  EXPECT_THAT(GetHistory(), ElementsAre(kShift0));
95  text_.AddLine(kTestString);
96
97  const size_t kShift1 = 4;
98  text_.PushOffset(kShift1);
99  EXPECT_EQ(kShift0 + kShift1, GetOffset());
100  EXPECT_THAT(GetHistory(), ElementsAre(kShift0, kShift1));
101  text_.AddLine(kTestString);
102
103  text_.PopOffset();
104  text_.AddLine(kTestString);
105  EXPECT_EQ(2u, GetOffset());
106  EXPECT_THAT(GetHistory(), ElementsAre(kShift0));
107
108  text_.PopOffset();
109  text_.AddLine(kTestString);
110  EXPECT_EQ(0u, GetOffset());
111  EXPECT_TRUE(GetHistory().empty());
112
113  EXPECT_EQ(string(kTestString) + "\n" +
114            string(kShift0, ' ') + kTestString + "\n" +
115            string(kShift0 + kShift1, ' ') + kTestString + "\n" +
116            string(kShift0, ' ') + kTestString + "\n" +
117            string(kTestString) + "\n",
118            text_.GetContents());
119}
120
121TEST_F(IndentedTextTest, Reset) {
122  text_.PushOffset(10);
123  text_.AddLine("test");
124  EXPECT_NE("", text_.GetContents());
125  EXPECT_NE(0u, GetOffset());
126  EXPECT_FALSE(GetHistory().empty());
127  text_.Reset();
128  EXPECT_EQ("", text_.GetContents());
129  EXPECT_EQ(0u, GetOffset());
130  EXPECT_TRUE(GetHistory().empty());
131}
132
133TEST_F(IndentedTextTest, AddComments_Empty) {
134  text_.AddComments("");
135  EXPECT_EQ("", text_.GetContents());
136}
137
138TEST_F(IndentedTextTest, AddComments_WhitespaceOnly) {
139  text_.AddComments("  \n \t  \n");
140  EXPECT_EQ("", text_.GetContents());
141}
142
143TEST_F(IndentedTextTest, AddComments_EmptyLines) {
144  string comment_block = R"(
145
146    line1
147
148    line2
149
150
151  )";
152  text_.AddComments(comment_block);
153  EXPECT_EQ("// line1\n"
154            "//\n"
155            "// line2\n", text_.GetContents());
156}
157
158TEST_F(IndentedTextTest, AddComments_Indentation) {
159  string comment_block = R"(
160    line1
161      - bullet1
162        line2
163      - bullet2
164  line3
165  )";
166  text_.AddComments(comment_block);
167  EXPECT_EQ("// line1\n"
168            "//   - bullet1\n"
169            "//     line2\n"
170            "//   - bullet2\n"
171            "// line3\n", text_.GetContents());
172}
173
174TEST_F(IndentedTextTest, GetLines) {
175  text_.AddLine("no indent");
176  text_.PushOffset(2);
177  text_.AddLine("2 spaces");
178  text_.AddLine("");
179
180  EXPECT_EQ((vector<string>{"no indent", "  2 spaces", ""}), text_.GetLines());
181}
182
183}  // namespace chromeos_dbus_bindings
184