Files
docx-js/ts/tests/numberingTest.ts

113 lines
5.3 KiB
TypeScript
Raw Normal View History

2017-03-08 17:07:54 +01:00
import { expect } from "chai";
2017-03-08 17:37:14 +01:00
import { Formatter } from "../export/formatter";
import { Numbering } from "../numbering";
2017-03-08 17:18:12 +01:00
import { AbstractNumbering } from "../numbering/abstract-numbering";
import { Num } from "../numbering/num";
2016-07-01 22:09:55 +01:00
2017-03-08 17:37:14 +01:00
function jsonify(obj: object) {
return JSON.parse(JSON.stringify(obj));
2016-07-01 22:09:55 +01:00
}
2017-03-08 17:07:54 +01:00
describe("Numbering", () => {
2017-03-08 17:37:14 +01:00
let numbering: Numbering;
2016-07-01 22:09:55 +01:00
beforeEach(() => {
numbering = new Numbering();
});
2017-03-08 17:07:54 +01:00
describe("#constructor", () => {
it("creates a default numbering with one abstract and one concrete instance", () => {
const tree = new Formatter().format(numbering);
2017-03-08 17:37:14 +01:00
expect(Object.keys(tree)).to.deep.equal(["w:numbering"]);
const abstractNums = tree["w:numbering"].filter((el) => el["w:abstractNum"]);
2017-03-08 17:07:54 +01:00
expect(abstractNums).to.have.lengthOf(1);
2017-03-08 17:37:14 +01:00
expect(abstractNums[0]["w:abstractNum"]).to.deep.include.members([
2017-03-08 17:07:54 +01:00
{_attr: {"w:abstractNumId": 0, "w15:restartNumberingAfterBreak": 0}},
2017-03-08 17:37:14 +01:00
{"w:multiLevelType": [{_attr: {"w:val": "hybridMultilevel"}}]},
2017-03-08 17:07:54 +01:00
]);
2016-07-01 22:09:55 +01:00
2017-03-08 17:37:14 +01:00
abstractNums.filter((el) => el["w:lvl"]).forEach((el, ix) => {
2017-03-08 17:07:54 +01:00
expect(Object.keys(el)).to.have.lengthOf(1);
2017-03-08 17:37:14 +01:00
expect(Object.keys(el["w:lvl"]).sort()).to.deep.equal([
"_attr", "w:start", "w:lvlJc", "w:numFmt", "w:pPr", "w:rPr",
]);
expect(el["w:lvl"]).to.have.deep.members([
{_attr: {"w:ilvl": ix, "w15:tentative": 1}},
{"w:start": [{_attr: {"w:val": 1}}]},
{"w:lvlJc": [{_attr: {"w:val": "left"}}]},
{"w:numFmt": [{_attr: {"w:val": "bullet"}}]},
2017-03-08 17:07:54 +01:00
]);
// Once chai 4.0.0 lands and #644 is resolved, we can add the following to the test:
// {"w:lvlText": [{"_attr": {"w:val": "•"}}]},
// {"w:rPr": [{"w:rFonts": [{"_attr": {"w:ascii": "Symbol", "w:hAnsi": "Symbol", "w:hint": "default"}}]}]},
// {"w:pPr": [{"_attr": {}},
// {"w:ind": [{"_attr": {"w:left": 720, "w:hanging": 360}}]}]},
2017-03-08 17:37:14 +01:00
});
2016-07-01 22:09:55 +01:00
});
});
describe("#createAbstractNumbering", () => {
it("returns a new AbstractNumbering instance", () => {
const a2 = numbering.createAbstractNumbering();
expect(a2).to.be.instanceof(AbstractNumbering);
});
it("assigns a unique ID to each abstract numbering it creates", () => {
const a2 = numbering.createAbstractNumbering();
const a3 = numbering.createAbstractNumbering();
expect(a2.id).not.to.equal(a3.id);
});
});
describe("#createConcreteNumbering", () => {
it("returns a new Num instance with its abstract ID set to the AbstractNumbering's ID", () => {
const a2 = numbering.createAbstractNumbering();
const n = numbering.createConcreteNumbering(a2);
expect(n).to.be.instanceof(Num);
const tree = new Formatter().format(numbering);
2017-03-09 20:49:34 +01:00
const serializedN = tree["w:numbering"].find(
(obj) => obj["w:num"] && obj["w:num"][0]._attr["w:numId"] === n.id
);
expect(serializedN["w:num"][1]["w:abstractNumId"][0]._attr["w:val"]).to.equal(a2.id);
});
it("assigns a unique ID to each concrete numbering it creates", () => {
const a2 = numbering.createAbstractNumbering();
const n = numbering.createConcreteNumbering(a2);
const n2 = numbering.createConcreteNumbering(a2);
expect(n.id).not.to.equal(n2.id);
});
});
2017-03-08 17:18:12 +01:00
});
describe("AbstractNumbering", () => {
it("stores its ID at its .id property", () => {
const abstractNumbering = new AbstractNumbering(5);
expect(abstractNumbering.id).to.equal(5);
});
describe("#createLevel", () => {
it("creates a level with the given characteristics", () => {
const abstractNumbering = new AbstractNumbering(1);
const level = abstractNumbering.createLevel(3, "lowerLetter", "%1)", "end");
const tree = new Formatter().format(level);
expect(tree['w:lvl']).to.include({_attr: {"w:ilvl": 3, "w15:tentative": 1}})
expect(tree['w:lvl']).to.include({"w:start": [{_attr: {"w:val": 1}}]})
expect(tree['w:lvl']).to.include({"w:lvlJc": [{_attr: {"w:val": "end"}}]})
expect(tree['w:lvl']).to.include({"w:numFmt": [{_attr: {"w:val": "lowerLetter"}}]})
expect(tree['w:lvl']).to.include({"w:lvlText": [{"_attr": {"w:val": "%1)"}}]})
});
it("uses 'start' as the default alignment", () => {
const abstractNumbering = new AbstractNumbering(1);
const level = abstractNumbering.createLevel(3, "lowerLetter", "%1)");
const tree = new Formatter().format(level);
expect(tree['w:lvl']).to.include({_attr: {"w:ilvl": 3, "w15:tentative": 1}})
expect(tree['w:lvl']).to.include({"w:start": [{_attr: {"w:val": 1}}]})
expect(tree['w:lvl']).to.include({"w:lvlJc": [{_attr: {"w:val": "start"}}]})
expect(tree['w:lvl']).to.include({"w:numFmt": [{_attr: {"w:val": "lowerLetter"}}]})
expect(tree['w:lvl']).to.include({"w:lvlText": [{"_attr": {"w:val": "%1)"}}]})
});
});
2017-03-08 17:37:14 +01:00
});