blob: 1c95d8419bddac9434c553eaf8a0dc08e30aecf7 [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();
17 new JsonFormatWriter(sw).WriteMessage(message);
18
19 Content = sw.ToString();
20
21 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
22 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
23
24 IMessageLite copy =
25 new JsonFormatReader(Content)
26 .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]
35 public void TestJsonFormatted()
36 {
37 TestXmlMessage message = TestXmlMessage.CreateBuilder()
38 .SetValid(true)
39 .SetNumber(0x1010)
40 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder())
41 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.ONE))
42 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.ONE).AddOptions(EnumOptions.TWO))
43 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().SetBinary(ByteString.CopyFromUtf8("abc")))
44 .Build();
45
46 StringWriter sw = new StringWriter();
47 new JsonFormatWriter(sw).Formatted()
48 .WriteMessage(message);
49
50 string json = sw.ToString();
51
52 TestXmlMessage copy = new JsonFormatReader(json)
53 .Merge(TestXmlMessage.CreateBuilder()).Build();
54 Assert.AreEqual(message, copy);
55 }
56
57 [Test]
58 public void TestEmptyMessage()
59 {
60 FormatterAssert(
61 TestXmlChild.CreateBuilder()
62 .Build(),
63 @"{}"
64 );
65 }
66 [Test]
67 public void TestRepeatedField()
68 {
69 FormatterAssert(
70 TestXmlChild.CreateBuilder()
71 .AddOptions(EnumOptions.ONE)
72 .AddOptions(EnumOptions.TWO)
73 .Build(),
74 @"{""options"":[""ONE"",""TWO""]}"
75 );
76 }
77 [Test]
78 public void TestNestedEmptyMessage()
79 {
80 FormatterAssert(
81 TestXmlMessage.CreateBuilder()
82 .SetChild(TestXmlChild.CreateBuilder().Build())
83 .Build(),
84 @"{""child"":{}}"
85 );
86 }
87 [Test]
88 public void TestNestedMessage()
89 {
90 FormatterAssert(
91 TestXmlMessage.CreateBuilder()
92 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
93 .Build(),
94 @"{""child"":{""options"":[""TWO""]}}"
95 );
96 }
97 [Test]
98 public void TestBooleanTypes()
99 {
100 FormatterAssert(
101 TestXmlMessage.CreateBuilder()
102 .SetValid(true)
103 .Build(),
104 @"{""valid"":true}"
105 );
106 }
107 [Test]
108 public void TestFullMessage()
109 {
110 FormatterAssert(
111 TestXmlMessage.CreateBuilder()
112 .SetValid(true)
113 .SetText("text")
114 .AddTextlines("a")
115 .AddTextlines("b")
116 .AddTextlines("c")
117 .SetNumber(0x1010101010)
118 .AddNumbers(1)
119 .AddNumbers(2)
120 .AddNumbers(3)
121 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
122 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
123 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
124 .Build(),
125 @"""text"":""text""",
126 @"[""a"",""b"",""c""]",
127 @"[1,2,3]",
128 @"""child"":{",
129 @"""children"":[{",
130 @"AA==",
131 @"AAA=",
132 @"AAAA",
133 0x1010101010L.ToString()
134 );
135 }
136 [Test]
137 public void TestMessageWithXmlText()
138 {
139 FormatterAssert(
140 TestXmlMessage.CreateBuilder()
141 .SetText("<text></text>")
142 .Build(),
143 @"{""text"":""<text><\/text>""}"
144 );
145 }
146 [Test]
147 public void TestWithEscapeChars()
148 {
149 FormatterAssert(
150 TestXmlMessage.CreateBuilder()
151 .SetText(" \t <- \"leading space and trailing\" -> \\ \xef54 \x0000 \xFF \xFFFF \b \f \r \n \t ")
152 .Build(),
153 "{\"text\":\" \\t <- \\\"leading space and trailing\\\" -> \\\\ \\uef54 \\u0000 \\u00ff \\uffff \\b \\f \\r \\n \\t \"}"
154 );
155 }
156 [Test]
157 public void TestWithExtensionText()
158 {
159 FormatterAssert(
160 TestXmlMessage.CreateBuilder()
161 .SetValid(false)
162 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
163 .Build(),
164 @"{""valid"":false,""extension_text"":"" extension text value ! ""}"
165 );
166 }
167 [Test]
168 public void TestWithExtensionNumber()
169 {
170 FormatterAssert(
171 TestXmlMessage.CreateBuilder()
172 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
173 new TestXmlExtension.Builder().SetNumber(42).Build())
174 .Build(),
175 @"{""number"":42}"
176 );
177 }
178 [Test]
179 public void TestWithExtensionArray()
180 {
181 FormatterAssert(
182 TestXmlMessage.CreateBuilder()
183 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
184 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
185 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
186 .Build(),
187 @"{""extension_number"":[100,101,102]}"
188 );
189 }
190 [Test]
191 public void TestWithExtensionEnum()
192 {
193 FormatterAssert(
194 TestXmlMessage.CreateBuilder()
195 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
196 .Build(),
197 @"{""extension_enum"":""ONE""}"
198 );
199 }
200 [Test]
201 public void TestMessageWithExtensions()
202 {
203 FormatterAssert(
204 TestXmlMessage.CreateBuilder()
205 .SetValid(true)
206 .SetText("text")
207 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, "extension text")
208 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
209 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
210 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
211 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
212 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
213 .Build(),
214 @"""text"":""text""",
215 @"""valid"":true",
216 @"""extension_enum"":""ONE""",
217 @"""extension_text"":""extension text""",
218 @"""extension_number"":[100,101,102]",
219 @"""extension_message"":{""number"":42}"
220 );
221 }
222 [Test]
223 public void TestMessageMissingExtensions()
224 {
225 TestXmlMessage original = TestXmlMessage.CreateBuilder()
226 .SetValid(true)
227 .SetText("text")
228 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
229 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
230 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
231 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
232 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
233 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
234 .Build();
235
236 TestXmlMessage message = original.ToBuilder()
237 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText)
238 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage)
239 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber)
240 .ClearExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum)
241 .Build();
242
243 JsonFormatWriter writer = new JsonFormatWriter();
244 writer.WriteMessage(original);
245 Content = writer.ToString();
246
247 IMessageLite copy = new JsonFormatReader(Content)
248 .Merge(message.CreateBuilderForType()).Build();
249
250 Assert.AreNotEqual(original, message);
251 Assert.AreNotEqual(original, copy);
252 Assert.AreEqual(message, copy);
253 }
254 [Test]
255 public void TestMergeFields()
256 {
257 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
258 builder.MergeFrom(new JsonFormatReader("\"valid\": true"));
259 builder.MergeFrom(new JsonFormatReader("\"text\": \"text\", \"number\": \"411\""));
260 Assert.AreEqual(true, builder.Valid);
261 Assert.AreEqual("text", builder.Text);
262 Assert.AreEqual(411, builder.Number);
263 }
264 [Test]
265 public void TestMessageArray()
266 {
267 JsonFormatWriter writer = new JsonFormatWriter().Formatted();
268 using (writer.StartArray())
269 {
270 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build());
271 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build());
272 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build());
273 }
274 string json = writer.ToString();
275 JsonFormatReader reader = new JsonFormatReader(json);
276
277 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
278 int ordinal = 0;
279
280 foreach (JsonFormatReader r in reader.EnumerateArray())
281 {
282 r.Merge(builder);
283 Assert.AreEqual(++ordinal, builder.Number);
284 }
285 Assert.AreEqual(3, ordinal);
286 Assert.AreEqual(3, builder.TextlinesCount);
287 }
288 [Test]
289 public void TestNestedMessageArray()
290 {
291 JsonFormatWriter writer = new JsonFormatWriter();
292 using (writer.StartArray())
293 {
294 using (writer.StartArray())
295 {
296 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(1).AddTextlines("a").Build());
297 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(2).AddTextlines("b").Build());
298 }
299 using (writer.StartArray())
300 writer.WriteMessage(TestXmlMessage.CreateBuilder().SetNumber(3).AddTextlines("c").Build());
301 }
302 string json = writer.ToString();
303 JsonFormatReader reader = new JsonFormatReader(json);
304
305 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
306 int ordinal = 0;
307
308 foreach (JsonFormatReader r in reader.EnumerateArray())
309 foreach (JsonFormatReader r2 in r.EnumerateArray())
310 {
311 r2.Merge(builder);
312 Assert.AreEqual(++ordinal, builder.Number);
313 }
314 Assert.AreEqual(3, ordinal);
315 Assert.AreEqual(3, builder.TextlinesCount);
316 }
317 [Test, ExpectedException(typeof(FormatException))]
318 public void FailWithEmptyText()
319 {
320 new JsonFormatReader("")
321 .Merge(TestXmlMessage.CreateBuilder());
322 }
323 [Test, ExpectedException(typeof(FormatException))]
324 public void FailWithUnexpectedValue()
325 {
326 new JsonFormatReader("{{}}")
327 .Merge(TestXmlMessage.CreateBuilder());
328 }
329 [Test, ExpectedException(typeof(FormatException))]
330 public void FailWithUnQuotedName()
331 {
332 new JsonFormatReader("{name:{}}")
333 .Merge(TestXmlMessage.CreateBuilder());
334 }
335 [Test, ExpectedException(typeof(FormatException))]
336 public void FailWithUnexpectedType()
337 {
338 new JsonFormatReader("{\"valid\":{}}")
339 .Merge(TestXmlMessage.CreateBuilder());
340 }
341 }
342}