Files
Genarrative/src/services/storyEngine/knowledgeContract.test.ts
T
kdletters cbc27bad4a
CI / verify (push) Has been cancelled
init with react+axum+spacetimedb
2026-04-26 18:06:23 +08:00

57 lines
1.7 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import type { KnowledgeFact } from '../../types';
import { buildVisibilitySliceFromFacts } from './knowledgeContract';
describe('buildVisibilitySliceFromFacts', () => {
it('separates direct, indirect, and forbidden facts', () => {
const facts: KnowledgeFact[] = [
{
id: 'fact-public',
title: '公开面',
content: '他只承认自己还在守桥。',
ownerActorIds: ['npc-1'],
relatedThreadIds: ['thread-1'],
relatedScarIds: [],
sourceType: 'actor',
visibility: 'public',
sayability: 'direct',
},
{
id: 'fact-indirect',
title: '错位',
content: '嘴上只说守桥,提到名单时却会明显收紧语气。',
ownerActorIds: ['npc-1'],
relatedThreadIds: ['thread-1'],
relatedScarIds: [],
sourceType: 'actor',
visibility: 'discoverable',
sayability: 'indirect',
},
{
id: 'fact-forbidden',
title: '禁区',
content: '封桥令',
ownerActorIds: ['npc-1'],
relatedThreadIds: ['thread-1'],
relatedScarIds: [],
sourceType: 'actor',
visibility: 'forbidden',
sayability: 'reactive_only',
},
];
const slice = buildVisibilitySliceFromFacts({
facts,
discoveredFactIds: ['fact-public', 'fact-indirect'],
activeThreadIds: ['thread-1'],
disclosureStage: 'guarded',
isFirstMeaningfulContact: false,
});
expect(slice.sayableFactIds).toContain('fact-public');
expect(slice.inferredFactIds).toContain('fact-indirect');
expect(slice.forbiddenFactIds).toContain('fact-forbidden');
});
});