From 82bc0fe4769483196ce8cc8147fab16b38c52e8f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 11 Sep 2025 15:21:40 +0100 Subject: Handle numbering levels defined without an index --- tests/docx/body_xml_tests.py | 6 ++--- tests/docx/numbering_xml_tests.py | 57 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/docx/body_xml_tests.py b/tests/docx/body_xml_tests.py index e9decc4..5d9766b 100644 --- a/tests/docx/body_xml_tests.py +++ b/tests/docx/body_xml_tests.py @@ -138,15 +138,15 @@ class ParagraphTests(object): assert_equal("1", paragraph.numbering.level_index) - def test_numbering_properties_are_ignored_if_lvl_is_missing(self): + def test_when_numbering_properties_are_missing_level_then_level_of_0_is_assumed(self): paragraph_xml = self._paragraph_with_numbering_properties([ xml_element("w:numId", {"w:val": "42"}), ]) - numbering = _NumberingMap({"42": {"1": documents.numbering_level("1", True)}}) + numbering = _NumberingMap({"42": {"0": documents.numbering_level("0", True)}}) paragraph = _read_and_get_document_xml_element(paragraph_xml, numbering=numbering) - assert_equal(None, paragraph.numbering) + assert_equal(documents.numbering_level("0", True), paragraph.numbering) def test_numbering_properties_are_ignored_if_num_id_is_missing(self): paragraph_xml = self._paragraph_with_numbering_properties([ diff --git a/tests/docx/numbering_xml_tests.py b/tests/docx/numbering_xml_tests.py index 6f1e447..6cc779f 100644 --- a/tests/docx/numbering_xml_tests.py +++ b/tests/docx/numbering_xml_tests.py @@ -72,6 +72,63 @@ def test_num_referencing_non_existent_abstract_num_is_ignored(): assert_equal(None, numbering.find_level("47", "0")) +def test_given_no_other_levels_with_index_of_0_when_level_is_missing_ilvl_then_level_index_is_0(): + element = xml_element("w:numbering", {}, [ + xml_element("w:abstractNum", {"w:abstractNumId": "42"}, [ + xml_element("w:lvl", {}, [ + xml_element("w:numFmt", {"w:val": "decimal"}), + ]), + ]), + xml_element("w:num", {"w:numId": "47"}, [ + xml_element("w:abstractNumId", {"w:val": "42"}) + ]) + ]) + + numbering = _read_numbering_xml_element(element) + + assert_equal(True, numbering.find_level("47", "0").is_ordered) + + +def test_given_previous_other_level_with_index_of_0_when_level_is_missing_ilvl_then_level_is_ignored(): + element = xml_element("w:numbering", {}, [ + xml_element("w:abstractNum", {"w:abstractNumId": "42"}, [ + xml_element("w:lvl", {"w:ilvl": "0"}, [ + xml_element("w:numFmt", {"w:val": "bullet"}), + ]), + xml_element("w:lvl", {}, [ + xml_element("w:numFmt", {"w:val": "decimal"}), + ]), + ]), + xml_element("w:num", {"w:numId": "47"}, [ + xml_element("w:abstractNumId", {"w:val": "42"}) + ]) + ]) + + numbering = _read_numbering_xml_element(element) + + assert_equal(False, numbering.find_level("47", "0").is_ordered) + + +def test_given_subsequent_other_level_with_index_of_0_when_level_is_missing_ilvl_then_level_is_ignored(): + element = xml_element("w:numbering", {}, [ + xml_element("w:abstractNum", {"w:abstractNumId": "42"}, [ + xml_element("w:lvl", {}, [ + xml_element("w:numFmt", {"w:val": "decimal"}), + ]), + xml_element("w:lvl", {"w:ilvl": "0"}, [ + xml_element("w:numFmt", {"w:val": "bullet"}), + ]), + ]), + xml_element("w:num", {"w:numId": "47"}, [ + xml_element("w:abstractNumId", {"w:val": "42"}) + ]) + ]) + + numbering = _read_numbering_xml_element(element) + + assert_equal(False, numbering.find_level("47", "0").is_ordered) + + def test_when_abstract_num_has_num_style_link_then_style_is_used_to_find_num(): numbering = _read_numbering_xml_element( xml_element("w:numbering", {}, [ -- cgit v1.2.3