clone

a browser grid puzzle game where you push words around to rewrite the rules of each level

Explain rules revision errors to players

Dami committed af337db
commit
af337db37cd5ae8be58572d2d18aeca769b7969e
parent
68af59a011c7e7043098c09ade54da703f853488
author
Dami <dami.etoile@gmail.com>
4 files changed, +55 -7
Mopenspec/changes/add-rules-compatibility-revision/specs/level-sharing/spec.md16++++++++-----
Mopenspec/changes/add-rules-compatibility-revision/tasks.md3++-
Msrc/pack-service.js6+++++
Mtests/pack-service.test.js37++++++++++++++++++++++++++++++
M openspec/changes/add-rules-compatibility-revision/specs/level-sharing/spec.md +10 -6
M openspec/changes/add-rules-compatibility-revision/tasks.md +2 -1
M src/pack-service.js +6 -0
M tests/pack-service.test.js +37 -0
@@ -169,10 +169,47 @@ test('future rules revisions fail before catalog registration', () => {
169169 assert.equal(preview.ok, true);170170 const rejected = service.importPackText(`module.exports = ${JSON.stringify(future)};`, 'future.cjs');171171 assert.equal(rejected.ok, false);172+ assert.equal(rejected.errors[0].message, 'This pack needs a newer version of Miau Is True. Update the game to play it.');172173 assert.match(rejected.errors[0].detail, /manifest\.rules: unsupported future rules revision 3/);173174 assert.deepEqual(service.catalog.getPacks(), before);174175 });175176 177+test('malformed rules revisions use player language while preserving technical detail', () => {178+ const malformed = structuredClone(example);179+ malformed.manifest.id = 'malformed-rules';180+ malformed.manifest.rules = 'two';181+ const service = createPackService();182+ const preview = service.importPackText(`module.exports = ${JSON.stringify(malformed)};`, 'malformed.cjs');183+ assert.equal(preview.ok, false);184+ assert.equal(preview.errors[0].message, "This pack's rules version isn't valid, so it can't be installed.");185+ assert.match(preview.errors[0].detail, /manifest\.rules: must be a positive integer/);186+ assert.equal(service.catalog.getPacks().some(pack => pack.id === 'malformed-rules'), false);187+});188+189+test('shared rules compatibility errors use the same player language', () => {190+ const sender = createPackService({ baseUrl: 'https://fcbc.n.zip/' });191+ assert.equal(sender.installPack(example).ok, true);192+ const shared = sender.packLink('gift-pack');193+194+ const futurePayload = tamperSharedPayload(new URL(shared.url).hash.slice('#pack='.length), pack => {195+ pack.manifest.rules = 3;196+ });197+ const malformedPayload = tamperSharedPayload(new URL(shared.url).hash.slice('#pack='.length), pack => {198+ pack.manifest.rules = 'two';199+ });200+ const receiver = createPackService();201+ const future = receiver.decodePackLink(`#pack=${futurePayload}`);202+ const malformed = receiver.decodePackLink(`#pack=${malformedPayload}`);203+204+ assert.equal(future.ok, false);205+ assert.equal(future.errors[0].message, 'This pack needs a newer version of Miau Is True. Update the game to play it.');206+ assert.match(future.errors[0].detail, /manifest\.rules: unsupported future rules revision 3/);207+ assert.equal(malformed.ok, false);208+ assert.equal(malformed.errors[0].message, "This pack's rules version isn't valid, so it can't be installed.");209+ assert.match(malformed.errors[0].detail, /manifest\.rules: must be a positive integer/);210+ assert.equal(receiver.catalog.getPacks().length, 1);211+});212+176213 test('local and shared previews expose fallback world metadata and notes', () => {177214 const authored = structuredClone(example);178215 authored.manifest.id = 'world-preview';