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();
+        }
+    }
+}
+