All checks were successful
Run the JSON parser tests / test (push) Has been skipped
195 lines
6.1 KiB
C#
195 lines
6.1 KiB
C#
using Jtr.Parsing.Json;
|
|
|
|
namespace Jtr.Parsing.Tests;
|
|
|
|
public class JsonLexerTests
|
|
{
|
|
[SetUp]
|
|
public void Setup()
|
|
{
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_null()
|
|
{
|
|
const string source = "null";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_null), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.Null, Lexeme: "null" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
]);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_booleans()
|
|
{
|
|
const string trueSource = "true";
|
|
const string falseSource = "false";
|
|
var trueTokens = JsonLexer.Default.Lex(nameof(Can_lex_booleans), trueSource);
|
|
var falseTokens = JsonLexer.Default.Lex(nameof(Can_lex_booleans), falseSource);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(trueTokens is
|
|
[
|
|
{ Type: JsonToken.True, Lexeme: "true" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
]);
|
|
|
|
Assert.That(falseTokens is
|
|
[
|
|
{ Type: JsonToken.False, Lexeme: "false" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
]);
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_an_integer()
|
|
{
|
|
const string source = "1";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_an_integer), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.Number, Lexeme: "1" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
]);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_a_decimal()
|
|
{
|
|
const string source = "1.0";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_a_decimal), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.Number, Lexeme: "1.0" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
]);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_a_string()
|
|
{
|
|
const string source = "\"Hello world!\"";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_a_string), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.String, Lexeme: "Hello world!" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
]);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_an_empty_array()
|
|
{
|
|
const string source = "[]";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_an_empty_array), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.LeftBracket, Lexeme: "[" },
|
|
{ Type: JsonToken.RightBracket, Lexeme: "]" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
], Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_a_single_item_array()
|
|
{
|
|
const string source = "[1]";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_a_single_item_array), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.LeftBracket, Lexeme: "[" },
|
|
{ Type: JsonToken.Number, Lexeme: "1" },
|
|
{ Type: JsonToken.RightBracket, Lexeme: "]" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
], Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_an_array_with_multiple_items()
|
|
{
|
|
const string source = "[1,true,{},[],null]";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_an_array_with_multiple_items), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.LeftBracket, Lexeme: "[" },
|
|
{ Type: JsonToken.Number, Lexeme: "1" },
|
|
{ Type: JsonToken.Comma, Lexeme: "," },
|
|
{ Type: JsonToken.True, Lexeme: "true" },
|
|
{ Type: JsonToken.Comma, Lexeme: "," },
|
|
{ Type: JsonToken.LeftBrace, Lexeme: "{" },
|
|
{ Type: JsonToken.RightBrace, Lexeme: "}" },
|
|
{ Type: JsonToken.Comma, Lexeme: "," },
|
|
{ Type: JsonToken.LeftBracket, Lexeme: "[" },
|
|
{ Type: JsonToken.RightBracket, Lexeme: "]" },
|
|
{ Type: JsonToken.Comma, Lexeme: "," },
|
|
{ Type: JsonToken.Null, Lexeme: "null" },
|
|
{ Type: JsonToken.RightBracket, Lexeme: "]" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
], Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_an_empty_object()
|
|
{
|
|
const string source = "{}";
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_an_empty_object), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.LeftBrace, Lexeme: "{" },
|
|
{ Type: JsonToken.RightBrace, Lexeme: "}" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
], Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_an_object_with_one_entry()
|
|
{
|
|
const string source = "{\"first_name\":\"John\"}";
|
|
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_an_object_with_one_entry), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.LeftBrace, Lexeme: "{" },
|
|
{ Type: JsonToken.String, Lexeme: "first_name" },
|
|
{ Type: JsonToken.Colon, Lexeme: ":" },
|
|
{ Type: JsonToken.String, Lexeme: "John" },
|
|
{ Type: JsonToken.RightBrace, Lexeme: "}" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
], Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Can_lex_an_object_with_multiple_entries()
|
|
{
|
|
const string source = "{\"first_name\":\"John\", \"last_name\": \"Doe\"}";
|
|
|
|
var tokens = JsonLexer.Default.Lex(nameof(Can_lex_an_object_with_multiple_entries), source);
|
|
|
|
Assert.That(tokens is
|
|
[
|
|
{ Type: JsonToken.LeftBrace, Lexeme: "{" },
|
|
{ Type: JsonToken.String, Lexeme: "first_name" },
|
|
{ Type: JsonToken.Colon, Lexeme: ":" },
|
|
{ Type: JsonToken.String, Lexeme: "John" },
|
|
{ Type: JsonToken.Comma, Lexeme: "," },
|
|
{ Type: JsonToken.String, Lexeme: "last_name" },
|
|
{ Type: JsonToken.Colon, Lexeme: ":" },
|
|
{ Type: JsonToken.String, Lexeme: "Doe" },
|
|
{ Type: JsonToken.RightBrace, Lexeme: "}" },
|
|
{ Type: JsonToken.EndOfSource }
|
|
], Is.True);
|
|
}
|
|
} |