1import { Driver, UpdateSummary } from "@citeproc-rs/wasm";
2
3export const mkStyle = (inner: string, bibliography?: string) => {
4    return `
5    <style class="note">
6      <info>
7        <id>https://github.com/cormacrelf/citeproc-rs/test-style</id>
8        <title>test-style</title>
9        <updated>2000-01-01T00:00:00Z</updated>
10      </info>
11      <citation>
12        <layout>
13          ${inner}
14        </layout>
15      </citation>
16      ${ bibliography != null ? bibliography : "" }
17    </style>
18    `;
19}
20
21export const mkLocale = (lang: string, terms: { [key: string]: string }) => {
22    return `
23    <?xml version="1.0" encoding="utf-8"?> <locale xml:lang="${lang}">
24    <terms>
25        ${ Object.entries(terms).map((k,v) => `<term name="${k}">${v}</term>`).join("\n") }
26    </terms>
27    </locale>
28    `;
29}
30
31export class Fetcher {
32    constructor(private callback: (lang: string) => void, private factory: (lang: string) => string) { }
33    async fetchLocale(lang: string) {
34        this.callback(lang);
35        return this.factory(lang);
36    }
37}
38
39export const boringFetcher = new Fetcher(
40    () => {},
41    (lang: string) => mkLocale(lang, {})
42);
43
44export const withDriver = (cfg: any, callback: (driver: Driver) => void) => {
45    let style = cfg.style || mkStyle('<text variable="title" />');
46    let fetcher = cfg.fetcher || boringFetcher;
47    let format = cfg.format || "plain";
48    let driver = Driver.new({ style, fetcher, format }).unwrap();
49    callback(driver);
50    driver.free();
51};
52
53export const oneOneOne = (driver: Driver, r?: any, cid?: string) => {
54    let refr = {
55        type: "book",
56        title: "TEST_TITLE",
57        id: "citekey",
58        ...r,
59    };
60    let id = refr.id;
61    cid = cid || "one";
62    driver.insertReference(refr).unwrap();
63    driver.insertCluster({id: cid, cites: [{ id }]}).unwrap();
64    driver.setClusterOrder([{ id: cid }]).unwrap();
65};
66
67export const checkUpdatesLen = (up: UpdateSummary, clusterCount: number, bibCount: number) => {
68    let updates = up;
69    expect(updates.clusters.length).toBe(clusterCount);
70    let updatedKeys = Object.keys(updates.bibliography?.updatedEntries || {});
71    expect(updatedKeys.length).toBe(bibCount);
72};
73
74