misc.spec.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { describe, expect, it } from 'vitest'
  2. import { parseSourceRef, isKnowledgeRef } from '../src/repo/sourceRef'
  3. import { assertState, familyOf } from '../src/derive/states'
  4. import { resolveLayers } from '../src/config/resolve'
  5. describe('来源引用语法(格式规格 §7.2)', () => {
  6. it('仓内路径@版本', () => {
  7. const r = parseSourceRef('来源:大纲/卷规划/卷01/卷纲.md@5')
  8. expect(r).toEqual({ kind: '仓内', path: '大纲/卷规划/卷01/卷纲.md', version: '5' })
  9. })
  10. it('全角冒号兼容(B9 方言容忍)', () => {
  11. expect(parseSourceRef('来源:作品契约/契约.md@2')?.kind).toBe('仓内')
  12. })
  13. it('作者自定义/对谈共创', () => {
  14. expect(parseSourceRef('来源:作者自定义')).toEqual({ kind: '作者自定义' })
  15. expect(parseSourceRef('来源:对谈共创')).toEqual({ kind: '对谈共创' })
  16. })
  17. it('知识库引用:库名/条目/版本', () => {
  18. const r = parseSourceRef('来源:知识库/写作方法库/节拍/蓄压-回旋-爆发.md@7')
  19. expect(r).toMatchObject({ kind: '知识库', library: '写作方法库', version: '7' })
  20. if (r) expect(isKnowledgeRef(r)).toBe(true)
  21. })
  22. it('拒绝:路径穿越、盘符、无版本', () => {
  23. expect(parseSourceRef('来源:../窃.md@1')).toBeNull()
  24. expect(parseSourceRef('来源:D:/x.md@1')).toBeNull()
  25. expect(parseSourceRef('来源:大纲/卷纲.md')).toBeNull()
  26. expect(parseSourceRef('随便一行')).toBeNull()
  27. })
  28. })
  29. describe('状态三族(格式规格 §7.3/D56⑪)', () => {
  30. it('族属判定', () => {
  31. expect(familyOf('已确认')).toBe('计划族')
  32. expect(familyOf('已埋')).toBe('计划族') // 线索域四态收编入计划族
  33. expect(familyOf('候选')).toBe('工件族')
  34. expect(familyOf('已消费')).toBe('轮次族')
  35. expect(familyOf('已入记')).toBeNull() // 自造词被拒
  36. })
  37. it('族属校验抛错', () => {
  38. expect(() => assertState('已消费', '工件族')).toThrow(/族属/) // D56⑪:族属标错即违规
  39. expect(() => assertState('玄学状态', '计划族')).toThrow(/三族词表/)
  40. expect(assertState('候选', '工件族')).toBeUndefined()
  41. })
  42. })
  43. describe('配置解析最小(D50 整项覆盖)', () => {
  44. it('后者整项覆盖前者,不做字段级合并', () => {
  45. const r = resolveLayers([
  46. { name: '默认', values: { 润色: { 道: ['去AI痕迹'], 排序: 1 } } },
  47. { name: 'profile', values: { 润色: { 道: ['平台适配'] } } },
  48. ])
  49. const item = r.find((x) => x.key === '润色')
  50. expect(item?.value).toEqual({ 道: ['平台适配'] }) // 整项覆盖,排序字段不残留
  51. expect(item?.fromLayer).toBe('profile')
  52. })
  53. })