disabilityIdParser.test.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /**
  2. * 残疾证号解析工具函数单元测试
  3. */
  4. import { describe, it, expect } from 'vitest';
  5. import {
  6. parseDisabilityId,
  7. getStandardDisabilityTypes,
  8. getStandardDisabilityLevels,
  9. isValidDisabilityType,
  10. isValidDisabilityLevel,
  11. getDisabilityTypeByCode,
  12. getDisabilityLevelByCode
  13. } from '../../src/utils/disabilityIdParser';
  14. describe('disabilityIdParser', () => {
  15. describe('parseDisabilityId - 标准格式解析', () => {
  16. it('应该正确解析"视力残疾123456一级"格式', () => {
  17. const result = parseDisabilityId('视力残疾123456一级');
  18. expect(result.disabilityType).toBe('视力残疾');
  19. expect(result.disabilityLevel).toBe('一级');
  20. expect(result.isValid).toBe(true);
  21. });
  22. it('应该正确解析"肢体残疾987654二级"格式', () => {
  23. const result = parseDisabilityId('肢体残疾987654二级');
  24. expect(result.disabilityType).toBe('肢体残疾');
  25. expect(result.disabilityLevel).toBe('二级');
  26. expect(result.isValid).toBe(true);
  27. });
  28. it('应该正确解析"听力残疾111111三级"格式', () => {
  29. const result = parseDisabilityId('听力残疾111111三级');
  30. expect(result.disabilityType).toBe('听力残疾');
  31. expect(result.disabilityLevel).toBe('三级');
  32. expect(result.isValid).toBe(true);
  33. });
  34. it('应该正确解析"精神残疾222222四级"格式', () => {
  35. const result = parseDisabilityId('精神残疾222222四级');
  36. expect(result.disabilityType).toBe('精神残疾');
  37. expect(result.disabilityLevel).toBe('四级');
  38. expect(result.isValid).toBe(true);
  39. });
  40. });
  41. describe('parseDisabilityId - 简写格式解析', () => {
  42. it('应该正确解析"视力123456一级"简写格式', () => {
  43. const result = parseDisabilityId('视力123456一级');
  44. expect(result.disabilityType).toBe('视力残疾');
  45. expect(result.disabilityLevel).toBe('一级');
  46. expect(result.isValid).toBe(true);
  47. });
  48. it('应该正确解析"肢体987654二级"简写格式', () => {
  49. const result = parseDisabilityId('肢体987654二级');
  50. expect(result.disabilityType).toBe('肢体残疾');
  51. expect(result.disabilityLevel).toBe('二级');
  52. expect(result.isValid).toBe(true);
  53. });
  54. it('应该正确解析"言语111111三级"简写格式', () => {
  55. const result = parseDisabilityId('言语111111三级');
  56. expect(result.disabilityType).toBe('言语残疾');
  57. expect(result.disabilityLevel).toBe('三级');
  58. expect(result.isValid).toBe(true);
  59. });
  60. });
  61. describe('parseDisabilityId - 数字等级格式', () => {
  62. it('应该正确解析"视力1234561级"格式', () => {
  63. const result = parseDisabilityId('视力1234561级');
  64. expect(result.disabilityType).toBe('视力残疾');
  65. expect(result.disabilityLevel).toBe('一级');
  66. expect(result.isValid).toBe(true);
  67. });
  68. it('应该正确解析"肢体9876542级"格式', () => {
  69. const result = parseDisabilityId('肢体9876542级');
  70. expect(result.disabilityType).toBe('肢体残疾');
  71. expect(result.disabilityLevel).toBe('二级');
  72. expect(result.isValid).toBe(true);
  73. });
  74. });
  75. describe('parseDisabilityId - 部分匹配', () => {
  76. it('应该只解析残疾类别,不解析等级', () => {
  77. const result = parseDisabilityId('视力残疾123456');
  78. expect(result.disabilityType).toBe('视力残疾');
  79. expect(result.disabilityLevel).toBeNull();
  80. expect(result.isValid).toBe(true); // 至少解析出一个字段
  81. });
  82. it('应该只解析等级,不解析类别', () => {
  83. const result = parseDisabilityId('123456一级');
  84. expect(result.disabilityType).toBeNull();
  85. expect(result.disabilityLevel).toBe('一级');
  86. expect(result.isValid).toBe(true);
  87. });
  88. });
  89. describe('parseDisabilityId - 边界情况', () => {
  90. it('应该处理空字符串', () => {
  91. const result = parseDisabilityId('');
  92. expect(result.disabilityType).toBeNull();
  93. expect(result.disabilityLevel).toBeNull();
  94. expect(result.isValid).toBe(false);
  95. });
  96. it('应该处理只有空格的字符串', () => {
  97. const result = parseDisabilityId(' ');
  98. expect(result.disabilityType).toBeNull();
  99. expect(result.disabilityLevel).toBeNull();
  100. expect(result.isValid).toBe(false);
  101. });
  102. it('应该处理无法匹配的格式', () => {
  103. const result = parseDisabilityId('ABC123');
  104. expect(result.disabilityType).toBeNull();
  105. expect(result.disabilityLevel).toBeNull();
  106. expect(result.isValid).toBe(false);
  107. });
  108. it('应该处理带空格的残疾证号', () => {
  109. const result = parseDisabilityId(' 视力残疾 123456 一级 ');
  110. expect(result.disabilityType).toBe('视力残疾');
  111. expect(result.disabilityLevel).toBe('一级');
  112. expect(result.isValid).toBe(true);
  113. });
  114. });
  115. describe('parseDisabilityId - 所有残疾类别', () => {
  116. it('应该正确解析所有七种残疾类别', () => {
  117. const types = [
  118. '视力残疾',
  119. '听力残疾',
  120. '言语残疾',
  121. '肢体残疾',
  122. '智力残疾',
  123. '精神残疾',
  124. '多重残疾'
  125. ];
  126. types.forEach(type => {
  127. const result = parseDisabilityId(`${type}123456一级`);
  128. expect(result.disabilityType).toBe(type);
  129. expect(result.isValid).toBe(true);
  130. });
  131. });
  132. });
  133. describe('getStandardDisabilityTypes', () => {
  134. it('应该返回所有七种标准残疾类别', () => {
  135. const types = getStandardDisabilityTypes();
  136. expect(types).toEqual([
  137. '视力残疾',
  138. '听力残疾',
  139. '言语残疾',
  140. '肢体残疾',
  141. '智力残疾',
  142. '精神残疾',
  143. '多重残疾'
  144. ]);
  145. });
  146. });
  147. describe('getStandardDisabilityLevels', () => {
  148. it('应该返回所有四种标准残疾等级', () => {
  149. const levels = getStandardDisabilityLevels();
  150. expect(levels).toEqual(['一级', '二级', '三级', '四级']);
  151. });
  152. });
  153. describe('isValidDisabilityType', () => {
  154. it('应该验证有效的残疾类别', () => {
  155. expect(isValidDisabilityType('视力残疾')).toBe(true);
  156. expect(isValidDisabilityType('肢体残疾')).toBe(true);
  157. expect(isValidDisabilityType('多重残疾')).toBe(true);
  158. });
  159. it('应该拒绝无效的残疾类别', () => {
  160. expect(isValidDisabilityType('其他残疾')).toBe(false);
  161. expect(isValidDisabilityType('视力')).toBe(false);
  162. expect(isValidDisabilityType('')).toBe(false);
  163. });
  164. });
  165. describe('isValidDisabilityLevel', () => {
  166. it('应该验证有效的残疾等级', () => {
  167. expect(isValidDisabilityLevel('一级')).toBe(true);
  168. expect(isValidDisabilityLevel('二级')).toBe(true);
  169. expect(isValidDisabilityLevel('三级')).toBe(true);
  170. expect(isValidDisabilityLevel('四级')).toBe(true);
  171. });
  172. it('应该拒绝无效的残疾等级', () => {
  173. expect(isValidDisabilityLevel('五级')).toBe(false);
  174. expect(isValidDisabilityLevel('1级')).toBe(false);
  175. expect(isValidDisabilityLevel('')).toBe(false);
  176. });
  177. });
  178. describe('parseDisabilityId - 数字编码格式 (20位)', () => {
  179. it('应该正确解析20位数字编码格式 - 视力残疾一级', () => {
  180. // 格式: [18位身份证][类别编码1][等级编码1]
  181. const result = parseDisabilityId('11010119900101123411');
  182. expect(result.disabilityType).toBe('视力残疾');
  183. expect(result.disabilityLevel).toBe('一级');
  184. expect(result.isValid).toBe(true);
  185. });
  186. it('应该正确解析20位数字编码格式 - 听力残疾二级', () => {
  187. const result = parseDisabilityId('11010119900101123422');
  188. expect(result.disabilityType).toBe('听力残疾');
  189. expect(result.disabilityLevel).toBe('二级');
  190. expect(result.isValid).toBe(true);
  191. });
  192. it('应该正确解析20位数字编码格式 - 肢体残疾三级', () => {
  193. const result = parseDisabilityId('11010119900101123443');
  194. expect(result.disabilityType).toBe('肢体残疾');
  195. expect(result.disabilityLevel).toBe('三级');
  196. expect(result.isValid).toBe(true);
  197. });
  198. it('应该正确解析20位数字编码格式 - 精神残疾四级', () => {
  199. const result = parseDisabilityId('11010119900101123464');
  200. expect(result.disabilityType).toBe('精神残疾');
  201. expect(result.disabilityLevel).toBe('四级');
  202. expect(result.isValid).toBe(true);
  203. });
  204. });
  205. describe('parseDisabilityId - 所有残疾类别编码', () => {
  206. const categoryTests = [
  207. { code: '1', name: '视力残疾' },
  208. { code: '2', name: '听力残疾' },
  209. { code: '3', name: '言语残疾' },
  210. { code: '4', name: '肢体残疾' },
  211. { code: '5', name: '智力残疾' },
  212. { code: '6', name: '精神残疾' },
  213. { code: '7', name: '多重残疾' }
  214. ];
  215. categoryTests.forEach(({ code, name }) => {
  216. it(`应该正确解析类别编码 ${code} 为 ${name}`, () => {
  217. // 使用一级等级编码 (1)
  218. const result = parseDisabilityId(`110101199001011234${code}1`);
  219. expect(result.disabilityType).toBe(name);
  220. expect(result.isValid).toBe(true);
  221. });
  222. });
  223. });
  224. describe('parseDisabilityId - 所有残疾等级编码', () => {
  225. const levelTests = [
  226. { code: '1', name: '一级' },
  227. { code: '2', name: '二级' },
  228. { code: '3', name: '三级' },
  229. { code: '4', name: '四级' }
  230. ];
  231. levelTests.forEach(({ code, name }) => {
  232. it(`应该正确解析等级编码 ${code} 为 ${name}`, () => {
  233. // 使用视力类别编码 (1)
  234. const result = parseDisabilityId(`1101011990010112341${code}`);
  235. expect(result.disabilityLevel).toBe(name);
  236. expect(result.isValid).toBe(true);
  237. });
  238. });
  239. });
  240. describe('parseDisabilityId - 数字编码边界情况', () => {
  241. it('应该拒绝长度不足20位的数字', () => {
  242. const result = parseDisabilityId('1101011990010112341'); // 19位
  243. expect(result.disabilityType).toBeNull();
  244. expect(result.disabilityLevel).toBeNull();
  245. expect(result.isValid).toBe(false);
  246. });
  247. it('应该拒绝长度超过20位的数字', () => {
  248. const result = parseDisabilityId('110101199001011234111'); // 21位
  249. expect(result.disabilityType).toBeNull();
  250. expect(result.disabilityLevel).toBeNull();
  251. expect(result.isValid).toBe(false);
  252. });
  253. it('应该拒绝包含非数字字符的20位字符串', () => {
  254. const result = parseDisabilityId('1101011990010112341A');
  255. expect(result.disabilityType).toBeNull();
  256. expect(result.disabilityLevel).toBeNull();
  257. expect(result.isValid).toBe(false);
  258. });
  259. it('应该拒绝无效的残疾类别编码', () => {
  260. // 类别编码为 8(无效),等级编码为 1(有效)
  261. const result = parseDisabilityId('11010119900101123481');
  262. expect(result.disabilityType).toBeNull();
  263. expect(result.disabilityLevel).toBe('一级');
  264. expect(result.isValid).toBe(true); // 至少解析出一个字段
  265. });
  266. it('应该拒绝无效的残疾等级编码', () => {
  267. // 类别编码为 1(有效),等级编码为 5(无效)
  268. const result = parseDisabilityId('11010119900101123415');
  269. expect(result.disabilityType).toBe('视力残疾');
  270. expect(result.disabilityLevel).toBeNull();
  271. expect(result.isValid).toBe(true); // 至少解析出一个字段
  272. });
  273. it('应该拒绝两个编码都无效的情况', () => {
  274. // 类别编码为 8(无效),等级编码为 9(无效)
  275. const result = parseDisabilityId('11010119900101123489');
  276. expect(result.disabilityType).toBeNull();
  277. expect(result.disabilityLevel).toBeNull();
  278. expect(result.isValid).toBe(false);
  279. });
  280. it('应该拒绝类别编码为 0 的情况', () => {
  281. const result = parseDisabilityId('11010119900101123401');
  282. expect(result.disabilityType).toBeNull();
  283. expect(result.disabilityLevel).toBe('一级');
  284. expect(result.isValid).toBe(true); // 等级编码有效
  285. });
  286. it('应该拒绝等级编码为 0 的情况', () => {
  287. const result = parseDisabilityId('11010119900101123410');
  288. expect(result.disabilityType).toBe('视力残疾');
  289. expect(result.disabilityLevel).toBeNull();
  290. expect(result.isValid).toBe(true); // 类别编码有效
  291. });
  292. });
  293. describe('parseDisabilityId - 数字编码与文本格式优先级', () => {
  294. it('应该优先使用数字编码格式解析', () => {
  295. // 20位纯数字应该被识别为数字编码格式
  296. const result = parseDisabilityId('11010119900101123411');
  297. expect(result.disabilityType).toBe('视力残疾');
  298. expect(result.disabilityLevel).toBe('一级');
  299. expect(result.isValid).toBe(true);
  300. });
  301. it('应该对非20位数字回退到文本格式解析', () => {
  302. // 包含文字的格式应该回退到文本解析
  303. const result = parseDisabilityId('视力残疾123456一级');
  304. expect(result.disabilityType).toBe('视力残疾');
  305. expect(result.disabilityLevel).toBe('一级');
  306. expect(result.isValid).toBe(true);
  307. });
  308. });
  309. describe('getDisabilityTypeByCode', () => {
  310. it('应该返回正确的残疾类别', () => {
  311. expect(getDisabilityTypeByCode('1')).toBe('视力残疾');
  312. expect(getDisabilityTypeByCode('2')).toBe('听力残疾');
  313. expect(getDisabilityTypeByCode('3')).toBe('言语残疾');
  314. expect(getDisabilityTypeByCode('4')).toBe('肢体残疾');
  315. expect(getDisabilityTypeByCode('5')).toBe('智力残疾');
  316. expect(getDisabilityTypeByCode('6')).toBe('精神残疾');
  317. expect(getDisabilityTypeByCode('7')).toBe('多重残疾');
  318. });
  319. it('应该对无效编码返回 null', () => {
  320. expect(getDisabilityTypeByCode('0')).toBeNull();
  321. expect(getDisabilityTypeByCode('8')).toBeNull();
  322. expect(getDisabilityTypeByCode('9')).toBeNull();
  323. expect(getDisabilityTypeByCode('')).toBeNull();
  324. expect(getDisabilityTypeByCode('abc')).toBeNull();
  325. });
  326. });
  327. describe('getDisabilityLevelByCode', () => {
  328. it('应该返回正确的残疾等级', () => {
  329. expect(getDisabilityLevelByCode('1')).toBe('一级');
  330. expect(getDisabilityLevelByCode('2')).toBe('二级');
  331. expect(getDisabilityLevelByCode('3')).toBe('三级');
  332. expect(getDisabilityLevelByCode('4')).toBe('四级');
  333. });
  334. it('应该对无效编码返回 null', () => {
  335. expect(getDisabilityLevelByCode('0')).toBeNull();
  336. expect(getDisabilityLevelByCode('5')).toBeNull();
  337. expect(getDisabilityLevelByCode('9')).toBeNull();
  338. expect(getDisabilityLevelByCode('')).toBeNull();
  339. expect(getDisabilityLevelByCode('abc')).toBeNull();
  340. });
  341. });
  342. });