From 8973efdd0bb605445df0d04abd8783aca181778b Mon Sep 17 00:00:00 2001 From: Libby Date: Wed, 11 Nov 2026 09:03:39 +0000 Subject: [PATCH] cultcache C# tests: pin that a refusal orders keys by code unit, not case Co-Authored-By: Claude Sonnet 5.5 --- .../UniqueIndexVectorTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/GameCult.Caching.Tests/UniqueIndexVectorTests.cs b/tests/GameCult.Caching.Tests/UniqueIndexVectorTests.cs index 257c4175..cf47bfbe 100644 --- a/tests/GameCult.Caching.Tests/UniqueIndexVectorTests.cs +++ b/tests/GameCult.Caching.Tests/UniqueIndexVectorTests.cs @@ -562,5 +562,21 @@ namespace GameCult.Caching.Tests Assert.That(walked, Is.EqualTo(13)); } + + // Not a vector row (the cross-runtime rows are fixed by the spec): keys order by code unit, so "B" precedes "a". + [Test] + public void RefusalOrdersKeysByCodeUnitNotByCase() + { + using var cache = CultCacheMessagePack.Create( + Path.Combine(Path.GetTempPath(), $"cultlib-uidxc-{Guid.NewGuid():N}.cc"), + new CultCacheOpenOptions { Registry = CultDocumentRegistry.ForTypes(new[] { ItemIndex }) }); + var refused = Assert.Throws(() => cache.Commit(batch => + { + foreach (var (key, sku) in new[] { ("a", "S"), ("z", "S"), ("B", "T"), ("C", "T") }) + batch.Upsert(ItemIndex, EmittedDocumentTypes.New(ItemIndex, ("Sku", sku), ("Category", "")), new CultRecordKey(key)); + }))!; + Assert.That(refused.Message, Is.EqualTo( + "Records B and C (tests.unique_item) both hold unique index 'Sku'; an index value names one record.")); + } } }