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