Repository navigation
[patch] Title-case [IsTitleCase] values with invariant rules, not the thread culture - #403
Merged
Merged
Conversation
… thread culture IsTitleCaseAttribute lowercased with invariant rules but title-cased with CultureInfo.CurrentCulture, so "Istanbul" validated under en-US and failed under tr-TR and az, where "i" title-cases to "İ". It now title-cases with CultureInfo.InvariantCulture, like the rest of the casing attributes. The test project turns off the invariant globalization ktsu.Sdk enables, so the culture test can set tr-TR and az at all. CA1304 and CA1307, which that switches on, are suppressed there: SemanticStringTests calls the culture-default overloads deliberately. Fixes #309 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Co2rZq6e7TjwF2FMUzNoXu
|
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Fixes #309
What was wrong
IsTitleCaseAttributelowercased the value with invariant rules, then title-cased it withCultureInfo.CurrentCulture. Undertr-TRoraz,ititle-cases toİ, so"Istanbul"was valid on an en-US machine and invalid on a Turkish one.Change (
Semantics.Strings/Validation/Attributes/Casing/IsTitleCaseAttribute.cs)CultureInfo.InvariantCulture.TextInfo. That matches the lowercasing and the other casing attributes made culture-invariant in SemanticString comparison operators use culture-sensitive ordering, inconsistent with its ordinal Equals #276.Test project (
Semantics.Test/Semantics.Test.csproj), which reviewers should look atktsu.SdksetsInvariantGlobalization=true, and in that mode every culture except the invariant one throwsCultureNotFoundExceptionwhen constructed. So no test in this project could settr-TR, and the bug couldn't be reproduced there. Consumers who don't use ktsu.Sdk still hit it. The test project now setsInvariantGlobalization=false.SemanticStringTests, which callsSemanticString's culture-default overloads on purpose to cover them. Both rules are suppressed in the test project only. No library project changes.Tests (
CasingValidatorsTests.TitleCase_DoesNotDependOnThreadCulture)en-US,tr-TRandaz-Latn-AZ. Each run checks that"Istanbul Is Lovely"validates and"istanbul"is rejected. The original culture is restored infinally.tr-TRandaz-Latn-AZrows fail anden-USpasses, which reproduces the issue.Semantics.Testsuite passes under real cultures: 1483 passed, 0 failed, 8 skipped.Semantics.Stringsbuilds for every target framework with no warnings.🤖 Generated with Claude Code
https://claude.ai/code/session_01Co2rZq6e7TjwF2FMUzNoXu
Generated by Claude Code