| 
158
 | 
     1 using NUnit.Framework;
 | 
| 
 | 
     2 using System;
 | 
| 
182
 | 
     3 using Implab.Formats.JSON;
 | 
| 
183
 | 
     4 using Implab.Automaton;
 | 
| 
158
 | 
     5 
 | 
| 
 | 
     6 namespace Implab.Format.Test {
 | 
| 
182
 | 
     7     [TestFixture]
 | 
| 
158
 | 
     8     public class JsonTests {
 | 
| 
182
 | 
     9         [Test]
 | 
| 
 | 
    10         public void TestScannerValidTokens() {
 | 
| 
183
 | 
    11             using (var scanner = new JSONScanner(@"9123, -123, 0, 0.1, -0.2, -0.1e3, 1.3E-3, ""some \t\n\u0020 text"", literal []{}:")) {
 | 
| 
 | 
    12 
 | 
| 
184
 | 
    13                 Tuple<JsonTokenType,object>[] expexted = {
 | 
| 
183
 | 
    14                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, 9123d),
 | 
| 
 | 
    15                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    16                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, -123d),
 | 
| 
 | 
    17                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    18                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0d),
 | 
| 
 | 
    19                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    20                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, 0.1d),
 | 
| 
 | 
    21                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    22                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.2d),
 | 
| 
 | 
    23                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    24                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, -0.1e3d),
 | 
| 
 | 
    25                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    26                     new Tuple<JsonTokenType,object>(JsonTokenType.Number, 1.3E-3d),
 | 
| 
 | 
    27                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    28                     new Tuple<JsonTokenType,object>(JsonTokenType.String, "some \t\n  text"),
 | 
| 
 | 
    29                     new Tuple<JsonTokenType,object>(JsonTokenType.ValueSeparator, ", "),
 | 
| 
 | 
    30                     new Tuple<JsonTokenType,object>(JsonTokenType.Literal, "literal"),
 | 
| 
 | 
    31                     new Tuple<JsonTokenType,object>(JsonTokenType.BeginArray, " ["),
 | 
| 
 | 
    32                     new Tuple<JsonTokenType,object>(JsonTokenType.EndArray, "]"),
 | 
| 
 | 
    33                     new Tuple<JsonTokenType,object>(JsonTokenType.BeginObject, "{"),
 | 
| 
 | 
    34                     new Tuple<JsonTokenType,object>(JsonTokenType.EndObject, "}"),
 | 
| 
 | 
    35                     new Tuple<JsonTokenType,object>(JsonTokenType.NameSeparator, ":")
 | 
| 
 | 
    36                 };
 | 
| 
182
 | 
    37 
 | 
| 
183
 | 
    38                 object value;
 | 
| 
 | 
    39                 JsonTokenType tokenType;
 | 
| 
 | 
    40                 for (var i = 0; i < expexted.Length; i++) {
 | 
| 
 | 
    41                 
 | 
| 
 | 
    42                     Assert.IsTrue(scanner.ReadToken(out value, out tokenType));
 | 
| 
 | 
    43                     Assert.AreEqual(expexted[i].Item1, tokenType);
 | 
| 
 | 
    44                     Assert.AreEqual(expexted[i].Item2, value);
 | 
| 
 | 
    45                 }
 | 
| 
 | 
    46 
 | 
| 
 | 
    47                 Assert.IsFalse(scanner.ReadToken(out value, out tokenType));
 | 
| 
 | 
    48             }
 | 
| 
 | 
    49         }
 | 
| 
 | 
    50 
 | 
| 
 | 
    51         [Test]
 | 
| 
 | 
    52         public void TestScannerBadTokens() {
 | 
| 
 | 
    53             var bad = new [] {
 | 
| 
 | 
    54                 " 1",
 | 
| 
 | 
    55                 " literal",
 | 
| 
 | 
    56                 " \"",
 | 
| 
 | 
    57                 "\"unclosed string",
 | 
| 
 | 
    58                 "1.bad",
 | 
| 
 | 
    59                 "001", // should be read as three numbers
 | 
| 
 | 
    60                 "--10",
 | 
| 
 | 
    61                 "+10",
 | 
| 
 | 
    62                 "1.0.0",
 | 
| 
 | 
    63                 "1e1.0",
 | 
| 
 | 
    64                 "l1teral0",
 | 
| 
 | 
    65                 ".123",
 | 
| 
 | 
    66                 "-.123"
 | 
| 
182
 | 
    67             };
 | 
| 
 | 
    68 
 | 
| 
183
 | 
    69             foreach (var json in bad)
 | 
| 
 | 
    70                 using (var scanner = new JSONScanner(json)) {
 | 
| 
 | 
    71                     try {
 | 
| 
 | 
    72                         object value;
 | 
| 
 | 
    73                         JsonTokenType token;
 | 
| 
 | 
    74                         scanner.ReadToken(out value, out token);
 | 
| 
 | 
    75                         if (!Object.Equals(value,json)) {
 | 
| 
 | 
    76                             Console.WriteLine("'{0}' is read as {1}", json, value is String ? String.Format("'{0}'", value) : value );
 | 
| 
 | 
    77                             continue;
 | 
| 
 | 
    78                         }
 | 
| 
 | 
    79                         Assert.Fail("Token '{0}' shouldn't pass", json);
 | 
| 
 | 
    80                     } catch (ParserException e) {
 | 
| 
 | 
    81                         Console.WriteLine(e.Message);
 | 
| 
 | 
    82                     }
 | 
| 
 | 
    83                 }
 | 
| 
 | 
    84             
 | 
| 
158
 | 
    85         }
 | 
| 
 | 
    86     }
 | 
| 
 | 
    87 }
 | 
| 
 | 
    88 
 |