import * as fs from 'fs' import { NeumeCollator } from "../src/NeumeCollator" import { JSDOM } from 'jsdom' const readFiles = (filenames: string[]): Document[] => { const dom = new JSDOM('') const DOMParser = dom.window.DOMParser const parser = new DOMParser return filenames.map(filename => { const xml = fs.readFileSync(filename, 'utf8') return parser.parseFromString(xml, "text/xml") }) } describe("NeumeCollator", function () { it("creates an apparatus for multiple different readings of an ", function () { const collator = new NeumeCollator() collator.collate(readFiles(['test/test01/a.xml', 'test/test01/b.xml', 'test/test01/c.xml'])) const result = collator.dom() expect(result).toBeDefined() if (!result) return const rdgs = result.querySelectorAll('rdg') expect(rdgs.length).toBe(3) expect(rdgs[0]!.parentElement!.nodeName).toEqual('app') expect(Array.from(rdgs).map((el: Element) => el.querySelector('nc')!.getAttribute('pname'))) .toEqual(['b', 'a', 'g']) }) it("creates a gap alignment in case of an additional in one reading", function () { const collator = new NeumeCollator() collator.collate(readFiles(['test/test02/a.xml', 'test/test02/b.xml', 'test/test02/c.xml'])) const result = collator.dom() expect(result).toBeDefined() if (!result) return const rdg1 = result.querySelector('rdg[source="source0 source2"]') const rdg2 = result.querySelector('rdg[source="source1"]') if (!rdg1 || !rdg2) { fail('rdg1 or rdg2 undefined') } expect(rdg1).toBeDefined() expect(rdg2).toBeDefined() expect(rdg1.children.length).toBe(2) expect(rdg2.children.length).toBe(0) }) it("creates an apparatus for multiple different readings of a ", function () { const collator = new NeumeCollator() collator.collate(readFiles(['test/test03/a.xml', 'test/test03/b.xml', 'test/test03/c.xml'])) const result = collator.dom() expect(result).toBeDefined() if (!result) return expect(result.querySelectorAll('rdg').length).toBe(3) }) it("deals with partly matched s", function () { const collator = new NeumeCollator() collator.collate(readFiles(['test/test04/a.xml', 'test/test04/b.xml', 'test/test04/c.xml'])) const result = collator.dom() expect(result).toBeDefined() if (!result) return expect(result.querySelectorAll('app').length).toBe(2) }) it("deals with alignments that already contain an ", function () { const collator = new NeumeCollator() collator.collate(readFiles(['test/test05/a.xml', 'test/test05/b.xml', 'test/test05/c.xml'])) const result = collator.dom() expect(result).toBeDefined() if (!result) return expect(result.querySelectorAll('app').length).toBe(1) expect(result.querySelectorAll('rdg').length).toBe(2) expect(result.querySelector('rdg[source="source1 source3"]')).toBeDefined() expect(result.querySelector('rdg[source="source2"]')).toBeDefined() }) it("can handle multiple left gap alignments", function () { const collator = new NeumeCollator() collator.collate(readFiles(['test/test06/a.xml', 'test/test06/b.xml', 'test/test06/c.xml'])) const result = collator.dom() expect(result).toBeDefined() if (!result) return expect(result.querySelectorAll('app').length).toBe(2) const app = result.querySelectorAll('app')[1] if (!app) return expect(app.querySelector('rdg[source="source0"]')).toBeDefined() expect(app.querySelector('rdg[source="source1"]')).toBeDefined() expect(app.querySelector('rdg[source="source2"]')).toBeDefined() }) })