JsonTests.cs
88 lines
| 4.0 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r158 | using NUnit.Framework; | ||
using System; | ||||
cin
|
r182 | using Implab.Formats.JSON; | ||
cin
|
r183 | using Implab.Automaton; | ||
cin
|
r158 | |||
namespace Implab.Format.Test { | ||||
cin
|
r182 | [TestFixture] | ||
cin
|
r158 | public class JsonTests { | ||
cin
|
r182 | [Test] | ||
public void TestScannerValidTokens() { | ||||
cin
|
r183 | 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 [] { | ||||
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, ":") | ||||
}; | ||||
cin
|
r182 | |||
cin
|
r183 | 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" | ||||
cin
|
r182 | }; | ||
cin
|
r183 | 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); | ||||
} | ||||
} | ||||
cin
|
r158 | } | ||
} | ||||
} | ||||