feat(game-ui): add action feedback layer

This commit is contained in:
2026-08-12 15:56:58 +00:00
parent 5e80a940d4
commit 5d4d5009ee
15 changed files with 671 additions and 50 deletions
@@ -0,0 +1,56 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { createGameFeedbackStore } from '../src/composables/useGameFeedback.ts';
void test('keeps four recent toasts and replaces an exact duplicate', () => {
const feedback = createGameFeedbackStore();
feedback.info('첫 번째', 0);
feedback.success('두 번째', 0);
feedback.error('세 번째', 0);
feedback.info('네 번째', 0);
feedback.success('다섯 번째', 0);
assert.deepEqual(
feedback.toasts.value.map((toast) => toast.message),
['두 번째', '세 번째', '네 번째', '다섯 번째']
);
feedback.error('세 번째', 0);
assert.deepEqual(
feedback.toasts.value.map((toast) => `${toast.kind}:${toast.message}`),
['success:두 번째', 'info:네 번째', 'success:다섯 번째', 'error:세 번째']
);
});
void test('queues acknowledgement dialogs and resolves each request in order', async () => {
const feedback = createGameFeedbackStore();
let firstResolved = false;
let secondResolved = false;
const first = feedback
.showDialog({ kind: 'error', title: '첫 알림', message: '먼저 확인' })
.then(() => (firstResolved = true));
const second = feedback
.showDialog({ kind: 'success', message: '다음 확인', acknowledgeLabel: '계속' })
.then(() => (secondResolved = true));
assert.equal(feedback.dialog.value?.title, '첫 알림');
feedback.acknowledgeDialog();
await first;
assert.equal(firstResolved, true);
assert.equal(secondResolved, false);
assert.deepEqual(feedback.dialog.value, {
id: 2,
kind: 'success',
title: '완료',
message: '다음 확인',
acknowledgeLabel: '계속',
});
feedback.acknowledgeDialog();
await second;
assert.equal(secondResolved, true);
assert.equal(feedback.dialog.value, null);
});