view Implab.Test/Implab.Format.Test/JsonTests.cs @ 222:98eeb63cedb2

sync
author cin
date Tue, 22 Aug 2017 09:34:47 +0300
parents d6a8cba73acc
children
line wrap: on
line source

using NUnit.Framework;
using System;
using Implab.Formats.JSON;
using Implab.Automaton;

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<JsonTokenType,object>[] expexted = {
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, 9123d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, -123d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0.1d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.2d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.1e3d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Number, 1.3E-3d),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.String, "some \t\n  text"),
                    new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
                    new Tuple<JsonTokenType,object>(JsonTokenType.Literal, "literal"),
                    new Tuple<JsonTokenType,object>(JsonTokenType.BeginArray, " ["),
                    new Tuple<JsonTokenType,object>(JsonTokenType.EndArray, "]"),
                    new Tuple<JsonTokenType,object>(JsonTokenType.BeginObject, "{"),
                    new Tuple<JsonTokenType,object>(JsonTokenType.EndObject, "}"),
                    new Tuple<JsonTokenType,object>(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);
                    }
                }
            
        }
    }
}