import { test } from 'node:test'; import assert from 'node:assert/strict'; import { stageOf, normalizeLayer, evidenceOf, uploadMethodLabel, oppEvidenceOf } from '../src/core/taxonomy/taxonomy.js'; test('阶段归一:三种写法落到同一阶段', () => { for (const v of ['S3 机会识别', 'S3机会识别', 's3', ' S3 机会点识别 ']) { assert.equal(stageOf(v)?.code, 'S3', v); } assert.equal(stageOf('S1品类分析')?.no, 1); assert.equal(stageOf('乱七八糟'), null, '认不出的不猜'); assert.equal(stageOf(null), null); }); test('四层归属:历史 tier 与「被引用升级」都有明确规则', () => { assert.equal(normalizeLayer({ layer: 'raw' }), 'raw'); assert.equal(normalizeLayer({ tier: 'pending' }), 'process'); assert.equal(normalizeLayer({ tier: 'record' }), 'record'); assert.equal(normalizeLayer({ layer: 'weird' }), 'process', '未知值落回 process'); assert.equal(normalizeLayer({}, { cited: true, hasOwner: true }), 'sediment'); assert.equal(normalizeLayer({}, { cited: true, hasOwner: false }), 'process', '没有出身的不能升沉淀'); assert.equal(normalizeLayer({ layer: 'process' }, { cited: true, hasOwner: true }), 'sediment'); }); test('归纳没有出身不许进沉淀层', () => { assert.equal(normalizeLayer({ derivedFrom: [] }, { isInsight: true }), 'record'); assert.equal(normalizeLayer({ derivedFrom: ['a'], layer: 'record' }, { isInsight: true }), 'record'); assert.equal(normalizeLayer({ derivedFrom: ['a'] }, { isInsight: true, hasOwner: true }), 'sediment'); }); test('evidenceLevel=verified 但没有原文 → 降级为「有佐证」', () => { assert.equal(evidenceOf('verified', true).key, 'verified'); assert.equal(evidenceOf('verified', false).key, 'supported'); assert.equal(evidenceOf(undefined, false).key, 'none'); }); test('机会卡证据强度与上传方式', () => { assert.equal(oppEvidenceOf('high').rank, 3); assert.equal(oppEvidenceOf('???').key, 'none'); assert.equal(uploadMethodLabel('session'), '会话上传'); assert.equal(uploadMethodLabel(''), ''); });