using NUnit.Framework; using System; using Implab.Formats.JSON; using Implab.Automaton; using Implab.Xml; using System.Xml; using System.Text; namespace Implab.Format.Test { [TestFixture] public class JsonTests { [Test] public void TestScannerValidTokens() { using (var scanner = new JSONScanner(@"9123, -123, 0, 0.1, -0.2, -0.1e3, 1.3E-3, ""some \t\n\u0020 text"", literal []{}:")) { Tuple[] expexted = { new Tuple(JsonTokenType.Number, 9123d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, -123d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, 0d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, 0.1d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, -0.2d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, -0.1e3d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Number, 1.3E-3d), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.String, "some \t\n text"), new Tuple(JsonTokenType.ValueSeparator, ", "), new Tuple(JsonTokenType.Literal, "literal"), new Tuple(JsonTokenType.BeginArray, " ["), new Tuple(JsonTokenType.EndArray, "]"), new Tuple(JsonTokenType.BeginObject, "{"), new Tuple(JsonTokenType.EndObject, "}"), new Tuple(JsonTokenType.NameSeparator, ":") }; 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) { using (var scanner = new JSONScanner(json)) { 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"); using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "json" })) { 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 })) using (var xmlReader = new JsonXmlReader(new JSONParser(json), new JsonXmlReaderOptions { NamespaceUri = "JsonXmlReaderSimpleTest", NodesPrefix = "", FlattenArrays = true })) { xmlWriter.WriteNode(xmlReader, false); } } } }