fix(rules): case-fold the played words, so the rule fires online too
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 21s
CI / ui (pull_request) Successful in 1m15s
CI / conformance (pull_request) Successful in 11s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m45s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 21s
CI / ui (pull_request) Successful in 1m15s
CI / conformance (pull_request) Successful in 11s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m45s
The no-repeat-words rule never fired in an online game. The move preview builds its set of already-used words from the history the client holds, and the codec upper-cases those words for display, while the evaluator decodes the candidate word to lower — so "БРА" was never found to equal "бра" and every repeat scored as an ordinary play, right up to the server refusing it. Offline was unaffected: that engine compares alphabet-index keys taken from its own journal, which carry no case at all. The tests missed it because they hand-built the played set in the form the server sends rather than deriving it the way the game screen does. They now go through playedWordsFromHistory with history records shaped as the codec produces them — upper-cased words and all — which is the path that was broken; three of the five fail without this fix.
This commit is contained in:
@@ -97,6 +97,11 @@ The native Android app is a Capacitor 8 wrapper of the `ui` SPA, scaffolded unde
|
||||
both the FBS schema and the backend DTO.
|
||||
- **Seat display name is built in two places** — `game.Service` live events **and** the server REST
|
||||
DTOs. Change both or they drift.
|
||||
- **The client codec UPPER-CASES history words** (`lib/codec.ts` `decodeMove`) for display, while the
|
||||
engine/evaluator decodes candidate words to lower. Anything comparing the two must case-fold, or it
|
||||
silently never matches — this is how the Erudit no-repeat rule shipped dead on the online path
|
||||
while working offline (offline compares alphabet-index keys, so it has no case at all). A test that
|
||||
hand-builds such a set instead of deriving it the way the screen does will pass vacuously.
|
||||
- **A per-viewer flag is computed only in the per-viewer REST DTO**; the client seeds it from REST,
|
||||
then bumps it from the live event. Don't expect it on the shared broadcast.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user