save progress

This commit is contained in:
StellaOps Bot
2026-01-03 11:02:24 +02:00
parent ca578801fd
commit 83c37243e0
446 changed files with 22798 additions and 4031 deletions

View File

@@ -15,14 +15,14 @@ public class CanonVersionTests
#region Version Constants
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void V1_HasExpectedValue()
{
Assert.Equal("stella:canon:v1", CanonVersion.V1);
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void VersionFieldName_HasUnderscorePrefix()
{
Assert.Equal("_canonVersion", CanonVersion.VersionFieldName);
@@ -30,7 +30,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void Current_EqualsV1()
{
Assert.Equal(CanonVersion.V1, CanonVersion.Current);
@@ -41,7 +41,7 @@ public class CanonVersionTests
#region IsVersioned Detection
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void IsVersioned_VersionedJson_ReturnsTrue()
{
var json = """{"_canonVersion":"stella:canon:v1","foo":"bar"}"""u8;
@@ -49,7 +49,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void IsVersioned_LegacyJson_ReturnsFalse()
{
var json = """{"foo":"bar"}"""u8;
@@ -57,7 +57,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void IsVersioned_EmptyJson_ReturnsFalse()
{
var json = "{}"u8;
@@ -65,7 +65,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void IsVersioned_TooShort_ReturnsFalse()
{
var json = """{"_ca":"v"}"""u8;
@@ -73,7 +73,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void IsVersioned_WrongFieldName_ReturnsFalse()
{
var json = """{"_version":"stella:canon:v1","foo":"bar"}"""u8;
@@ -85,7 +85,7 @@ public class CanonVersionTests
#region ExtractVersion
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void ExtractVersion_VersionedJson_ReturnsVersion()
{
var json = """{"_canonVersion":"stella:canon:v1","foo":"bar"}"""u8;
@@ -93,7 +93,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void ExtractVersion_CustomVersion_ReturnsVersion()
{
var json = """{"_canonVersion":"custom:v2","foo":"bar"}"""u8;
@@ -101,7 +101,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void ExtractVersion_LegacyJson_ReturnsNull()
{
var json = """{"foo":"bar"}"""u8;
@@ -109,7 +109,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void ExtractVersion_EmptyVersion_ReturnsNull()
{
var json = """{"_canonVersion":"","foo":"bar"}"""u8;
@@ -121,7 +121,7 @@ public class CanonVersionTests
#region CanonicalizeVersioned
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_IncludesVersionMarker()
{
var obj = new { foo = "bar" };
@@ -133,7 +133,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_VersionMarkerIsFirst()
{
var obj = new { aaa = 1, zzz = 2 };
@@ -147,7 +147,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_SortsOtherKeys()
{
var obj = new { z = 3, a = 1, m = 2 };
@@ -159,7 +159,38 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_WithCustomOptions_UsesOptions()
{
var obj = new { MyProperty = "test" };
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
};
var canonical = CanonJson.CanonicalizeVersioned(obj, options);
var json = Encoding.UTF8.GetString(canonical);
Assert.Contains(@"""my_property"":""test""", json);
}
[Trait("Category", TestCategories.Unit)]
[Fact]
public void CanonicalizeVersioned_SkipsExistingVersionField()
{
var jsonInput = """{"_canonVersion":"legacy","foo":"bar"}""";
var element = JsonSerializer.Deserialize<JsonElement>(jsonInput);
var canonical = CanonJson.CanonicalizeVersioned(element, "stella:canon:v1");
var json = Encoding.UTF8.GetString(canonical);
var matches = Regex.Matches(json, "_canonVersion");
Assert.Single(matches);
Assert.Contains(@"""_canonVersion"":""stella:canon:v1""", json);
}
[Trait("Category", TestCategories.Unit)]
[Fact]
public void CanonicalizeVersioned_CustomVersion_UsesProvidedVersion()
{
var obj = new { foo = "bar" };
@@ -170,7 +201,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_NullVersion_ThrowsArgumentException()
{
var obj = new { foo = "bar" };
@@ -178,7 +209,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_EmptyVersion_ThrowsArgumentException()
{
var obj = new { foo = "bar" };
@@ -190,7 +221,7 @@ public class CanonVersionTests
#region Hash Difference (Versioned vs Legacy)
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void HashVersioned_DiffersFromLegacyHash()
{
var obj = new { foo = "bar", count = 42 };
@@ -202,7 +233,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void HashVersionedPrefixed_DiffersFromLegacyHashPrefixed()
{
var obj = new { foo = "bar", count = 42 };
@@ -216,7 +247,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void HashVersioned_SameInput_ProducesSameHash()
{
var obj = new { foo = "bar", count = 42 };
@@ -228,7 +259,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void HashVersioned_DifferentVersions_ProduceDifferentHashes()
{
var obj = new { foo = "bar" };
@@ -244,7 +275,7 @@ public class CanonVersionTests
#region Determinism
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_SameInput_ProducesSameBytes()
{
var obj = new { name = "test", value = 123, nested = new { x = 1, y = 2 } };
@@ -256,7 +287,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_DifferentPropertyOrder_ProducesSameBytes()
{
// Create two objects with same properties but defined in different order
@@ -273,7 +304,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_StableAcrossMultipleCalls()
{
var obj = new { id = Guid.Parse("12345678-1234-1234-1234-123456789012"), name = "stable" };
@@ -291,7 +322,7 @@ public class CanonVersionTests
#region Golden File / Snapshot Tests
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_KnownInput_ProducesKnownOutput()
{
// Golden test: exact output for known input to detect algorithm changes
@@ -304,7 +335,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void HashVersioned_KnownInput_ProducesKnownHash()
{
// Golden test: exact hash for known input to detect algorithm changes
@@ -323,7 +354,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_NestedObject_ProducesCorrectOutput()
{
var obj = new
@@ -343,7 +374,7 @@ public class CanonVersionTests
#region Backward Compatibility
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanVersion_CanDistinguishLegacyFromVersioned()
{
var obj = new { foo = "bar" };
@@ -356,7 +387,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void LegacyCanonicalize_StillWorks()
{
// Ensure we haven't broken the legacy canonicalize method
@@ -373,7 +404,7 @@ public class CanonVersionTests
#region Edge Cases
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_EmptyObject_IncludesOnlyVersion()
{
var obj = new { };
@@ -384,7 +415,7 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_WithSpecialCharacters_HandlesCorrectly()
{
var obj = new { message = "hello\nworld", special = "quote:\"test\"" };
@@ -399,17 +430,16 @@ public class CanonVersionTests
}
[Trait("Category", TestCategories.Unit)]
[Fact]
[Fact]
public void CanonicalizeVersioned_WithUnicodeCharacters_HandlesCorrectly()
{
var obj = new { greeting = "こんにちは", emoji = "🚀" };
var obj = new { greeting = "\u3053\u3093\u306b\u3061\u306f", emoji = "\U0001F680" };
var canonical = CanonJson.CanonicalizeVersioned(obj);
var json = Encoding.UTF8.GetString(canonical);
var parsed = JsonSerializer.Deserialize<JsonElement>(json);
Assert.Equal("こんにちは", parsed.GetProperty("greeting").GetString());
Assert.Equal("🚀", parsed.GetProperty("emoji").GetString());
Assert.Equal("\u3053\u3093\u306b\u3061\u306f", parsed.GetProperty("greeting").GetString());
Assert.Equal("\U0001F680", parsed.GetProperty("emoji").GetString());
}
#endregion
}