Skip to content

Commit c92929a

Browse files
Separate text sequence reset logic for robustness
DEVSIX-1438 Autoported commit. Original commit hash: [02f34d5dda]
1 parent e9aa51d commit c92929a

File tree

5 files changed

+136
-111
lines changed

5 files changed

+136
-111
lines changed

itext.tests/itext.layout.tests/itext/layout/renderer/TextRendererIntegrationTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,33 @@ public virtual void MinMaxWidthWordSplitAcrossMultipleTextRenderers() {
407407
));
408408
}
409409

410+
[NUnit.Framework.Test]
411+
[LogMessage(iText.IO.LogMessageConstant.TABLE_WIDTH_IS_MORE_THAN_EXPECTED_DUE_TO_MIN_WIDTH)]
412+
public virtual void MinWidthForWordInMultipleTextRenderersFollowedByFloatTest() {
413+
String outFileName = destinationFolder + "minWidthForSpanningWordFollowedByFloat.pdf";
414+
String cmpFileName = sourceFolder + "cmp_minWidthForSpanningWordFollowedByFloat.pdf";
415+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
416+
Document doc = new Document(pdfDocument);
417+
doc.SetFontSize(40);
418+
// add elements to the table in narrow parent div, so table width would be completely based on min-width
419+
Div narrowDivWithTable = new Div().SetBorder(new DashedBorder(ColorConstants.DARK_GRAY, 3)).SetWidth(10);
420+
Table table = new Table(1);
421+
table.SetBorder(new SolidBorder(ColorConstants.GREEN, 2));
422+
Div floatingDiv = new Div();
423+
floatingDiv.SetProperty(Property.FLOAT, FloatPropertyValue.LEFT);
424+
floatingDiv.SetWidth(40).SetHeight(20).SetBackgroundColor(ColorConstants.LIGHT_GRAY);
425+
Paragraph paragraph = new Paragraph().Add(new Text("s")).Add(new Text("i")).Add(new Text("n")).Add(new Text
426+
("g")).Add(new Text("l")).Add(new Text("e")).Add(floatingDiv).SetBorder(new SolidBorder(1));
427+
paragraph.SetProperty(Property.OVERFLOW_X, OverflowPropertyValue.VISIBLE);
428+
paragraph.SetProperty(Property.RENDERING_MODE, RenderingMode.HTML_MODE);
429+
table.AddCell(paragraph);
430+
narrowDivWithTable.Add(table);
431+
doc.Add(narrowDivWithTable);
432+
doc.Close();
433+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder
434+
));
435+
}
436+
410437
[NUnit.Framework.Test]
411438
public virtual void OverflowWrapBreakWordWithOverflowXTest() {
412439
String outFileName = destinationFolder + "overflowWrapBreakWordWithOverflowXTest.pdf";

itext.tests/itext.layout.tests/itext/layout/renderer/WordWrapUnitTest.cs

Lines changed: 61 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -534,96 +534,115 @@ public virtual void NothingLayoutResult() {
534534
}
535535

536536
[NUnit.Framework.Test]
537-
public virtual void UpdateSpecialScriptLayoutResultsNonTextRenderer() {
538-
IDictionary<int, LayoutResult> specialScriptLayoutResults = new Dictionary<int, LayoutResult>();
537+
public virtual void ResetTextSequenceLayoutResultsBecauseOfNonTextRenderer() {
538+
IDictionary<int, LayoutResult> textRendererLayoutResults = new Dictionary<int, LayoutResult>();
539539
TextLayoutResult res = new TextLayoutResult(LayoutResult.NOTHING, new LayoutArea(0, new Rectangle(0, 0, 10
540540
, 10)), null, null, null);
541-
specialScriptLayoutResults.Put(0, res);
542-
NUnit.Framework.Assert.IsFalse(specialScriptLayoutResults.IsEmpty());
541+
textRendererLayoutResults.Put(0, res);
543542
TabRenderer tabRenderer = new TabRenderer(new Tab());
544543
LineRenderer.MinMaxWidthOfTextRendererSequenceHelper minMaxWidthOfTextRendererSequenceHelper = new LineRenderer.MinMaxWidthOfTextRendererSequenceHelper
545544
(0f, 0f, false);
546545
AbstractWidthHandler widthHandler = new MaxSumWidthHandler(new MinMaxWidth());
547-
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()));
548-
Document document = new Document(pdfDocument);
549546
LineRenderer lineRenderer = new LineRenderer();
550-
lineRenderer.SetParent(document.GetRenderer());
551-
lineRenderer.AddChild(tabRenderer);
552-
lineRenderer.UpdateSpecialScriptLayoutResults(specialScriptLayoutResults, tabRenderer, 1, res, minMaxWidthOfTextRendererSequenceHelper
547+
lineRenderer.ResetTextSequenceIfItEnded(textRendererLayoutResults, false, tabRenderer, 1, minMaxWidthOfTextRendererSequenceHelper
553548
, false, widthHandler);
554-
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.IsEmpty());
549+
NUnit.Framework.Assert.IsTrue(textRendererLayoutResults.IsEmpty());
555550
}
556551

557552
[NUnit.Framework.Test]
558-
public virtual void UpdateSpecialScriptLayoutResultsFloatingRenderer() {
559-
IDictionary<int, LayoutResult> specialScriptLayoutResults = new Dictionary<int, LayoutResult>();
553+
public virtual void ResetTextSequenceLayoutResultsBecauseOfFloatingRenderer() {
554+
IDictionary<int, LayoutResult> textRendererLayoutResults = new Dictionary<int, LayoutResult>();
560555
TextLayoutResult res = new TextLayoutResult(LayoutResult.NOTHING, new LayoutArea(0, new Rectangle(0, 0, 10
561556
, 10)), null, null, null);
562-
int childPosToRemain = 0;
563-
specialScriptLayoutResults.Put(childPosToRemain, res);
564-
NUnit.Framework.Assert.IsFalse(specialScriptLayoutResults.IsEmpty());
565-
Tab tab = new Tab();
566-
tab.SetProperty(Property.FLOAT, FloatPropertyValue.RIGHT);
567-
TabRenderer tabRenderer = new TabRenderer(tab);
557+
int childPosAlreadyAdded = 0;
558+
textRendererLayoutResults.Put(childPosAlreadyAdded, res);
559+
iText.Layout.Element.Text text = new iText.Layout.Element.Text("float");
560+
text.SetProperty(Property.FLOAT, FloatPropertyValue.RIGHT);
561+
TextRenderer tabRenderer = new TextRenderer(text);
568562
LineRenderer.MinMaxWidthOfTextRendererSequenceHelper minMaxWidthOfTextRendererSequenceHelper = new LineRenderer.MinMaxWidthOfTextRendererSequenceHelper
569563
(0f, 0f, false);
570564
AbstractWidthHandler widthHandler = new MaxSumWidthHandler(new MinMaxWidth());
571-
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()));
572-
Document document = new Document(pdfDocument);
573565
LineRenderer lineRenderer = new LineRenderer();
574-
lineRenderer.SetParent(document.GetRenderer());
575-
lineRenderer.AddChild(tabRenderer);
566+
int childPosDuringResetAttempt = 1;
567+
lineRenderer.ResetTextSequenceIfItEnded(textRendererLayoutResults, false, tabRenderer, childPosDuringResetAttempt
568+
, minMaxWidthOfTextRendererSequenceHelper, true, widthHandler);
569+
NUnit.Framework.Assert.IsTrue(textRendererLayoutResults.IsEmpty());
570+
}
571+
572+
[NUnit.Framework.Test]
573+
public virtual void UpdateSpecialScriptLayoutResultsNonTextRenderer() {
574+
IDictionary<int, LayoutResult> textRendererLayoutResults = new Dictionary<int, LayoutResult>();
575+
Tab tab = new Tab();
576+
TabRenderer tabRenderer = new TabRenderer(tab);
577+
LineRenderer lineRenderer = new LineRenderer();
576578
int childPosNotToBeAdded = 1;
577-
lineRenderer.UpdateSpecialScriptLayoutResults(specialScriptLayoutResults, tabRenderer, childPosNotToBeAdded
578-
, res, minMaxWidthOfTextRendererSequenceHelper, false, widthHandler);
579-
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.ContainsKey(childPosToRemain));
580-
NUnit.Framework.Assert.IsFalse(specialScriptLayoutResults.ContainsKey(childPosNotToBeAdded));
579+
lineRenderer.UpdateSpecialScriptLayoutResults(textRendererLayoutResults, tabRenderer, childPosNotToBeAdded
580+
, new LayoutResult(LayoutResult.FULL, new LayoutArea(1, new Rectangle(10, 10)), null, null, null));
581+
NUnit.Framework.Assert.IsTrue(textRendererLayoutResults.IsEmpty());
581582
}
582583

583584
[NUnit.Framework.Test]
584-
public virtual void UpdateSpecialScriptLayoutResultsTextRendererWithNoSpecialScripts() {
585+
public virtual void ResetSpecialScriptTextSequenceBecauseOfTextRendererWithNoSpecialScripts() {
585586
IDictionary<int, LayoutResult> specialScriptLayoutResults = new Dictionary<int, LayoutResult>();
586587
LayoutResult res = new LayoutResult(LayoutResult.NOTHING, new LayoutArea(0, new Rectangle(0, 0, 10, 10)),
587588
null, null);
588589
specialScriptLayoutResults.Put(0, res);
589-
NUnit.Framework.Assert.IsFalse(specialScriptLayoutResults.IsEmpty());
590590
TextRenderer textRenderer = new TextRenderer(new iText.Layout.Element.Text("whatever"));
591-
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()));
592-
Document document = new Document(pdfDocument);
593591
LineRenderer lineRenderer = new LineRenderer();
594-
lineRenderer.SetParent(document.GetRenderer());
595-
lineRenderer.AddChild(textRenderer);
596592
LineRenderer.MinMaxWidthOfTextRendererSequenceHelper minMaxWidthOfTextRendererSequenceHelper = new LineRenderer.MinMaxWidthOfTextRendererSequenceHelper
597593
(0f, 0f, false);
598594
AbstractWidthHandler widthHandler = new MaxSumWidthHandler(new MinMaxWidth());
599-
lineRenderer.UpdateSpecialScriptLayoutResults(specialScriptLayoutResults, textRenderer, 1, res, minMaxWidthOfTextRendererSequenceHelper
595+
lineRenderer.ResetTextSequenceIfItEnded(specialScriptLayoutResults, true, textRenderer, 1, minMaxWidthOfTextRendererSequenceHelper
600596
, true, widthHandler);
601597
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.IsEmpty());
602598
}
603599

604600
[NUnit.Framework.Test]
605-
public virtual void UpdateSpecialScriptLayoutResultsTextRendererWithSpecialScripts() {
601+
public virtual void UpdateSpecialScriptLayoutResultsTextRendererWithNoSpecialScripts() {
606602
IDictionary<int, LayoutResult> specialScriptLayoutResults = new Dictionary<int, LayoutResult>();
603+
TextRenderer textRenderer = new TextRenderer(new iText.Layout.Element.Text("whatever"));
607604
LayoutResult res = new LayoutResult(LayoutResult.NOTHING, new LayoutArea(0, new Rectangle(0, 0, 10, 10)),
608605
null, null);
609-
int firstKey = -1;
606+
LineRenderer lineRenderer = new LineRenderer();
607+
lineRenderer.UpdateSpecialScriptLayoutResults(specialScriptLayoutResults, textRenderer, 1, res);
608+
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.IsEmpty());
609+
}
610+
611+
[NUnit.Framework.Test]
612+
public virtual void NotResetSpecialScriptTextSequenceBecauseOfTextRendererWithSpecialScripts() {
613+
IDictionary<int, LayoutResult> specialScriptLayoutResults = new Dictionary<int, LayoutResult>();
614+
LayoutResult res = new LayoutResult(LayoutResult.NOTHING, new LayoutArea(0, new Rectangle(0, 0, 10, 10)),
615+
null, null);
616+
int firstKey = 0;
610617
specialScriptLayoutResults.Put(firstKey, res);
611-
NUnit.Framework.Assert.IsFalse(specialScriptLayoutResults.IsEmpty());
612618
TextRenderer textRenderer = new TextRenderer(new iText.Layout.Element.Text("whatever"));
613-
textRenderer.SetSpecialScriptsWordBreakPoints(new List<int>(JavaUtil.ArraysAsList(-1)));
614-
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream()));
615-
Document document = new Document(pdfDocument);
619+
textRenderer.SetSpecialScriptsWordBreakPoints(new List<int>(JavaCollectionsUtil.SingletonList(-1)));
616620
LineRenderer lineRenderer = new LineRenderer();
617-
lineRenderer.SetParent(document.GetRenderer());
618-
lineRenderer.AddChild(textRenderer);
619621
LineRenderer.MinMaxWidthOfTextRendererSequenceHelper minMaxWidthOfTextRendererSequenceHelper = new LineRenderer.MinMaxWidthOfTextRendererSequenceHelper
620622
(0f, 0f, false);
621623
AbstractWidthHandler widthHandler = new MaxSumWidthHandler(new MinMaxWidth());
622624
int secondKey = firstKey + 1;
623-
lineRenderer.UpdateSpecialScriptLayoutResults(specialScriptLayoutResults, textRenderer, secondKey, res, minMaxWidthOfTextRendererSequenceHelper
625+
lineRenderer.ResetTextSequenceIfItEnded(specialScriptLayoutResults, true, textRenderer, secondKey, minMaxWidthOfTextRendererSequenceHelper
624626
, true, widthHandler);
627+
NUnit.Framework.Assert.AreEqual(1, specialScriptLayoutResults.Count);
628+
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.ContainsKey(firstKey));
629+
}
630+
631+
[NUnit.Framework.Test]
632+
public virtual void UpdateSpecialScriptLayoutResultsTextRendererWithSpecialScripts() {
633+
IDictionary<int, LayoutResult> specialScriptLayoutResults = new Dictionary<int, LayoutResult>();
634+
LayoutResult res = new LayoutResult(LayoutResult.NOTHING, new LayoutArea(0, new Rectangle(0, 0, 10, 10)),
635+
null, null);
636+
int firstKey = 0;
637+
specialScriptLayoutResults.Put(firstKey, res);
638+
TextRenderer textRenderer = new TextRenderer(new iText.Layout.Element.Text("whatever"));
639+
textRenderer.SetSpecialScriptsWordBreakPoints(new List<int>(JavaCollectionsUtil.SingletonList(-1)));
640+
LineRenderer lineRenderer = new LineRenderer();
641+
int secondKey = firstKey + 1;
642+
lineRenderer.UpdateSpecialScriptLayoutResults(specialScriptLayoutResults, textRenderer, secondKey, res);
625643
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.ContainsKey(firstKey));
626644
NUnit.Framework.Assert.IsTrue(specialScriptLayoutResults.ContainsKey(secondKey));
645+
NUnit.Framework.Assert.AreEqual(2, specialScriptLayoutResults.Count);
627646
}
628647

629648
[NUnit.Framework.Test]

0 commit comments

Comments
 (0)