80 lines
3.0 KiB
C#
80 lines
3.0 KiB
C#
using System.Text;
|
|
using System.Text.Json;
|
|
|
|
namespace Strata.SqlTools.SqlBreakdown.Tests;
|
|
|
|
[TestFixture]
|
|
public class JsonTokenReaderTests
|
|
{
|
|
[Test]
|
|
public void JsonTokenReader_ReadsJsonTokensCorrectly()
|
|
{
|
|
// Arrange
|
|
var jsonString = """
|
|
{
|
|
"foo": "bar",
|
|
"myList": [1,2,3,4],
|
|
"another": 12
|
|
}
|
|
""";
|
|
var jsonBytes = Encoding.UTF8.GetBytes(jsonString);
|
|
var reader = new Utf8JsonReader(jsonBytes);
|
|
var tokens = new List<(JsonTokenType Type, string Value)>();
|
|
|
|
// Act
|
|
while (reader.Read())
|
|
{
|
|
var tokenValue = Encoding.UTF8.GetString(reader.ValueSpan);
|
|
tokens.Add((reader.TokenType, tokenValue));
|
|
}
|
|
|
|
// Assert - Validate JSON shape and structure
|
|
Assert.That(tokens, Is.Not.Empty);
|
|
|
|
// Validate JSON starts with StartObject and ends with EndObject
|
|
Assert.That(tokens, Has.Count.GreaterThan(2));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(tokens[0].Type, Is.EqualTo(JsonTokenType.StartObject));
|
|
Assert.That(tokens[^1].Type, Is.EqualTo(JsonTokenType.EndObject));
|
|
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "foo"), Is.EqualTo(1));
|
|
Assert.That(tokens.Count(t => t.Type == JsonTokenType.String && t.Value == "bar"), Is.EqualTo(1));
|
|
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "myList"), Is.EqualTo(1));
|
|
Assert.That(tokens.Count(t => t.Type == JsonTokenType.StartArray), Is.EqualTo(1));
|
|
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "another"), Is.EqualTo(1));
|
|
Assert.That(tokens.Count(t => t.Type == JsonTokenType.Number && t.Value == "12"), Is.EqualTo(1));
|
|
});
|
|
|
|
// Deep validation of JSON content structure
|
|
var tokenIndex = 4;
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Token 4: [
|
|
Assert.That(tokens[tokenIndex++].Type, Is.EqualTo(JsonTokenType.StartArray));
|
|
|
|
// Token 5-8: Array elements [1,2,3,4]
|
|
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
|
|
Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("1"));
|
|
});
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
|
|
Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("2"));
|
|
});
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
|
|
Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("3"));
|
|
});
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
|
|
Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("4"));
|
|
});
|
|
|
|
// Token 9: ]
|
|
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.EndArray));
|
|
}
|
|
}
|