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