Mercurial > pub > ImplabNet
diff Implab.Test/JsonTests.cs @ 262:f1696cdc3d7a v3 v3.0.8
Added IInitializable.Initialize() overload
Added IRunnable.Start(), IRunnable.Start() overloads
Fixed cancellation of the current operation when Stop() is called
More tests
author | cin |
---|---|
date | Mon, 16 Apr 2018 02:12:39 +0300 |
parents | Implab.Format.Test/JsonTests.cs@302ca905c19e |
children | 3a6e18c432be |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab.Test/JsonTests.cs Mon Apr 16 02:12:39 2018 +0300 @@ -0,0 +1,152 @@ +using Xunit; +using System; +using Implab.Automaton; +using Implab.Xml; +using System.Xml; +using Implab.Formats; +using Implab.Formats.Json; +using System.IO; + +namespace Implab.Test { + public class JsonTests { + + [Fact] + public void TestScannerValidTokens() { + using (var scanner = JsonStringScanner.Create(@"9123, -123, 0, 0.1, -0.2, -0.1e3, 1.3E-3, ""some \t\n\u0020 text"", literal []{}:")) { + + Tuple<JsonTokenType, object>[] expexted = { + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "9123"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "-123"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "0"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "0.1"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "-0.2"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "-0.1e3"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Number, "1.3E-3"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.String, "some \t\n text"), + new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, null), + new Tuple<JsonTokenType,object>(JsonTokenType.Literal, "literal"), + 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) + }; + + string value; + JsonTokenType tokenType; + for (var i = 0; i < expexted.Length; i++) { + + Assert.True(scanner.ReadToken(out value, out tokenType)); + Assert.Equal(expexted[i].Item1, tokenType); + Assert.Equal(expexted[i].Item2, value); + } + + Assert.False(scanner.ReadToken(out value, out tokenType)); + } + } + + [Fact] + 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) { + using (var scanner = JsonStringScanner.Create(json)) { + try { + string 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.True(false, $"Token '{json}' shouldn't pass"); + } catch (ParserException e) { + Console.WriteLine(e.Message); + } + } + } + } + + [Fact] + 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.True(reader.Read()); + Console.WriteLine($"{new string(' ', reader.Depth * 2)}{reader}"); + Assert.Equal(expected, reader.NodeType); + } + + void DumpJsonParse(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 + })) + using (var xmlReader = new JsonXmlReader(JsonReader.ParseString(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "json" })) { + xmlWriter.WriteNode(xmlReader, false); + } + Console.WriteLine(); + } + + 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 + })) + using (var xmlReader = new JsonXmlReader(JsonReader.ParseString(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "", FlattenArrays = true })) { + xmlWriter.WriteNode(xmlReader, false); + } + Console.WriteLine(); + } + } +} +