blob: 1a1a480d9de3d18bdf306844f481fc71e65f452d [file] [log] [blame]
csharptestafe844b2011-06-10 16:03:22 -05001using System;
2using System.IO;
csharptest3b70dd72011-06-11 12:22:17 -05003using System.Text;
csharptestafe844b2011-06-10 16:03:22 -05004using Google.ProtocolBuffers.Serialization;
5using NUnit.Framework;
6using Google.ProtocolBuffers.TestProtos;
7
8namespace Google.ProtocolBuffers
9{
10 [TestFixture]
11 public class TestWriterFormatJson
12 {
csharptestc2d2c1a2011-09-08 20:02:11 -050013 [Test]
14 public void Example_FromJson()
15 {
16 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
17
18 builder.MergeFromJson(@"{""valid"":true}");
19
20 TestXmlMessage message = builder.Build();
21 Assert.AreEqual(true, message.Valid);
22 }
23
24 [Test]
25 public void Example_ToJson()
26 {
27 TestXmlMessage message =
28 TestXmlMessage.CreateBuilder()
29 .SetValid(true)
30 .Build();
31
32 string json = message.ToJson();
33
34 Assert.AreEqual(@"{""valid"":true}", json);
35 }
36
37 [Test]
38 public void Example_WriteJsonUsingICodedOutputStream()
39 {
40 TestXmlMessage message =
41 TestXmlMessage.CreateBuilder()
42 .SetValid(true)
43 .Build();
44
45 using (TextWriter output = new StringWriter())
csharptestc2d2c1a2011-09-08 20:02:11 -050046 {
csharptest353b0fa2011-09-29 16:33:31 -050047 ICodedOutputStream writer = JsonFormatWriter.CreateInstance(output);
csharptest60fd7732011-09-09 12:18:16 -050048 writer.WriteMessageStart(); //manually begin the message, output is '{'
csharptestc2d2c1a2011-09-08 20:02:11 -050049
50 writer.Flush();
51 Assert.AreEqual("{", output.ToString());
52
53 ICodedOutputStream stream = writer;
54 message.WriteTo(stream); //write the message normally
55
56 writer.Flush();
57 Assert.AreEqual(@"{""valid"":true", output.ToString());
58
csharptest60fd7732011-09-09 12:18:16 -050059 writer.WriteMessageEnd(); //manually write the end message '}'
csharptestc2d2c1a2011-09-08 20:02:11 -050060 Assert.AreEqual(@"{""valid"":true}", output.ToString());
61 }
62 }
63
64 [Test]
65 public void Example_ReadJsonUsingICodedInputStream()
66 {
67 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
csharptest60fd7732011-09-09 12:18:16 -050068 ICodedInputStream reader = JsonFormatReader.CreateInstance(@"{""valid"":true}");
csharptestc2d2c1a2011-09-08 20:02:11 -050069
csharptest60fd7732011-09-09 12:18:16 -050070 reader.ReadMessageStart(); //manually read the begin the message '{'
csharptestc2d2c1a2011-09-08 20:02:11 -050071
csharptest60fd7732011-09-09 12:18:16 -050072 builder.MergeFrom(reader); //write the message normally
csharptestc2d2c1a2011-09-08 20:02:11 -050073
csharptest60fd7732011-09-09 12:18:16 -050074 reader.ReadMessageEnd(); //manually read the end message '}'
csharptestc2d2c1a2011-09-08 20:02:11 -050075 }
76
csharptestafe844b2011-06-10 16:03:22 -050077 protected string Content;
78 [System.Diagnostics.DebuggerNonUserCode]
79 protected void FormatterAssert<TMessage>(TMessage message, params string[] expecting) where TMessage : IMessageLite
80 {
81 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -050082 JsonFormatWriter.CreateInstance(sw).WriteMessage(message);
csharptestafe844b2011-06-10 16:03:22 -050083
84 Content = sw.ToString();
85
86 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
87 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
88
89 IMessageLite copy =
csharptest7fc785c2011-06-10 23:54:53 -050090 JsonFormatReader.CreateInstance(Content)
csharptestafe844b2011-06-10 16:03:22 -050091 .Merge(message.WeakCreateBuilderForType(), registry).WeakBuild();
92
93 Assert.AreEqual(typeof(TMessage), copy.GetType());
94 Assert.AreEqual(message, copy);
95 foreach (string expect in expecting)
96 Assert.IsTrue(Content.IndexOf(expect) >= 0, "Expected to find content '{0}' in: \r\n{1}", expect, Content);
97 }
98
99 [Test]
csharptestf2925232011-06-11 10:41:57 -0500100 public void TestToJsonParseFromJson()
101 {
102 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
103 string json = msg.ToJson();
104 Assert.AreEqual("{\"default_bool\":true}", json);
csharptest0f3540e2011-08-05 20:40:14 -0500105 TestAllTypes copy = new TestAllTypes.Builder().MergeFromJson(json).Build();
csharptestf2925232011-06-11 10:41:57 -0500106 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
107 Assert.AreEqual(msg, copy);
108 }
109
110 [Test]
111 public void TestToJsonParseFromJsonReader()
112 {
113 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
114 string json = msg.ToJson();
115 Assert.AreEqual("{\"default_bool\":true}", json);
csharptest0f3540e2011-08-05 20:40:14 -0500116 TestAllTypes copy = new TestAllTypes.Builder().MergeFromJson(new StringReader(json)).Build();
csharptestf2925232011-06-11 10:41:57 -0500117 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
118 Assert.AreEqual(msg, copy);
119 }
120
121 [Test]
csharptestafe844b2011-06-10 16:03:22 -0500122 public void TestJsonFormatted()
123 {
124 TestXmlMessage message = TestXmlMessage.CreateBuilder()
125 .SetValid(true)
126 .SetNumber(0x1010)
127 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder())
128 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.ONE))
129 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.ONE).AddOptions(EnumOptions.TWO))
130 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().SetBinary(ByteString.CopyFromUtf8("abc")))
131 .Build();
132
133 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500134 JsonFormatWriter.CreateInstance(sw).Formatted()
csharptestafe844b2011-06-10 16:03:22 -0500135 .WriteMessage(message);
136
137 string json = sw.ToString();
138
csharptest7fc785c2011-06-10 23:54:53 -0500139 TestXmlMessage copy = JsonFormatReader.CreateInstance(json)
csharptestafe844b2011-06-10 16:03:22 -0500140 .Merge(TestXmlMessage.CreateBuilder()).Build();
141 Assert.AreEqual(message, copy);
142 }
143
144 [Test]
145 public void TestEmptyMessage()
146 {
147 FormatterAssert(
148 TestXmlChild.CreateBuilder()
149 .Build(),
150 @"{}"
151 );
152 }
153 [Test]
154 public void TestRepeatedField()
155 {
156 FormatterAssert(
157 TestXmlChild.CreateBuilder()
158 .AddOptions(EnumOptions.ONE)
159 .AddOptions(EnumOptions.TWO)
160 .Build(),
161 @"{""options"":[""ONE"",""TWO""]}"
162 );
163 }
164 [Test]
165 public void TestNestedEmptyMessage()
166 {
167 FormatterAssert(
168 TestXmlMessage.CreateBuilder()
169 .SetChild(TestXmlChild.CreateBuilder().Build())
170 .Build(),
171 @"{""child"":{}}"
172 );
173 }
174 [Test]
175 public void TestNestedMessage()
176 {
177 FormatterAssert(
178 TestXmlMessage.CreateBuilder()
179 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
180 .Build(),
181 @"{""child"":{""options"":[""TWO""]}}"
182 );
183 }
184 [Test]
185 public void TestBooleanTypes()
186 {
187 FormatterAssert(
188 TestXmlMessage.CreateBuilder()
189 .SetValid(true)
190 .Build(),
191 @"{""valid"":true}"
192 );
193 }
194 [Test]
195 public void TestFullMessage()
196 {
197 FormatterAssert(
198 TestXmlMessage.CreateBuilder()
199 .SetValid(true)
200 .SetText("text")
201 .AddTextlines("a")
202 .AddTextlines("b")
203 .AddTextlines("c")
204 .SetNumber(0x1010101010)
205 .AddNumbers(1)
206 .AddNumbers(2)
207 .AddNumbers(3)
208 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
209 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
210 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
211 .Build(),
212 @"""text"":""text""",
213 @"[""a"",""b"",""c""]",
214 @"[1,2,3]",
215 @"""child"":{",
216 @"""children"":[{",
217 @"AA==",
218 @"AAA=",
219 @"AAAA",
220 0x1010101010L.ToString()
221 );
222 }
223 [Test]
224 public void TestMessageWithXmlText()
225 {
226 FormatterAssert(
227 TestXmlMessage.CreateBuilder()
228 .SetText("<text></text>")
229 .Build(),
230 @"{""text"":""<text><\/text>""}"
231 );
232 }
233 [Test]
234 public void TestWithEscapeChars()
235 {
236 FormatterAssert(
237 TestXmlMessage.CreateBuilder()
238 .SetText(" \t <- \"leading space and trailing\" -> \\ \xef54 \x0000 \xFF \xFFFF \b \f \r \n \t ")
239 .Build(),
240 "{\"text\":\" \\t <- \\\"leading space and trailing\\\" -> \\\\ \\uef54 \\u0000 \\u00ff \\uffff \\b \\f \\r \\n \\t \"}"
241 );
242 }
243 [Test]
244 public void TestWithExtensionText()
245 {
246 FormatterAssert(
247 TestXmlMessage.CreateBuilder()
248 .SetValid(false)
249 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
250 .Build(),
251 @"{""valid"":false,""extension_text"":"" extension text value ! ""}"
252 );
253 }
254 [Test]
255 public void TestWithExtensionNumber()
256 {
257 FormatterAssert(
258 TestXmlMessage.CreateBuilder()
259 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
260 new TestXmlExtension.Builder().SetNumber(42).Build())
261 .Build(),
262 @"{""number"":42}"
263 );
264 }
265 [Test]
266 public void TestWithExtensionArray()
267 {
268 FormatterAssert(
269 TestXmlMessage.CreateBuilder()
270 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
271 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
272 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
273 .Build(),
274 @"{""extension_number"":[100,101,102]}"
275 );
276 }
277 [Test]
278 public void TestWithExtensionEnum()
279 {
280 FormatterAssert(
281 TestXmlMessage.CreateBuilder()
282 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
283 .Build(),
284 @"{""extension_enum"":""ONE""}"
285 );
286 }
287 [Test]
288 public void TestMessageWithExtensions()
289 {
290 FormatterAssert(
291 TestXmlMessage.CreateBuilder()
292 .SetValid(true)
293 .SetText("text")
294 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, "extension text")
295 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
296 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
297 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
298 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
299 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
300 .Build(),
301 @"""text"":""text""",
302 @"""valid"":true",
303 @"""extension_enum"":""ONE""",
304 @"""extension_text"":""extension text""",
305 @"""extension_number"":[100,101,102]",
306 @"""extension_message"":{""number"":42}"
307 );
308 }
309 [Test]
310 public void TestMessageMissingExtensions()
311 {
312 TestXmlMessage original = TestXmlMessage.CreateBuilder()
313 .SetValid(true)
314 .SetText("text")
315 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
316 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
317 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
318 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
319 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
320 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
321 .Build();
322
323 TestXmlMessage message = original.ToBuilder()
324 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText)
325 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage)
326 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber)
327 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum)
328 .Build();
329
csharptest7fc785c2011-06-10 23:54:53 -0500330 JsonFormatWriter writer = JsonFormatWriter.CreateInstance();
csharptestafe844b2011-06-10 16:03:22 -0500331 writer.WriteMessage(original);
332 Content = writer.ToString();
333
csharptest7fc785c2011-06-10 23:54:53 -0500334 IMessageLite copy = JsonFormatReader.CreateInstance(Content)
csharptestafe844b2011-06-10 16:03:22 -0500335 .Merge(message.CreateBuilderForType()).Build();
336
337 Assert.AreNotEqual(original, message);
338 Assert.AreNotEqual(original, copy);
339 Assert.AreEqual(message, copy);
340 }
341 [Test]
342 public void TestMergeFields()
343 {
344 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
csharptest7fc785c2011-06-10 23:54:53 -0500345 builder.MergeFrom(JsonFormatReader.CreateInstance("\"valid\": true"));
346 builder.MergeFrom(JsonFormatReader.CreateInstance("\"text\": \"text\", \"number\": \"411\""));
csharptestafe844b2011-06-10 16:03:22 -0500347 Assert.AreEqual(true, builder.Valid);
348 Assert.AreEqual("text", builder.Text);
349 Assert.AreEqual(411, builder.Number);
350 }
351 [Test]
352 public void TestMessageArray()
353 {
csharptest7fc785c2011-06-10 23:54:53 -0500354 JsonFormatWriter writer = JsonFormatWriter.CreateInstance().Formatted();
csharptestafe844b2011-06-10 16:03:22 -0500355 using (writer.StartArray())
356 {
357 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build());
358 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build());
359 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build());
360 }
361 string json = writer.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500362 JsonFormatReader reader = JsonFormatReader.CreateInstance(json);
csharptestafe844b2011-06-10 16:03:22 -0500363
364 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
365 int ordinal = 0;
366
367 foreach (JsonFormatReader r in reader.EnumerateArray())
368 {
369 r.Merge(builder);
370 Assert.AreEqual(++ordinal, builder.Number);
371 }
372 Assert.AreEqual(3, ordinal);
373 Assert.AreEqual(3, builder.TextlinesCount);
374 }
375 [Test]
376 public void TestNestedMessageArray()
377 {
csharptest7fc785c2011-06-10 23:54:53 -0500378 JsonFormatWriter writer = JsonFormatWriter.CreateInstance();
csharptestafe844b2011-06-10 16:03:22 -0500379 using (writer.StartArray())
380 {
381 using (writer.StartArray())
382 {
383 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build());
384 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build());
385 }
386 using (writer.StartArray())
387 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build());
388 }
389 string json = writer.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500390 JsonFormatReader reader = JsonFormatReader.CreateInstance(json);
csharptestafe844b2011-06-10 16:03:22 -0500391
392 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
393 int ordinal = 0;
394
395 foreach (JsonFormatReader r in reader.EnumerateArray())
396 foreach (JsonFormatReader r2 in r.EnumerateArray())
397 {
398 r2.Merge(builder);
399 Assert.AreEqual(++ordinal, builder.Number);
400 }
401 Assert.AreEqual(3, ordinal);
402 Assert.AreEqual(3, builder.TextlinesCount);
403 }
csharptest60fd7732011-09-09 12:18:16 -0500404 [Test]
405 public void TestReadWriteJsonWithoutRoot()
406 {
407 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
408 TestXmlMessage message = builder.SetText("abc").SetNumber(123).Build();
409
410 string Json;
411 using (StringWriter sw = new StringWriter())
412 {
413 ICodedOutputStream output = JsonFormatWriter.CreateInstance(sw);
414
415 message.WriteTo(output);
416 output.Flush();
417 Json = sw.ToString();
418 }
419 Assert.AreEqual(@"""text"":""abc"",""number"":123", Json);
420
421 ICodedInputStream input = JsonFormatReader.CreateInstance(Json);
422 TestXmlMessage copy = TestXmlMessage.CreateBuilder().MergeFrom(input).Build();
423
424 Assert.AreEqual(message, copy);
425 }
csharptest0f3540e2011-08-05 20:40:14 -0500426 [Test,ExpectedException(typeof(RecursionLimitExceededException))]
csharptest3b70dd72011-06-11 12:22:17 -0500427 public void TestRecursiveLimit()
428 {
429 StringBuilder sb = new StringBuilder(8192);
430 for (int i = 0; i < 80; i++)
431 sb.Append("{\"child\":");
csharptest0f3540e2011-08-05 20:40:14 -0500432 TestXmlRescursive msg = new TestXmlRescursive.Builder().MergeFromJson(sb.ToString()).Build();
csharptest3b70dd72011-06-11 12:22:17 -0500433 }
csharptestafe844b2011-06-10 16:03:22 -0500434 [Test, ExpectedException(typeof(FormatException))]
435 public void FailWithEmptyText()
436 {
csharptest7fc785c2011-06-10 23:54:53 -0500437 JsonFormatReader.CreateInstance("")
csharptestafe844b2011-06-10 16:03:22 -0500438 .Merge(TestXmlMessage.CreateBuilder());
439 }
440 [Test, ExpectedException(typeof(FormatException))]
441 public void FailWithUnexpectedValue()
442 {
csharptest7fc785c2011-06-10 23:54:53 -0500443 JsonFormatReader.CreateInstance("{{}}")
csharptestafe844b2011-06-10 16:03:22 -0500444 .Merge(TestXmlMessage.CreateBuilder());
445 }
446 [Test, ExpectedException(typeof(FormatException))]
447 public void FailWithUnQuotedName()
448 {
csharptest7fc785c2011-06-10 23:54:53 -0500449 JsonFormatReader.CreateInstance("{name:{}}")
csharptestafe844b2011-06-10 16:03:22 -0500450 .Merge(TestXmlMessage.CreateBuilder());
451 }
452 [Test, ExpectedException(typeof(FormatException))]
453 public void FailWithUnexpectedType()
454 {
csharptest7fc785c2011-06-10 23:54:53 -0500455 JsonFormatReader.CreateInstance("{\"valid\":{}}")
csharptestafe844b2011-06-10 16:03:22 -0500456 .Merge(TestXmlMessage.CreateBuilder());
457 }
458 }
459}