11"""Test suite for the docx.text.run module."""
22
3+ from __future__ import annotations
4+
5+ from typing import cast
6+
37import pytest
48
59from docx .enum .style import WD_STYLE_TYPE
610from docx .enum .text import WD_BREAK , WD_UNDERLINE
11+ from docx .oxml .text .run import CT_R
712from docx .parts .document import DocumentPart
813from docx .shape import InlineShape
914from docx .text .font import Font
@@ -64,9 +69,23 @@ def it_can_add_text(self, add_text_fixture, Text_):
6469 assert run ._r .xml == expected_xml
6570 assert _text is Text_ .return_value
6671
67- def it_can_add_a_break (self , add_break_fixture ):
68- run , break_type , expected_xml = add_break_fixture
72+ @pytest .mark .parametrize (
73+ ("break_type" , "expected_cxml" ),
74+ [
75+ (WD_BREAK .LINE , "w:r/w:br" ),
76+ (WD_BREAK .PAGE , "w:r/w:br{w:type=page}" ),
77+ (WD_BREAK .COLUMN , "w:r/w:br{w:type=column}" ),
78+ (WD_BREAK .LINE_CLEAR_LEFT , "w:r/w:br{w:type=textWrapping, w:clear=left}" ),
79+ (WD_BREAK .LINE_CLEAR_RIGHT , "w:r/w:br{w:type=textWrapping, w:clear=right}" ),
80+ (WD_BREAK .LINE_CLEAR_ALL , "w:r/w:br{w:type=textWrapping, w:clear=all}" ),
81+ ],
82+ )
83+ def it_can_add_a_break (self , break_type : WD_BREAK , expected_cxml : str ):
84+ run = Run (element ("w:r" ), None )
85+ expected_xml = xml (expected_cxml )
86+
6987 run .add_break (break_type )
88+
7089 assert run ._r .xml == expected_xml
7190
7291 def it_can_add_a_tab (self , add_tab_fixture ):
@@ -91,8 +110,18 @@ def it_can_remove_its_content_but_keep_formatting(self, clear_fixture):
91110 assert run ._r .xml == expected_xml
92111 assert _run is run
93112
94- def it_knows_the_text_it_contains (self , text_get_fixture ):
95- run , expected_text = text_get_fixture
113+ @pytest .mark .parametrize (
114+ ("r_cxml" , "expected_text" ),
115+ [
116+ ("w:r" , "" ),
117+ ('w:r/w:t"foobar"' , "foobar" ),
118+ ('w:r/(w:t"abc", w:tab, w:t"def", w:cr)' , "abc\t def\n " ),
119+ ('w:r/(w:br{w:type=page}, w:t"abc", w:t"def", w:tab)' , "\n abcdef\t " ),
120+ ],
121+ )
122+ def it_knows_the_text_it_contains (self , r_cxml : str , expected_text : str ):
123+ r = cast (CT_R , element (r_cxml ))
124+ run = Run (r , None ) # pyright: ignore[reportGeneralTypeIssues]
96125 assert run .text == expected_text
97126
98127 def it_can_replace_the_text_it_contains (self , text_set_fixture ):
@@ -102,22 +131,6 @@ def it_can_replace_the_text_it_contains(self, text_set_fixture):
102131
103132 # fixtures -------------------------------------------------------
104133
105- @pytest .fixture (
106- params = [
107- (WD_BREAK .LINE , "w:r/w:br" ),
108- (WD_BREAK .PAGE , "w:r/w:br{w:type=page}" ),
109- (WD_BREAK .COLUMN , "w:r/w:br{w:type=column}" ),
110- (WD_BREAK .LINE_CLEAR_LEFT , "w:r/w:br{w:type=textWrapping, w:clear=left}" ),
111- (WD_BREAK .LINE_CLEAR_RIGHT , "w:r/w:br{w:type=textWrapping, w:clear=right}" ),
112- (WD_BREAK .LINE_CLEAR_ALL , "w:r/w:br{w:type=textWrapping, w:clear=all}" ),
113- ]
114- )
115- def add_break_fixture (self , request ):
116- break_type , expected_cxml = request .param
117- run = Run (element ("w:r" ), None )
118- expected_xml = xml (expected_cxml )
119- return run , break_type , expected_xml
120-
121134 @pytest .fixture
122135 def add_picture_fixture (self , part_prop_ , document_part_ , InlineShape_ , picture_ ):
123136 run = Run (element ("w:r/wp:x" ), None )
@@ -247,19 +260,6 @@ def style_set_fixture(self, request, part_prop_):
247260 expected_xml = xml (expected_cxml )
248261 return run , value , expected_xml
249262
250- @pytest .fixture (
251- params = [
252- ("w:r" , "" ),
253- ('w:r/w:t"foobar"' , "foobar" ),
254- ('w:r/(w:t"abc", w:tab, w:t"def", w:cr)' , "abc\t def\n " ),
255- ('w:r/(w:br{w:type=page}, w:t"abc", w:t"def", w:tab)' , "\n abcdef\t " ),
256- ]
257- )
258- def text_get_fixture (self , request ):
259- r_cxml , expected_text = request .param
260- run = Run (element (r_cxml ), None )
261- return run , expected_text
262-
263263 @pytest .fixture (
264264 params = [
265265 ("abc def" , 'w:r/w:t"abc def"' ),
0 commit comments