@@ -81,4 +81,61 @@ public void RightToLeftIndentsMirrorWhileBordersStayPhysical()
8181 Assert . Equal ( "67.25pt" , rtl [ "margin-right" ] ) ;
8282 Assert . Equal ( "6.5pt" , rtl [ "margin-left" ] ) ;
8383 }
84+ // Issue #1155: consecutive bordered paragraphs share a box only when their boxes coincide.
85+ private const string SingleBorders =
86+ "<w:pBdr><w:top w:val=\" single\" w:sz=\" 8\" w:space=\" 4\" /><w:left w:val=\" single\" w:sz=\" 8\" w:space=\" 4\" />" +
87+ "<w:bottom w:val=\" single\" w:sz=\" 8\" w:space=\" 4\" /><w:right w:val=\" single\" w:sz=\" 8\" w:space=\" 4\" />" +
88+ "<w:between w:val=\" single\" w:sz=\" 8\" w:space=\" 4\" /></w:pBdr>" ;
89+
90+ private static string Boxed ( string text , string ind , bool bidi ) =>
91+ $ "<w:p><w:pPr>{ ( bidi ? "<w:bidi/>" : "" ) } { SingleBorders } { ind } </w:pPr><w:r><w:t>{ text } </w:t></w:r></w:p>";
92+
93+ private const string Unequal = "<w:ind w:start=\" 720\" w:end=\" 1440\" />" ;
94+
95+ [ Fact ]
96+ public void MixedDirectionsWithUnequalIndentsGetMirroredBoxes ( )
97+ {
98+ var html = Convert ( Boxed ( "Eastward" , Unequal , bidi : false ) , Boxed ( "Westward" , Unequal , bidi : true ) ) ;
99+
100+ Assert . Equal ( 2 , Wrappers ( html ) . Count ) ;
101+ var ltr = Style ( WrapperOf ( html , "Eastward" ) ) ;
102+ var rtl = Style ( WrapperOf ( html , "Westward" ) ) ;
103+ // Start 36pt and end 72pt, each less the 4pt space and the 0.75pt border.
104+ Assert . Equal ( "31.25pt" , ltr [ "margin-left" ] ) ;
105+ Assert . Equal ( "67.25pt" , ltr [ "margin-right" ] ) ;
106+ Assert . Equal ( "31.25pt" , rtl [ "margin-right" ] ) ;
107+ Assert . Equal ( "67.25pt" , rtl [ "margin-left" ] ) ;
108+ }
109+
110+ [ Fact ]
111+ public void MixedDirectionsWithEqualIndentsStillShareOneBox ( )
112+ {
113+ var equal = "<w:ind w:start=\" 720\" w:end=\" 720\" />" ;
114+ var html = Convert ( Boxed ( "Eastward" , equal , bidi : false ) , Boxed ( "Westward" , equal , bidi : true ) ,
115+ Boxed ( "Onward" , equal , bidi : false ) ) ;
116+
117+ var wrapper = Assert . Single ( Wrappers ( html ) ) ;
118+ Assert . Equal ( 3 , wrapper . Descendants ( ) . Count ( e => e . Name . LocalName == "p" ) ) ;
119+ }
120+
121+ [ Fact ]
122+ public void RightToLeftParagraphsWithUnequalIndentsShareOneBox ( )
123+ {
124+ var html = Convert ( Boxed ( "Westward" , Unequal , bidi : true ) , Boxed ( "Seaward" , Unequal , bidi : true ) ) ;
125+
126+ var wrapper = Assert . Single ( Wrappers ( html ) ) ;
127+ Assert . Equal ( "31.25pt" , Style ( wrapper ) [ "margin-right" ] ) ;
128+ Assert . Equal ( "67.25pt" , Style ( wrapper ) [ "margin-left" ] ) ;
129+ }
130+ [ Fact ]
131+ public void MixedDirectionsShareOneBoxWhenAHangingIndentMakesTheBoxSymmetric ( )
132+ {
133+ // Start 72pt less a 36pt hanging indent puts the box's leading edge 36pt in, the same as the
134+ // 36pt end: the box is the same in either direction, so the paragraphs join (as LibreOffice joins them).
135+ var hanging = "<w:ind w:start=\" 1440\" w:hanging=\" 720\" w:end=\" 720\" />" ;
136+ var html = Convert ( Boxed ( "Eastward" , hanging , bidi : false ) , Boxed ( "Westward" , hanging , bidi : true ) ) ;
137+
138+ var wrapper = Assert . Single ( Wrappers ( html ) ) ;
139+ Assert . Equal ( 2 , wrapper . Descendants ( ) . Count ( e => e . Name . LocalName == "p" ) ) ;
140+ }
84141}
0 commit comments