Mercurial > pub > ImplabNet
comparison Implab.Format.Test/JsonTests.cs @ 227:8d5de4eb9c2c v2
Reimplemented JsonXmlReader, added support for null values: JSON null values are
mapped to empty nodes with 'xsi:nil' attribute set to 'true'
| author | cin |
|---|---|
| date | Sat, 09 Sep 2017 03:53:13 +0300 |
| parents | Implab.Test/Implab.Format.Test/JsonTests.cs@d6a8cba73acc |
| children | 6fa235c5a760 |
comparison
equal
deleted
inserted
replaced
| 226:9428ea36838e | 227:8d5de4eb9c2c |
|---|---|
| 1 using NUnit.Framework; | |
| 2 using System; | |
| 3 using Implab.Formats.JSON; | |
| 4 using Implab.Automaton; | |
| 5 using Implab.Xml; | |
| 6 using System.Xml; | |
| 7 using System.Text; | |
| 8 | |
| 9 namespace Implab.Format.Test { | |
| 10 [TestFixture] | |
| 11 public class JsonTests { | |
| 12 [Test] | |
| 13 public void TestScannerValidTokens() { | |
| 14 using (var scanner = new JSONScanner(@"9123, -123, 0, 0.1, -0.2, -0.1e3, 1.3E-3, ""some \t\n\u0020 text"", literal []{}:")) { | |
| 15 | |
| 16 Tuple<JsonTokenType, object>[] expexted = { | |
| 17 new Tuple<JsonTokenType,object>(JsonTokenType.Number, 9123d), | |
| 18 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 19 new Tuple<JsonTokenType,object>(JsonTokenType.Number, -123d), | |
| 20 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 21 new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0d), | |
| 22 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 23 new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0.1d), | |
| 24 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 25 new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.2d), | |
| 26 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 27 new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.1e3d), | |
| 28 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 29 new Tuple<JsonTokenType,object>(JsonTokenType.Number, 1.3E-3d), | |
| 30 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 31 new Tuple<JsonTokenType,object>(JsonTokenType.String, "some \t\n text"), | |
| 32 new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "), | |
| 33 new Tuple<JsonTokenType,object>(JsonTokenType.Literal, "literal"), | |
| 34 new Tuple<JsonTokenType,object>(JsonTokenType.BeginArray, " ["), | |
| 35 new Tuple<JsonTokenType,object>(JsonTokenType.EndArray, "]"), | |
| 36 new Tuple<JsonTokenType,object>(JsonTokenType.BeginObject, "{"), | |
| 37 new Tuple<JsonTokenType,object>(JsonTokenType.EndObject, "}"), | |
| 38 new Tuple<JsonTokenType,object>(JsonTokenType.NameSeparator, ":") | |
| 39 }; | |
| 40 | |
| 41 object value; | |
| 42 JsonTokenType tokenType; | |
| 43 for (var i = 0; i < expexted.Length; i++) { | |
| 44 | |
| 45 Assert.IsTrue(scanner.ReadToken(out value, out tokenType)); | |
| 46 Assert.AreEqual(expexted[i].Item1, tokenType); | |
| 47 Assert.AreEqual(expexted[i].Item2, value); | |
| 48 } | |
| 49 | |
| 50 Assert.IsFalse(scanner.ReadToken(out value, out tokenType)); | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 [Test] | |
| 55 public void TestScannerBadTokens() { | |
| 56 var bad = new[] { | |
| 57 " 1", | |
| 58 " literal", | |
| 59 " \"", | |
| 60 "\"unclosed string", | |
| 61 "1.bad", | |
| 62 "001", // should be read as three numbers | |
| 63 "--10", | |
| 64 "+10", | |
| 65 "1.0.0", | |
| 66 "1e1.0", | |
| 67 "l1teral0", | |
| 68 ".123", | |
| 69 "-.123" | |
| 70 }; | |
| 71 | |
| 72 foreach (var json in bad) { | |
| 73 using (var scanner = new JSONScanner(json)) { | |
| 74 try { | |
| 75 object value; | |
| 76 JsonTokenType token; | |
| 77 scanner.ReadToken(out value, out token); | |
| 78 if (!Object.Equals(value, json)) { | |
| 79 Console.WriteLine("'{0}' is read as {1}", json, value is String ? String.Format("'{0}'", value) : value); | |
| 80 continue; | |
| 81 } | |
| 82 Assert.Fail("Token '{0}' shouldn't pass", json); | |
| 83 } catch (ParserException e) { | |
| 84 Console.WriteLine(e.Message); | |
| 85 } | |
| 86 } | |
| 87 } | |
| 88 } | |
| 89 | |
| 90 [Test] | |
| 91 public void JsonXmlReaderSimpleTest() { | |
| 92 var json = "\"some text\""; | |
| 93 //Console.WriteLine($"JSON: {json}"); | |
| 94 //Console.WriteLine("XML"); | |
| 95 /*using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", RootName = "string", NodesPrefix = "json" })) { | |
| 96 Assert.AreEqual(xmlReader.ReadState, System.Xml.ReadState.Initial); | |
| 97 | |
| 98 AssertRead(xmlReader, XmlNodeType.XmlDeclaration); | |
| 99 AssertRead(xmlReader, XmlNodeType.Element); | |
| 100 AssertRead(xmlReader, XmlNodeType.Text); | |
| 101 AssertRead(xmlReader, XmlNodeType.EndElement); | |
| 102 Assert.IsFalse(xmlReader.Read()); | |
| 103 }*/ | |
| 104 | |
| 105 //DumpJsonParse("\"text value\""); | |
| 106 //DumpJsonParse("null"); | |
| 107 //DumpJsonParse("true"); | |
| 108 //DumpJsonParse("{}"); | |
| 109 //DumpJsonParse("[]"); | |
| 110 DumpJsonParse("{\"one\":1, \"two\":2}"); | |
| 111 DumpJsonParse("[1,2,3]"); | |
| 112 DumpJsonParse("[{\"info\": [7,8,9]}]"); | |
| 113 DumpJsonFlatParse("[1,2,[3,4],{\"info\": [5,6]},{\"num\": [7,8,null]}, null,[null]]"); | |
| 114 } | |
| 115 | |
| 116 void AssertRead(XmlReader reader, XmlNodeType expected) { | |
| 117 Assert.IsTrue(reader.Read()); | |
| 118 Console.WriteLine($"{new string(' ', reader.Depth*2)}{reader}"); | |
| 119 Assert.AreEqual(expected, reader.NodeType); | |
| 120 } | |
| 121 | |
| 122 void DumpJsonParse(string json) { | |
| 123 Console.WriteLine($"JSON: {json}"); | |
| 124 Console.WriteLine("XML"); | |
| 125 using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "json" })) { | |
| 126 while (xmlReader.Read()) | |
| 127 Console.WriteLine($"{new string(' ', xmlReader.Depth * 2)}{xmlReader}"); | |
| 128 } | |
| 129 } | |
| 130 | |
| 131 void DumpJsonFlatParse(string json) { | |
| 132 Console.WriteLine($"JSON: {json}"); | |
| 133 Console.WriteLine("XML"); | |
| 134 using (var xmlWriter = XmlWriter.Create(Console.Out, new XmlWriterSettings { | |
| 135 Indent = true, | |
| 136 CloseOutput = false, | |
| 137 ConformanceLevel = ConformanceLevel.Document | |
| 138 })) | |
| 139 using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "", FlattenArrays = true })) { | |
| 140 xmlWriter.WriteNode(xmlReader, false); | |
| 141 } | |
| 142 } | |
| 143 } | |
| 144 } | |
| 145 |
