JsonTests.cs
146 lines
| 6.6 KiB
| text/x-csharp
|
CSharpLexer
/ Implab.Format.Test / JsonTests.cs
|
|
r227 | using NUnit.Framework; | ||
| using System; | ||||
| using Implab.Automaton; | ||||
| using Implab.Xml; | ||||
| using System.Xml; | ||||
|
|
r228 | using Implab.Formats; | ||
| using Implab.Formats.Json; | ||||
|
|
r227 | |||
| namespace Implab.Format.Test { | ||||
| [TestFixture] | ||||
| public class JsonTests { | ||||
|
|
r228 | |||
|
|
r227 | [Test] | ||
| public void TestScannerValidTokens() { | ||||
|
|
r228 | using (var scanner = JsonStringScanner.Create(@"9123, -123, 0, 0.1, -0.2, -0.1e3, 1.3E-3, ""some \t\n\u0020 text"", literal []{}:")) { | ||
|
|
r227 | |||
| Tuple<JsonTokenType, object>[] expexted = { | ||||
| new Tuple<JsonTokenType,object>(JsonTokenType.Number, 9123d), | ||||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Number, -123d), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0d), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0.1d), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.2d), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.1e3d), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Number, 1.3E-3d), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.String, "some \t\n text"), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), | ||
|
|
r227 | new Tuple<JsonTokenType,object>(JsonTokenType.Literal, "literal"), | ||
|
|
r228 | new Tuple<JsonTokenType,object>(JsonTokenType.BeginArray, null), | ||
| new Tuple<JsonTokenType,object>(JsonTokenType.EndArray, null), | ||||
| new Tuple<JsonTokenType,object>(JsonTokenType.BeginObject, null), | ||||
| new Tuple<JsonTokenType,object>(JsonTokenType.EndObject, null), | ||||
| new Tuple<JsonTokenType,object>(JsonTokenType.NameSeparator, null) | ||||
|
|
r227 | }; | ||
| object value; | ||||
| JsonTokenType tokenType; | ||||
| for (var i = 0; i < expexted.Length; i++) { | ||||
| Assert.IsTrue(scanner.ReadToken(out value, out tokenType)); | ||||
| Assert.AreEqual(expexted[i].Item1, tokenType); | ||||
| Assert.AreEqual(expexted[i].Item2, value); | ||||
| } | ||||
| Assert.IsFalse(scanner.ReadToken(out value, out tokenType)); | ||||
| } | ||||
| } | ||||
| [Test] | ||||
| public void TestScannerBadTokens() { | ||||
| var bad = new[] { | ||||
| " 1", | ||||
| " literal", | ||||
| " \"", | ||||
| "\"unclosed string", | ||||
| "1.bad", | ||||
| "001", // should be read as three numbers | ||||
| "--10", | ||||
| "+10", | ||||
| "1.0.0", | ||||
| "1e1.0", | ||||
| "l1teral0", | ||||
| ".123", | ||||
| "-.123" | ||||
| }; | ||||
| foreach (var json in bad) { | ||||
|
|
r228 | using (var scanner = JsonStringScanner.Create(json)) { | ||
|
|
r227 | try { | ||
| object value; | ||||
| JsonTokenType token; | ||||
| scanner.ReadToken(out value, out token); | ||||
| if (!Object.Equals(value, json)) { | ||||
| Console.WriteLine("'{0}' is read as {1}", json, value is String ? String.Format("'{0}'", value) : value); | ||||
| continue; | ||||
| } | ||||
| Assert.Fail("Token '{0}' shouldn't pass", json); | ||||
| } catch (ParserException e) { | ||||
| Console.WriteLine(e.Message); | ||||
| } | ||||
| } | ||||
| } | ||||
| } | ||||
| [Test] | ||||
| public void JsonXmlReaderSimpleTest() { | ||||
| var json = "\"some text\""; | ||||
| //Console.WriteLine($"JSON: {json}"); | ||||
| //Console.WriteLine("XML"); | ||||
| /*using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", RootName = "string", NodesPrefix = "json" })) { | ||||
| Assert.AreEqual(xmlReader.ReadState, System.Xml.ReadState.Initial); | ||||
| AssertRead(xmlReader, XmlNodeType.XmlDeclaration); | ||||
| AssertRead(xmlReader, XmlNodeType.Element); | ||||
| AssertRead(xmlReader, XmlNodeType.Text); | ||||
| AssertRead(xmlReader, XmlNodeType.EndElement); | ||||
| Assert.IsFalse(xmlReader.Read()); | ||||
| }*/ | ||||
| //DumpJsonParse("\"text value\""); | ||||
| //DumpJsonParse("null"); | ||||
| //DumpJsonParse("true"); | ||||
| //DumpJsonParse("{}"); | ||||
| //DumpJsonParse("[]"); | ||||
| DumpJsonParse("{\"one\":1, \"two\":2}"); | ||||
| DumpJsonParse("[1,2,3]"); | ||||
| DumpJsonParse("[{\"info\": [7,8,9]}]"); | ||||
| DumpJsonFlatParse("[1,2,[3,4],{\"info\": [5,6]},{\"num\": [7,8,null]}, null,[null]]"); | ||||
| } | ||||
| void AssertRead(XmlReader reader, XmlNodeType expected) { | ||||
| Assert.IsTrue(reader.Read()); | ||||
| Console.WriteLine($"{new string(' ', reader.Depth*2)}{reader}"); | ||||
| Assert.AreEqual(expected, reader.NodeType); | ||||
| } | ||||
| void DumpJsonParse(string json) { | ||||
| Console.WriteLine($"JSON: {json}"); | ||||
| Console.WriteLine("XML"); | ||||
|
|
r228 | using (var xmlReader = new JsonXmlReader(new JsonParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "json" })) { | ||
|
|
r227 | while (xmlReader.Read()) | ||
| Console.WriteLine($"{new string(' ', xmlReader.Depth * 2)}{xmlReader}"); | ||||
| } | ||||
| } | ||||
| void DumpJsonFlatParse(string json) { | ||||
| Console.WriteLine($"JSON: {json}"); | ||||
| Console.WriteLine("XML"); | ||||
| using (var xmlWriter = XmlWriter.Create(Console.Out, new XmlWriterSettings { | ||||
| Indent = true, | ||||
| CloseOutput = false, | ||||
| ConformanceLevel = ConformanceLevel.Document | ||||
| })) | ||||
|
|
r228 | using (var xmlReader = new JsonXmlReader(new JsonParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "", FlattenArrays = true })) { | ||
|
|
r227 | xmlWriter.WriteNode(xmlReader, false); | ||
| } | ||||
| } | ||||
| } | ||||
| } | ||||
