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