@natlibfi/marc-record-validators-melinda 11.6.7-alpha.1 → 12.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +871 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +84 -167
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2290 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +119 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +57 -95
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +66 -126
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +182 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/index.js +15 -49
  127. package/dist/merge-fields/index.js.map +7 -1
  128. package/dist/merge-fields/mergableIndicator.js +18 -51
  129. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  130. package/dist/merge-fields/mergableTag.js +78 -30
  131. package/dist/merge-fields/mergableTag.js.map +7 -1
  132. package/dist/merge-fields/mergeConfig.js +66 -171
  133. package/dist/merge-fields/mergeConfig.js.map +7 -1
  134. package/dist/merge-fields/mergeConstraints.js +323 -1214
  135. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  136. package/dist/merge-fields/mergeField.js +47 -111
  137. package/dist/merge-fields/mergeField.js.map +7 -1
  138. package/dist/merge-fields/mergeIndicator.js +64 -118
  139. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  140. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  141. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  143. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  144. package/dist/merge-fields/mergeSubfield.js +47 -95
  145. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  146. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  147. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  148. package/dist/merge-fields/worldKnowledge.js +15 -40
  149. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  150. package/dist/merge-fields.test.js +44 -0
  151. package/dist/merge-fields.test.js.map +7 -0
  152. package/dist/mergeField500Lisapainokset.js +28 -57
  153. package/dist/mergeField500Lisapainokset.js.map +7 -1
  154. package/dist/mergeField500Lisapainokset.test.js +44 -0
  155. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  156. package/dist/mergeRelatorTermFields.js +33 -69
  157. package/dist/mergeRelatorTermFields.js.map +7 -1
  158. package/dist/mergeRelatorTermFields.test.js +44 -0
  159. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  160. package/dist/modernize-502.js +23 -55
  161. package/dist/modernize-502.js.map +7 -1
  162. package/dist/modernize-502.test.js +38 -0
  163. package/dist/modernize-502.test.js.map +7 -0
  164. package/dist/multiple-subfield-0.js +23 -48
  165. package/dist/multiple-subfield-0.js.map +7 -1
  166. package/dist/multiple-subfield-0.test.js +44 -0
  167. package/dist/multiple-subfield-0.test.js.map +7 -0
  168. package/dist/non-breaking-space.js +11 -32
  169. package/dist/non-breaking-space.js.map +7 -1
  170. package/dist/non-breaking-space.test.js +38 -0
  171. package/dist/non-breaking-space.test.js.map +7 -0
  172. package/dist/normalize-dashes.js +18 -37
  173. package/dist/normalize-dashes.js.map +7 -1
  174. package/dist/normalize-dashes.test.js +44 -0
  175. package/dist/normalize-dashes.test.js.map +7 -0
  176. package/dist/normalize-identifiers.js +54 -140
  177. package/dist/normalize-identifiers.js.map +7 -1
  178. package/dist/normalize-identifiers.test.js +44 -0
  179. package/dist/normalize-identifiers.test.js.map +7 -0
  180. package/dist/normalize-qualifying-information.js +23 -48
  181. package/dist/normalize-qualifying-information.js.map +7 -1
  182. package/dist/normalize-qualifying-information.test.js +44 -0
  183. package/dist/normalize-qualifying-information.test.js.map +7 -0
  184. package/dist/normalize-utf8-diacritics.js +19 -105
  185. package/dist/normalize-utf8-diacritics.js.map +7 -1
  186. package/dist/normalize-utf8-diacritics.test.js +44 -0
  187. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  188. package/dist/normalizeFieldForComparison.js +67 -158
  189. package/dist/normalizeFieldForComparison.js.map +7 -1
  190. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  191. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  192. package/dist/prepublicationUtils.js +58 -111
  193. package/dist/prepublicationUtils.js.map +7 -1
  194. package/dist/punctuation/index.js +56 -72
  195. package/dist/punctuation/index.js.map +7 -1
  196. package/dist/punctuation/rules/aut.js +372 -331
  197. package/dist/punctuation/rules/aut.js.map +7 -1
  198. package/dist/punctuation/rules/bib.js +420 -373
  199. package/dist/punctuation/rules/bib.js.map +7 -1
  200. package/dist/punctuation/rules/index.js +7 -21
  201. package/dist/punctuation/rules/index.js.map +7 -1
  202. package/dist/punctuation.test.js +44 -0
  203. package/dist/punctuation.test.js.map +7 -0
  204. package/dist/punctuation2.js +251 -800
  205. package/dist/punctuation2.js.map +7 -1
  206. package/dist/punctuation2.test.js +44 -0
  207. package/dist/punctuation2.test.js.map +7 -0
  208. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  209. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  210. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  211. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  212. package/dist/removeDuplicateDataFields.js +102 -202
  213. package/dist/removeDuplicateDataFields.js.map +7 -1
  214. package/dist/removeDuplicateDataFields.test.js +44 -0
  215. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  216. package/dist/removeInferiorDataFields.js +103 -227
  217. package/dist/removeInferiorDataFields.js.map +7 -1
  218. package/dist/removeInferiorDataFields.test.js +44 -0
  219. package/dist/removeInferiorDataFields.test.js.map +7 -0
  220. package/dist/resolvable-ext-references-melinda.js +25 -60
  221. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  222. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  223. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  224. package/dist/resolveOrphanedSubfield6s.js +33 -64
  225. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  226. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  227. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  228. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  229. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  230. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  231. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  232. package/dist/sort-tags.js +13 -25
  233. package/dist/sort-tags.js.map +7 -1
  234. package/dist/sort-tags.test.js +261 -0
  235. package/dist/sort-tags.test.js.map +7 -0
  236. package/dist/sortFields.js +152 -222
  237. package/dist/sortFields.js.map +7 -1
  238. package/dist/sortFields.test.js +44 -0
  239. package/dist/sortFields.test.js.map +7 -0
  240. package/dist/sortRelatorTerms.js +30 -68
  241. package/dist/sortRelatorTerms.js.map +7 -1
  242. package/dist/sortRelatorTerms.test.js +44 -0
  243. package/dist/sortRelatorTerms.test.js.map +7 -0
  244. package/dist/sortSubfields.js +102 -255
  245. package/dist/sortSubfields.js.map +7 -1
  246. package/dist/sortSubfields.test.js +44 -0
  247. package/dist/sortSubfields.test.js.map +7 -0
  248. package/dist/stripPunctuation.js +13 -36
  249. package/dist/stripPunctuation.js.map +7 -1
  250. package/dist/stripPunctuation.test.js +44 -0
  251. package/dist/stripPunctuation.test.js.map +7 -0
  252. package/dist/subfield-exclusion.js +28 -75
  253. package/dist/subfield-exclusion.js.map +7 -1
  254. package/dist/subfield-exclusion.test.js +471 -0
  255. package/dist/subfield-exclusion.test.js.map +7 -0
  256. package/dist/subfield6Utils.js +107 -269
  257. package/dist/subfield6Utils.js.map +7 -1
  258. package/dist/subfield8Utils.js +26 -50
  259. package/dist/subfield8Utils.js.map +7 -1
  260. package/dist/subfieldValueNormalizations.js +40 -74
  261. package/dist/subfieldValueNormalizations.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.test.js +45 -0
  263. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  264. package/dist/sync-007-and-300.js +22 -53
  265. package/dist/sync-007-and-300.js.map +7 -1
  266. package/dist/sync-007-and-300.test.js +44 -0
  267. package/dist/sync-007-and-300.test.js.map +7 -0
  268. package/dist/translate-terms.js +67 -155
  269. package/dist/translate-terms.js.map +7 -1
  270. package/dist/translate-terms.test.js +44 -0
  271. package/dist/translate-terms.test.js.map +7 -0
  272. package/dist/typeOfDate-008.js +10 -25
  273. package/dist/typeOfDate-008.js.map +7 -1
  274. package/dist/typeOfDate-008.test.js +40 -0
  275. package/dist/typeOfDate-008.test.js.map +7 -0
  276. package/dist/unicode-decomposition.js +94 -107
  277. package/dist/unicode-decomposition.js.map +7 -1
  278. package/dist/unicode-decomposition.test.js +94 -0
  279. package/dist/unicode-decomposition.test.js.map +7 -0
  280. package/dist/update-field-540.js +30 -75
  281. package/dist/update-field-540.js.map +7 -1
  282. package/dist/update-field-540.test.js +44 -0
  283. package/dist/update-field-540.test.js.map +7 -0
  284. package/dist/urn.js +55 -128
  285. package/dist/urn.js.map +7 -1
  286. package/dist/urn.test.js +44 -0
  287. package/dist/urn.test.js.map +7 -0
  288. package/dist/utils.js +72 -126
  289. package/dist/utils.js.map +7 -1
  290. package/eslint.config.mjs +1 -2
  291. package/package.json +21 -93
  292. package/src/access-rights.js +1 -1
  293. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  294. package/src/addMissingField041.js +1 -1
  295. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  296. package/src/addMissingField336.js +3 -3
  297. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  298. package/src/addMissingField337.js +2 -2
  299. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  300. package/src/addMissingField338.js +2 -2
  301. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  302. package/src/cyrillux-usemarcon-replacement.js +18 -18
  303. package/src/cyrillux-usemarcon-replacement.test.js +55 -0
  304. package/src/cyrillux.js +19 -12
  305. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  306. package/src/disambiguateSeriesStatements.js +2 -2
  307. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  308. package/src/double-commas.js +1 -1
  309. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  310. package/src/duplicates-ind1.js +1 -1
  311. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  312. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  313. package/src/ending-punctuation.js +1 -1
  314. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
  315. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  316. package/src/field-008-18-34-character-groups.js +2 -2
  317. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  318. package/src/field-505-separators.js +3 -3
  319. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  320. package/src/field-521-fix.js +2 -2
  321. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  322. package/src/field-exclusion.js +1 -1
  323. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  324. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  325. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  326. package/src/fix-33X.js +4 -4
  327. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  328. package/src/fix-country-codes.js +1 -1
  329. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  330. package/src/fix-language-codes.js +5 -5
  331. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  332. package/src/fixRelatorTerms.js +5 -5
  333. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  334. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  335. package/src/identical-fields.js +1 -1
  336. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  337. package/src/indicator-fixes.js +3 -3
  338. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  339. package/src/isbn-issn.js +1 -1
  340. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  341. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  342. package/src/merge-fields/controlSubfields.js +1 -1
  343. package/src/merge-fields/counterpartField.js +8 -9
  344. package/src/merge-fields/index.js +1 -1
  345. package/src/merge-fields/mergableIndicator.js +1 -1
  346. package/src/merge-fields/mergeField.js +6 -6
  347. package/src/merge-fields/mergeIndicator.js +1 -1
  348. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  349. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  350. package/src/merge-fields/mergeSubfield.js +4 -4
  351. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  352. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  353. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  354. package/src/mergeRelatorTermFields.js +5 -7
  355. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  356. package/src/modernize-502.js +1 -1
  357. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  358. package/src/multiple-subfield-0.js +3 -3
  359. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  360. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  361. package/src/normalize-dashes.js +2 -2
  362. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  363. package/src/normalize-identifiers.js +1 -1
  364. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  365. package/src/normalize-qualifying-information.js +2 -2
  366. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  367. package/src/normalize-utf8-diacritics.js +2 -2
  368. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  369. package/src/normalizeFieldForComparison.js +6 -6
  370. package/src/normalizeSubfieldValueForComparison.js +1 -1
  371. package/src/prepublicationUtils.js +4 -4
  372. package/src/punctuation/index.js +1 -1
  373. package/src/punctuation/rules/index.js +2 -2
  374. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  375. package/src/punctuation2.js +4 -4
  376. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  377. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  378. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  379. package/src/removeDuplicateDataFields.js +11 -19
  380. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  381. package/src/removeInferiorDataFields.js +11 -11
  382. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  383. package/src/resolvable-ext-references-melinda.js +1 -1
  384. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  385. package/src/resolveOrphanedSubfield6s.js +5 -5
  386. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  387. package/src/sanitize-vocabulary-source-codes.js +4 -4
  388. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  389. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  390. package/src/sortFields.js +4 -4
  391. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  392. package/src/sortRelatorTerms.js +3 -3
  393. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  394. package/src/sortSubfields.js +1 -1
  395. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  396. package/src/stripPunctuation.js +3 -3
  397. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  398. package/src/subfield-exclusion.js +1 -1
  399. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  400. package/src/subfield6Utils.js +6 -10
  401. package/src/subfield8Utils.js +4 -4
  402. package/src/subfieldValueNormalizations.js +3 -3
  403. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  404. package/src/sync-007-and-300.js +2 -2
  405. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  406. package/src/translate-terms.js +3 -3
  407. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  408. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  409. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  410. package/src/update-field-540.js +2 -2
  411. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  412. package/src/urn.js +2 -2
  413. package/src/{urn.spec.js → urn.test.js} +12 -13
  414. package/src/utils.js +3 -3
  415. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  416. package/test-fixtures/field-505-separators/03/record.json +3 -0
  417. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  418. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  419. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  420. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  421. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  422. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  426. package/dist/access-rights.spec.js +0 -195
  427. package/dist/access-rights.spec.js.map +0 -1
  428. package/dist/addMissingField041.spec.js +0 -45
  429. package/dist/addMissingField041.spec.js.map +0 -1
  430. package/dist/addMissingField336.spec.js +0 -45
  431. package/dist/addMissingField336.spec.js.map +0 -1
  432. package/dist/addMissingField337.spec.js +0 -43
  433. package/dist/addMissingField337.spec.js.map +0 -1
  434. package/dist/addMissingField338.spec.js +0 -45
  435. package/dist/addMissingField338.spec.js.map +0 -1
  436. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  437. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  438. package/dist/cyrillux.spec.js +0 -46
  439. package/dist/cyrillux.spec.js.map +0 -1
  440. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  441. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  442. package/dist/double-commas.spec.js +0 -73
  443. package/dist/double-commas.spec.js.map +0 -1
  444. package/dist/duplicates-ind1.spec.js +0 -45
  445. package/dist/duplicates-ind1.spec.js.map +0 -1
  446. package/dist/empty-fields.spec.js +0 -118
  447. package/dist/empty-fields.spec.js.map +0 -1
  448. package/dist/ending-punctuation.spec.js +0 -2654
  449. package/dist/ending-punctuation.spec.js.map +0 -1
  450. package/dist/ending-whitespace.spec.js +0 -42
  451. package/dist/ending-whitespace.spec.js.map +0 -1
  452. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  453. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  454. package/dist/field-505-separators.spec.js +0 -51
  455. package/dist/field-505-separators.spec.js.map +0 -1
  456. package/dist/field-521-fix.spec.js +0 -51
  457. package/dist/field-521-fix.spec.js.map +0 -1
  458. package/dist/field-exclusion.spec.js +0 -1054
  459. package/dist/field-exclusion.spec.js.map +0 -1
  460. package/dist/field-structure.spec.js +0 -535
  461. package/dist/field-structure.spec.js.map +0 -1
  462. package/dist/fields-present.spec.js +0 -121
  463. package/dist/fields-present.spec.js.map +0 -1
  464. package/dist/fix-33X.spec.js +0 -45
  465. package/dist/fix-33X.spec.js.map +0 -1
  466. package/dist/fix-country-codes.spec.js +0 -51
  467. package/dist/fix-country-codes.spec.js.map +0 -1
  468. package/dist/fix-language-codes.spec.js +0 -44
  469. package/dist/fix-language-codes.spec.js.map +0 -1
  470. package/dist/fixRelatorTerms.spec.js +0 -51
  471. package/dist/fixRelatorTerms.spec.js.map +0 -1
  472. package/dist/fixed-fields.spec.js +0 -140
  473. package/dist/fixed-fields.spec.js.map +0 -1
  474. package/dist/identical-fields.spec.js +0 -99
  475. package/dist/identical-fields.spec.js.map +0 -1
  476. package/dist/indicator-fixes.spec.js +0 -51
  477. package/dist/indicator-fixes.spec.js.map +0 -1
  478. package/dist/isbn-issn.spec.js +0 -595
  479. package/dist/isbn-issn.spec.js.map +0 -1
  480. package/dist/item-language.spec.js +0 -306
  481. package/dist/item-language.spec.js.map +0 -1
  482. package/dist/melindaCustomMergeFields.json +0 -5120
  483. package/dist/merge-fields.spec.js +0 -51
  484. package/dist/merge-fields.spec.js.map +0 -1
  485. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  486. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  487. package/dist/mergeRelatorTermFields.spec.js +0 -51
  488. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  489. package/dist/modernize-502.spec.js +0 -49
  490. package/dist/modernize-502.spec.js.map +0 -1
  491. package/dist/multiple-subfield-0.spec.js +0 -51
  492. package/dist/multiple-subfield-0.spec.js.map +0 -1
  493. package/dist/non-breaking-space.spec.js +0 -42
  494. package/dist/non-breaking-space.spec.js.map +0 -1
  495. package/dist/normalize-dashes.spec.js +0 -51
  496. package/dist/normalize-dashes.spec.js.map +0 -1
  497. package/dist/normalize-identifiers.spec.js +0 -51
  498. package/dist/normalize-identifiers.spec.js.map +0 -1
  499. package/dist/normalize-qualifying-information.spec.js +0 -51
  500. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  501. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  502. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  503. package/dist/punctuation.spec.js +0 -51
  504. package/dist/punctuation.spec.js.map +0 -1
  505. package/dist/punctuation2.spec.js +0 -51
  506. package/dist/punctuation2.spec.js.map +0 -1
  507. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  509. package/dist/removeDuplicateDataFields.spec.js +0 -51
  510. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  511. package/dist/removeInferiorDataFields.spec.js +0 -51
  512. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  513. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  514. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  515. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  516. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  517. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  518. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  519. package/dist/sort-tags.spec.js +0 -207
  520. package/dist/sort-tags.spec.js.map +0 -1
  521. package/dist/sortFields.spec.js +0 -51
  522. package/dist/sortFields.spec.js.map +0 -1
  523. package/dist/sortRelatorTerms.spec.js +0 -51
  524. package/dist/sortRelatorTerms.spec.js.map +0 -1
  525. package/dist/sortSubfields.spec.js +0 -52
  526. package/dist/sortSubfields.spec.js.map +0 -1
  527. package/dist/stripPunctuation.spec.js +0 -51
  528. package/dist/stripPunctuation.spec.js.map +0 -1
  529. package/dist/subfield-exclusion.spec.js +0 -523
  530. package/dist/subfield-exclusion.spec.js.map +0 -1
  531. package/dist/subfieldValueNormalizations.spec.js +0 -51
  532. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  533. package/dist/sync-007-and-300.spec.js +0 -51
  534. package/dist/sync-007-and-300.spec.js.map +0 -1
  535. package/dist/translate-terms.spec.js +0 -51
  536. package/dist/translate-terms.spec.js.map +0 -1
  537. package/dist/typeOfDate-008.spec.js +0 -47
  538. package/dist/typeOfDate-008.spec.js.map +0 -1
  539. package/dist/unicode-decomposition.spec.js +0 -91
  540. package/dist/unicode-decomposition.spec.js.map +0 -1
  541. package/dist/update-field-540.spec.js +0 -51
  542. package/dist/update-field-540.spec.js.map +0 -1
  543. package/dist/urn.spec.js +0 -52
  544. package/dist/urn.spec.js.map +0 -1
  545. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -0,0 +1,2290 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "../src/ending-punctuation.js";
4
+ import { describe, it } from "node:test";
5
+ describe("ending-punctuation", () => {
6
+ describe("#validate: Indicators and subfields", () => {
7
+ const recordValid = new MarcRecord({
8
+ leader: "",
9
+ fields: [
10
+ {
11
+ tag: "245",
12
+ ind1: " ",
13
+ ind2: " ",
14
+ subfields: [
15
+ { code: "a", value: "El\xE4m\xE4ni ja tutkimusretkeni / " },
16
+ { code: "c", value: "Roald Amundsen ; suomentanut Sulo Veikko Pekkola." },
17
+ { code: "6", value: "FOO" }
18
+ ]
19
+ },
20
+ {
21
+ tag: "337",
22
+ // Range 336-338
23
+ ind1: " ",
24
+ ind2: " ",
25
+ subfields: [
26
+ { code: "a", value: "k\xE4ytett\xE4viss\xE4 ilman laitetta" },
27
+ { code: "b", value: "n" },
28
+ { code: "2", value: "rdamedia" }
29
+ ]
30
+ },
31
+ {
32
+ tag: "500",
33
+ // Range 500-509
34
+ ind1: " ",
35
+ ind2: " ",
36
+ subfields: [{ code: "a", value: "FOO (Bar)" }]
37
+ }
38
+ ]
39
+ });
40
+ const recordInvalid = new MarcRecord({
41
+ leader: "",
42
+ fields: [
43
+ {
44
+ tag: "245",
45
+ ind1: " ",
46
+ ind2: " ",
47
+ subfields: [
48
+ { code: "a", value: "El\xE4m\xE4ni ja tutkimusretkeni / " },
49
+ { code: "c", value: "Roald Amundsen ; suomentanut Sulo Veikko Pekkola" },
50
+ { code: "6", value: "FOO" }
51
+ ]
52
+ },
53
+ {
54
+ tag: "337",
55
+ ind1: " ",
56
+ ind2: " ",
57
+ subfields: [
58
+ { code: "a", value: "k\xE4ytett\xE4viss\xE4 ilman laitetta" },
59
+ { code: "b", value: "n." },
60
+ // This can be abbreviation -> does not generate error
61
+ { code: "2", value: "rdamedia" }
62
+ ]
63
+ },
64
+ {
65
+ tag: "500",
66
+ ind1: " ",
67
+ ind2: " ",
68
+ subfields: [{ code: "a", value: "FOO (Bar)." }]
69
+ }
70
+ ]
71
+ });
72
+ const recordBroken = new MarcRecord({
73
+ leader: "",
74
+ fields: [
75
+ {
76
+ tag: "245",
77
+ ind1: " ",
78
+ ind2: " ",
79
+ subfields: [
80
+ { code: "a", value: "El\xE4m\xE4ni ja tutkimusretkeni / " },
81
+ { code: "c", value: "Roald Amundsen ; suomentanut Sulo Veikko Pekkola" },
82
+ { code: "6", value: "FOO" }
83
+ ]
84
+ },
85
+ {
86
+ tag: "337",
87
+ ind1: " ",
88
+ ind2: " ",
89
+ subfields: [
90
+ { code: "a", value: "k\xE4ytett\xE4viss\xE4 ilman laitetta" },
91
+ { code: "b", value: "n" },
92
+ // Dot removed from possible abbreviation as it cannot be removed in fixing
93
+ { code: "2", value: "rdamedia" }
94
+ ]
95
+ },
96
+ {
97
+ tag: "500",
98
+ ind1: " ",
99
+ ind2: " ",
100
+ subfields: [{ code: "a", value: "FOO (Bar)." }]
101
+ }
102
+ ]
103
+ });
104
+ it("Finds the record valid", async () => {
105
+ const validator = await validatorFactory();
106
+ const result = await validator.validate(recordValid);
107
+ assert.equal(result.valid, true);
108
+ });
109
+ it("Finds the record invalid", async () => {
110
+ const validator = await validatorFactory();
111
+ const result = await validator.validate(recordInvalid);
112
+ assert.deepEqual(result, {
113
+ message: ["Field 245 has invalid ending punctuation", "Field 500 has invalid ending punctuation"],
114
+ valid: false
115
+ });
116
+ });
117
+ it("Repairs the invalid record", async () => {
118
+ const validator = await validatorFactory();
119
+ const result = await validator.fix(recordBroken);
120
+ assert.equal(recordBroken.equalsTo(recordValid), true);
121
+ assert.deepEqual(result, {
122
+ message: ["Field 245 has invalid ending punctuation", "Field 500 has invalid ending punctuation"],
123
+ fix: ["Field 245 - Added punctuation to $c", "Field 500 - Removed double punctuation from $a"],
124
+ valid: false
125
+ });
126
+ });
127
+ });
128
+ describe("#specials", () => {
129
+ describe("#036 TRUE - only after subfield $b", () => {
130
+ const recordValid = new MarcRecord({
131
+ leader: "",
132
+ fields: [
133
+ {
134
+ tag: "036",
135
+ ind1: " ",
136
+ ind2: " ",
137
+ subfields: [
138
+ { code: "a", value: "CNRS 84115" },
139
+ { code: "b", value: "Centre national de la recherche scientifique." }
140
+ ]
141
+ }
142
+ ]
143
+ });
144
+ const recordValidOnlyA = new MarcRecord({
145
+ leader: "",
146
+ fields: [
147
+ {
148
+ tag: "036",
149
+ ind1: " ",
150
+ ind2: " ",
151
+ subfields: [{ code: "a", value: "CNRS 84115" }]
152
+ }
153
+ ]
154
+ });
155
+ it("Finds record valid - Punc $b", async () => {
156
+ const validator = await validatorFactory();
157
+ const result = await validator.validate(recordValid);
158
+ assert.equal(result.valid, true);
159
+ });
160
+ it("Finds record valid - Only $a without punc", async () => {
161
+ const validator = await validatorFactory();
162
+ const result = await validator.validate(recordValidOnlyA);
163
+ assert.equal(result.valid, true);
164
+ });
165
+ const recordInvalid = new MarcRecord({
166
+ leader: "",
167
+ fields: [
168
+ {
169
+ tag: "036",
170
+ ind1: " ",
171
+ ind2: " ",
172
+ subfields: [
173
+ { code: "a", value: "CNRS 84115" },
174
+ { code: "b", value: "Centre national de la recherche scientifique" }
175
+ ]
176
+ }
177
+ ]
178
+ });
179
+ const recordInvalidOnlyA = new MarcRecord({
180
+ leader: "",
181
+ fields: [
182
+ {
183
+ tag: "036",
184
+ ind1: " ",
185
+ ind2: " ",
186
+ subfields: [{ code: "a", value: "CNRS 84115." }]
187
+ // $a is register number, no change for abbreviation
188
+ }
189
+ ]
190
+ });
191
+ it("Finds record invalid - No punc $b", async () => {
192
+ const validator = await validatorFactory();
193
+ const result = await validator.validate(recordInvalid);
194
+ assert.deepEqual(result, {
195
+ message: ["Field 036 has invalid ending punctuation"],
196
+ valid: false
197
+ });
198
+ });
199
+ it("Finds record invalid - Only $a with punc", async () => {
200
+ const validator = await validatorFactory();
201
+ const result = await validator.validate(recordInvalidOnlyA);
202
+ assert.deepEqual(result, {
203
+ message: ["Field 036 has invalid ending punctuation"],
204
+ valid: false
205
+ });
206
+ });
207
+ it("Repairs the invalid record - Add punc $b", async () => {
208
+ const validator = await validatorFactory();
209
+ const result = await validator.fix(recordInvalid);
210
+ assert.equal(recordInvalid.equalsTo(recordValid), true);
211
+ assert.deepEqual(result, {
212
+ message: ["Field 036 has invalid ending punctuation"],
213
+ fix: ["Field 036 - Added punctuation to $b"],
214
+ valid: false
215
+ });
216
+ });
217
+ it("Repairs the invalid record - Removes punc $a (register)", async () => {
218
+ const validator = await validatorFactory();
219
+ const result = await validator.fix(recordInvalidOnlyA);
220
+ assert.equal(recordInvalidOnlyA.equalsTo(recordValidOnlyA), true);
221
+ assert.deepEqual(result, {
222
+ message: ["Field 036 has invalid ending punctuation"],
223
+ fix: ["Field 036 - Removed punctuation from $a"],
224
+ valid: false
225
+ });
226
+ });
227
+ });
228
+ describe("#242 TRUE - if last subfield $y, punc before it", () => {
229
+ const recordValidOnlyA = new MarcRecord({
230
+ leader: "",
231
+ fields: [
232
+ {
233
+ tag: "242",
234
+ ind1: " ",
235
+ ind2: " ",
236
+ subfields: [
237
+ { code: "a", value: "World of art." },
238
+ { code: "y", value: "eng" }
239
+ ]
240
+ }
241
+ ]
242
+ });
243
+ const recordValidMultiple = new MarcRecord({
244
+ leader: "",
245
+ fields: [
246
+ {
247
+ tag: "242",
248
+ ind1: " ",
249
+ ind2: " ",
250
+ subfields: [
251
+ { code: "a", value: "Annals of chemistry." },
252
+ { code: "n", value: "Series C," },
253
+ { code: "p", value: "Organic chemistry and biochemistry." },
254
+ { code: "y", value: "eng" }
255
+ ]
256
+ }
257
+ ]
258
+ });
259
+ const recordValidWithoutY = new MarcRecord({
260
+ leader: "",
261
+ fields: [
262
+ {
263
+ tag: "242",
264
+ ind1: " ",
265
+ ind2: " ",
266
+ subfields: [{ code: "a", value: "World of art." }]
267
+ }
268
+ ]
269
+ });
270
+ it("Finds record valid - Punc $a", async () => {
271
+ const validator = await validatorFactory();
272
+ const result = await validator.validate(recordValidOnlyA);
273
+ assert.equal(result.valid, true);
274
+ });
275
+ it("Finds record valid - Punc $p", async () => {
276
+ const validator = await validatorFactory();
277
+ const result = await validator.validate(recordValidMultiple);
278
+ assert.equal(result.valid, true);
279
+ });
280
+ it("Finds record valid - Punc $a without $y", async () => {
281
+ const validator = await validatorFactory();
282
+ const result = await validator.validate(recordValidWithoutY);
283
+ assert.equal(result.valid, true);
284
+ });
285
+ const recordInvalidOnlyAMissingA = new MarcRecord({
286
+ leader: "",
287
+ fields: [
288
+ {
289
+ tag: "242",
290
+ ind1: " ",
291
+ ind2: " ",
292
+ subfields: [
293
+ { code: "a", value: "World of art" },
294
+ { code: "y", value: "eng" }
295
+ ]
296
+ }
297
+ ]
298
+ });
299
+ const recordInvalidOnlyAPuncY = new MarcRecord({
300
+ leader: "",
301
+ fields: [
302
+ {
303
+ tag: "242",
304
+ ind1: " ",
305
+ ind2: " ",
306
+ subfields: [
307
+ { code: "a", value: "World of art." },
308
+ { code: "y", value: "eng." }
309
+ // $y is also checked as rule is explicit
310
+ ]
311
+ }
312
+ ]
313
+ });
314
+ const recordInvalidOnlyAMissingAPuncY = new MarcRecord({
315
+ leader: "",
316
+ fields: [
317
+ {
318
+ tag: "242",
319
+ ind1: " ",
320
+ ind2: " ",
321
+ subfields: [
322
+ { code: "a", value: "World of art" },
323
+ { code: "y", value: "eng." }
324
+ // $y is also checked as rule is explicit
325
+ ]
326
+ }
327
+ ]
328
+ });
329
+ const recordValidMultipleMissingP = new MarcRecord({
330
+ leader: "",
331
+ fields: [
332
+ {
333
+ tag: "242",
334
+ ind1: " ",
335
+ ind2: " ",
336
+ subfields: [
337
+ { code: "a", value: "Annals of chemistry." },
338
+ { code: "n", value: "Series C," },
339
+ { code: "p", value: "Organic chemistry and biochemistry" },
340
+ { code: "y", value: "eng" }
341
+ ]
342
+ }
343
+ ]
344
+ });
345
+ const recordValidWithoutYMissingA = new MarcRecord({
346
+ leader: "",
347
+ fields: [
348
+ {
349
+ tag: "242",
350
+ ind1: " ",
351
+ ind2: " ",
352
+ subfields: [{ code: "a", value: "World of art" }]
353
+ }
354
+ ]
355
+ });
356
+ it("Finds record invalid - No punc at $a (only before $y)", async () => {
357
+ const validator = await validatorFactory();
358
+ const result = await validator.validate(recordInvalidOnlyAMissingA);
359
+ assert.deepEqual(result, {
360
+ message: ["Field 242 has invalid ending punctuation"],
361
+ valid: false
362
+ });
363
+ });
364
+ it("Finds record invalid - Punc at $y (Language field)", async () => {
365
+ const validator = await validatorFactory();
366
+ const result = await validator.validate(recordInvalidOnlyAPuncY);
367
+ assert.deepEqual(result, {
368
+ message: ["Field 242 has invalid ending punctuation"],
369
+ valid: false
370
+ });
371
+ });
372
+ it("Finds record invalid - No punc at $a & punc $y", async () => {
373
+ const validator = await validatorFactory();
374
+ const result = await validator.validate(recordInvalidOnlyAMissingAPuncY);
375
+ assert.deepEqual(result, {
376
+ message: ["Field 242 has invalid ending punctuation", "Field 242 has invalid ending punctuation"],
377
+ valid: false
378
+ });
379
+ });
380
+ it("Finds record invalid - No punc $p (last before $y)", async () => {
381
+ const validator = await validatorFactory();
382
+ const result = await validator.validate(recordValidMultipleMissingP);
383
+ assert.deepEqual(result, {
384
+ message: ["Field 242 has invalid ending punctuation"],
385
+ valid: false
386
+ });
387
+ });
388
+ it("Finds record invalid - No punc $a (only)", async () => {
389
+ const validator = await validatorFactory();
390
+ const result = await validator.validate(recordValidWithoutYMissingA);
391
+ assert.deepEqual(result, {
392
+ message: ["Field 242 has invalid ending punctuation"],
393
+ valid: false
394
+ });
395
+ });
396
+ it("Repairs the invalid record - Add punc $a", async () => {
397
+ const validator = await validatorFactory();
398
+ const result = await validator.fix(recordInvalidOnlyAMissingA);
399
+ assert.equal(recordInvalidOnlyAMissingA.equalsTo(recordValidOnlyA), true);
400
+ assert.deepEqual(result, {
401
+ message: ["Field 242 has invalid ending punctuation"],
402
+ fix: ["Field 242 - Added punctuation to $a"],
403
+ valid: false
404
+ });
405
+ });
406
+ it("Repairs the invalid record - Remove punc $y (Language field)", async () => {
407
+ const validator = await validatorFactory();
408
+ const result = await validator.fix(recordInvalidOnlyAPuncY);
409
+ assert.equal(recordInvalidOnlyAPuncY.equalsTo(recordValidOnlyA), true);
410
+ assert.deepEqual(result, {
411
+ message: ["Field 242 has invalid ending punctuation"],
412
+ fix: ["Field 242 - Removed punctuation from $y"],
413
+ valid: false
414
+ });
415
+ });
416
+ it("Repairs the invalid record - Add punc $a & remove punc $y (Language field)", async () => {
417
+ const validator = await validatorFactory();
418
+ const result = await validator.fix(recordInvalidOnlyAMissingAPuncY);
419
+ assert.equal(recordInvalidOnlyAMissingAPuncY.equalsTo(recordValidOnlyA), true);
420
+ assert.deepEqual(result, {
421
+ message: ["Field 242 has invalid ending punctuation", "Field 242 has invalid ending punctuation"],
422
+ fix: ["Field 242 - Removed punctuation from $y", "Field 242 - Added punctuation to $a"],
423
+ valid: false
424
+ });
425
+ });
426
+ it("Repairs the invalid record - Add punc $p", async () => {
427
+ const validator = await validatorFactory();
428
+ const result = await validator.fix(recordValidMultipleMissingP);
429
+ assert.equal(recordValidMultipleMissingP.equalsTo(recordValidMultiple), true);
430
+ assert.deepEqual(result, {
431
+ message: ["Field 242 has invalid ending punctuation"],
432
+ fix: ["Field 242 - Added punctuation to $p"],
433
+ valid: false
434
+ });
435
+ });
436
+ it("Repairs the invalid record - Add punc $a", async () => {
437
+ const validator = await validatorFactory();
438
+ const result = await validator.fix(recordValidWithoutYMissingA);
439
+ assert.equal(recordValidWithoutYMissingA.equalsTo(recordValidWithoutY), true);
440
+ assert.deepEqual(result, {
441
+ message: ["Field 242 has invalid ending punctuation"],
442
+ fix: ["Field 242 - Added punctuation to $a"],
443
+ valid: false
444
+ });
445
+ });
446
+ });
447
+ describe("#260 TRUE - Punc only if last subfield c", () => {
448
+ const recordValidEndC = new MarcRecord({
449
+ leader: "",
450
+ fields: [
451
+ {
452
+ tag: "260",
453
+ ind1: " ",
454
+ ind2: " ",
455
+ subfields: [
456
+ { code: "a", value: "Helsinki" },
457
+ { code: "b", value: "Suomen atk-kustannus," },
458
+ { code: "c", value: "1982." }
459
+ ]
460
+ }
461
+ ]
462
+ });
463
+ const recordValidEndG = new MarcRecord({
464
+ leader: "",
465
+ fields: [
466
+ {
467
+ tag: "260",
468
+ ind1: " ",
469
+ ind2: " ",
470
+ subfields: [
471
+ { code: "a", value: "London" },
472
+ { code: "b", value: "Macmillan," },
473
+ { code: "c", value: "1971" },
474
+ { code: "g", value: "(1973 printing)" }
475
+ ]
476
+ }
477
+ ]
478
+ });
479
+ const recordValidEndB = new MarcRecord({
480
+ leader: "",
481
+ fields: [
482
+ {
483
+ tag: "260",
484
+ ind1: " ",
485
+ ind2: " ",
486
+ subfields: [
487
+ { code: "3", value: "June 1993-" },
488
+ { code: "a", value: "London" },
489
+ { code: "b", value: "Elle" }
490
+ ]
491
+ }
492
+ ]
493
+ });
494
+ it("Finds record valid - Punc $c", async () => {
495
+ const validator = await validatorFactory();
496
+ const result = await validator.validate(recordValidEndC);
497
+ assert.equal(result.valid, true);
498
+ });
499
+ it("Finds record valid - Punc char $g (after $c)", async () => {
500
+ const validator = await validatorFactory();
501
+ const result = await validator.validate(recordValidEndG);
502
+ assert.equal(result.valid, true);
503
+ });
504
+ it("Finds record valid - No punc $b", async () => {
505
+ const validator = await validatorFactory();
506
+ const result = await validator.validate(recordValidEndB);
507
+ assert.equal(result.valid, true);
508
+ });
509
+ const recordInvalidEndC = new MarcRecord({
510
+ leader: "",
511
+ fields: [
512
+ {
513
+ tag: "260",
514
+ ind1: " ",
515
+ ind2: " ",
516
+ subfields: [
517
+ { code: "a", value: "Helsinki" },
518
+ { code: "b", value: "Suomen atk-kustannus," },
519
+ { code: "c", value: "1982" }
520
+ ]
521
+ }
522
+ ]
523
+ });
524
+ const recordInvalidEndGDouble = new MarcRecord({
525
+ leader: "",
526
+ fields: [
527
+ {
528
+ tag: "260",
529
+ ind1: " ",
530
+ ind2: " ",
531
+ subfields: [
532
+ { code: "a", value: "London" },
533
+ { code: "b", value: "Macmillan," },
534
+ { code: "c", value: "1971" },
535
+ { code: "g", value: "(1973 printing)." }
536
+ ]
537
+ }
538
+ ]
539
+ });
540
+ it("Finds record invalid", async () => {
541
+ const validator = await validatorFactory();
542
+ const result = await validator.validate(recordInvalidEndC);
543
+ assert.deepEqual(result, {
544
+ message: ["Field 260 has invalid ending punctuation"],
545
+ valid: false
546
+ });
547
+ });
548
+ it("Finds record invalid", async () => {
549
+ const validator = await validatorFactory();
550
+ const result = await validator.validate(recordInvalidEndGDouble);
551
+ assert.deepEqual(result, {
552
+ message: ["Field 260 has invalid ending punctuation"],
553
+ valid: false
554
+ });
555
+ });
556
+ it("Repairs the invalid record - Add punc $c", async () => {
557
+ const validator = await validatorFactory();
558
+ const result = await validator.fix(recordInvalidEndC);
559
+ assert.equal(recordInvalidEndC.equalsTo(recordValidEndC), true);
560
+ assert.deepEqual(result, {
561
+ message: ["Field 260 has invalid ending punctuation"],
562
+ fix: ["Field 260 - Added punctuation to $c"],
563
+ valid: false
564
+ });
565
+ });
566
+ it("Repairs the invalid record - Remove double punc $g", async () => {
567
+ const validator = await validatorFactory();
568
+ const result = await validator.fix(recordInvalidEndGDouble);
569
+ assert.equal(recordInvalidEndGDouble.equalsTo(recordValidEndG), true);
570
+ assert.deepEqual(result, {
571
+ message: ["Field 260 has invalid ending punctuation"],
572
+ fix: ["Field 260 - Removed double punctuation from $g"],
573
+ valid: false
574
+ });
575
+ });
576
+ });
577
+ describe("#264 TRUE - If ind2 === 0, 1, 2 or 3, punc at the end", () => {
578
+ const recordValidInd2v1 = new MarcRecord({
579
+ leader: "",
580
+ fields: [
581
+ {
582
+ tag: "264",
583
+ ind1: "#",
584
+ ind2: "1",
585
+ subfields: [
586
+ { code: "a", value: "Helsinki" },
587
+ { code: "b", value: "Helsingin yliopisto" },
588
+ { code: "c", value: "1995-2006." }
589
+ ]
590
+ }
591
+ ]
592
+ });
593
+ const recordValidInd2v1Short = new MarcRecord({
594
+ leader: "",
595
+ fields: [
596
+ {
597
+ tag: "264",
598
+ ind1: "#",
599
+ ind2: "1",
600
+ subfields: [
601
+ { code: "a", value: "Helsinki" },
602
+ { code: "b", value: "Helsingin yliopisto" },
603
+ { code: "c", value: "1995-" }
604
+ ]
605
+ }
606
+ ]
607
+ });
608
+ const recordValidInd2v2WithoutC = new MarcRecord({
609
+ leader: "",
610
+ fields: [
611
+ {
612
+ tag: "264",
613
+ ind1: "#",
614
+ ind2: "2",
615
+ subfields: [
616
+ { code: "a", value: "Kouvola" },
617
+ { code: "b", value: "Nuorisovirasto" }
618
+ ]
619
+ }
620
+ ]
621
+ });
622
+ const recordValidCopyright = new MarcRecord({
623
+ leader: "",
624
+ fields: [
625
+ {
626
+ tag: "264",
627
+ ind1: " ",
628
+ ind2: "4",
629
+ subfields: [
630
+ { code: "a", value: "Helsinki : " },
631
+ { code: "b", value: "Suomen poliisikoirayhdistys." },
632
+ { code: "c", value: "\xA9 1974" }
633
+ ]
634
+ }
635
+ ]
636
+ });
637
+ it("Finds record valid - Ind2 = 1, $c 1995-2006.", async () => {
638
+ const validator = await validatorFactory();
639
+ const result = await validator.validate(recordValidInd2v1);
640
+ assert.equal(result.valid, true);
641
+ });
642
+ it("Finds record valid - Ind2 = 1, $c 1995-", async () => {
643
+ const validator = await validatorFactory();
644
+ const result = await validator.validate(recordValidInd2v1Short);
645
+ assert.equal(result.valid, true);
646
+ });
647
+ it("Finds record valid - Ind2 = 2, no $c", async () => {
648
+ const validator = await validatorFactory();
649
+ const result = await validator.validate(recordValidInd2v2WithoutC);
650
+ assert.equal(result.valid, true);
651
+ });
652
+ it("Finds record valid - Ind2 = 4, copyright", async () => {
653
+ const validator = await validatorFactory();
654
+ const result = await validator.validate(recordValidCopyright);
655
+ assert.equal(result.valid, true);
656
+ });
657
+ const recordInvalidInd2v1 = new MarcRecord({
658
+ leader: "",
659
+ fields: [
660
+ {
661
+ tag: "264",
662
+ ind1: "#",
663
+ ind2: "1",
664
+ subfields: [
665
+ { code: "a", value: "Helsinki" },
666
+ { code: "b", value: "Helsingin yliopisto" },
667
+ { code: "c", value: "1995-2006" }
668
+ ]
669
+ }
670
+ ]
671
+ });
672
+ const recordInvalidCopyrightCExtra = new MarcRecord({
673
+ leader: "",
674
+ fields: [
675
+ {
676
+ tag: "264",
677
+ ind1: " ",
678
+ ind2: "4",
679
+ subfields: [
680
+ { code: "a", value: "Helsinki : " },
681
+ { code: "b", value: "Suomen poliisikoirayhdistys." },
682
+ { code: "c", value: "\xA9 1974." }
683
+ ]
684
+ }
685
+ ]
686
+ });
687
+ it("Finds record invalid - No punc $c", async () => {
688
+ const validator = await validatorFactory();
689
+ const result = await validator.validate(recordInvalidInd2v1);
690
+ assert.deepEqual(result, {
691
+ message: ["Field 264 has invalid ending punctuation"],
692
+ valid: false
693
+ });
694
+ });
695
+ it("Finds record invalid - Ind2 = 4, copyright, extra punc $c", async () => {
696
+ const validator = await validatorFactory();
697
+ const result = await validator.validate(recordInvalidCopyrightCExtra);
698
+ assert.deepEqual(result, {
699
+ message: ["Field 264 has invalid ending punctuation"],
700
+ valid: false
701
+ });
702
+ });
703
+ it("Repairs the invalid record - Add punc $c", async () => {
704
+ const validator = await validatorFactory();
705
+ const result = await validator.fix(recordInvalidInd2v1);
706
+ assert.equal(recordInvalidInd2v1.equalsTo(recordValidInd2v1), true);
707
+ assert.deepEqual(result, {
708
+ message: ["Field 264 has invalid ending punctuation"],
709
+ fix: ["Field 264 - Added punctuation to $c"],
710
+ valid: false
711
+ });
712
+ });
713
+ it("Repairs the invalid record - Remove punc $c ($c has \xA9, should not have punc)", async () => {
714
+ const validator = await validatorFactory();
715
+ const result = await validator.fix(recordInvalidCopyrightCExtra);
716
+ assert.equal(recordInvalidCopyrightCExtra.equalsTo(recordValidCopyright), true);
717
+ assert.deepEqual(result, {
718
+ message: ["Field 264 has invalid ending punctuation"],
719
+ fix: ["Field 264 - Removed punctuation from $c"],
720
+ valid: false
721
+ });
722
+ });
723
+ });
724
+ describe("#340 TRUE - Punc at $b always and to last of [$a, $d, $e, $f, $h, $i]", () => {
725
+ const recordValidA = new MarcRecord({
726
+ leader: "",
727
+ fields: [
728
+ {
729
+ tag: "340",
730
+ ind1: " ",
731
+ ind2: " ",
732
+ subfields: [{ code: "a", value: "marble." }]
733
+ }
734
+ ]
735
+ });
736
+ const recordValidAB = new MarcRecord({
737
+ leader: "",
738
+ fields: [
739
+ {
740
+ tag: "340",
741
+ ind1: " ",
742
+ ind2: " ",
743
+ subfields: [
744
+ { code: "a", value: "parchment." },
745
+ // This punc doesn't match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/3XX.htm#340
746
+ { code: "b", value: "20 cm. folded to 10 x 12 cm." }
747
+ ]
748
+ }
749
+ ]
750
+ });
751
+ const recordValidDD = new MarcRecord({
752
+ leader: "",
753
+ fields: [
754
+ {
755
+ tag: "340",
756
+ ind1: " ",
757
+ ind2: " ",
758
+ subfields: [
759
+ { code: "d", value: "handwritten" },
760
+ { code: "d", value: "typed." }
761
+ ]
762
+ }
763
+ ]
764
+ });
765
+ const recordValidComplex = new MarcRecord({
766
+ leader: "",
767
+ fields: [
768
+ {
769
+ tag: "340",
770
+ ind1: " ",
771
+ ind2: " ",
772
+ subfields: [
773
+ { code: "a", value: "wove paper" },
774
+ { code: "c", value: "ink" },
775
+ { code: "c", value: "gouache" },
776
+ { code: "d", value: "lithography" },
777
+ { code: "d", value: "collage." },
778
+ // This punc doesn't match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/3XX.htm#340
779
+ { code: "g", value: "polychrome" }
780
+ ]
781
+ }
782
+ ]
783
+ });
784
+ const recordValidJ2 = new MarcRecord({
785
+ leader: "",
786
+ fields: [
787
+ {
788
+ tag: "340",
789
+ ind1: " ",
790
+ ind2: " ",
791
+ subfields: [
792
+ { code: "j", value: "original" },
793
+ { code: "2", value: "rda" }
794
+ ]
795
+ }
796
+ ]
797
+ });
798
+ it("Finds record valid - Punc $a (only)", async () => {
799
+ const validator = await validatorFactory();
800
+ const result = await validator.validate(recordValidA);
801
+ assert.equal(result.valid, true);
802
+ });
803
+ it("Finds record valid - Punc $a (last) & punc $b (mandatory)", async () => {
804
+ const validator = await validatorFactory();
805
+ const result = await validator.validate(recordValidAB);
806
+ assert.equal(result.valid, true);
807
+ });
808
+ it("Finds record valid - Punc $d (last of two)", async () => {
809
+ const validator = await validatorFactory();
810
+ const result = await validator.validate(recordValidDD);
811
+ assert.equal(result.valid, true);
812
+ });
813
+ it("Finds record valid - Punc $d (last of two) followed by $g", async () => {
814
+ const validator = await validatorFactory();
815
+ const result = await validator.validate(recordValidComplex);
816
+ assert.equal(result.valid, true);
817
+ });
818
+ it("Finds record valid - No punc (not $b, nor from list)", async () => {
819
+ const validator = await validatorFactory();
820
+ const result = await validator.validate(recordValidJ2);
821
+ assert.equal(result.valid, true);
822
+ });
823
+ const recordInvalidA = new MarcRecord({
824
+ leader: "",
825
+ fields: [
826
+ {
827
+ tag: "340",
828
+ ind1: " ",
829
+ ind2: " ",
830
+ subfields: [{ code: "a", value: "marble" }]
831
+ }
832
+ ]
833
+ });
834
+ const recordInvalidAMissingB = new MarcRecord({
835
+ leader: "",
836
+ fields: [
837
+ {
838
+ tag: "340",
839
+ ind1: " ",
840
+ ind2: " ",
841
+ subfields: [
842
+ { code: "a", value: "parchment" },
843
+ // This punc doesn't match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/3XX.htm#340
844
+ { code: "b", value: "20 cm. folded to 10 x 12 cm." }
845
+ ]
846
+ }
847
+ ]
848
+ });
849
+ const recordInvalidABMissing = new MarcRecord({
850
+ leader: "",
851
+ fields: [
852
+ {
853
+ tag: "340",
854
+ ind1: " ",
855
+ ind2: " ",
856
+ subfields: [
857
+ { code: "a", value: "parchment." },
858
+ // This punc doesn't match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/3XX.htm#340
859
+ { code: "b", value: "20 cm. folded to 10 x 12 cm" }
860
+ ]
861
+ }
862
+ ]
863
+ });
864
+ const recordInvalidDDMissing = new MarcRecord({
865
+ leader: "",
866
+ fields: [
867
+ {
868
+ tag: "340",
869
+ ind1: " ",
870
+ ind2: " ",
871
+ subfields: [
872
+ { code: "d", value: "handwritten" },
873
+ { code: "d", value: "typed" }
874
+ ]
875
+ }
876
+ ]
877
+ });
878
+ const recordInvalidComplexDMissing = new MarcRecord({
879
+ leader: "",
880
+ fields: [
881
+ {
882
+ tag: "340",
883
+ ind1: " ",
884
+ ind2: " ",
885
+ subfields: [
886
+ { code: "a", value: "wove paper" },
887
+ { code: "c", value: "ink" },
888
+ { code: "c", value: "gouache" },
889
+ { code: "d", value: "lithography" },
890
+ { code: "d", value: "collage" },
891
+ // This punc doesn't match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/3XX.htm#340
892
+ { code: "g", value: "polychrome" }
893
+ ]
894
+ }
895
+ ]
896
+ });
897
+ it("Finds record invalid - No punc $a (only)", async () => {
898
+ const validator = await validatorFactory();
899
+ const result = await validator.validate(recordInvalidA);
900
+ assert.deepEqual(result, {
901
+ message: ["Field 340 has invalid ending punctuation"],
902
+ valid: false
903
+ });
904
+ });
905
+ it("Finds record invalid - No punc $a (last)", async () => {
906
+ const validator = await validatorFactory();
907
+ const result = await validator.validate(recordInvalidAMissingB);
908
+ assert.deepEqual(result, {
909
+ message: ["Field 340 has invalid ending punctuation"],
910
+ valid: false
911
+ });
912
+ });
913
+ it("Finds record invalid - No punc $b (mandatory)", async () => {
914
+ const validator = await validatorFactory();
915
+ const result = await validator.validate(recordInvalidABMissing);
916
+ assert.deepEqual(result, {
917
+ message: ["Field 340 has invalid ending punctuation"],
918
+ valid: false
919
+ });
920
+ });
921
+ it("Finds record invalid - No punc $d (last of two)", async () => {
922
+ const validator = await validatorFactory();
923
+ const result = await validator.validate(recordInvalidDDMissing);
924
+ assert.deepEqual(result, {
925
+ message: ["Field 340 has invalid ending punctuation"],
926
+ valid: false
927
+ });
928
+ });
929
+ it("Finds record invalid - No punc $d (last of two) followed by $g", async () => {
930
+ const validator = await validatorFactory();
931
+ const result = await validator.validate(recordInvalidComplexDMissing);
932
+ assert.deepEqual(result, {
933
+ message: ["Field 340 has invalid ending punctuation"],
934
+ valid: false
935
+ });
936
+ });
937
+ it("Repairs the invalid record - Add punc $a (only)", async () => {
938
+ const validator = await validatorFactory();
939
+ const result = await validator.fix(recordInvalidA);
940
+ assert.equal(recordInvalidA.equalsTo(recordInvalidA), true);
941
+ assert.deepEqual(result, {
942
+ message: ["Field 340 has invalid ending punctuation"],
943
+ fix: ["Field 340 - Added punctuation to $a"],
944
+ valid: false
945
+ });
946
+ });
947
+ it("Repairs the invalid record - Add punc $a (last)", async () => {
948
+ const validator = await validatorFactory();
949
+ const result = await validator.fix(recordInvalidAMissingB);
950
+ assert.equal(recordInvalidAMissingB.equalsTo(recordValidAB), true);
951
+ assert.deepEqual(result, {
952
+ message: ["Field 340 has invalid ending punctuation"],
953
+ fix: ["Field 340 - Added punctuation to $a"],
954
+ valid: false
955
+ });
956
+ });
957
+ it("Repairs the invalid record - Add punc $b (mandatory)", async () => {
958
+ const validator = await validatorFactory();
959
+ const result = await validator.fix(recordInvalidABMissing);
960
+ assert.equal(recordInvalidABMissing.equalsTo(recordValidAB), true);
961
+ assert.deepEqual(result, {
962
+ message: ["Field 340 has invalid ending punctuation"],
963
+ fix: ["Field 340 - Added punctuation to $b"],
964
+ valid: false
965
+ });
966
+ });
967
+ it("Repairs the invalid record - Add punc $d (last of two)", async () => {
968
+ const validator = await validatorFactory();
969
+ const result = await validator.fix(recordInvalidDDMissing);
970
+ assert.equal(recordInvalidDDMissing.equalsTo(recordValidDD), true);
971
+ assert.deepEqual(result, {
972
+ message: ["Field 340 has invalid ending punctuation"],
973
+ fix: ["Field 340 - Added punctuation to $d"],
974
+ valid: false
975
+ });
976
+ });
977
+ it("Repairs the invalid record - Add punc $d (last of list)", async () => {
978
+ const validator = await validatorFactory();
979
+ const result = await validator.fix(recordInvalidComplexDMissing);
980
+ assert.equal(recordInvalidComplexDMissing.equalsTo(recordInvalidComplexDMissing), true);
981
+ assert.deepEqual(result, {
982
+ message: ["Field 340 has invalid ending punctuation"],
983
+ fix: ["Field 340 - Added punctuation to $d"],
984
+ valid: false
985
+ });
986
+ });
987
+ });
988
+ describe("#520 TRUE - If last subfield $u, punc before it", () => {
989
+ const recordValid = new MarcRecord({
990
+ leader: "",
991
+ fields: [
992
+ {
993
+ tag: "520",
994
+ ind1: " ",
995
+ ind2: " ",
996
+ subfields: [{ code: "a", value: "Mediav\xE4kivalta ja sen yleis\xF6." }]
997
+ }
998
+ ]
999
+ });
1000
+ const recordValidWithU = new MarcRecord({
1001
+ leader: "",
1002
+ fields: [
1003
+ {
1004
+ tag: "520",
1005
+ ind1: " ",
1006
+ ind2: " ",
1007
+ subfields: [
1008
+ { code: "a", value: "Abstrakti." },
1009
+ // This does not match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/50X-53X.htm#520
1010
+ { code: "u", value: "http://www.ojp.usdoj.gov/bjs/abstract/cchrie98.htm" }
1011
+ ]
1012
+ }
1013
+ ]
1014
+ });
1015
+ const recordValidU = new MarcRecord({
1016
+ leader: "",
1017
+ fields: [
1018
+ {
1019
+ tag: "520",
1020
+ ind1: " ",
1021
+ ind2: " ",
1022
+ subfields: [
1023
+ { code: "a", value: "Abstrakti." },
1024
+ // This does not match example: https://www.kansalliskirjasto.fi/extra/marc21/bib/50X-53X.htm#520
1025
+ { code: "u", value: "http://www.ojp.usdoj.gov/bjs/abstract/cchrie98.htm." }
1026
+ ]
1027
+ }
1028
+ ]
1029
+ });
1030
+ it("Finds record valid - Punc $a (without $u)", async () => {
1031
+ const validator = await validatorFactory();
1032
+ const result = await validator.validate(recordValid);
1033
+ assert.equal(result.valid, true);
1034
+ });
1035
+ it("Finds record valid - Punc $a (with $u) ", async () => {
1036
+ const validator = await validatorFactory();
1037
+ const result = await validator.validate(recordValidWithU);
1038
+ assert.equal(result.valid, true);
1039
+ });
1040
+ it("Finds record valid - Punc $a & $u (punc at $u should be ignored) ", async () => {
1041
+ const validator = await validatorFactory();
1042
+ const result = await validator.validate(recordValidU);
1043
+ assert.equal(result.valid, true);
1044
+ });
1045
+ const recordInvalid = new MarcRecord({
1046
+ leader: "",
1047
+ fields: [
1048
+ {
1049
+ tag: "520",
1050
+ ind1: " ",
1051
+ ind2: " ",
1052
+ subfields: [{ code: "a", value: "Mediav\xE4kivalta ja sen yleis\xF6" }]
1053
+ }
1054
+ ]
1055
+ });
1056
+ const recordInvalidWithU = new MarcRecord({
1057
+ leader: "",
1058
+ fields: [
1059
+ {
1060
+ tag: "520",
1061
+ ind1: " ",
1062
+ ind2: " ",
1063
+ subfields: [
1064
+ { code: "a", value: "Abstrakti" },
1065
+ { code: "u", value: "http://www.ojp.usdoj.gov/bjs/abstract/cchrie98.htm" }
1066
+ ]
1067
+ }
1068
+ ]
1069
+ });
1070
+ it("Finds record invalid - No punc $a (without $u)", async () => {
1071
+ const validator = await validatorFactory();
1072
+ const result = await validator.validate(recordInvalid);
1073
+ assert.deepEqual(result, {
1074
+ message: ["Field 520 has invalid ending punctuation"],
1075
+ valid: false
1076
+ });
1077
+ });
1078
+ it("Finds record invalid - No punc $a (with $u)", async () => {
1079
+ const validator = await validatorFactory();
1080
+ const result = await validator.validate(recordInvalidWithU);
1081
+ assert.deepEqual(result, {
1082
+ message: ["Field 520 has invalid ending punctuation"],
1083
+ valid: false
1084
+ });
1085
+ });
1086
+ it("Repairs the invalid record - Add punc $a (only)", async () => {
1087
+ const validator = await validatorFactory();
1088
+ const result = await validator.fix(recordInvalid);
1089
+ assert.equal(recordInvalid.equalsTo(recordValid), true);
1090
+ assert.deepEqual(result, {
1091
+ message: ["Field 520 has invalid ending punctuation"],
1092
+ fix: ["Field 520 - Added punctuation to $a"],
1093
+ valid: false
1094
+ });
1095
+ });
1096
+ it("Repairs the invalid record - Add punc $a (last before $u)", async () => {
1097
+ const validator = await validatorFactory();
1098
+ const result = await validator.fix(recordInvalidWithU);
1099
+ assert.equal(recordInvalidWithU.equalsTo(recordValidWithU), true);
1100
+ assert.deepEqual(result, {
1101
+ message: ["Field 520 has invalid ending punctuation"],
1102
+ fix: ["Field 520 - Added punctuation to $a"],
1103
+ valid: false
1104
+ });
1105
+ });
1106
+ });
1107
+ describe("#538 TRUE - If last subfield $u, punc before it", () => {
1108
+ const recordValid = new MarcRecord({
1109
+ leader: "",
1110
+ fields: [
1111
+ {
1112
+ tag: "538",
1113
+ ind1: " ",
1114
+ ind2: " ",
1115
+ subfields: [
1116
+ { code: "a", value: "Project methodology for digital version" },
1117
+ { code: "i", value: "Technical details." },
1118
+ // This ended to ':' in examples, but it doesn't match statet rules: https://www.kansalliskirjasto.fi/extra/marc21/bib/53X-58X.htm#538
1119
+ { code: "u", value: "http://www.columbia.edu/dlc/linglung/methodology.html" }
1120
+ ]
1121
+ }
1122
+ ]
1123
+ });
1124
+ const recordValidPuncU = new MarcRecord({
1125
+ leader: "",
1126
+ fields: [
1127
+ {
1128
+ tag: "538",
1129
+ ind1: " ",
1130
+ ind2: " ",
1131
+ subfields: [
1132
+ { code: "a", value: "Project methodology for digital version" },
1133
+ { code: "i", value: "Technical details." },
1134
+ { code: "u", value: "http://www.columbia.edu/dlc/linglung/methodology.html." }
1135
+ ]
1136
+ }
1137
+ ]
1138
+ });
1139
+ const recordValidOnlyA = new MarcRecord({
1140
+ leader: "",
1141
+ fields: [
1142
+ {
1143
+ tag: "538",
1144
+ ind1: " ",
1145
+ ind2: " ",
1146
+ subfields: [{ code: "a", value: "SECAM-videolaite." }]
1147
+ }
1148
+ ]
1149
+ });
1150
+ it("Finds record valid - Punc $i (last before $u)", async () => {
1151
+ const validator = await validatorFactory();
1152
+ const result = await validator.validate(recordValid);
1153
+ assert.equal(result.valid, true);
1154
+ });
1155
+ it("Finds record valid - Punc $i & punc $u ($u is URL, should pass)", async () => {
1156
+ const validator = await validatorFactory();
1157
+ const result = await validator.validate(recordValidPuncU);
1158
+ assert.equal(result.valid, true);
1159
+ });
1160
+ it("Finds record valid - Punc $a (only)", async () => {
1161
+ const validator = await validatorFactory();
1162
+ const result = await validator.validate(recordValidOnlyA);
1163
+ assert.equal(result.valid, true);
1164
+ });
1165
+ const recordInvalidMissingI = new MarcRecord({
1166
+ leader: "",
1167
+ fields: [
1168
+ {
1169
+ tag: "538",
1170
+ ind1: " ",
1171
+ ind2: " ",
1172
+ subfields: [
1173
+ { code: "a", value: "Project methodology for digital version" },
1174
+ { code: "i", value: "Technical details" },
1175
+ { code: "u", value: "http://www.columbia.edu/dlc/linglung/methodology.html" }
1176
+ ]
1177
+ }
1178
+ ]
1179
+ });
1180
+ const recordInvalidI = new MarcRecord({
1181
+ leader: "",
1182
+ fields: [
1183
+ {
1184
+ tag: "538",
1185
+ ind1: " ",
1186
+ ind2: " ",
1187
+ subfields: [
1188
+ { code: "a", value: "Project methodology for digital version" },
1189
+ { code: "i", value: "Technical details:" },
1190
+ // This is actually like in examples, but it doesn't match statet rules: https://www.kansalliskirjasto.fi/extra/marc21/bib/53X-58X.htm#538
1191
+ { code: "u", value: "http://www.columbia.edu/dlc/linglung/methodology.html" }
1192
+ ]
1193
+ }
1194
+ ]
1195
+ });
1196
+ const recordInvalidOnlyA = new MarcRecord({
1197
+ leader: "",
1198
+ fields: [
1199
+ {
1200
+ tag: "538",
1201
+ ind1: " ",
1202
+ ind2: " ",
1203
+ subfields: [{ code: "a", value: "SECAM-videolaite" }]
1204
+ }
1205
+ ]
1206
+ });
1207
+ it("Finds record invalid - No punc $i (last before $u)", async () => {
1208
+ const validator = await validatorFactory();
1209
+ const result = await validator.validate(recordInvalidMissingI);
1210
+ assert.deepEqual(result, {
1211
+ message: ["Field 538 has invalid ending punctuation"],
1212
+ valid: false
1213
+ });
1214
+ });
1215
+ it('Finds record invalid - Invalid punc $i (":" not valid punc mark, but this is according example...)', async () => {
1216
+ const validator = await validatorFactory();
1217
+ const result = await validator.validate(recordInvalidI);
1218
+ assert.deepEqual(result, {
1219
+ message: ["Field 538 has invalid ending punctuation"],
1220
+ valid: false
1221
+ });
1222
+ });
1223
+ it("Finds record invalid - No punc $a (only)", async () => {
1224
+ const validator = await validatorFactory();
1225
+ const result = await validator.validate(recordInvalidOnlyA);
1226
+ assert.deepEqual(result, {
1227
+ message: ["Field 538 has invalid ending punctuation"],
1228
+ valid: false
1229
+ });
1230
+ });
1231
+ it("Repairs the invalid record - Add punc $i (last)", async () => {
1232
+ const validator = await validatorFactory();
1233
+ const result = await validator.fix(recordInvalidMissingI);
1234
+ assert.equal(recordInvalidMissingI.equalsTo(recordValid), true);
1235
+ assert.deepEqual(result, {
1236
+ message: ["Field 538 has invalid ending punctuation"],
1237
+ fix: ["Field 538 - Added punctuation to $i"],
1238
+ valid: false
1239
+ });
1240
+ });
1241
+ it("Repairs the invalid record - Add punc $a (only)", async () => {
1242
+ const validator = await validatorFactory();
1243
+ const result = await validator.fix(recordInvalidOnlyA);
1244
+ assert.equal(recordInvalidOnlyA.equalsTo(recordValidOnlyA), true);
1245
+ assert.deepEqual(result, {
1246
+ message: ["Field 538 has invalid ending punctuation"],
1247
+ fix: ["Field 538 - Added punctuation to $a"],
1248
+ valid: false
1249
+ });
1250
+ });
1251
+ });
1252
+ describe("#567 TRUE - After subfield $a, FALSE after others", () => {
1253
+ const recordValid = new MarcRecord({
1254
+ leader: "",
1255
+ fields: [
1256
+ {
1257
+ tag: "567",
1258
+ ind1: " ",
1259
+ ind2: " ",
1260
+ subfields: [{ code: "a", value: "Narratiivinen tutkimus." }]
1261
+ }
1262
+ ]
1263
+ });
1264
+ const recordValidWithoutA = new MarcRecord({
1265
+ leader: "",
1266
+ fields: [
1267
+ {
1268
+ tag: "567",
1269
+ ind1: " ",
1270
+ ind2: " ",
1271
+ subfields: [
1272
+ { code: "b", value: "Narrative inquiry" },
1273
+ { code: "2", value: "lcsh" }
1274
+ ]
1275
+ }
1276
+ ]
1277
+ });
1278
+ it("Finds record valid - Punc $a (only)", async () => {
1279
+ const validator = await validatorFactory();
1280
+ const result = await validator.validate(recordValid);
1281
+ assert.equal(result.valid, true);
1282
+ });
1283
+ it("Finds record valid - No punc $b (only data field)", async () => {
1284
+ const validator = await validatorFactory();
1285
+ const result = await validator.validate(recordValidWithoutA);
1286
+ assert.equal(result.valid, true);
1287
+ });
1288
+ const recordInvalid = new MarcRecord({
1289
+ leader: "",
1290
+ fields: [
1291
+ {
1292
+ tag: "567",
1293
+ ind1: " ",
1294
+ ind2: " ",
1295
+ subfields: [{ code: "a", value: "Narratiivinen tutkimus" }]
1296
+ }
1297
+ ]
1298
+ });
1299
+ const recordInvalidWithoutA = new MarcRecord({
1300
+ leader: "",
1301
+ fields: [
1302
+ {
1303
+ tag: "567",
1304
+ ind1: " ",
1305
+ ind2: " ",
1306
+ subfields: [
1307
+ { code: "b", value: "Narrative inquiry." },
1308
+ { code: "2", value: "lcsh" }
1309
+ ]
1310
+ }
1311
+ ]
1312
+ });
1313
+ it("Finds record invalid - No punc $a (only)", async () => {
1314
+ const validator = await validatorFactory();
1315
+ const result = await validator.validate(recordInvalid);
1316
+ assert.deepEqual(result, {
1317
+ message: ["Field 567 has invalid ending punctuation"],
1318
+ valid: false
1319
+ });
1320
+ });
1321
+ it("Finds record invalid - Punc $b (only data field)", async () => {
1322
+ const validator = await validatorFactory();
1323
+ const result = await validator.validate(recordInvalidWithoutA);
1324
+ assert.deepEqual(result, {
1325
+ message: ["Field 567 has invalid ending punctuation"],
1326
+ valid: false
1327
+ });
1328
+ });
1329
+ it("Repairs the invalid record - Add punc $a (only)", async () => {
1330
+ const validator = await validatorFactory();
1331
+ const result = await validator.fix(recordInvalid);
1332
+ assert.equal(recordInvalid.equalsTo(recordValid), true);
1333
+ assert.deepEqual(result, {
1334
+ message: ["Field 567 has invalid ending punctuation"],
1335
+ fix: ["Field 567 - Added punctuation to $a"],
1336
+ valid: false
1337
+ });
1338
+ });
1339
+ it("Repairs the invalid record - Remove punc $b (only data field)", async () => {
1340
+ const validator = await validatorFactory();
1341
+ const result = await validator.fix(recordInvalidWithoutA);
1342
+ assert.equal(recordInvalidWithoutA.equalsTo(recordValidWithoutA), true);
1343
+ assert.deepEqual(result, {
1344
+ message: ["Field 567 has invalid ending punctuation"],
1345
+ fix: ["Field 567 - Removed punctuation from $b"],
1346
+ valid: false
1347
+ });
1348
+ });
1349
+ });
1350
+ describe("#647-651 FALSE - If Finnish, else TRUE", () => {
1351
+ const recordValid647FastEndPunc = new MarcRecord({
1352
+ leader: "",
1353
+ fields: [
1354
+ {
1355
+ tag: "647",
1356
+ ind1: " ",
1357
+ ind2: "7",
1358
+ subfields: [
1359
+ { code: "a", value: "Hurricane Katrina" },
1360
+ { code: "d", value: "(2005)" },
1361
+ { code: "2", value: "fast" }
1362
+ ]
1363
+ }
1364
+ ]
1365
+ });
1366
+ const recordVali648dFinNo = new MarcRecord({
1367
+ leader: "",
1368
+ fields: [
1369
+ {
1370
+ tag: "648",
1371
+ ind1: " ",
1372
+ ind2: "7",
1373
+ subfields: [
1374
+ { code: "a", value: "1900-luku" },
1375
+ { code: "2", value: "yso/swe" }
1376
+ ]
1377
+ }
1378
+ ]
1379
+ });
1380
+ const recordValid648FastNo = new MarcRecord({
1381
+ leader: "",
1382
+ fields: [
1383
+ {
1384
+ tag: "648",
1385
+ ind1: " ",
1386
+ ind2: "7",
1387
+ subfields: [
1388
+ { code: "a", value: "1862" },
1389
+ { code: "2", value: "fast" }
1390
+ // https://www.kansalliskirjasto.fi/extra/marc21/bib/6XX.htm#648
1391
+ ]
1392
+ }
1393
+ ]
1394
+ });
1395
+ const recordValid650FinNo = new MarcRecord({
1396
+ leader: "",
1397
+ fields: [
1398
+ { tag: "650", ind1: " ", ind2: "7", subfields: [
1399
+ { code: "a", value: "kirjastot" },
1400
+ { code: "x", value: "atk-j\xE4rjestelm\xE4t" },
1401
+ { code: "2", value: "kauno/fin" }
1402
+ ] },
1403
+ { tag: "650", ind1: " ", ind2: "7", subfields: [
1404
+ { code: "a", value: "ajovalot" },
1405
+ { code: "2", value: "juho" }
1406
+ ] }
1407
+ ]
1408
+ });
1409
+ const recordValid650EngNoControl = new MarcRecord({
1410
+ leader: "",
1411
+ fields: [
1412
+ {
1413
+ tag: "650",
1414
+ ind1: " ",
1415
+ ind2: " ",
1416
+ subfields: [
1417
+ { code: "a", value: "Flour industry" },
1418
+ { code: "v", value: "Periodicals." }
1419
+ ]
1420
+ }
1421
+ ]
1422
+ });
1423
+ const recordValid650EngControl = new MarcRecord({
1424
+ leader: "",
1425
+ fields: [
1426
+ {
1427
+ tag: "650",
1428
+ ind1: " ",
1429
+ ind2: "7",
1430
+ subfields: [
1431
+ { code: "a", value: "Career Exploration." },
1432
+ { code: "2", value: "ericd" }
1433
+ ]
1434
+ }
1435
+ ]
1436
+ });
1437
+ it("Finds record valid - 647 Fast, punc char at end", async () => {
1438
+ const validator = await validatorFactory();
1439
+ const result = await validator.validate(recordValid647FastEndPunc);
1440
+ assert.equal(result.valid, true);
1441
+ });
1442
+ it("Finds record valid - 648 Finnish, without punc", async () => {
1443
+ const validator = await validatorFactory();
1444
+ const result = await validator.validate(recordVali648dFinNo);
1445
+ assert.equal(result.valid, true);
1446
+ });
1447
+ it("Finds record valid - 648 Fast, without punc", async () => {
1448
+ const validator = await validatorFactory();
1449
+ const result = await validator.validate(recordValid648FastNo);
1450
+ assert.equal(result.valid, true);
1451
+ });
1452
+ it("Finds record valid - 650 Finnish, without punc", async () => {
1453
+ const validator = await validatorFactory();
1454
+ const result = await validator.validate(recordValid650FinNo);
1455
+ assert.equal(result.valid, true);
1456
+ });
1457
+ it("Finds record valid - 650 English, punc (no control)", async () => {
1458
+ const validator = await validatorFactory();
1459
+ const result = await validator.validate(recordValid650EngNoControl);
1460
+ assert.equal(result.valid, true);
1461
+ });
1462
+ it("Finds record valid - 650 English, with punc", async () => {
1463
+ const validator = await validatorFactory();
1464
+ const result = await validator.validate(recordValid650EngControl);
1465
+ assert.equal(result.valid, true);
1466
+ });
1467
+ const recordInvalid647FastEndPunc = new MarcRecord({
1468
+ leader: "",
1469
+ fields: [
1470
+ {
1471
+ tag: "647",
1472
+ ind1: " ",
1473
+ ind2: "7",
1474
+ subfields: [
1475
+ { code: "a", value: "Hurricane Katrina" },
1476
+ { code: "d", value: "(2005)." },
1477
+ { code: "2", value: "fast" }
1478
+ ]
1479
+ }
1480
+ ]
1481
+ });
1482
+ const recordInvali648dFinYes = new MarcRecord({
1483
+ leader: "",
1484
+ fields: [
1485
+ {
1486
+ tag: "648",
1487
+ ind1: " ",
1488
+ ind2: "7",
1489
+ subfields: [
1490
+ { code: "a", value: "1900-luku." },
1491
+ { code: "2", value: "yso/swe" }
1492
+ ]
1493
+ }
1494
+ ]
1495
+ });
1496
+ const recordInvalid648FastYes = new MarcRecord({
1497
+ leader: "",
1498
+ fields: [
1499
+ {
1500
+ tag: "648",
1501
+ ind1: " ",
1502
+ ind2: "7",
1503
+ subfields: [
1504
+ { code: "a", value: "1862." },
1505
+ { code: "2", value: "fast" }
1506
+ ]
1507
+ }
1508
+ ]
1509
+ });
1510
+ const recordInvalid650FinYes = new MarcRecord({
1511
+ leader: "",
1512
+ fields: [
1513
+ { tag: "650", ind1: " ", ind2: "7", subfields: [
1514
+ { code: "a", value: "kirjastot" },
1515
+ { code: "x", value: "atk-j\xE4rjestelm\xE4t." },
1516
+ { code: "2", value: "kauno/fin" }
1517
+ ] },
1518
+ { tag: "650", ind1: " ", ind2: "7", subfields: [
1519
+ { code: "a", value: "ajovalot." },
1520
+ { code: "2", value: "juho" }
1521
+ ] }
1522
+ ]
1523
+ });
1524
+ const recordInvalid650EngNoControl = new MarcRecord({
1525
+ leader: "",
1526
+ fields: [
1527
+ {
1528
+ tag: "650",
1529
+ ind1: " ",
1530
+ ind2: " ",
1531
+ subfields: [
1532
+ { code: "a", value: "Flour industry" },
1533
+ { code: "v", value: "Periodicals" }
1534
+ ]
1535
+ }
1536
+ ]
1537
+ });
1538
+ const recordInvalid650EngControl = new MarcRecord({
1539
+ leader: "",
1540
+ fields: [
1541
+ {
1542
+ tag: "650",
1543
+ ind1: " ",
1544
+ ind2: "7",
1545
+ subfields: [
1546
+ { code: "a", value: "Career Exploration" },
1547
+ { code: "2", value: "ericd" }
1548
+ ]
1549
+ }
1550
+ ]
1551
+ });
1552
+ it("Finds record invalid - 647 Fast, dot at end", async () => {
1553
+ const validator = await validatorFactory();
1554
+ const result = await validator.validate(recordInvalid647FastEndPunc);
1555
+ assert.deepEqual(result, {
1556
+ message: ["Field 647 has invalid ending punctuation"],
1557
+ valid: false
1558
+ });
1559
+ });
1560
+ it("Finds record invalid - 648 Finnish, with punc", async () => {
1561
+ const validator = await validatorFactory();
1562
+ const result = await validator.validate(recordInvali648dFinYes);
1563
+ assert.deepEqual(result, {
1564
+ message: ["Field 648 has invalid ending punctuation"],
1565
+ valid: false
1566
+ });
1567
+ });
1568
+ it("Finds record invalid - 648 Fast, with punc", async () => {
1569
+ const validator = await validatorFactory();
1570
+ const result = await validator.validate(recordInvalid648FastYes);
1571
+ assert.deepEqual(result, {
1572
+ message: ["Field 648 has invalid ending punctuation"],
1573
+ valid: false
1574
+ });
1575
+ });
1576
+ const invalidField650Message = "Field 650 has invalid ending punctuation";
1577
+ it("Finds record invalid - 650 Finnish, with punc", async () => {
1578
+ const validator = await validatorFactory();
1579
+ const result = await validator.validate(recordInvalid650FinYes);
1580
+ assert.deepEqual(result, {
1581
+ message: [invalidField650Message, invalidField650Message],
1582
+ valid: false
1583
+ });
1584
+ });
1585
+ it("Finds record invalid - 650 !Finnish, without punc (no control)", async () => {
1586
+ const validator = await validatorFactory();
1587
+ const result = await validator.validate(recordInvalid650EngNoControl);
1588
+ assert.deepEqual(result, {
1589
+ message: [invalidField650Message],
1590
+ valid: false
1591
+ });
1592
+ });
1593
+ it("Finds record invalid - 650 !Finnish, without punc", async () => {
1594
+ const validator = await validatorFactory();
1595
+ const result = await validator.validate(recordInvalid650EngControl);
1596
+ assert.deepEqual(result, {
1597
+ message: ["Field 650 has invalid ending punctuation"],
1598
+ valid: false
1599
+ });
1600
+ });
1601
+ it("Repairs the invalid record - 647 Fast, removes double punc $d", async () => {
1602
+ const validator = await validatorFactory();
1603
+ const result = await validator.fix(recordInvalid647FastEndPunc);
1604
+ assert.equal(recordInvalid647FastEndPunc.equalsTo(recordValid647FastEndPunc), true);
1605
+ assert.deepEqual(result, {
1606
+ message: ["Field 647 has invalid ending punctuation"],
1607
+ fix: ["Field 647 - Removed double punctuation from $d"],
1608
+ valid: false
1609
+ });
1610
+ });
1611
+ it("Repairs the invalid record - 648 Finnish, removes punc $a", async () => {
1612
+ const validator = await validatorFactory();
1613
+ const result = await validator.fix(recordInvali648dFinYes);
1614
+ assert.equal(recordInvali648dFinYes.equalsTo(recordVali648dFinNo), true);
1615
+ assert.deepEqual(result, {
1616
+ message: ["Field 648 has invalid ending punctuation"],
1617
+ fix: ["Field 648 - Removed punctuation from $a"],
1618
+ valid: false
1619
+ });
1620
+ });
1621
+ it("Repairs the invalid record - 648 Fast, removes punc $a", async () => {
1622
+ const validator = await validatorFactory();
1623
+ const result = await validator.fix(recordInvalid648FastYes);
1624
+ assert.equal(recordInvalid648FastYes.equalsTo(recordValid648FastNo), true);
1625
+ assert.deepEqual(result, {
1626
+ message: ["Field 648 has invalid ending punctuation"],
1627
+ fix: ["Field 648 - Removed punctuation from $a"],
1628
+ valid: false
1629
+ });
1630
+ });
1631
+ it("Repairs the invalid record - 650 Finnish, removes punc $x", async () => {
1632
+ const validator = await validatorFactory();
1633
+ const result = await validator.fix(recordInvalid650FinYes);
1634
+ assert.equal(recordInvalid650FinYes.equalsTo(recordValid650FinNo), true);
1635
+ assert.deepEqual(result, {
1636
+ message: [invalidField650Message, invalidField650Message],
1637
+ fix: ["Field 650 - Removed punctuation from $x", "Field 650 - Removed punctuation from $a"],
1638
+ valid: false
1639
+ });
1640
+ });
1641
+ it("Repairs the invalid record - 650 !Finnish, add punc $v (no control)", async () => {
1642
+ const validator = await validatorFactory();
1643
+ const result = await validator.fix(recordInvalid650EngNoControl);
1644
+ assert.equal(recordInvalid650EngNoControl.equalsTo(recordValid650EngNoControl), true);
1645
+ assert.deepEqual(result, {
1646
+ message: ["Field 650 has invalid ending punctuation"],
1647
+ fix: ["Field 650 - Added punctuation to $v"],
1648
+ valid: false
1649
+ });
1650
+ });
1651
+ it("Repairs the invalid record - 650 !Finnish, add punc $a", async () => {
1652
+ const validator = await validatorFactory();
1653
+ const result = await validator.fix(recordInvalid650EngControl);
1654
+ assert.equal(recordInvalid650EngControl.equalsTo(recordValid650EngControl), true);
1655
+ assert.deepEqual(result, {
1656
+ message: ["Field 650 has invalid ending punctuation"],
1657
+ fix: ["Field 650 - Added punctuation to $a"],
1658
+ valid: false
1659
+ });
1660
+ });
1661
+ });
1662
+ describe("#654-662 TRUE - If finnish, else TRUE", () => {
1663
+ const recordValid655FinNo = new MarcRecord({
1664
+ leader: "",
1665
+ fields: [
1666
+ {
1667
+ tag: "655",
1668
+ ind1: " ",
1669
+ ind2: "7",
1670
+ subfields: [
1671
+ { code: "a", value: "kausijulkaisut" },
1672
+ { code: "2", value: "yso/eng" }
1673
+ ]
1674
+ }
1675
+ ]
1676
+ });
1677
+ const recordValid655FinNo2 = new MarcRecord({
1678
+ leader: "",
1679
+ fields: [
1680
+ {
1681
+ tag: "655",
1682
+ ind1: " ",
1683
+ ind2: "7",
1684
+ subfields: [
1685
+ { code: "a", value: "vironkielinen kirjallisuus" },
1686
+ { code: "2", value: "local" }
1687
+ ]
1688
+ }
1689
+ ]
1690
+ });
1691
+ const recordValid655EngYes = new MarcRecord({
1692
+ leader: "",
1693
+ fields: [
1694
+ {
1695
+ tag: "655",
1696
+ ind1: " ",
1697
+ ind2: "7",
1698
+ subfields: [
1699
+ { code: "a", value: "Bird's-eye views" },
1700
+ { code: "y", value: "1874." },
1701
+ { code: "2", value: "gmgpc" }
1702
+ ]
1703
+ }
1704
+ ]
1705
+ });
1706
+ const recordValid655EngYesNoControl = new MarcRecord({
1707
+ leader: "",
1708
+ fields: [
1709
+ {
1710
+ tag: "655",
1711
+ ind1: " ",
1712
+ ind2: " ",
1713
+ subfields: [{ code: "a", value: "Diaries." }]
1714
+ }
1715
+ ]
1716
+ });
1717
+ const recordValid656FinNo = new MarcRecord({
1718
+ leader: "",
1719
+ fields: [
1720
+ {
1721
+ tag: "656",
1722
+ ind1: " ",
1723
+ ind2: "7",
1724
+ subfields: [
1725
+ { code: "a", value: "kuvaamataidonopettajat" },
1726
+ { code: "2", value: "slm/eng" }
1727
+ ]
1728
+ }
1729
+ ]
1730
+ });
1731
+ const recordValid657EngYes = new MarcRecord({
1732
+ leader: "",
1733
+ fields: [
1734
+ {
1735
+ tag: "657",
1736
+ ind1: " ",
1737
+ ind2: "7",
1738
+ subfields: [
1739
+ { code: "a", value: "Personnel benefits management" },
1740
+ { code: "x", value: "Vital statistics" },
1741
+ { code: "z", value: "Love Canal, New York." },
1742
+ { code: "2", value: "New York State Management Functions Index" }
1743
+ ]
1744
+ }
1745
+ ]
1746
+ });
1747
+ const recordValid658EngYes = new MarcRecord({
1748
+ leader: "",
1749
+ fields: [
1750
+ {
1751
+ tag: "658",
1752
+ ind1: " ",
1753
+ ind2: " ",
1754
+ subfields: [
1755
+ { code: "a", value: "Math manipulatives" },
1756
+ { code: "d", value: "highly correlated." },
1757
+ { code: "2", value: "[source code]" }
1758
+ ]
1759
+ }
1760
+ ]
1761
+ });
1762
+ const recordValid662EngYes = new MarcRecord({
1763
+ leader: "",
1764
+ fields: [
1765
+ {
1766
+ tag: "662",
1767
+ ind1: " ",
1768
+ ind2: " ",
1769
+ subfields: [
1770
+ { code: "a", value: "Antarctica." },
1771
+ { code: "2", value: "lcsh/naf" }
1772
+ ]
1773
+ }
1774
+ ]
1775
+ });
1776
+ it("Finds record valid - 655 Finnish, no punc $a", async () => {
1777
+ const validator = await validatorFactory();
1778
+ const result = await validator.validate(recordValid655FinNo);
1779
+ assert.equal(result.valid, true);
1780
+ });
1781
+ it("Finds record valid - 655 Finnish, without punc", async () => {
1782
+ const validator = await validatorFactory();
1783
+ const result = await validator.validate(recordValid655FinNo2);
1784
+ assert.equal(result.valid, true);
1785
+ });
1786
+ it("Finds record valid - 655 English, with punc $y", async () => {
1787
+ const validator = await validatorFactory();
1788
+ const result = await validator.validate(recordValid655EngYes);
1789
+ assert.equal(result.valid, true);
1790
+ });
1791
+ it("Finds record valid - 655 English, with punc $a (no control)", async () => {
1792
+ const validator = await validatorFactory();
1793
+ const result = await validator.validate(recordValid655EngYesNoControl);
1794
+ assert.equal(result.valid, true);
1795
+ });
1796
+ it("Finds record valid - 656 Finnish, without punc $a", async () => {
1797
+ const validator = await validatorFactory();
1798
+ const result = await validator.validate(recordValid656FinNo);
1799
+ assert.equal(result.valid, true);
1800
+ });
1801
+ it("Finds record valid - 657 English, with punc $z", async () => {
1802
+ const validator = await validatorFactory();
1803
+ const result = await validator.validate(recordValid657EngYes);
1804
+ assert.equal(result.valid, true);
1805
+ });
1806
+ it("Finds record valid - 658 English, with punc $d", async () => {
1807
+ const validator = await validatorFactory();
1808
+ const result = await validator.validate(recordValid658EngYes);
1809
+ assert.equal(result.valid, true);
1810
+ });
1811
+ it("Finds record valid - 662 English, with punc $a", async () => {
1812
+ const validator = await validatorFactory();
1813
+ const result = await validator.validate(recordValid662EngYes);
1814
+ assert.equal(result.valid, true);
1815
+ });
1816
+ const recordInvalid655FinYes = new MarcRecord({
1817
+ leader: "",
1818
+ fields: [
1819
+ {
1820
+ tag: "655",
1821
+ ind1: " ",
1822
+ ind2: "7",
1823
+ subfields: [
1824
+ { code: "a", value: "kausijulkaisut." },
1825
+ { code: "2", value: "yso/eng" }
1826
+ ]
1827
+ }
1828
+ ]
1829
+ });
1830
+ const recordInvalid655FinYes2 = new MarcRecord({
1831
+ leader: "",
1832
+ fields: [
1833
+ {
1834
+ tag: "655",
1835
+ ind1: " ",
1836
+ ind2: "7",
1837
+ subfields: [
1838
+ { code: "a", value: "vironkielinen kirjallisuus." },
1839
+ { code: "2", value: "local" }
1840
+ ]
1841
+ }
1842
+ ]
1843
+ });
1844
+ const recordInvalid655EngNo = new MarcRecord({
1845
+ leader: "",
1846
+ fields: [
1847
+ {
1848
+ tag: "655",
1849
+ ind1: " ",
1850
+ ind2: "7",
1851
+ subfields: [
1852
+ { code: "a", value: "Bird's-eye views" },
1853
+ { code: "y", value: "1874" },
1854
+ { code: "2", value: "gmgpc" }
1855
+ ]
1856
+ }
1857
+ ]
1858
+ });
1859
+ const recordInvalid655EngNoNoControl = new MarcRecord({
1860
+ leader: "",
1861
+ fields: [
1862
+ {
1863
+ tag: "655",
1864
+ ind1: " ",
1865
+ ind2: " ",
1866
+ subfields: [{ code: "a", value: "Diaries" }]
1867
+ }
1868
+ ]
1869
+ });
1870
+ const recordInvalid656FinYes = new MarcRecord({
1871
+ leader: "",
1872
+ fields: [
1873
+ {
1874
+ tag: "656",
1875
+ ind1: " ",
1876
+ ind2: "7",
1877
+ subfields: [
1878
+ { code: "a", value: "kuvaamataidonopettajat." },
1879
+ { code: "2", value: "slm/eng" }
1880
+ ]
1881
+ }
1882
+ ]
1883
+ });
1884
+ const recordInvalid657EngNo = new MarcRecord({
1885
+ leader: "",
1886
+ fields: [
1887
+ {
1888
+ tag: "657",
1889
+ ind1: " ",
1890
+ ind2: "7",
1891
+ subfields: [
1892
+ { code: "a", value: "Personnel benefits management" },
1893
+ { code: "x", value: "Vital statistics" },
1894
+ { code: "z", value: "Love Canal, New York" },
1895
+ { code: "2", value: "New York State Management Functions Index" }
1896
+ ]
1897
+ }
1898
+ ]
1899
+ });
1900
+ const recordInvalid658EngNo = new MarcRecord({
1901
+ leader: "",
1902
+ fields: [
1903
+ {
1904
+ tag: "658",
1905
+ ind1: " ",
1906
+ ind2: " ",
1907
+ subfields: [
1908
+ { code: "a", value: "Math manipulatives" },
1909
+ { code: "d", value: "highly correlated" },
1910
+ { code: "2", value: "[source code]" }
1911
+ ]
1912
+ }
1913
+ ]
1914
+ });
1915
+ const recordInvalid662EngNo = new MarcRecord({
1916
+ leader: "",
1917
+ fields: [
1918
+ {
1919
+ tag: "662",
1920
+ ind1: " ",
1921
+ ind2: " ",
1922
+ subfields: [
1923
+ { code: "a", value: "Antarctica" },
1924
+ { code: "2", value: "lcsh/naf" }
1925
+ ]
1926
+ }
1927
+ ]
1928
+ });
1929
+ it("Finds record invalid - 655 Finnish, punc $a", async () => {
1930
+ const validator = await validatorFactory();
1931
+ const result = await validator.validate(recordInvalid655FinYes);
1932
+ assert.deepEqual(result, {
1933
+ message: ["Field 655 has invalid ending punctuation"],
1934
+ valid: false
1935
+ });
1936
+ });
1937
+ it("Finds record invalid - 655 Finnish, with punc", async () => {
1938
+ const validator = await validatorFactory();
1939
+ const result = await validator.validate(recordInvalid655FinYes2);
1940
+ assert.deepEqual(result, {
1941
+ message: ["Field 655 has invalid ending punctuation"],
1942
+ valid: false
1943
+ });
1944
+ });
1945
+ it("Finds record invalid - 655 !Finnish, without punc $y", async () => {
1946
+ const validator = await validatorFactory();
1947
+ const result = await validator.validate(recordInvalid655EngNo);
1948
+ assert.deepEqual(result, {
1949
+ message: ["Field 655 has invalid ending punctuation"],
1950
+ valid: false
1951
+ });
1952
+ });
1953
+ it("Finds record invalid - 655 !Finnish, without punc $a (no control)", async () => {
1954
+ const validator = await validatorFactory();
1955
+ const result = await validator.validate(recordInvalid655EngNoNoControl);
1956
+ assert.deepEqual(result, {
1957
+ message: ["Field 655 has invalid ending punctuation"],
1958
+ valid: false
1959
+ });
1960
+ });
1961
+ it("Finds record invalid - 656 Finnish, with punc $a", async () => {
1962
+ const validator = await validatorFactory();
1963
+ const result = await validator.validate(recordInvalid656FinYes);
1964
+ assert.deepEqual(result, {
1965
+ message: ["Field 656 has invalid ending punctuation"],
1966
+ valid: false
1967
+ });
1968
+ });
1969
+ it("Finds record invalid - 657 !Finnish, without punc $z", async () => {
1970
+ const validator = await validatorFactory();
1971
+ const result = await validator.validate(recordInvalid657EngNo);
1972
+ assert.deepEqual(result, {
1973
+ message: ["Field 657 has invalid ending punctuation"],
1974
+ valid: false
1975
+ });
1976
+ });
1977
+ it("Finds record invalid - 658 !Finnish, without punc $d", async () => {
1978
+ const validator = await validatorFactory();
1979
+ const result = await validator.validate(recordInvalid658EngNo);
1980
+ assert.deepEqual(result, {
1981
+ message: ["Field 658 has invalid ending punctuation"],
1982
+ valid: false
1983
+ });
1984
+ });
1985
+ it("Finds record invalid - 662 !Finnish, without punc $a", async () => {
1986
+ const validator = await validatorFactory();
1987
+ const result = await validator.validate(recordInvalid662EngNo);
1988
+ assert.deepEqual(result, {
1989
+ message: ["Field 662 has invalid ending punctuation"],
1990
+ valid: false
1991
+ });
1992
+ });
1993
+ it("Repairs the invalid record - 655 Finnish, remove punc $a", async () => {
1994
+ const validator = await validatorFactory();
1995
+ const result = await validator.fix(recordInvalid655FinYes);
1996
+ assert.equal(recordInvalid655FinYes.equalsTo(recordValid655FinNo), true);
1997
+ assert.deepEqual(result, {
1998
+ message: ["Field 655 has invalid ending punctuation"],
1999
+ fix: ["Field 655 - Removed punctuation from $a"],
2000
+ valid: false
2001
+ });
2002
+ });
2003
+ it("Repairs the invalid record - 655 Finnish, removes punc $a 2", async () => {
2004
+ const validator = await validatorFactory();
2005
+ const result = await validator.fix(recordInvalid655FinYes2);
2006
+ assert.equal(recordInvalid655FinYes2.equalsTo(recordValid655FinNo2), true);
2007
+ assert.deepEqual(result, {
2008
+ message: ["Field 655 has invalid ending punctuation"],
2009
+ fix: ["Field 655 - Removed punctuation from $a"],
2010
+ valid: false
2011
+ });
2012
+ });
2013
+ it("Repairs the invalid record - 655 !Finnish, add punc $y", async () => {
2014
+ const validator = await validatorFactory();
2015
+ const result = await validator.fix(recordInvalid655EngNo);
2016
+ assert.equal(recordInvalid655EngNo.equalsTo(recordValid655EngYes), true);
2017
+ assert.deepEqual(result, {
2018
+ message: ["Field 655 has invalid ending punctuation"],
2019
+ fix: ["Field 655 - Added punctuation to $y"],
2020
+ valid: false
2021
+ });
2022
+ });
2023
+ it("Repairs the invalid record - 655 !Finnish, add punc $a (no control)", async () => {
2024
+ const validator = await validatorFactory();
2025
+ const result = await validator.fix(recordInvalid655EngNoNoControl);
2026
+ assert.equal(recordInvalid655EngNoNoControl.equalsTo(recordValid655EngYesNoControl), true);
2027
+ assert.deepEqual(result, {
2028
+ message: ["Field 655 has invalid ending punctuation"],
2029
+ fix: ["Field 655 - Added punctuation to $a"],
2030
+ valid: false
2031
+ });
2032
+ });
2033
+ it("Repairs the invalid record - 656 Finnish, remove punc $a", async () => {
2034
+ const validator = await validatorFactory();
2035
+ const result = await validator.fix(recordInvalid656FinYes);
2036
+ assert.equal(recordInvalid656FinYes.equalsTo(recordValid656FinNo), true);
2037
+ assert.deepEqual(result, {
2038
+ message: ["Field 656 has invalid ending punctuation"],
2039
+ fix: ["Field 656 - Removed punctuation from $a"],
2040
+ valid: false
2041
+ });
2042
+ });
2043
+ it("Repairs the invalid record - 657 !Finnish, add punc $z", async () => {
2044
+ const validator = await validatorFactory();
2045
+ const result = await validator.fix(recordInvalid657EngNo);
2046
+ assert.equal(recordInvalid657EngNo.equalsTo(recordValid657EngYes), true);
2047
+ assert.deepEqual(result, {
2048
+ message: ["Field 657 has invalid ending punctuation"],
2049
+ fix: ["Field 657 - Added punctuation to $z"],
2050
+ valid: false
2051
+ });
2052
+ });
2053
+ it("Repairs the invalid record - 658 !Finnish, add punc $d", async () => {
2054
+ const validator = await validatorFactory();
2055
+ const result = await validator.fix(recordInvalid658EngNo);
2056
+ assert.equal(recordInvalid658EngNo.equalsTo(recordValid658EngYes), true);
2057
+ assert.deepEqual(result, {
2058
+ message: ["Field 658 has invalid ending punctuation"],
2059
+ fix: ["Field 658 - Added punctuation to $d"],
2060
+ valid: false
2061
+ });
2062
+ });
2063
+ it("Repairs the invalid record - 662 !Finnish, add pun $a", async () => {
2064
+ const validator = await validatorFactory();
2065
+ const result = await validator.fix(recordInvalid662EngNo);
2066
+ assert.equal(recordInvalid662EngNo.equalsTo(recordValid662EngYes), true);
2067
+ assert.deepEqual(result, {
2068
+ message: ["Field 662 has invalid ending punctuation"],
2069
+ fix: ["Field 662 - Added punctuation to $a"],
2070
+ valid: false
2071
+ });
2072
+ });
2073
+ });
2074
+ describe("#760-787 TRUE - After subfield $a, FALSE after others", () => {
2075
+ const recordValid = new MarcRecord({
2076
+ leader: "",
2077
+ fields: [
2078
+ {
2079
+ tag: "760",
2080
+ ind1: " ",
2081
+ ind2: " ",
2082
+ subfields: [
2083
+ { code: "a", value: "Mellor, Alec." },
2084
+ { code: "t", value: "Strange masonic stories" },
2085
+ { code: "e", value: "eng" }
2086
+ ]
2087
+ }
2088
+ ]
2089
+ });
2090
+ const recordValidOnlyA = new MarcRecord({
2091
+ leader: "",
2092
+ fields: [
2093
+ {
2094
+ tag: "760",
2095
+ ind1: " ",
2096
+ ind2: " ",
2097
+ subfields: [{ code: "a", value: "Mellor, Alec." }]
2098
+ }
2099
+ ]
2100
+ });
2101
+ it("Finds record valid - Punc $a, but following fields, $e no punc (last)", async () => {
2102
+ const validator = await validatorFactory();
2103
+ const result = await validator.validate(recordValid);
2104
+ assert.equal(result.valid, true);
2105
+ });
2106
+ it("Finds record valid - Punc $a (only)", async () => {
2107
+ const validator = await validatorFactory();
2108
+ const result = await validator.validate(recordValidOnlyA);
2109
+ assert.equal(result.valid, true);
2110
+ });
2111
+ const recordInvalid = new MarcRecord({
2112
+ leader: "",
2113
+ fields: [
2114
+ {
2115
+ tag: "760",
2116
+ ind1: " ",
2117
+ ind2: " ",
2118
+ subfields: [
2119
+ { code: "a", value: "Mellor, Alec." },
2120
+ { code: "t", value: "Strange masonic stories" },
2121
+ { code: "e", value: "eng." }
2122
+ ]
2123
+ }
2124
+ ]
2125
+ });
2126
+ const recordInvalidOnlyA = new MarcRecord({
2127
+ leader: "",
2128
+ fields: [
2129
+ {
2130
+ tag: "760",
2131
+ ind1: " ",
2132
+ ind2: " ",
2133
+ subfields: [{ code: "a", value: "Mellor, Alec" }]
2134
+ }
2135
+ ]
2136
+ });
2137
+ it("Finds record invalid - Punc $e (language field, strict)", async () => {
2138
+ const validator = await validatorFactory();
2139
+ const result = await validator.validate(recordInvalid);
2140
+ assert.deepEqual(result, {
2141
+ message: ["Field 760 has invalid ending punctuation"],
2142
+ valid: false
2143
+ });
2144
+ });
2145
+ it("Finds record invalid - No punc $a (only)", async () => {
2146
+ const validator = await validatorFactory();
2147
+ const result = await validator.validate(recordInvalidOnlyA);
2148
+ assert.deepEqual(result, {
2149
+ message: ["Field 760 has invalid ending punctuation"],
2150
+ valid: false
2151
+ });
2152
+ });
2153
+ it("Repairs the invalid record - Remove punc $e (language field, strict)", async () => {
2154
+ const validator = await validatorFactory();
2155
+ const result = await validator.fix(recordInvalid);
2156
+ assert.equal(recordInvalid.equalsTo(recordValid), true);
2157
+ assert.deepEqual(result, {
2158
+ message: ["Field 760 has invalid ending punctuation"],
2159
+ fix: ["Field 760 - Removed punctuation from $e"],
2160
+ valid: false
2161
+ });
2162
+ });
2163
+ it("Repairs the invalid record - Add punc $a (only)", async () => {
2164
+ const validator = await validatorFactory();
2165
+ const result = await validator.fix(recordInvalidOnlyA);
2166
+ assert.equal(recordInvalidOnlyA.equalsTo(recordValidOnlyA), true);
2167
+ assert.deepEqual(result, {
2168
+ message: ["Field 760 has invalid ending punctuation"],
2169
+ fix: ["Field 760 - Added punctuation to $a"],
2170
+ valid: false
2171
+ });
2172
+ });
2173
+ });
2174
+ describe("#880 - Like linked fields", () => {
2175
+ const recordValidSimple = new MarcRecord({
2176
+ leader: "",
2177
+ fields: [
2178
+ {
2179
+ tag: "880",
2180
+ ind1: " ",
2181
+ ind2: " ",
2182
+ subfields: [
2183
+ { code: "a", value: "\u5E73\u7530 \u7BE4\u80E4" },
2184
+ { code: "b", value: "1776-1843." },
2185
+ { code: "6", value: "100-01/$1" }
2186
+ // Tag 100 has value TRUE -> last data subfield should have punc
2187
+ ]
2188
+ }
2189
+ ]
2190
+ });
2191
+ const recordValidComplex = new MarcRecord({
2192
+ leader: "",
2193
+ fields: [
2194
+ {
2195
+ tag: "880",
2196
+ ind1: " ",
2197
+ ind2: " ",
2198
+ subfields: [
2199
+ { code: "b", value: "\u05D9\u05D3\u05D9\u05E2\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05E0\u05D5\u05EA" },
2200
+ { code: "b", value: "\u05E1\u05E4\u05E8\u05D9 \u05D7\u05DE\u05D3" },
2201
+ { code: "c", value: "2006." },
2202
+ { code: "6", value: "260-02/(2/r \u2021a \u05EA\u05DC-\u05D0\u05D1\u05D9\u05D1" }
2203
+ // Tag 260 has value TRUE -> last data subfield should have punc
2204
+ ]
2205
+ }
2206
+ ]
2207
+ });
2208
+ it("Finds record valid - Punc $b", async () => {
2209
+ const validator = await validatorFactory();
2210
+ const result = await validator.validate(recordValidSimple);
2211
+ assert.equal(result.valid, true);
2212
+ });
2213
+ it("Finds record valid - Punc $c", async () => {
2214
+ const validator = await validatorFactory();
2215
+ const result = await validator.validate(recordValidComplex);
2216
+ assert.equal(result.valid, true);
2217
+ });
2218
+ const recordInvalidSimple = new MarcRecord({
2219
+ leader: "",
2220
+ fields: [
2221
+ {
2222
+ tag: "880",
2223
+ ind1: " ",
2224
+ ind2: " ",
2225
+ subfields: [
2226
+ { code: "a", value: "\u5E73\u7530 \u7BE4\u80E4" },
2227
+ { code: "b", value: "1776-1843" },
2228
+ { code: "6", value: "100-01/$1" }
2229
+ // Tag 100 has value TRUE -> last data subfield should have punc
2230
+ ]
2231
+ }
2232
+ ]
2233
+ });
2234
+ const recordInvalidComplex = new MarcRecord({
2235
+ leader: "",
2236
+ fields: [
2237
+ {
2238
+ tag: "880",
2239
+ ind1: " ",
2240
+ ind2: " ",
2241
+ subfields: [
2242
+ { code: "b", value: "\u05D9\u05D3\u05D9\u05E2\u05D5\u05EA \u05D0\u05D7\u05E8\u05D5\u05E0\u05D5\u05EA" },
2243
+ { code: "b", value: "\u05E1\u05E4\u05E8\u05D9 \u05D7\u05DE\u05D3" },
2244
+ { code: "c", value: "2006" },
2245
+ { code: "6", value: "260-02/(2/r \u2021a \u05EA\u05DC-\u05D0\u05D1\u05D9\u05D1" }
2246
+ // Tag 260 has value TRUE -> last data subfield should have punc
2247
+ ]
2248
+ }
2249
+ ]
2250
+ });
2251
+ it("Finds record invalid - No punc $b", async () => {
2252
+ const validator = await validatorFactory();
2253
+ const result = await validator.validate(recordInvalidSimple);
2254
+ assert.deepEqual(result, {
2255
+ message: ["Field 880 has invalid ending punctuation"],
2256
+ valid: false
2257
+ });
2258
+ });
2259
+ it("Finds record invalid - No punc $c", async () => {
2260
+ const validator = await validatorFactory();
2261
+ const result = await validator.validate(recordInvalidComplex);
2262
+ assert.deepEqual(result, {
2263
+ message: ["Field 880 has invalid ending punctuation"],
2264
+ valid: false
2265
+ });
2266
+ });
2267
+ it("Repairs the invalid record - Add punc $b", async () => {
2268
+ const validator = await validatorFactory();
2269
+ const result = await validator.fix(recordInvalidSimple);
2270
+ assert.equal(recordInvalidSimple.equalsTo(recordValidSimple), true);
2271
+ assert.deepEqual(result, {
2272
+ message: ["Field 880 has invalid ending punctuation"],
2273
+ fix: ["Field 880 - Added punctuation to $b"],
2274
+ valid: false
2275
+ });
2276
+ });
2277
+ it("Repairs the invalid record - Add punc $c", async () => {
2278
+ const validator = await validatorFactory();
2279
+ const result = await validator.fix(recordInvalidComplex);
2280
+ assert.equal(recordInvalidComplex.equalsTo(recordValidComplex), true);
2281
+ assert.deepEqual(result, {
2282
+ message: ["Field 880 has invalid ending punctuation"],
2283
+ fix: ["Field 880 - Added punctuation to $c"],
2284
+ valid: false
2285
+ });
2286
+ });
2287
+ });
2288
+ });
2289
+ });
2290
+ //# sourceMappingURL=ending-punctuation.test.js.map