numbering-xml.tests.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. var assert = require("assert");
  2. var duck = require("duck");
  3. var readNumberingXml = require("../../lib/docx/numbering-xml").readNumberingXml;
  4. var stylesReader = require("../../lib/docx/styles-reader");
  5. var XmlElement = require("../../lib/xml").Element;
  6. var test = require("../test")(module);
  7. test('w:num element inherits levels from w:abstractNum', function() {
  8. var numbering = readNumberingXml(
  9. new XmlElement("w:numbering", {}, [
  10. new XmlElement("w:abstractNum", {"w:abstractNumId": "42"}, [
  11. new XmlElement("w:lvl", {"w:ilvl": "0"}, [
  12. new XmlElement("w:numFmt", {"w:val": "bullet"})
  13. ]),
  14. new XmlElement("w:lvl", {"w:ilvl": "1"}, [
  15. new XmlElement("w:numFmt", {"w:val": "decimal"})
  16. ])
  17. ]),
  18. new XmlElement("w:num", {"w:numId": "47"}, [
  19. new XmlElement("w:abstractNumId", {"w:val": "42"})
  20. ])
  21. ]),
  22. {styles: stylesReader.defaultStyles}
  23. );
  24. duck.assertThat(numbering.findLevel("47", "0"), duck.hasProperties({
  25. isOrdered: false
  26. }));
  27. duck.assertThat(numbering.findLevel("47", "1"), duck.hasProperties({
  28. isOrdered: true
  29. }));
  30. });
  31. test('w:num element referencing non-existent w:abstractNumId is ignored', function() {
  32. var numbering = readNumberingXml(
  33. new XmlElement("w:numbering", {}, [
  34. new XmlElement("w:num", {"w:numId": "47"}, [
  35. new XmlElement("w:abstractNumId", {"w:val": "42"})
  36. ])
  37. ]),
  38. {styles: stylesReader.defaultStyles}
  39. );
  40. duck.assertThat(numbering.findLevel("47", "0"), duck.equalTo(null));
  41. });
  42. test('when level is missing w:numFmt then level is ordered', function() {
  43. var numbering = readNumberingXml(
  44. new XmlElement("w:numbering", {}, [
  45. new XmlElement("w:abstractNum", {"w:abstractNumId": "42"}, [
  46. new XmlElement("w:lvl", {"w:ilvl": "0"})
  47. ]),
  48. new XmlElement("w:num", {"w:numId": "47"}, [
  49. new XmlElement("w:abstractNumId", {"w:val": "42"})
  50. ])
  51. ]),
  52. {styles: stylesReader.defaultStyles}
  53. );
  54. duck.assertThat(numbering.findLevel("47", "0"), duck.hasProperties({
  55. isOrdered: true
  56. }));
  57. });
  58. test('when w:abstractNum has w:numStyleLink then style is used to find w:num', function() {
  59. var numbering = readNumberingXml(
  60. new XmlElement("w:numbering", {}, [
  61. new XmlElement("w:abstractNum", {"w:abstractNumId": "100"}, [
  62. new XmlElement("w:lvl", {"w:ilvl": "0"}, [
  63. new XmlElement("w:numFmt", {"w:val": "decimal"})
  64. ])
  65. ]),
  66. new XmlElement("w:abstractNum", {"w:abstractNumId": "101"}, [
  67. new XmlElement("w:numStyleLink", {"w:val": "List1"})
  68. ]),
  69. new XmlElement("w:num", {"w:numId": "200"}, [
  70. new XmlElement("w:abstractNumId", {"w:val": "100"})
  71. ]),
  72. new XmlElement("w:num", {"w:numId": "201"}, [
  73. new XmlElement("w:abstractNumId", {"w:val": "101"})
  74. ])
  75. ]),
  76. {styles: new stylesReader.Styles({}, {}, {}, {"List1": {numId: "200"}})}
  77. );
  78. duck.assertThat(numbering.findLevel("201", "0"), duck.hasProperties({
  79. isOrdered: true
  80. }));
  81. });
  82. // See: 17.9.23 pStyle (Paragraph Style's Associated Numbering Level) in ECMA-376, 4th Edition
  83. test('numbering level can be found by paragraph style ID', function() {
  84. var numbering = readNumberingXml(
  85. new XmlElement("w:numbering", {}, [
  86. new XmlElement("w:abstractNum", {"w:abstractNumId": "42"}, [
  87. new XmlElement("w:lvl", {"w:ilvl": "0"}, [
  88. new XmlElement("w:numFmt", {"w:val": "bullet"})
  89. ])
  90. ]),
  91. new XmlElement("w:abstractNum", {"w:abstractNumId": "43"}, [
  92. new XmlElement("w:lvl", {"w:ilvl": "0"}, [
  93. new XmlElement("w:pStyle", {"w:val": "List"}),
  94. new XmlElement("w:numFmt", {"w:val": "decimal"})
  95. ])
  96. ])
  97. ]),
  98. {styles: stylesReader.defaultStyles}
  99. );
  100. duck.assertThat(numbering.findLevelByParagraphStyleId("List"), duck.hasProperties({
  101. isOrdered: true
  102. }));
  103. duck.assertThat(numbering.findLevelByParagraphStyleId("Paragraph"), duck.equalTo(null));
  104. });
  105. test('when styles is missing then error is thrown', function() {
  106. assert.throws(function() {
  107. readNumberingXml(new XmlElement("w:numbering", {}, []));
  108. }, /styles is missing/);
  109. });