57 lines
1.7 KiB
TypeScript
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');
|
|
});
|
|
});
|