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