blob: 052d8f2b4b3f669b5c705b7cf8a1d1046b3cab7f [file] [log] [blame]
csharptestafe844b2011-06-10 16:03:22 -05001using System;
2using System.IO;
3using Google.ProtocolBuffers.Serialization;
4using NUnit.Framework;
5using Google.ProtocolBuffers.TestProtos;
6
7namespace Google.ProtocolBuffers
8{
9 [TestFixture]
10 public class TestWriterFormatJson
11 {
12 protected string Content;
13 [System.Diagnostics.DebuggerNonUserCode]
14 protected void FormatterAssert<TMessage>(TMessage message, params string[] expecting) where TMessage : IMessageLite
15 {
16 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -050017 JsonFormatWriter.CreateInstance(sw).WriteMessage(message);
csharptestafe844b2011-06-10 16:03:22 -050018
19 Content = sw.ToString();
20
21 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
22 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
23
24 IMessageLite copy =
csharptest7fc785c2011-06-10 23:54:53 -050025 JsonFormatReader.CreateInstance(Content)
csharptestafe844b2011-06-10 16:03:22 -050026 .Merge(message.WeakCreateBuilderForType(), registry).WeakBuild();
27
28 Assert.AreEqual(typeof(TMessage), copy.GetType());
29 Assert.AreEqual(message, copy);
30 foreach (string expect in expecting)
31 Assert.IsTrue(Content.IndexOf(expect) >= 0, "Expected to find content '{0}' in: \r\n{1}", expect, Content);
32 }
33
34 [Test]
csharptestf2925232011-06-11 10:41:57 -050035 public void TestToJsonParseFromJson()
36 {
37 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
38 string json = msg.ToJson();
39 Assert.AreEqual("{\"default_bool\":true}", json);
40 TestAllTypes copy = TestAllTypes.ParseFromJson(json);
41 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
42 Assert.AreEqual(msg, copy);
43 }
44
45 [Test]
46 public void TestToJsonParseFromJsonReader()
47 {
48 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
49 string json = msg.ToJson();
50 Assert.AreEqual("{\"default_bool\":true}", json);
51 TestAllTypes copy = TestAllTypes.ParseFromJson(new StringReader(json));
52 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
53 Assert.AreEqual(msg, copy);
54 }
55
56 [Test]
csharptestafe844b2011-06-10 16:03:22 -050057 public void TestJsonFormatted()
58 {
59 TestXmlMessage message = TestXmlMessage.CreateBuilder()
60 .SetValid(true)
61 .SetNumber(0x1010)
62 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder())
63 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.ONE))
64 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.ONE).AddOptions(EnumOptions.TWO))
65 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().SetBinary(ByteString.CopyFromUtf8("abc")))
66 .Build();
67
68 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -050069 JsonFormatWriter.CreateInstance(sw).Formatted()
csharptestafe844b2011-06-10 16:03:22 -050070 .WriteMessage(message);
71
72 string json = sw.ToString();
73
csharptest7fc785c2011-06-10 23:54:53 -050074 TestXmlMessage copy = JsonFormatReader.CreateInstance(json)
csharptestafe844b2011-06-10 16:03:22 -050075 .Merge(TestXmlMessage.CreateBuilder()).Build();
76 Assert.AreEqual(message, copy);
77 }
78
79 [Test]
80 public void TestEmptyMessage()
81 {
82 FormatterAssert(
83 TestXmlChild.CreateBuilder()
84 .Build(),
85 @"{}"
86 );
87 }
88 [Test]
89 public void TestRepeatedField()
90 {
91 FormatterAssert(
92 TestXmlChild.CreateBuilder()
93 .AddOptions(EnumOptions.ONE)
94 .AddOptions(EnumOptions.TWO)
95 .Build(),
96 @"{""options"":[""ONE"",""TWO""]}"
97 );
98 }
99 [Test]
100 public void TestNestedEmptyMessage()
101 {
102 FormatterAssert(
103 TestXmlMessage.CreateBuilder()
104 .SetChild(TestXmlChild.CreateBuilder().Build())
105 .Build(),
106 @"{""child"":{}}"
107 );
108 }
109 [Test]
110 public void TestNestedMessage()
111 {
112 FormatterAssert(
113 TestXmlMessage.CreateBuilder()
114 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
115 .Build(),
116 @"{""child"":{""options"":[""TWO""]}}"
117 );
118 }
119 [Test]
120 public void TestBooleanTypes()
121 {
122 FormatterAssert(
123 TestXmlMessage.CreateBuilder()
124 .SetValid(true)
125 .Build(),
126 @"{""valid"":true}"
127 );
128 }
129 [Test]
130 public void TestFullMessage()
131 {
132 FormatterAssert(
133 TestXmlMessage.CreateBuilder()
134 .SetValid(true)
135 .SetText("text")
136 .AddTextlines("a")
137 .AddTextlines("b")
138 .AddTextlines("c")
139 .SetNumber(0x1010101010)
140 .AddNumbers(1)
141 .AddNumbers(2)
142 .AddNumbers(3)
143 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
144 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
145 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
146 .Build(),
147 @"""text"":""text""",
148 @"[""a"",""b"",""c""]",
149 @"[1,2,3]",
150 @"""child"":{",
151 @"""children"":[{",
152 @"AA==",
153 @"AAA=",
154 @"AAAA",
155 0x1010101010L.ToString()
156 );
157 }
158 [Test]
159 public void TestMessageWithXmlText()
160 {
161 FormatterAssert(
162 TestXmlMessage.CreateBuilder()
163 .SetText("<text></text>")
164 .Build(),
165 @"{""text"":""<text><\/text>""}"
166 );
167 }
168 [Test]
169 public void TestWithEscapeChars()
170 {
171 FormatterAssert(
172 TestXmlMessage.CreateBuilder()
173 .SetText(" \t <- \"leading space and trailing\" -> \\ \xef54 \x0000 \xFF \xFFFF \b \f \r \n \t ")
174 .Build(),
175 "{\"text\":\" \\t <- \\\"leading space and trailing\\\" -> \\\\ \\uef54 \\u0000 \\u00ff \\uffff \\b \\f \\r \\n \\t \"}"
176 );
177 }
178 [Test]
179 public void TestWithExtensionText()
180 {
181 FormatterAssert(
182 TestXmlMessage.CreateBuilder()
183 .SetValid(false)
184 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
185 .Build(),
186 @"{""valid"":false,""extension_text"":"" extension text value ! ""}"
187 );
188 }
189 [Test]
190 public void TestWithExtensionNumber()
191 {
192 FormatterAssert(
193 TestXmlMessage.CreateBuilder()
194 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
195 new TestXmlExtension.Builder().SetNumber(42).Build())
196 .Build(),
197 @"{""number"":42}"
198 );
199 }
200 [Test]
201 public void TestWithExtensionArray()
202 {
203 FormatterAssert(
204 TestXmlMessage.CreateBuilder()
205 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
206 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
207 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
208 .Build(),
209 @"{""extension_number"":[100,101,102]}"
210 );
211 }
212 [Test]
213 public void TestWithExtensionEnum()
214 {
215 FormatterAssert(
216 TestXmlMessage.CreateBuilder()
217 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
218 .Build(),
219 @"{""extension_enum"":""ONE""}"
220 );
221 }
222 [Test]
223 public void TestMessageWithExtensions()
224 {
225 FormatterAssert(
226 TestXmlMessage.CreateBuilder()
227 .SetValid(true)
228 .SetText("text")
229 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, "extension text")
230 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
231 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
232 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
233 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
234 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
235 .Build(),
236 @"""text"":""text""",
237 @"""valid"":true",
238 @"""extension_enum"":""ONE""",
239 @"""extension_text"":""extension text""",
240 @"""extension_number"":[100,101,102]",
241 @"""extension_message"":{""number"":42}"
242 );
243 }
244 [Test]
245 public void TestMessageMissingExtensions()
246 {
247 TestXmlMessage original = TestXmlMessage.CreateBuilder()
248 .SetValid(true)
249 .SetText("text")
250 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
251 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
252 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
253 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
254 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
255 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
256 .Build();
257
258 TestXmlMessage message = original.ToBuilder()
259 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText)
260 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage)
261 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber)
262 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum)
263 .Build();
264
csharptest7fc785c2011-06-10 23:54:53 -0500265 JsonFormatWriter writer = JsonFormatWriter.CreateInstance();
csharptestafe844b2011-06-10 16:03:22 -0500266 writer.WriteMessage(original);
267 Content = writer.ToString();
268
csharptest7fc785c2011-06-10 23:54:53 -0500269 IMessageLite copy = JsonFormatReader.CreateInstance(Content)
csharptestafe844b2011-06-10 16:03:22 -0500270 .Merge(message.CreateBuilderForType()).Build();
271
272 Assert.AreNotEqual(original, message);
273 Assert.AreNotEqual(original, copy);
274 Assert.AreEqual(message, copy);
275 }
276 [Test]
277 public void TestMergeFields()
278 {
279 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
csharptest7fc785c2011-06-10 23:54:53 -0500280 builder.MergeFrom(JsonFormatReader.CreateInstance("\"valid\": true"));
281 builder.MergeFrom(JsonFormatReader.CreateInstance("\"text\": \"text\", \"number\": \"411\""));
csharptestafe844b2011-06-10 16:03:22 -0500282 Assert.AreEqual(true, builder.Valid);
283 Assert.AreEqual("text", builder.Text);
284 Assert.AreEqual(411, builder.Number);
285 }
286 [Test]
287 public void TestMessageArray()
288 {
csharptest7fc785c2011-06-10 23:54:53 -0500289 JsonFormatWriter writer = JsonFormatWriter.CreateInstance().Formatted();
csharptestafe844b2011-06-10 16:03:22 -0500290 using (writer.StartArray())
291 {
292 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build());
293 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build());
294 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build());
295 }
296 string json = writer.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500297 JsonFormatReader reader = JsonFormatReader.CreateInstance(json);
csharptestafe844b2011-06-10 16:03:22 -0500298
299 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
300 int ordinal = 0;
301
302 foreach (JsonFormatReader r in reader.EnumerateArray())
303 {
304 r.Merge(builder);
305 Assert.AreEqual(++ordinal, builder.Number);
306 }
307 Assert.AreEqual(3, ordinal);
308 Assert.AreEqual(3, builder.TextlinesCount);
309 }
310 [Test]
311 public void TestNestedMessageArray()
312 {
csharptest7fc785c2011-06-10 23:54:53 -0500313 JsonFormatWriter writer = JsonFormatWriter.CreateInstance();
csharptestafe844b2011-06-10 16:03:22 -0500314 using (writer.StartArray())
315 {
316 using (writer.StartArray())
317 {
318 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build());
319 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build());
320 }
321 using (writer.StartArray())
322 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build());
323 }
324 string json = writer.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500325 JsonFormatReader reader = JsonFormatReader.CreateInstance(json);
csharptestafe844b2011-06-10 16:03:22 -0500326
327 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
328 int ordinal = 0;
329
330 foreach (JsonFormatReader r in reader.EnumerateArray())
331 foreach (JsonFormatReader r2 in r.EnumerateArray())
332 {
333 r2.Merge(builder);
334 Assert.AreEqual(++ordinal, builder.Number);
335 }
336 Assert.AreEqual(3, ordinal);
337 Assert.AreEqual(3, builder.TextlinesCount);
338 }
339 [Test, ExpectedException(typeof(FormatException))]
340 public void FailWithEmptyText()
341 {
csharptest7fc785c2011-06-10 23:54:53 -0500342 JsonFormatReader.CreateInstance("")
csharptestafe844b2011-06-10 16:03:22 -0500343 .Merge(TestXmlMessage.CreateBuilder());
344 }
345 [Test, ExpectedException(typeof(FormatException))]
346 public void FailWithUnexpectedValue()
347 {
csharptest7fc785c2011-06-10 23:54:53 -0500348 JsonFormatReader.CreateInstance("{{}}")
csharptestafe844b2011-06-10 16:03:22 -0500349 .Merge(TestXmlMessage.CreateBuilder());
350 }
351 [Test, ExpectedException(typeof(FormatException))]
352 public void FailWithUnQuotedName()
353 {
csharptest7fc785c2011-06-10 23:54:53 -0500354 JsonFormatReader.CreateInstance("{name:{}}")
csharptestafe844b2011-06-10 16:03:22 -0500355 .Merge(TestXmlMessage.CreateBuilder());
356 }
357 [Test, ExpectedException(typeof(FormatException))]
358 public void FailWithUnexpectedType()
359 {
csharptest7fc785c2011-06-10 23:54:53 -0500360 JsonFormatReader.CreateInstance("{\"valid\":{}}")
csharptestafe844b2011-06-10 16:03:22 -0500361 .Merge(TestXmlMessage.CreateBuilder());
362 }
363 }
364}