import { loadMock } from "../mocks/mockHelper"; import { cif2json } from "./index"; describe("cif2json#parse", () => { const sut = cif2json; it("should export method", () => { expect(typeof sut).toEqual("function"); }); it("should return array", () => { expect(sut("")).toEqual({}); }); it("should correctly split cif files with several items", () => { const cifData = loadMock("001_several_data.cif"); const parseResult = sut(cifData); expect(Object.keys(parseResult)).toEqual(["data_1000004", "data_1000005"]); }); it("should process simple data lines", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(parseResult.data_1000004._chemical_formula_sum).toEqual("C29 H30 Cu I P2"); }); it("should process symbols conversion diring data line parse", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(parseResult.data_1000004._diffrn_radiation_type).toEqual("MoKα"); }); it('should set "?" as empty value', () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(parseResult.data_1000004._exptl_absorpt_correction_type).toEqual(""); }); it("should process multiline data values with delimer", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(parseResult.data_1000004._chemical_name_systematic).toEqual("awesome name"); }); it("should process multiline data values", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(parseResult.data_1000004._refine_ls_weighting_details) .toEqual("calc w=1/[σ^2^(Fo^2^)+(0.1038P)^2^+0.5590P] where P=(Fo^2^+2Fc^2^)/3"); }); it("should return loop_ as array", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(Array.isArray(parseResult.data_1000004.loop_)).toEqual(true); }); it("should parse correctly loop_ keys as array", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(Array.isArray(parseResult.data_1000004.loop_)).toEqual(true); const loops = parseResult.data_1000004.loop_; loops.forEach((loop: any) => { expect(Array.isArray(loop.columns)).toEqual(true); expect(Array.isArray(loop.data)).toEqual(true); expect(loop.columns.length).toBeGreaterThan(0); }); }); it("should return array of strings for single column", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); expect(Array.isArray(parseResult.data_1000004.loop_)).toEqual(true); const loops = parseResult.data_1000004.loop_; loops.forEach((loop: any) => { expect(Array.isArray(loop.columns)).toEqual(true); expect(Array.isArray(loop.data)).toEqual(true); if (loop.columns.length === 1 && loop.data.length >= 1) { expect(typeof loop.data[0]).toEqual("string"); } }); }); it("should return 4 loop_", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); const loops = parseResult.data_1000004.loop_; expect(loops.length).toEqual(4); }); it("should return loop_[columns&data] as array", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); const loops = parseResult.data_1000004.loop_; loops.forEach((loop: any) => { expect(Array.isArray(loop.columns)).toEqual(true); expect(Array.isArray(loop.data)).toEqual(true); }); }); it("should return some values in loop_[columns]", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); const loops = parseResult.data_1000004.loop_; loops.forEach((loop: any) => { expect(loop.columns.length).toBeGreaterThan(0); }); }); it("should return some values in loop_[data]", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); const loops = parseResult.data_1000004.loop_; loops.forEach((loop: any) => { expect(loop.data.length).toBeGreaterThan(0); }); }); it("should return loop_[data] & loop_[columns] of equal length", () => { const cifData = loadMock("002_single_dataline.cif"); const parseResult = sut(cifData); const loops = parseResult.data_1000004.loop_; loops.forEach((loop: any) => { const colsCount = loop.columns.length; expect(Array.isArray(loop.data)).toEqual(true); loop.data.forEach((line: any) => { if (typeof line === "string") { expect(colsCount).toEqual(1); } else { expect(line.length).toEqual(colsCount); } }); }); }); it("should process correctly handle errors with data attribute", () => { const cifData = loadMock("2010108.cif"); const parseResult = sut(cifData); expect(parseResult.data_2010108).toBeDefined(); }); it("should correctly process multiline comments", () => { const cifData = loadMock("2222708.cif"); const parseResult = sut(cifData); expect(parseResult.data_2222708).toBeDefined(); // '_chemical_name_systematic' const nameSystematic = parseResult.data_2222708._chemical_name_systematic; expect(nameSystematic).toEqual("Bromidobis(N,N-diphenylthiourea-κS)copper(I)\nmonohydrate"); }); describe("performance test", () => { it("should process the file", () => { const cifData = loadMock("2222708.cif"); /* tslint:disable */ console.time("performance:"); for (var i = 0; i < 30; i++) { const parseResult = sut(cifData); } console.timeEnd("performance:"); /* tslint:enable */ // reference 608-696 ms; droped to 190ms // n~30 -> 578ms; droped to 140ms // 130 ms }); it("should fastly process big files", () => { const cifData = loadMock("4128884.cif"); // tslint:disable-next-line console.time("performance2:"); const parseResult = sut(cifData); // tslint:disable-next-line console.timeEnd("performance2:"); }); // 624ms }); it("should parse multiline loops", () => { const cifData = loadMock("1100937.cif"); const parseResult = sut(cifData); expect(parseResult.data_1100937).toBeDefined(); const authorLoop = parseResult.data_1100937.loop_.filter((item: any) => { return item.columns.indexOf("_publ_author_name") !== -1; }); expect(authorLoop.length).toEqual(1); expect(authorLoop[0].data[0][0]).toEqual("Gerd Becker"); const addr = ['Institut f\\"ur Anorganische Chemie', 'Universit\\"at Stuttgart', "Pfaffenwaldring 55", "70569 Stuttgart", "Bundesrepublik Deutschland"].join("\n"); expect(authorLoop[0].data[0][1]).toEqual(addr); }); it("should not produce errors during loops parse", () => { const cifData = loadMock("1508375.cif"); const parseResult = sut(cifData); expect(parseResult.data_1508375).toBeDefined(); }); it("should process loop errors", () => { const cifData = loadMock("1502740.cif"); const parseResult = sut(cifData); expect(parseResult.data_1502740).toBeDefined(); const coordLoop = parseResult.data_1502740.loop_.filter((item: any) => { return item.columns.indexOf("_atom_site_fract_x") !== -1; }); expect(coordLoop.length).toEqual(1); }); });