1// Copyright 2009 Google Inc.
2// Author: James deBoer
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16// Unit tests for the class JSONCodeTableWriter, found in jsonwriter.h.
17
18#include <config.h>
19#include "jsonwriter.h"
20#include "testing.h"
21#include "vcdiff_defs.h"
22#include "google/output_string.h"
23
24namespace open_vcdiff {
25namespace {
26
27class JSONWriterTest : public testing::Test {
28 protected:
29  typedef std::string string;
30
31  JSONWriterTest()
32      : output_string_(&out_) {
33    EXPECT_TRUE(coder_.Init(0));
34    coder_.WriteHeader(&output_string_, 0);
35  }
36
37  virtual ~JSONWriterTest() { }
38
39  string out_;
40  OutputString<string> output_string_;
41  JSONCodeTableWriter coder_;
42};
43
44TEST_F(JSONWriterTest, Null) {
45  EXPECT_EQ(0U, coder_.target_length());
46  coder_.FinishEncoding(&output_string_);
47  EXPECT_EQ("", out_);
48  EXPECT_EQ(0U, coder_.target_length());
49}
50
51TEST_F(JSONWriterTest, Empty) {
52  EXPECT_EQ(0U, coder_.target_length());
53  coder_.Output(&output_string_);
54  coder_.FinishEncoding(&output_string_);
55  EXPECT_EQ("[]", out_);
56  EXPECT_EQ(0U, coder_.target_length());
57}
58
59TEST_F(JSONWriterTest, Add) {
60  coder_.Add("123", 3);
61  EXPECT_EQ(3U, coder_.target_length());
62  coder_.Output(&output_string_);
63  EXPECT_EQ(0U, coder_.target_length());
64  coder_.FinishEncoding(&output_string_);
65  EXPECT_EQ("[\"123\",]", out_);
66}
67
68TEST_F(JSONWriterTest, Copy) {
69  coder_.Copy(3, 5);
70  EXPECT_EQ(5U, coder_.target_length());
71  coder_.Output(&output_string_);
72  EXPECT_EQ(0U, coder_.target_length());
73  coder_.FinishEncoding(&output_string_);
74  EXPECT_EQ("[3,5,]", out_);
75}
76
77TEST_F(JSONWriterTest, Run) {
78  coder_.Run(3, 'a');
79  EXPECT_EQ(3U, coder_.target_length());
80  coder_.Output(&output_string_);
81  EXPECT_EQ(0U, coder_.target_length());
82  coder_.FinishEncoding(&output_string_);
83  EXPECT_EQ("[\"aaa\",]", out_);
84}
85
86TEST_F(JSONWriterTest, AddEscaped) {
87  coder_.Add("\n\b\r", 3);
88  EXPECT_EQ(3U, coder_.target_length());
89  coder_.Output(&output_string_);
90  EXPECT_EQ(0U, coder_.target_length());
91  coder_.FinishEncoding(&output_string_);
92  EXPECT_EQ("[\"\\n\\b\\r\",]", out_);
93}
94
95TEST_F(JSONWriterTest, AddCopyAdd) {
96  coder_.Add("abc", 3);
97  coder_.Copy(3, 5);
98  coder_.Add("defghij", 7);
99  EXPECT_EQ(15U, coder_.target_length());
100  coder_.Output(&output_string_);
101  EXPECT_EQ(0U, coder_.target_length());
102  coder_.FinishEncoding(&output_string_);
103  EXPECT_EQ("[\"abc\",3,5,\"defghij\",]", out_);
104}
105
106TEST_F(JSONWriterTest, AddOutputAddOutputToSameString) {
107  coder_.Add("abc", 3);
108  EXPECT_EQ(3U, coder_.target_length());
109  coder_.Output(&output_string_);
110  EXPECT_EQ(0U, coder_.target_length());
111  EXPECT_EQ("[\"abc\",", out_);
112  coder_.Add("def", 3);
113  EXPECT_EQ(3U, coder_.target_length());
114  coder_.Output(&output_string_);
115  EXPECT_EQ(0U, coder_.target_length());
116  coder_.FinishEncoding(&output_string_);
117  EXPECT_EQ("[\"abc\",\"def\",]", out_);
118}
119
120TEST_F(JSONWriterTest, AddOutputAddOutputToDifferentString) {
121  coder_.Add("abc", 3);
122  EXPECT_EQ(3U, coder_.target_length());
123  coder_.Output(&output_string_);
124  EXPECT_EQ(0U, coder_.target_length());
125  coder_.FinishEncoding(&output_string_);
126  EXPECT_EQ("[\"abc\",]", out_);
127  string out2;
128  OutputString<string> output_string2(&out2);
129  coder_.Init(0);
130  coder_.Add("def", 3);
131  EXPECT_EQ(3U, coder_.target_length());
132  coder_.Output(&output_string2);
133  EXPECT_EQ(0U, coder_.target_length());
134  coder_.FinishEncoding(&output_string2);
135  EXPECT_EQ("[\"def\",]", out2);
136}
137
138}  // unnamed namespace
139}  // namespace open_vcdiff
140