| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- using System;
- using System.Linq;
- using NUnit.Framework;
- using QuestPDF.Elements.Text;
- using QuestPDF.Elements.Text.Items;
- using QuestPDF.Fluent;
- using QuestPDF.Helpers;
- using QuestPDF.Infrastructure;
- using QuestPDF.Skia.Text;
- namespace QuestPDF.UnitTests;
- public class TextSpanTests
- {
- internal (TextSpanDescriptor, TextBlockSpan) CreateTextBlockSpan()
- {
- var container = EmptyContainer.Create();
- var descriptor = container.Text("test");
- var textElement = container.Child as TextBlock;
- var textBlockSpan = textElement?.Items.SingleOrDefault() as TextBlockSpan;
-
- return (descriptor, textBlockSpan);
- }
-
- #region Override Style
-
- [Test]
- public void OverridesStyle()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- var customStyle = TextStyle
- .Default
- .FontColor(Colors.Black)
- .BackgroundColor(Colors.Transparent)
- .Underline()
- .DecorationColor(Colors.Red.Medium)
- .DecorationWavy();
- descriptor
- .FontSize(30)
- .FontColor(Colors.Blue.Darken4)
- .BackgroundColor(Colors.Blue.Lighten5)
- .Bold()
- .Style(customStyle);
-
- Assert.That(textBlockSpan.Style.Size, Is.EqualTo(30));
- Assert.That(textBlockSpan.Style.Color, Is.EqualTo(Colors.Black));
- Assert.That(textBlockSpan.Style.BackgroundColor, Is.EqualTo(Colors.Transparent));
- Assert.That(textBlockSpan.Style.HasUnderline, Is.True);
- Assert.That(textBlockSpan.Style.DecorationColor, Is.EqualTo(Colors.Red.Medium));
- Assert.That(textBlockSpan.Style.DecorationStyle, Is.EqualTo(TextStyleConfiguration.TextDecorationStyle.Wavy));
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Bold));
- }
-
- [Test]
- public void OverridesStyle_AcceptsNull()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor
- .FontSize(30)
- .FontColor(Colors.Blue.Darken4)
- .BackgroundColor(Colors.Blue.Lighten5)
- .Bold()
- .Style(null);
-
- Assert.That(textBlockSpan.Style.Size, Is.EqualTo(30));
- Assert.That(textBlockSpan.Style.Color, Is.EqualTo(Colors.Blue.Darken4));
- Assert.That(textBlockSpan.Style.BackgroundColor, Is.EqualTo(Colors.Blue.Lighten5));
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Bold));
- }
-
- #endregion
-
- #region Font Color
-
- [Test]
- public void SetsCorrectFontColor()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontColor(Colors.Blue.Medium);
- Assert.That(textBlockSpan.Style.Color, Is.EqualTo(Colors.Blue.Medium));
- }
-
- [Test]
- public void FontColor_AlsoSetsDecorationColor()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontColor(Colors.Green.Darken2);
- Assert.That(textBlockSpan.Style.DecorationColor, Is.EqualTo(Colors.Green.Darken2));
- }
-
- #endregion
-
- #region Background Color
-
- [Test]
- public void SetsCorrectBackgroundColor()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.BackgroundColor(Colors.Yellow.Lighten3);
- Assert.That(textBlockSpan.Style.BackgroundColor, Is.EqualTo(Colors.Yellow.Lighten3));
- }
-
- #endregion
-
- #region Font Family
-
- [Test]
- public void SetsCorrectFontFamily_Single()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontFamily("Arial");
- Assert.That(textBlockSpan.Style.FontFamilies, Is.EqualTo(new[] { "Arial" }));
- }
-
- [Test]
- public void SetsCorrectFontFamily_Multiple()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontFamily("Helvetica", "Arial", "sans-serif");
- Assert.That(textBlockSpan.Style.FontFamilies, Is.EqualTo(new[] { "Helvetica", "Arial", "sans-serif" }));
- }
- [Test]
- public void FontFamily_EmptyArray_ReturnsUnchanged()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontFamily([]);
- Assert.That(textBlockSpan.Style.FontFamilies, Is.Null);
- }
-
- [Test]
- public void FontFamily_Null_ReturnsUnchanged()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontFamily(null);
- Assert.That(textBlockSpan.Style.FontFamilies, Is.Null);
- }
-
- #endregion
-
- #region Font Size
-
- [Test]
- public void SetsCorrectFontSize()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontSize(18);
- Assert.That(textBlockSpan.Style.Size, Is.EqualTo(18));
- }
-
- [TestCase(-10)]
- [TestCase(-5)]
- [TestCase(-float.Epsilon)]
- [TestCase(0)]
- public void FontSize_MustBePositive(float fontSize)
- {
- var exception = Assert.Throws<ArgumentException>(() =>
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.FontSize(fontSize);
- });
-
- Assert.That(exception.Message, Is.EqualTo("Font size must be greater than 0."));
- }
- #endregion
-
- #region Line Height
- [Test]
- public void SetsCorrectLineHeight()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LineHeight(1.5f);
- Assert.That(textBlockSpan.Style.LineHeight, Is.EqualTo(1.5f));
- }
-
- [Test]
- public void LineHeight_Null_SetsToNormalLineHeight()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LineHeight(null);
- Assert.That(textBlockSpan.Style.LineHeight, Is.EqualTo(TextStyle.NormalLineHeightCalculatedFromFontMetrics));
- }
-
- [TestCase(-5)]
- [TestCase(-float.Epsilon)]
- public void LineHeightMustBePositive(float lineHeight)
- {
- var exception = Assert.Throws<ArgumentException>(() =>
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LineHeight(lineHeight);
- });
-
- Assert.That(exception.Message, Is.EqualTo("Line height must be greater than 0."));
- }
-
- [Test]
- public void LineHeight_AllowsZero()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LineHeight(0);
- Assert.That(textBlockSpan.Style.LineHeight, Is.Zero);
- }
-
- #endregion
-
- #region Letter Spacing
-
- [Test]
- public void SetsCorrectLetterSpacing_Positive()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LetterSpacing(0.5f);
- Assert.That(textBlockSpan.Style.LetterSpacing, Is.EqualTo(0.5f));
- }
-
- [Test]
- public void SetsCorrectLetterSpacing_Negative()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LetterSpacing(-0.2f);
- Assert.That(textBlockSpan.Style.LetterSpacing, Is.EqualTo(-0.2f));
- }
-
- [Test]
- public void LetterSpacing_DefaultParameterIsZero()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.LetterSpacing();
- Assert.That(textBlockSpan.Style.LetterSpacing, Is.Zero);
- }
-
- #endregion
-
- #region Word Spacing
-
- [Test]
- public void SetsCorrectWordSpacing_Positive()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.WordSpacing(2.0f);
- Assert.That(textBlockSpan.Style.WordSpacing, Is.EqualTo(2.0f));
- }
-
- [Test]
- public void SetsCorrectWordSpacing_Negative()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.WordSpacing(-1.0f);
- Assert.That(textBlockSpan.Style.WordSpacing, Is.EqualTo(-1.0f));
- }
-
- [Test]
- public void WordSpacing_DefaultParameterIsZero()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.WordSpacing();
- Assert.That(textBlockSpan.Style.WordSpacing, Is.Zero);
- }
-
- #endregion
-
- #region Italic
-
- [Test]
- public void SetsCorrectItalic_Enabled()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Italic();
- Assert.That(textBlockSpan.Style.IsItalic, Is.True);
- }
-
- [Test]
- public void SetsCorrectItalic_Disabled()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Italic().Italic(false);
- Assert.That(textBlockSpan.Style.IsItalic, Is.False);
- }
-
- #endregion
-
- #region Text Decoration
- [Test]
- public void SetsCorrectTextDecoration_Strikethrough()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Strikethrough();
- Assert.That(textBlockSpan.Style.HasStrikethrough, Is.True);
- }
-
- [Test]
- public void SetsCorrectTextDecoration_StrikethroughDisabled()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Strikethrough(false);
- Assert.That(textBlockSpan.Style.HasStrikethrough, Is.False);
- }
-
- [Test]
- public void SetsCorrectTextDecoration_Underline()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Underline();
- Assert.That(textBlockSpan.Style.HasUnderline, Is.True);
- }
-
- [Test]
- public void SetsCorrectTextDecoration_UnderlineDisabled()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Underline(false);
- Assert.That(textBlockSpan.Style.HasUnderline, Is.False);
- }
-
- [Test]
- public void SetsCorrectTextDecoration_Overline()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Overline();
- Assert.That(textBlockSpan.Style.HasOverline, Is.True);
- }
-
- [Test]
- public void SetsCorrectTextDecoration_OverlineDisabled()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Overline(false);
- Assert.That(textBlockSpan.Style.HasOverline, Is.False);
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationColor()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationColor(Colors.Red.Medium);
- Assert.That(textBlockSpan.Style.DecorationColor, Is.EqualTo(Colors.Red.Medium));
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationThickness()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationThickness(1.5f);
- Assert.That(textBlockSpan.Style.DecorationThickness, Is.EqualTo(1.5f));
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationSolid()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationSolid();
- Assert.That(textBlockSpan.Style.DecorationStyle, Is.EqualTo(TextStyleConfiguration.TextDecorationStyle.Solid));
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationDouble()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationDouble();
- Assert.That(textBlockSpan.Style.DecorationStyle, Is.EqualTo(TextStyleConfiguration.TextDecorationStyle.Double));
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationWavy()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationWavy();
- Assert.That(textBlockSpan.Style.DecorationStyle, Is.EqualTo(TextStyleConfiguration.TextDecorationStyle.Wavy));
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationDotted()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationDotted();
- Assert.That(textBlockSpan.Style.DecorationStyle, Is.EqualTo(TextStyleConfiguration.TextDecorationStyle.Dotted));
- }
-
- [Test]
- public void SetsCorrectTextDecoration_DecorationDashed()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DecorationDashed();
- Assert.That(textBlockSpan.Style.DecorationStyle, Is.EqualTo(TextStyleConfiguration.TextDecorationStyle.Dashed));
- }
-
- #endregion
-
- #region Font Weight
- [Test]
- public void SetsCorrectSetsCorrectFontWeight_Thin()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Thin();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Thin));
- }
-
- [Test]
- public void SetsCorrectFontWeight_ExtraLight()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.ExtraLight();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.ExtraLight));
- }
-
- [Test]
- public void SetsCorrectFontWeight_Light()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Light();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Light));
- }
-
- [Test]
- public void SetsCorrectFontWeight_Normal()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.NormalWeight();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Normal));
- }
-
- [Test]
- public void SetsCorrectFontWeight_Medium()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Medium();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Medium));
- }
-
- [Test]
- public void SetsCorrectFontWeight_SemiBold()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.SemiBold();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.SemiBold));
- }
-
- [Test]
- public void SetsCorrectFontWeight_Bold()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Bold();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Bold));
- }
-
- [Test]
- public void SetsCorrectFontWeight_ExtraBold()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.ExtraBold();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.ExtraBold));
- }
-
- [Test]
- public void SetsCorrectFontWeight_Black()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Black();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.Black));
- }
-
- [Test]
- public void SetsCorrectFontWeight_ExtraBlack()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.ExtraBlack();
- Assert.That(textBlockSpan.Style.FontWeight, Is.EqualTo(FontWeight.ExtraBlack));
- }
- #endregion
-
- #region Text Position
-
- [Test]
- public void SetsCorrectTextPosition_Subscript()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Subscript();
- Assert.That(textBlockSpan.Style.FontPosition, Is.EqualTo(FontPosition.Subscript));
- }
-
- [Test]
- public void SetsCorrectTextPosition_Normal()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Superscript().NormalPosition(); // first change from default, then normal
- Assert.That(textBlockSpan.Style.FontPosition, Is.EqualTo(FontPosition.Normal));
- }
-
- [Test]
- public void SetsCorrectTextPosition_Superscript()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.Superscript();
- Assert.That(textBlockSpan.Style.FontPosition, Is.EqualTo(FontPosition.Superscript));
- }
-
- #endregion
-
- #region Text Direction
-
- [Test]
- public void SetsCorrectTextDirection_LeftToRight()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DirectionFromLeftToRight();
- Assert.That(textBlockSpan.Style.Direction, Is.EqualTo(TextDirection.LeftToRight));
- }
-
- [Test]
- public void SetsCorrectTextDirection_RightToLeft()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DirectionFromRightToLeft();
- Assert.That(textBlockSpan.Style.Direction, Is.EqualTo(TextDirection.RightToLeft));
- }
-
- [Test]
- public void SetsCorrectTextDirection_Auto()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
- descriptor.DirectionFromRightToLeft().DirectionAuto();
- Assert.That(textBlockSpan.Style.Direction, Is.EqualTo(TextDirection.Auto));
- }
-
- #endregion
-
- #region Font Features
-
- [Test]
- public void EnableFontFeature_SingleFeature()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
-
- descriptor.EnableFontFeature(FontFeatures.StandardLigatures);
- Assert.That(textBlockSpan.Style.FontFeatures, Has.Length.EqualTo(1));
- Assert.That(textBlockSpan.Style.FontFeatures[0], Is.EqualTo((FontFeatures.StandardLigatures, true)));
- }
-
- [Test]
- public void DisableFontFeature_SingleFeature()
- {
- var (descriptor, textBlockSpan) = CreateTextBlockSpan();
-
- descriptor.DisableFontFeature(FontFeatures.Kerning);
- Assert.That(textBlockSpan.Style.FontFeatures, Has.Length.EqualTo(1));
- Assert.That(textBlockSpan.Style.FontFeatures[0], Is.EqualTo((FontFeatures.Kerning, false)));
- }
- [Test]
- public void FontFeatures_MixedEnableDisable()
- {
- var textStyle = TextStyle.Default
- .EnableFontFeature(FontFeatures.StandardLigatures)
- .DisableFontFeature(FontFeatures.Kerning)
- .DisableFontFeature(FontFeatures.DiscretionaryLigatures)
- .EnableFontFeature(FontFeatures.Kerning);
-
- Assert.That(textStyle.FontFeatures, Has.Length.EqualTo(3));
- Assert.That(textStyle.FontFeatures[0], Is.EqualTo((FontFeatures.Kerning, true)));
- Assert.That(textStyle.FontFeatures[1], Is.EqualTo((FontFeatures.DiscretionaryLigatures, false)));
- Assert.That(textStyle.FontFeatures[2], Is.EqualTo((FontFeatures.StandardLigatures, true)));
- }
-
- #endregion
- }
|