Compare commits
133 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 77b8f04659 | |||
| 5235ada66f | |||
| 4ce66878f2 | |||
| 79cc5f1507 | |||
| 7c7d461c4b | |||
| 63af713935 | |||
| 2419a25cbd | |||
| 014ec15908 | |||
| 82e29d5fdd | |||
| c64754241d | |||
| 9de87061e4 | |||
| 86cfd22316 | |||
| 520bfc840c | |||
| 22cdad69b7 | |||
| d260fa7587 | |||
| 011668fb4c | |||
| 5a886452cf | |||
| b044208195 | |||
| dadb8a5087 | |||
| 11f0809efc | |||
| 0a6673dd4f | |||
| 525bf534e5 | |||
| 68f050a154 | |||
| fd696c5b66 | |||
| 0ccc8cc236 | |||
| 9ef444462a | |||
| 479915b68f | |||
| 5deea91fe4 | |||
| 7174a2afa1 | |||
| 1371fe1df9 | |||
| bb00dfd4d4 | |||
| 70e5783f0e | |||
| e8b7f38187 | |||
| c2ba2addfc | |||
| e379502a64 | |||
| 88e58500a8 | |||
| caa779e1e0 | |||
| 4938e97e6d | |||
| 7980befb77 | |||
| f3b75b43ac | |||
| 17e2727833 | |||
| 1b9ea70f6e | |||
| 87f4c9774a | |||
| 3bdd03031b | |||
| 26335faa97 | |||
| 7b81e61840 | |||
| 391c5a6092 | |||
| d951e0a6b2 | |||
| 188fbc22a7 | |||
| cc6d1c81c8 | |||
| 6d333da84c | |||
| e411554a29 | |||
| 9fddea84ba | |||
| 84e896e13b | |||
| 569864d48a | |||
| 2c11491d4e | |||
| acdd8164be | |||
| 094b25a9fb | |||
| 122f35d0a7 | |||
| f4c9f8b3c2 | |||
| ae7873680d | |||
| 175db288f6 | |||
| 22401be791 | |||
| e2774ef347 | |||
| 99f004dd85 | |||
| 8ada092531 | |||
| c334390af0 | |||
| deed219a0a | |||
| bb8e590fc6 | |||
| a08a7b85c9 | |||
| 755447e1fd | |||
| b66a53a189 | |||
| 6d41ac9b9a | |||
| a124d23862 | |||
| 5f65b2daed | |||
| 07938a1510 | |||
| f17860f519 | |||
| 6023b4de34 | |||
| 748b8f65f5 | |||
| feab280a27 | |||
| ae32511172 | |||
| 6c4da7285a | |||
| 070b6a20bd | |||
| f7cfdb763f | |||
| 5975b19445 | |||
| fb7743e828 | |||
| eca93b7e66 | |||
| 6a3bfd855e | |||
| 5e7f2a3adf | |||
| 2f1dd4b383 | |||
| adec37007b | |||
| 814d325376 | |||
| 4152a0f701 | |||
| 6c80c59996 | |||
| 08a37666fe | |||
| c2fb68562d | |||
| 683ab362d8 | |||
| 3bb46ecc42 | |||
| 3112ee10cf | |||
| 899c138842 | |||
| 5177dcfd2b | |||
| 4e6415aee2 | |||
| d9b3f016e8 | |||
| b9cfaf3846 | |||
| e3e7a22af8 | |||
| c938ea32b0 | |||
| 69419c8440 | |||
| 23e8aa3491 | |||
| fd5d51e764 | |||
| dbc479db07 | |||
| 04af33fc31 | |||
| edc595d199 | |||
| 7f94ae589a | |||
| adfce6204e | |||
| 6d3c8d0708 | |||
| 3b8c300126 | |||
| 239a042615 | |||
| 49fb6dadb3 | |||
| c79a4a0c08 | |||
| 31191efd88 | |||
| 20fe49dd01 | |||
| 7cdc1fcee2 | |||
| 14f11232be | |||
| c05c5e1597 | |||
| 07f1eb99b9 | |||
| 44d7538578 | |||
| b894262f7e | |||
| 4423774648 | |||
| 5d4f1f530a | |||
| 3ba8185871 | |||
| b6e0bd505c | |||
| 4e3ba1d878 | |||
| 6f0c6513da |
@@ -0,0 +1,32 @@
|
|||||||
|
using System.IO;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class BarCode
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Example()
|
||||||
|
{
|
||||||
|
FontManager.RegisterFontType("LibreBarcode39", File.OpenRead("LibreBarcode39-Regular.ttf"));
|
||||||
|
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(400, 100)
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Background(Colors.White)
|
||||||
|
.AlignCenter()
|
||||||
|
.AlignMiddle()
|
||||||
|
.Text("*QuestPDF*", TextStyle.Default.FontType("LibreBarcode39").Size(64));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class BarcodeExamples
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Barcode()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(300, 300)
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Background("#FFF")
|
||||||
|
.Padding(25)
|
||||||
|
.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().Border(1).Background(Colors.Grey.Lighten3).Padding(5).Text("Barcode Example");
|
||||||
|
stack.Item().Border(1).Padding(5).AlignCenter().Text("*123456789*", TextStyle.Default.FontType("CarolinaBar-Demo-25E2").Size(20));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using Microcharts;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class ChartExample
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void MicrochartChart()
|
||||||
|
{
|
||||||
|
var entries = new[]
|
||||||
|
{
|
||||||
|
new ChartEntry(212)
|
||||||
|
{
|
||||||
|
Label = "UWP",
|
||||||
|
ValueLabel = "112",
|
||||||
|
Color = SKColor.Parse("#2c3e50")
|
||||||
|
},
|
||||||
|
new ChartEntry(248)
|
||||||
|
{
|
||||||
|
Label = "Android",
|
||||||
|
ValueLabel = "648",
|
||||||
|
Color = SKColor.Parse("#77d065")
|
||||||
|
},
|
||||||
|
new ChartEntry(128)
|
||||||
|
{
|
||||||
|
Label = "iOS",
|
||||||
|
ValueLabel = "428",
|
||||||
|
Color = SKColor.Parse("#b455b6")
|
||||||
|
},
|
||||||
|
new ChartEntry(514)
|
||||||
|
{
|
||||||
|
Label = "Forms",
|
||||||
|
ValueLabel = "214",
|
||||||
|
Color = SKColor.Parse("#3498db")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(300, 300)
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container.Extend().Canvas((canvas, size) =>
|
||||||
|
{
|
||||||
|
var bar = new BarChart
|
||||||
|
{
|
||||||
|
Entries = entries,
|
||||||
|
IsAnimated = false,
|
||||||
|
};
|
||||||
|
bar.Draw(canvas, (int)size.Width, (int)size.Height);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class ComplexLayoutBenchmark
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void ComplexLayout()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(x => x.Image(new byte[] { 1, 2, 3 }));
|
||||||
|
//.Render(x => GenerateStructure(x, 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GenerateStructure(IContainer container, int level)
|
||||||
|
{
|
||||||
|
if (level <= 0)
|
||||||
|
{
|
||||||
|
container.Background(Placeholders.BackgroundColor()).Height(10);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
level--;
|
||||||
|
|
||||||
|
if (level % 3 == 0)
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Border(level / 10f)
|
||||||
|
.BorderColor(Colors.Black)
|
||||||
|
.Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn().Element(x => GenerateStructure(x, level));
|
||||||
|
row.RelativeColumn().Element(x => GenerateStructure(x, level));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Border(level / 10f)
|
||||||
|
.BorderColor(Colors.Black)
|
||||||
|
.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().Element(x => GenerateStructure(x, level));
|
||||||
|
stack.Item().Element(x => GenerateStructure(x, level));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class ContinuousPageDocument : IDocument
|
||||||
|
{
|
||||||
|
public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
|
||||||
|
|
||||||
|
public void Compose(IDocumentContainer container)
|
||||||
|
{
|
||||||
|
container.Page(page =>
|
||||||
|
{
|
||||||
|
page.Margin(20);
|
||||||
|
page.ContinuousSize(150);
|
||||||
|
|
||||||
|
page.Header().Text("Header");
|
||||||
|
|
||||||
|
page.Content().PaddingVertical(10).Border(1).Padding(10).Stack(stack =>
|
||||||
|
{
|
||||||
|
foreach (var index in Enumerable.Range(1, 100))
|
||||||
|
stack.Item().Text($"Line {index}", TextStyle.Default.Color(Placeholders.Color()));
|
||||||
|
});
|
||||||
|
|
||||||
|
page.Footer().Text("Footer");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContinuousPageExamples
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void ContinuousPage()
|
||||||
|
{
|
||||||
|
var path = "example.pdf";
|
||||||
|
new ContinuousPageDocument().GeneratePdf(path);
|
||||||
|
Process.Start("explorer", path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class DebuggingTesting
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Stack()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(500, 360)
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Background(Colors.White)
|
||||||
|
.Padding(15)
|
||||||
|
.Grid(grid =>
|
||||||
|
{
|
||||||
|
grid.Spacing(15);
|
||||||
|
|
||||||
|
grid.Item().Background(Colors.Grey.Medium).Text(Placeholders.LoremIpsum());
|
||||||
|
grid.Item().DebugPointer("Test").Background(Colors.Grey.Lighten1).Height(1000); // <-- problem
|
||||||
|
grid.Item().Background(Colors.Grey.Lighten2).Height(150);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class DefaultTextStyleExample
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void DefaultTextStyle()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.RenderDocument(container =>
|
||||||
|
{
|
||||||
|
container.Page(page =>
|
||||||
|
{
|
||||||
|
// all text in this set of pages has size 20
|
||||||
|
page.DefaultTextStyle(TextStyle.Default.Size(20));
|
||||||
|
|
||||||
|
page.Margin(20);
|
||||||
|
page.Size(PageSizes.A4);
|
||||||
|
page.Background(Colors.White);
|
||||||
|
|
||||||
|
page.Content().Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().Text(Placeholders.Sentence());
|
||||||
|
|
||||||
|
stack.Item().Text(text =>
|
||||||
|
{
|
||||||
|
// text in this block is additionally semibold
|
||||||
|
text.DefaultTextStyle(TextStyle.Default.SemiBold());
|
||||||
|
|
||||||
|
text.Line(Placeholders.Sentence());
|
||||||
|
|
||||||
|
// this text has size 20 but also semibold and red
|
||||||
|
text.Span(Placeholders.Sentence(), TextStyle.Default.Color(Colors.Red.Medium));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,95 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using QuestPDF.Elements;
|
|
||||||
using QuestPDF.Fluent;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
using SkiaSharp;
|
|
||||||
|
|
||||||
namespace QuestPDF.Examples.Engine
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
public class ExampleTestBase
|
|
||||||
{
|
|
||||||
private readonly Size DefaultImageSize = new Size(400, 300);
|
|
||||||
private const string ResultPath = "Result";
|
|
||||||
|
|
||||||
[SetUp]
|
|
||||||
public void Setup()
|
|
||||||
{
|
|
||||||
if (Directory.Exists(ResultPath))
|
|
||||||
Directory.Delete(ResultPath, true);
|
|
||||||
|
|
||||||
Directory.CreateDirectory(ResultPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void RunTest()
|
|
||||||
{
|
|
||||||
GetType()
|
|
||||||
.GetMethods()
|
|
||||||
.Where(IsExampleMethod)
|
|
||||||
.ToList()
|
|
||||||
.ForEach(HandleExample);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsExampleMethod(MethodInfo method)
|
|
||||||
{
|
|
||||||
var parameters = method.GetParameters();
|
|
||||||
return parameters.Length == 1 && parameters.First().ParameterType == typeof(IContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private T GetAttribute<T>(MethodInfo methodInfo) where T : Attribute
|
|
||||||
{
|
|
||||||
return methodInfo.GetCustomAttributes().FirstOrDefault(y => y is T) as T;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HandleExample(MethodInfo methodInfo)
|
|
||||||
{
|
|
||||||
var size = GetAttribute<ImageSizeAttribute>(methodInfo)?.Size ?? DefaultImageSize;
|
|
||||||
var fileName = GetAttribute<FileNameAttribute>(methodInfo)?.FileName ?? methodInfo.Name;
|
|
||||||
var showResult = GetAttribute<ShowResultAttribute>(methodInfo) != null;
|
|
||||||
var shouldIgnore = GetAttribute<IgnoreAttribute>(methodInfo) != null;
|
|
||||||
|
|
||||||
if (shouldIgnore)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var container = new Container();
|
|
||||||
methodInfo.Invoke(this, new object[] {container});
|
|
||||||
|
|
||||||
Func<int, string> fileNameSchema = i => $"{fileName.ToLower()}-${i}.png";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var document = new SimpleDocument(container, size);
|
|
||||||
document.GenerateImages(fileNameSchema);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
throw new Exception($"Cannot perform test {fileName}", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (showResult)
|
|
||||||
Process.Start("explorer", fileNameSchema(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] RenderPage(Element element, Size size)
|
|
||||||
{
|
|
||||||
// scale the result so it is more readable
|
|
||||||
const float scalingFactor = 2;
|
|
||||||
|
|
||||||
var imageInfo = new SKImageInfo((int)(size.Width * scalingFactor), (int)(size.Height * scalingFactor));
|
|
||||||
using var surface = SKSurface.Create(imageInfo);
|
|
||||||
surface.Canvas.Scale(scalingFactor);
|
|
||||||
|
|
||||||
var canvas = new Drawing.Canvas(surface.Canvas);
|
|
||||||
element?.Draw(canvas, size);
|
|
||||||
|
|
||||||
surface.Canvas.Save();
|
|
||||||
return surface.Snapshot().Encode(SKEncodedImageFormat.Png, 100).ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace QuestPDF.Examples.Engine
|
|
||||||
{
|
|
||||||
public class FileNameAttribute : Attribute
|
|
||||||
{
|
|
||||||
public string FileName { get; }
|
|
||||||
|
|
||||||
public FileNameAttribute(string fileName)
|
|
||||||
{
|
|
||||||
FileName = fileName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace QuestPDF.Examples.Engine
|
|
||||||
{
|
|
||||||
public class IgnoreAttribute : Attribute
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
using System;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
|
|
||||||
namespace QuestPDF.Examples.Engine
|
|
||||||
{
|
|
||||||
public class ImageSizeAttribute : Attribute
|
|
||||||
{
|
|
||||||
private int Width { get; }
|
|
||||||
private int Height { get; }
|
|
||||||
|
|
||||||
public Size Size => new Size(Width, Height);
|
|
||||||
|
|
||||||
public ImageSizeAttribute(int width, int height)
|
|
||||||
{
|
|
||||||
Width = width;
|
|
||||||
Height = height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples.Engine
|
||||||
|
{
|
||||||
|
public enum RenderingTestResult
|
||||||
|
{
|
||||||
|
Pdf,
|
||||||
|
Images
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RenderingTest
|
||||||
|
{
|
||||||
|
private string FileNamePrefix = "test";
|
||||||
|
private Size Size { get; set; }
|
||||||
|
private int? MaxPagesThreshold { get; set; }
|
||||||
|
private bool ShowResult { get; set; }
|
||||||
|
private RenderingTestResult ResultType { get; set; } = RenderingTestResult.Images;
|
||||||
|
|
||||||
|
private RenderingTest()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RenderingTest Create([CallerMemberName] string fileName = "test")
|
||||||
|
{
|
||||||
|
return new RenderingTest().FileName(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderingTest FileName(string fileName)
|
||||||
|
{
|
||||||
|
FileNamePrefix = fileName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderingTest PageSize(Size size)
|
||||||
|
{
|
||||||
|
Size = size;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderingTest PageSize(int width, int height)
|
||||||
|
{
|
||||||
|
return PageSize(new Size(width, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderingTest ProducePdf()
|
||||||
|
{
|
||||||
|
ResultType = RenderingTestResult.Pdf;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderingTest ProduceImages()
|
||||||
|
{
|
||||||
|
ResultType = RenderingTestResult.Images;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderingTest ShowResults()
|
||||||
|
{
|
||||||
|
ShowResult = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Render(Action<IContainer> content)
|
||||||
|
{
|
||||||
|
RenderDocument(container =>
|
||||||
|
{
|
||||||
|
container.Page(page =>
|
||||||
|
{
|
||||||
|
page.Size(new PageSize(Size.Width, Size.Height));
|
||||||
|
page.Content().Container().Background(Colors.White).Element(content);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MaxPages(int value)
|
||||||
|
{
|
||||||
|
MaxPagesThreshold = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RenderDocument(Action<IDocumentContainer> content)
|
||||||
|
{
|
||||||
|
MaxPagesThreshold ??= ResultType == RenderingTestResult.Pdf ? 1000 : 10;
|
||||||
|
var document = new SimpleDocument(content, MaxPagesThreshold.Value);
|
||||||
|
|
||||||
|
Render(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Render(IDocument document)
|
||||||
|
{
|
||||||
|
if (ResultType == RenderingTestResult.Images)
|
||||||
|
{
|
||||||
|
Func<int, string> fileNameSchema = i => $"{FileNamePrefix}-${i}.png";
|
||||||
|
document.GenerateImages(fileNameSchema);
|
||||||
|
|
||||||
|
if (ShowResult)
|
||||||
|
Process.Start("explorer", fileNameSchema(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ResultType == RenderingTestResult.Pdf)
|
||||||
|
{
|
||||||
|
var fileName = $"{FileNamePrefix}.pdf";
|
||||||
|
document.GeneratePdf(fileName);
|
||||||
|
|
||||||
|
if (ShowResult)
|
||||||
|
Process.Start("explorer", fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace QuestPDF.Examples.Engine
|
|
||||||
{
|
|
||||||
public class ShowResultAttribute : Attribute
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
using QuestPDF.Drawing;
|
using System;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Helpers;
|
using QuestPDF.Helpers;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
@@ -7,27 +9,29 @@ namespace QuestPDF.Examples.Engine
|
|||||||
{
|
{
|
||||||
public class SimpleDocument : IDocument
|
public class SimpleDocument : IDocument
|
||||||
{
|
{
|
||||||
private IContainer Container { get; }
|
public const int ImageScalingFactor = 2;
|
||||||
private Size Size { get; }
|
|
||||||
|
private Action<IDocumentContainer> Content { get; }
|
||||||
|
private int MaxPages { get; }
|
||||||
|
|
||||||
public SimpleDocument(IContainer container, Size size)
|
public SimpleDocument(Action<IDocumentContainer> content, int maxPages)
|
||||||
{
|
{
|
||||||
Container = container;
|
Content = content;
|
||||||
Size = size;
|
MaxPages = maxPages;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DocumentMetadata GetMetadata()
|
public DocumentMetadata GetMetadata()
|
||||||
{
|
{
|
||||||
return new DocumentMetadata()
|
return new DocumentMetadata()
|
||||||
{
|
{
|
||||||
RasterDpi = PageSizes.PointsPerInch * 2,
|
RasterDpi = PageSizes.PointsPerInch * ImageScalingFactor,
|
||||||
Size = Size
|
DocumentLayoutExceptionThreshold = MaxPages
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Compose(IContainer container)
|
public void Compose(IDocumentContainer container)
|
||||||
{
|
{
|
||||||
container.Background("#FFF").Element(Container.Child);
|
Content(container);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class EnsureSpaceExample
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void EnsureSpaceWith()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.RenderDocument(container =>
|
||||||
|
{
|
||||||
|
container.Page(page =>
|
||||||
|
{
|
||||||
|
page.Margin(20);
|
||||||
|
page.Size(PageSizes.A7.Landscape());
|
||||||
|
page.Background(Colors.White);
|
||||||
|
|
||||||
|
page.Header().Text("With ensure space", TextStyle.Default.SemiBold());
|
||||||
|
|
||||||
|
page.Content().Stack(stack =>
|
||||||
|
{
|
||||||
|
stack
|
||||||
|
.Item()
|
||||||
|
.ExtendHorizontal()
|
||||||
|
.Height(75)
|
||||||
|
.Background(Colors.Grey.Lighten2);
|
||||||
|
|
||||||
|
stack
|
||||||
|
.Item()
|
||||||
|
.EnsureSpace(100)
|
||||||
|
.Text(Placeholders.LoremIpsum());
|
||||||
|
});
|
||||||
|
|
||||||
|
page.Footer().Text(text =>
|
||||||
|
{
|
||||||
|
text.Span("Page ");
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" out of ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
using QuestPDF.Examples.Engine;
|
using QuestPDF.Examples.Engine;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Helpers;
|
using QuestPDF.Helpers;
|
||||||
@@ -11,33 +12,39 @@ namespace QuestPDF.Examples
|
|||||||
{
|
{
|
||||||
return container
|
return container
|
||||||
.Border(1)
|
.Border(1)
|
||||||
.Background(dark ? "#EEE" : "#FFF")
|
.Background(dark ? Colors.Grey.Lighten2 : Colors.White)
|
||||||
.Padding(10);
|
.Padding(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IContainer LabelCell(this IContainer container) => container.Cell(true);
|
public static void LabelCell(this IContainer container, string text) => container.Cell(true).Text(text, TextStyle.Default.Medium());
|
||||||
public static IContainer ValueCell(this IContainer container) => container.Cell(false);
|
public static IContainer ValueCell(this IContainer container) => container.Cell(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FrameExample: ExampleTestBase
|
public class FrameExample
|
||||||
{
|
{
|
||||||
[ImageSize(550, 400)]
|
[Test]
|
||||||
[ShowResult]
|
public void Frame()
|
||||||
public void Frame(IContainer container)
|
|
||||||
{
|
{
|
||||||
container
|
RenderingTest
|
||||||
.Background("#FFF")
|
.Create()
|
||||||
.Padding(25)
|
.PageSize(550, 400)
|
||||||
.Stack(stack =>
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
{
|
{
|
||||||
for(var i=1; i<=4; i++)
|
container
|
||||||
{
|
.Background("#FFF")
|
||||||
stack.Item().Row(row =>
|
.Padding(25)
|
||||||
|
.Stack(stack =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(2).LabelCell().Text(Placeholders.Label());
|
for(var i=1; i<=4; i++)
|
||||||
row.RelativeColumn(3).ValueCell().Text(Placeholders.Paragraph());
|
{
|
||||||
|
stack.Item().Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn(2).LabelCell(Placeholders.Label());
|
||||||
|
row.RelativeColumn(3).ValueCell().Text(Placeholders.Paragraph());
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using System.IO;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class ImageExamples
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void LoadingImage()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A5)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(page =>
|
||||||
|
{
|
||||||
|
page.Padding(25).Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Spacing(25);
|
||||||
|
|
||||||
|
stack.Item().Image("logo.png");
|
||||||
|
|
||||||
|
var binaryData = File.ReadAllBytes("logo.png");
|
||||||
|
stack.Item().Image(binaryData);
|
||||||
|
|
||||||
|
using var stream = new FileStream("logo.png", FileMode.Open);
|
||||||
|
stack.Item().Image(stream);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Exception()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A5)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(page => page.Image("non_existent.png"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection.Metadata.Ecma335;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class InlinedExamples
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Inlined()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(800, 650)
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(25)
|
||||||
|
.Decoration(decoration =>
|
||||||
|
{
|
||||||
|
decoration.Header().Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default.Size(20));
|
||||||
|
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" / ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
|
|
||||||
|
decoration
|
||||||
|
.Content()
|
||||||
|
.PaddingTop(25)
|
||||||
|
//.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Background(Colors.Grey.Lighten2)
|
||||||
|
.Inlined(inlined =>
|
||||||
|
{
|
||||||
|
inlined.Spacing(25);
|
||||||
|
|
||||||
|
inlined.AlignSpaceAround();
|
||||||
|
inlined.BaselineMiddle();
|
||||||
|
|
||||||
|
var random = new Random(123);
|
||||||
|
|
||||||
|
foreach (var _ in Enumerable.Range(0, 50))
|
||||||
|
{
|
||||||
|
var width = random.Next(2, 7);
|
||||||
|
var height = random.Next(2, 7);
|
||||||
|
|
||||||
|
var sizeText = $"{width}×{height}";
|
||||||
|
|
||||||
|
inlined
|
||||||
|
.Item()
|
||||||
|
.Border(1)
|
||||||
|
.Width(width * 25)
|
||||||
|
.Height(height * 25)
|
||||||
|
.Background(Placeholders.BackgroundColor())
|
||||||
|
.Layers(layers =>
|
||||||
|
{
|
||||||
|
layers.Layer().Grid(grid =>
|
||||||
|
{
|
||||||
|
grid.Columns(width);
|
||||||
|
Enumerable.Range(0, width * height).ToList().ForEach(x => grid.Item().Border(1).BorderColor(Colors.White).Width(25).Height(25));
|
||||||
|
});
|
||||||
|
|
||||||
|
layers
|
||||||
|
.PrimaryLayer()
|
||||||
|
.AlignCenter()
|
||||||
|
.AlignMiddle()
|
||||||
|
.Text(sizeText, TextStyle.Default.Size(15));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Inline_AlignLeft_BaselineBottom()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(800, 600)
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(20)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Background(Colors.Grey.Lighten4)
|
||||||
|
.Inlined(inlined =>
|
||||||
|
{
|
||||||
|
inlined.VerticalSpacing(50);
|
||||||
|
inlined.HorizontalSpacing(25);
|
||||||
|
inlined.AlignRight();
|
||||||
|
inlined.BaselineMiddle();
|
||||||
|
|
||||||
|
foreach (var _ in Enumerable.Range(0, 100))
|
||||||
|
inlined.Item().Element(RandomBlock);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
void RandomBlock(IContainer container)
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Width(Placeholders.Random.Next(1, 5) * 20)
|
||||||
|
.Height(Placeholders.Random.Next(1, 5) * 20)
|
||||||
|
.Border(1)
|
||||||
|
.BorderColor(Colors.Grey.Darken2)
|
||||||
|
.Background(Placeholders.BackgroundColor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -1,4 +1,5 @@
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
|
using NUnit.Framework;
|
||||||
using QuestPDF.Examples.Engine;
|
using QuestPDF.Examples.Engine;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
@@ -27,27 +28,32 @@ namespace QuestPDF.Examples
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LoremPicsumExample : ExampleTestBase
|
public class LoremPicsumExample
|
||||||
{
|
{
|
||||||
[ShowResult]
|
[Test]
|
||||||
[ImageSize(350, 280)]
|
public void LoremPicsum()
|
||||||
public void LoremPicsum(IContainer container)
|
|
||||||
{
|
{
|
||||||
container
|
RenderingTest
|
||||||
.Background("#FFF")
|
.Create()
|
||||||
.Padding(25)
|
.PageSize(350, 280)
|
||||||
.Stack(column =>
|
.Render(container =>
|
||||||
{
|
{
|
||||||
column.Spacing(10);
|
container
|
||||||
|
.Background("#FFF")
|
||||||
|
.Padding(25)
|
||||||
|
.Stack(column =>
|
||||||
|
{
|
||||||
|
column.Spacing(10);
|
||||||
|
|
||||||
column
|
column
|
||||||
.Item()
|
.Item()
|
||||||
.Component(new LoremPicsum(true));
|
.Component(new LoremPicsum(true));
|
||||||
|
|
||||||
column
|
column
|
||||||
.Item()
|
.Item()
|
||||||
.AlignRight()
|
.AlignRight()
|
||||||
.Text("From Lorem Picsum");
|
.Text("From Lorem Picsum");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+137
-106
@@ -1,132 +1,163 @@
|
|||||||
using QuestPDF.Examples.Engine;
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
namespace QuestPDF.Examples
|
namespace QuestPDF.Examples
|
||||||
{
|
{
|
||||||
public class Examples : ExampleTestBase
|
public class Examples
|
||||||
{
|
{
|
||||||
public void Padding(IContainer container)
|
[Test]
|
||||||
|
public void Padding()
|
||||||
{
|
{
|
||||||
container
|
RenderingTest
|
||||||
.Background("#FDD")
|
.Create()
|
||||||
.Padding(50)
|
.PageSize(300, 300)
|
||||||
|
.ShowResults()
|
||||||
.Background("#AFA")
|
.Render(container =>
|
||||||
.PaddingVertical(50)
|
|
||||||
|
|
||||||
.Background("#77F")
|
|
||||||
.PaddingHorizontal(50)
|
|
||||||
|
|
||||||
.Background("#444");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Border(IContainer container)
|
|
||||||
{
|
|
||||||
container
|
|
||||||
.Background("#EEE")
|
|
||||||
.Padding(25)
|
|
||||||
|
|
||||||
.AlignBottom()
|
|
||||||
.AlignCenter()
|
|
||||||
.BorderBottom(2)
|
|
||||||
.BorderColor("#000")
|
|
||||||
|
|
||||||
.Background("FFF")
|
|
||||||
.Padding(5)
|
|
||||||
.Text("Sample text", TextStyle.Default.FontType("Segoe UI emoji").Alignment(HorizontalAlignment.Center));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Alignment(IContainer container)
|
|
||||||
{
|
|
||||||
container
|
|
||||||
.Stack(column =>
|
|
||||||
{
|
{
|
||||||
column
|
container
|
||||||
.Item()
|
.Background("#FDD")
|
||||||
.Height(100)
|
.Padding(50)
|
||||||
.Background("#FFF")
|
|
||||||
|
.Background("#AFA")
|
||||||
.AlignLeft()
|
.PaddingVertical(50)
|
||||||
.AlignMiddle()
|
|
||||||
|
.Background("#77F")
|
||||||
|
.PaddingHorizontal(50)
|
||||||
|
|
||||||
.Width(50)
|
|
||||||
.Height(50)
|
|
||||||
.Background("#444");
|
.Background("#444");
|
||||||
|
|
||||||
column
|
|
||||||
.Item()
|
|
||||||
.Height(100)
|
|
||||||
.Background("#DDD")
|
|
||||||
|
|
||||||
.AlignCenter()
|
|
||||||
.AlignMiddle()
|
|
||||||
|
|
||||||
.Width(50)
|
|
||||||
.Height(50)
|
|
||||||
.Background("#222");
|
|
||||||
|
|
||||||
column
|
|
||||||
.Item()
|
|
||||||
.Height(100)
|
|
||||||
.Background("#BBB")
|
|
||||||
|
|
||||||
.AlignRight()
|
|
||||||
.AlignMiddle()
|
|
||||||
|
|
||||||
.Width(50)
|
|
||||||
.Height(50)
|
|
||||||
.Background("#000");
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Expand(IContainer container)
|
[Test]
|
||||||
|
public void Border()
|
||||||
{
|
{
|
||||||
container
|
RenderingTest
|
||||||
.Stack(column =>
|
.Create()
|
||||||
|
.PageSize(200, 150)
|
||||||
|
.Render(container =>
|
||||||
{
|
{
|
||||||
column
|
container
|
||||||
.Item()
|
.Background("#EEE")
|
||||||
.Height(150)
|
.Padding(25)
|
||||||
.Row(row =>
|
|
||||||
|
.AlignBottom()
|
||||||
|
.AlignCenter()
|
||||||
|
.BorderBottom(2)
|
||||||
|
.BorderColor("#000")
|
||||||
|
|
||||||
|
.Background("FFF")
|
||||||
|
.Padding(5)
|
||||||
|
.AlignCenter()
|
||||||
|
.Text("Sample text", TextStyle.Default.FontType("Segoe UI emoji"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Alignment()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(200, 150)
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Stack(column =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn()
|
column
|
||||||
.Extend()
|
.Item()
|
||||||
.Background("FFF")
|
.Height(100)
|
||||||
|
.Background("#FFF")
|
||||||
|
|
||||||
|
.AlignLeft()
|
||||||
|
.AlignMiddle()
|
||||||
|
|
||||||
.Height(50)
|
|
||||||
.Width(50)
|
.Width(50)
|
||||||
.Background("444");
|
|
||||||
|
|
||||||
row.RelativeColumn()
|
|
||||||
.Extend()
|
|
||||||
.Background("BBB")
|
|
||||||
|
|
||||||
.Height(50)
|
.Height(50)
|
||||||
.ExtendHorizontal()
|
.Background("#444");
|
||||||
.Background("444");
|
|
||||||
});
|
|
||||||
|
|
||||||
column
|
column
|
||||||
.Item()
|
.Item()
|
||||||
.Height(150)
|
.Height(100)
|
||||||
.Row(row =>
|
.Background("#DDD")
|
||||||
{
|
|
||||||
row.RelativeColumn()
|
.AlignCenter()
|
||||||
.Extend()
|
.AlignMiddle()
|
||||||
.Background("BBB")
|
|
||||||
|
|
||||||
.ExtendVertical()
|
|
||||||
.Width(50)
|
.Width(50)
|
||||||
.Background("444");
|
.Height(50)
|
||||||
|
.Background("#222");
|
||||||
row.RelativeColumn()
|
|
||||||
.Extend()
|
column
|
||||||
.Background("BBB")
|
.Item()
|
||||||
|
.Height(100)
|
||||||
|
.Background("#BBB")
|
||||||
|
|
||||||
|
.AlignRight()
|
||||||
|
.AlignMiddle()
|
||||||
|
|
||||||
.ExtendVertical()
|
.Width(50)
|
||||||
.ExtendHorizontal()
|
.Height(50)
|
||||||
.Background("444");
|
.Background("#000");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Expand()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(200, 150)
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Stack(column =>
|
||||||
|
{
|
||||||
|
column
|
||||||
|
.Item()
|
||||||
|
.Height(150)
|
||||||
|
.Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn()
|
||||||
|
.Extend()
|
||||||
|
.Background("FFF")
|
||||||
|
|
||||||
|
.Height(50)
|
||||||
|
.Width(50)
|
||||||
|
.Background("444");
|
||||||
|
|
||||||
|
row.RelativeColumn()
|
||||||
|
.Extend()
|
||||||
|
.Background("BBB")
|
||||||
|
|
||||||
|
.Height(50)
|
||||||
|
.ExtendHorizontal()
|
||||||
|
.Background("444");
|
||||||
|
});
|
||||||
|
|
||||||
|
column
|
||||||
|
.Item()
|
||||||
|
.Height(150)
|
||||||
|
.Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn()
|
||||||
|
.Extend()
|
||||||
|
.Background("BBB")
|
||||||
|
|
||||||
|
.ExtendVertical()
|
||||||
|
.Width(50)
|
||||||
|
.Background("444");
|
||||||
|
|
||||||
|
row.RelativeColumn()
|
||||||
|
.Extend()
|
||||||
|
.Background("BBB")
|
||||||
|
|
||||||
|
.ExtendVertical()
|
||||||
|
.ExtendHorizontal()
|
||||||
|
.Background("444");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,27 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="nunit" Version="3.12.0" />
|
<PackageReference Include="microcharts" Version="0.9.5.9" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
|
<PackageReference Include="nunit" Version="3.13.2" />
|
||||||
|
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
|
||||||
<PackageReference Include="SkiaSharp" Version="2.80.2" />
|
<PackageReference Include="SkiaSharp" Version="2.80.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\QuestPDF\QuestPDF.csproj" />
|
<ProjectReference Include="..\QuestPDF\QuestPDF.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="quo-vadis.txt">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="LibreBarcode39-Regular.ttf">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="logo.png">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class ShowOnceExample
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void ShowOnce()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.RenderDocument(container =>
|
||||||
|
{
|
||||||
|
container.Page(page =>
|
||||||
|
{
|
||||||
|
page.Margin(20);
|
||||||
|
page.Size(PageSizes.A7.Landscape());
|
||||||
|
page.Background(Colors.White);
|
||||||
|
|
||||||
|
page.Header().Text("With show once", TextStyle.Default.SemiBold());
|
||||||
|
|
||||||
|
page.Content().PaddingVertical(5).Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn()
|
||||||
|
.Background(Colors.Grey.Lighten2)
|
||||||
|
.Border(1)
|
||||||
|
.Padding(5)
|
||||||
|
.ShowOnce()
|
||||||
|
.Text(Placeholders.Label());
|
||||||
|
|
||||||
|
row.RelativeColumn(2)
|
||||||
|
.Border(1)
|
||||||
|
.Padding(5)
|
||||||
|
.Text(Placeholders.Paragraph());
|
||||||
|
});
|
||||||
|
|
||||||
|
page.Footer().Text(text =>
|
||||||
|
{
|
||||||
|
text.Span("Page ");
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" out of ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class SkipOnceExample
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void SkipOnce()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.RenderDocument(container =>
|
||||||
|
{
|
||||||
|
container.Page(page =>
|
||||||
|
{
|
||||||
|
page.Margin(20);
|
||||||
|
page.Size(PageSizes.A7.Landscape());
|
||||||
|
page.Background(Colors.White);
|
||||||
|
|
||||||
|
page.Header().Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().ShowOnce().Text("This header is visible on the first page.");
|
||||||
|
stack.Item().SkipOnce().Text("This header is visible on the second page and all following.");
|
||||||
|
});
|
||||||
|
|
||||||
|
page.Content()
|
||||||
|
.PaddingVertical(10)
|
||||||
|
.Text(Placeholders.Paragraphs(), TextStyle.Default.Color(Colors.Grey.Medium));
|
||||||
|
|
||||||
|
page.Footer().Text(text =>
|
||||||
|
{
|
||||||
|
text.Span("Page ");
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" out of ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class TextBenchmark
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Generate()
|
||||||
|
{
|
||||||
|
var chapters = GetBookChapters().ToList();
|
||||||
|
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(x => ComposeBook(x, chapters));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Benchmark()
|
||||||
|
{
|
||||||
|
var chapters = GetBookChapters().ToList();
|
||||||
|
|
||||||
|
var results = PerformTest(16).ToList();
|
||||||
|
|
||||||
|
Console.WriteLine($"Min: {results.Min():F}");
|
||||||
|
Console.WriteLine($"Max: {results.Max():F}");
|
||||||
|
Console.WriteLine($"Avg: {results.Average():F}");
|
||||||
|
|
||||||
|
void GenerateDocument()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.Render(x => ComposeBook(x, chapters));
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerable<float> PerformTest(int attempts)
|
||||||
|
{
|
||||||
|
foreach (var i in Enumerable.Range(0, attempts))
|
||||||
|
{
|
||||||
|
var timer = new Stopwatch();
|
||||||
|
|
||||||
|
timer.Start();
|
||||||
|
GenerateDocument();
|
||||||
|
timer.Stop();
|
||||||
|
|
||||||
|
Console.WriteLine($"Attempt {i}: {timer.ElapsedMilliseconds:F}");
|
||||||
|
yield return timer.ElapsedMilliseconds;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BookChapter
|
||||||
|
{
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string Content { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<BookChapter> GetBookChapters()
|
||||||
|
{
|
||||||
|
var book = File.ReadAllLines("quo-vadis.txt");
|
||||||
|
|
||||||
|
var chapterPointers = book
|
||||||
|
.Select((line, index) => new
|
||||||
|
{
|
||||||
|
LineNumber = index,
|
||||||
|
Text = line
|
||||||
|
})
|
||||||
|
.Where(x => x.Text.Length < 50 && x.Text.Contains("Rozdział") || x.Text.Contains("-----"))
|
||||||
|
.Select(x => x.LineNumber)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var index in Enumerable.Range(0, chapterPointers.Count - 1))
|
||||||
|
{
|
||||||
|
var chapter = chapterPointers[index];
|
||||||
|
|
||||||
|
var title = book[chapter];
|
||||||
|
|
||||||
|
var lineFrom = chapterPointers[index];
|
||||||
|
var lineTo = chapterPointers[index + 1] - 1;
|
||||||
|
|
||||||
|
var lines = book.Skip(lineFrom + 1).Take(lineTo - lineFrom).Where(x => !string.IsNullOrWhiteSpace(x));
|
||||||
|
var content = string.Join(Environment.NewLine, lines);
|
||||||
|
|
||||||
|
yield return new BookChapter
|
||||||
|
{
|
||||||
|
Title = title,
|
||||||
|
Content = content
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComposeBook(IContainer container, ICollection<BookChapter> chapters)
|
||||||
|
{
|
||||||
|
var subtitleStyle = TextStyle.Default.Size(24).SemiBold().Color(Colors.Blue.Medium);
|
||||||
|
var normalStyle = TextStyle.Default.Size(14);
|
||||||
|
|
||||||
|
ComposePage(container);
|
||||||
|
|
||||||
|
void ComposePage(IContainer container)
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(50)
|
||||||
|
.Decoration(decoration =>
|
||||||
|
{
|
||||||
|
decoration
|
||||||
|
.Content()
|
||||||
|
.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().Element(Title);
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
stack.Item().Element(TableOfContents);
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
|
||||||
|
Chapters(stack);
|
||||||
|
|
||||||
|
stack.Item().Element(Acknowledgements);
|
||||||
|
});
|
||||||
|
|
||||||
|
decoration.Footer().Element(Footer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Title(IContainer container)
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Extend()
|
||||||
|
.PaddingBottom(200)
|
||||||
|
.AlignBottom()
|
||||||
|
.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().Text("Quo Vadis", TextStyle.Default.Size(72).Bold().Color(Colors.Blue.Darken2));
|
||||||
|
stack.Item().Text("Henryk Sienkiewicz", TextStyle.Default.Size(24).Color(Colors.Grey.Darken2));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void TableOfContents(IContainer container)
|
||||||
|
{
|
||||||
|
container.Stack(stack =>
|
||||||
|
{
|
||||||
|
SectionTitle(stack, "Spis treści");
|
||||||
|
|
||||||
|
foreach (var chapter in chapters)
|
||||||
|
{
|
||||||
|
stack.Item().InternalLink(chapter.Title).Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn().Text(chapter.Title, normalStyle);
|
||||||
|
row.ConstantColumn(100).AlignRight().Text(text => text.PageNumberOfLocation(chapter.Title, normalStyle));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Chapters(StackDescriptor stack)
|
||||||
|
{
|
||||||
|
foreach (var chapter in chapters)
|
||||||
|
{
|
||||||
|
stack.Item().Element(container => Chapter(container, chapter.Title, chapter.Content));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Chapter(IContainer container, string title, string content)
|
||||||
|
{
|
||||||
|
container.Stack(stack =>
|
||||||
|
{
|
||||||
|
SectionTitle(stack, title);
|
||||||
|
|
||||||
|
stack.Item().Text(text =>
|
||||||
|
{
|
||||||
|
text.ParagraphSpacing(5);
|
||||||
|
text.Span(content, normalStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Acknowledgements(IContainer container)
|
||||||
|
{
|
||||||
|
container.Stack(stack =>
|
||||||
|
{
|
||||||
|
SectionTitle(stack, "Podziękowania");
|
||||||
|
|
||||||
|
stack.Item().Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(normalStyle);
|
||||||
|
|
||||||
|
text.Span("Ten dokument został wygenerowany na podstawie książki w formacie TXT opublikowanej w serwisie ");
|
||||||
|
text.ExternalLocation("wolnelektury.pl", "https://wolnelektury.pl/", normalStyle.Color(Colors.Blue.Medium).Underline());
|
||||||
|
text.Span(". Dziękuję za wspieranie polskiego czytelnictwa!");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void SectionTitle(StackDescriptor stack, string text)
|
||||||
|
{
|
||||||
|
stack.Item().Location(text).Text(text, subtitleStyle);
|
||||||
|
stack.Item().PaddingTop(10).PaddingBottom(50).BorderBottom(1).BorderColor(Colors.Grey.Lighten2).ExtendHorizontal();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Footer(IContainer container)
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.AlignCenter()
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" / ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,271 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class TextExamples
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void SimpleTextBlock()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(500, 300)
|
||||||
|
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(5)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default.Size(20));
|
||||||
|
text.Span("This is a normal text, followed by an ");
|
||||||
|
text.Span("underlined red text.", TextStyle.Default.Size(20).Color(Colors.Red.Medium).Underline());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ParagraphSpacing()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(500, 300)
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(5)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.ParagraphSpacing(10);
|
||||||
|
|
||||||
|
foreach (var i in Enumerable.Range(1, 3))
|
||||||
|
{
|
||||||
|
text.Span($"Paragraph {i}: ", TextStyle.Default.SemiBold());
|
||||||
|
text.Line(Placeholders.Paragraph());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void CustomElement()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(500, 200)
|
||||||
|
.ProduceImages()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(5)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default.Size(20));
|
||||||
|
text.Span("This is a random image aligned to the baseline: ");
|
||||||
|
|
||||||
|
text.Element()
|
||||||
|
.PaddingBottom(-6)
|
||||||
|
.Height(24)
|
||||||
|
.Width(48)
|
||||||
|
.Image(Placeholders.Image);
|
||||||
|
|
||||||
|
text.Span(".");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TextElements()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(20)
|
||||||
|
.Padding(10)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(5)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default);
|
||||||
|
text.AlignLeft();
|
||||||
|
text.ParagraphSpacing(10);
|
||||||
|
|
||||||
|
text.Line(Placeholders.LoremIpsum());
|
||||||
|
|
||||||
|
text.Span($"This is target text that should show up. {DateTime.UtcNow:T} > This is a short sentence that will be wrapped into second line hopefully, right? <", TextStyle.Default.Underline());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TextStack()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(20)
|
||||||
|
.Padding(10)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(5)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default);
|
||||||
|
text.AlignLeft();
|
||||||
|
text.ParagraphSpacing(10);
|
||||||
|
|
||||||
|
foreach (var i in Enumerable.Range(1, 100))
|
||||||
|
text.Line($"{i}: {Placeholders.Paragraph()}");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SpaceIssue()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(20)
|
||||||
|
.Padding(10)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(5)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default);
|
||||||
|
text.AlignLeft();
|
||||||
|
text.ParagraphSpacing(10);
|
||||||
|
|
||||||
|
text.Span(Placeholders.LoremIpsum());
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
text.Span("This text is a normal text, ");
|
||||||
|
text.Span("this is a bold text, ", TextStyle.Default.Bold());
|
||||||
|
text.Span("this is a red and underlined text, ", TextStyle.Default.Color(Colors.Red.Medium).Underline());
|
||||||
|
text.Span("and this is slightly bigger text.", TextStyle.Default.Size(16));
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
text.Span("The new text element also supports injecting custom content between words: ");
|
||||||
|
text.Element().PaddingBottom(-10).Height(16).Width(32).Image(Placeholders.Image);
|
||||||
|
text.Span(".");
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
text.Span("This is page number ");
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" out of ");
|
||||||
|
text.TotalPages();
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
text.ExternalLocation("Please visit QuestPDF website", "https://www.questpdf.com");
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
text.Span(Placeholders.Paragraphs());
|
||||||
|
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
text.Span(Placeholders.Paragraphs(), TextStyle.Default.Italic());
|
||||||
|
|
||||||
|
text.Line("This is target text that does not show up. " + Placeholders.Paragraph());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void HugeList()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A4)
|
||||||
|
.ProducePdf()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Padding(20)
|
||||||
|
.Padding(10)
|
||||||
|
.Box()
|
||||||
|
.Border(1)
|
||||||
|
.Padding(5)
|
||||||
|
.Padding(10)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default);
|
||||||
|
text.AlignLeft();
|
||||||
|
text.ParagraphSpacing(10);
|
||||||
|
|
||||||
|
text.Span("This text is a normal text, ");
|
||||||
|
text.Span("this is a bold text, ", TextStyle.Default.Bold());
|
||||||
|
text.Span("this is a red and underlined text, ", TextStyle.Default.Color(Colors.Red.Medium).Underline());
|
||||||
|
text.Span("and this is slightly bigger text.", TextStyle.Default.Size(16));
|
||||||
|
|
||||||
|
text.Span("The new text element also supports injecting custom content between words: ");
|
||||||
|
text.Element().PaddingBottom(-10).Height(16).Width(32).Image(Placeholders.Image);
|
||||||
|
text.Span(".");
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
|
||||||
|
foreach (var i in Enumerable.Range(1, 100))
|
||||||
|
{
|
||||||
|
text.Line($"{i}: {Placeholders.Paragraph()}");
|
||||||
|
|
||||||
|
text.ExternalLocation("Please visit QuestPDF website", "https://www.questpdf.com");
|
||||||
|
|
||||||
|
text.Span("This is page number ");
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" out of ");
|
||||||
|
text.TotalPages();
|
||||||
|
|
||||||
|
text.EmptyLine();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
File diff suppressed because one or more lines are too long
@@ -7,9 +7,6 @@ namespace QuestPDF.ReportSample
|
|||||||
{
|
{
|
||||||
public static class DataSource
|
public static class DataSource
|
||||||
{
|
{
|
||||||
public static int SectionCounter { get; set; }
|
|
||||||
public static int FieldCounter { get; set; }
|
|
||||||
|
|
||||||
public static ReportModel GetReport()
|
public static ReportModel GetReport()
|
||||||
{
|
{
|
||||||
return new ReportModel
|
return new ReportModel
|
||||||
@@ -18,8 +15,8 @@ namespace QuestPDF.ReportSample
|
|||||||
HeaderFields = HeaderFields(),
|
HeaderFields = HeaderFields(),
|
||||||
|
|
||||||
LogoData = Helpers.GetImage("Logo.png"),
|
LogoData = Helpers.GetImage("Logo.png"),
|
||||||
Sections = Enumerable.Range(0, 8).Select(x => GenerateSection()).ToList(),
|
Sections = Enumerable.Range(0, 40).Select(x => GenerateSection()).ToList(),
|
||||||
Photos = Enumerable.Range(2, 6).Select(x => GetReportPhotos()).ToList()
|
Photos = Enumerable.Range(0, 25).Select(x => GetReportPhotos()).ToList()
|
||||||
};
|
};
|
||||||
|
|
||||||
List<ReportHeaderField> HeaderFields()
|
List<ReportHeaderField> HeaderFields()
|
||||||
@@ -52,8 +49,8 @@ namespace QuestPDF.ReportSample
|
|||||||
ReportSection GenerateSection()
|
ReportSection GenerateSection()
|
||||||
{
|
{
|
||||||
var sectionLength = Helpers.Random.NextDouble() > 0.75
|
var sectionLength = Helpers.Random.NextDouble() > 0.75
|
||||||
? Helpers.Random.Next(10, 20)
|
? Helpers.Random.Next(20, 40)
|
||||||
: Helpers.Random.Next(3, 11);
|
: Helpers.Random.Next(5, 10);
|
||||||
|
|
||||||
return new ReportSection
|
return new ReportSection
|
||||||
{
|
{
|
||||||
@@ -89,7 +86,6 @@ namespace QuestPDF.ReportSample
|
|||||||
return new ReportSectionMap
|
return new ReportSectionMap
|
||||||
{
|
{
|
||||||
Label = "Location",
|
Label = "Location",
|
||||||
ImageSource = Placeholders.Image,
|
|
||||||
Location = Helpers.RandomLocation()
|
Location = Helpers.RandomLocation()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -99,11 +95,7 @@ namespace QuestPDF.ReportSample
|
|||||||
return new ReportSectionPhotos
|
return new ReportSectionPhotos
|
||||||
{
|
{
|
||||||
Label = "Photos",
|
Label = "Photos",
|
||||||
Photos = Enumerable
|
PhotoCount = Helpers.Random.Next(1, 15)
|
||||||
.Range(0, Helpers.Random.Next(1, 10))
|
|
||||||
.Select(x => Helpers.Random.Next(0, 128))
|
|
||||||
.Select(x => Placeholders.Image(400, 300))
|
|
||||||
.ToList()
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,14 +103,9 @@ namespace QuestPDF.ReportSample
|
|||||||
{
|
{
|
||||||
return new ReportPhoto()
|
return new ReportPhoto()
|
||||||
{
|
{
|
||||||
PhotoData = Placeholders.Image(400, 300),
|
|
||||||
|
|
||||||
Comments = Placeholders.Sentence(),
|
Comments = Placeholders.Sentence(),
|
||||||
Date = DateTime.Now - TimeSpan.FromDays(Helpers.Random.NextDouble() * 100),
|
Date = DateTime.Now - TimeSpan.FromDays(Helpers.Random.NextDouble() * 100),
|
||||||
Location = Helpers.RandomLocation(),
|
Location = Helpers.RandomLocation()
|
||||||
|
|
||||||
MapContextSource = x => Placeholders.Image(400, 300),
|
|
||||||
MapDetailsSource = x => Placeholders.Image(400, 300)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace QuestPDF.ReportSample
|
|||||||
{
|
{
|
||||||
public static class Helpers
|
public static class Helpers
|
||||||
{
|
{
|
||||||
public static Random Random { get; } = new Random();
|
public static Random Random { get; } = new Random(1);
|
||||||
|
|
||||||
public static string GetTestItem(string path) => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", path);
|
public static string GetTestItem(string path) => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", path);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.ReportSample.Layouts
|
||||||
|
{
|
||||||
|
public class DifferentHeadersTemplate : IDocument
|
||||||
|
{
|
||||||
|
public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
|
||||||
|
|
||||||
|
public void Compose(IDocumentContainer container)
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Page(page =>
|
||||||
|
{
|
||||||
|
page.Margin(40);
|
||||||
|
|
||||||
|
page.Size(PageSizes.A4);
|
||||||
|
|
||||||
|
page.Header().Element(ComposeHeader);
|
||||||
|
page.Content().Element(ComposeContent);
|
||||||
|
page.Footer().Element(ComposeFooter);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComposeHeader(IContainer container)
|
||||||
|
{
|
||||||
|
container.Background(Colors.Grey.Lighten3).Border(1).Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().ShowOnce().Padding(5).AlignMiddle().Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn(2).AlignMiddle().Text("PRIMARY HEADER", TextStyle.Default.Color(Colors.Grey.Darken3).Size(30).Bold());
|
||||||
|
row.RelativeColumn(1).AlignRight().Box().AlignMiddle().Background(Colors.Blue.Darken2).Padding(30);
|
||||||
|
});
|
||||||
|
stack.Item().SkipOnce().Padding(5).Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn(2).Text("SECONDARY HEADER", TextStyle.Default.Color(Colors.Grey.Darken3).Size(30).Bold());
|
||||||
|
row.RelativeColumn(1).AlignRight().Box().Background(Colors.Blue.Lighten4).Padding(15);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComposeContent(IContainer container)
|
||||||
|
{
|
||||||
|
container.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().PaddingVertical(80).Text("First");
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
stack.Item().PaddingVertical(80).Text("Second");
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
stack.Item().PaddingVertical(80).Text("Third");
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComposeFooter(IContainer container)
|
||||||
|
{
|
||||||
|
container.Background(Colors.Grey.Lighten3).Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Item().ShowOnce().Background(Colors.Grey.Lighten3).Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn().Text(x =>
|
||||||
|
{
|
||||||
|
x.CurrentPageNumber();
|
||||||
|
x.Span(" / ");
|
||||||
|
x.TotalPages();
|
||||||
|
});
|
||||||
|
row.RelativeColumn().AlignRight().Text("Footer for header");
|
||||||
|
});
|
||||||
|
|
||||||
|
stack.Item().SkipOnce().Background(Colors.Grey.Lighten3).Row(row =>
|
||||||
|
{
|
||||||
|
row.RelativeColumn().Text(x =>
|
||||||
|
{
|
||||||
|
x.CurrentPageNumber();
|
||||||
|
x.Span(" / ");
|
||||||
|
x.TotalPages();
|
||||||
|
});
|
||||||
|
row.RelativeColumn().AlignRight().Text("Footer for every page except header");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.ReportSample.Layouts
|
||||||
|
{
|
||||||
|
public class ImagePlaceholder : IComponent
|
||||||
|
{
|
||||||
|
public static bool Solid { get; set; } = false;
|
||||||
|
|
||||||
|
public void Compose(IContainer container)
|
||||||
|
{
|
||||||
|
if (Solid)
|
||||||
|
container.Background(Placeholders.Color());
|
||||||
|
|
||||||
|
else
|
||||||
|
container.Image(Placeholders.Image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using System;
|
|
||||||
using QuestPDF.Fluent;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
|
|
||||||
namespace QuestPDF.ReportSample.Layouts
|
|
||||||
{
|
|
||||||
public class ImageTemplate : IComponent
|
|
||||||
{
|
|
||||||
private Func<Size, byte[]> Source { get; }
|
|
||||||
private float AspectRatio { get; }
|
|
||||||
|
|
||||||
public ImageTemplate(byte[] source, float aspectRatio = 1.333333f) : this(_ => source, aspectRatio)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public ImageTemplate(Func<Size, byte[]> source, float aspectRatio = 1.333333f)
|
|
||||||
{
|
|
||||||
Source = source;
|
|
||||||
AspectRatio = aspectRatio;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Compose(IContainer container)
|
|
||||||
{
|
|
||||||
container
|
|
||||||
.AspectRatio(AspectRatio)
|
|
||||||
.Background("#EEEEEE")
|
|
||||||
.Image(Source(Size.Zero));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -30,14 +30,14 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
container
|
container
|
||||||
.Row(row =>
|
.Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(2).AspectRatio(4 / 3f).Image(Placeholders.Image);
|
row.RelativeColumn(2).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||||
|
|
||||||
row.RelativeColumn().PaddingLeft(5).Stack(stack =>
|
row.RelativeColumn().PaddingLeft(5).Stack(stack =>
|
||||||
{
|
{
|
||||||
stack.Spacing(7f);
|
stack.Spacing(7f);
|
||||||
|
|
||||||
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image);
|
stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||||
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image);
|
stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -48,13 +48,13 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
{
|
{
|
||||||
grid.Columns(6);
|
grid.Columns(6);
|
||||||
|
|
||||||
grid.Item().LabelCell().Text("Date", Typography.Normal);
|
grid.Item().LabelCell().Text("Date");
|
||||||
grid.Item(2).ValueCell().Text(Model.Date?.ToString("g") ?? string.Empty, Typography.Normal);
|
grid.Item(2).ValueCell().Text(Model.Date?.ToString("g") ?? string.Empty);
|
||||||
grid.Item().LabelCell().Text("Location", Typography.Normal);
|
grid.Item().LabelCell().Text("Location");
|
||||||
grid.Item(2).ValueCell().Text(Model.Location.Format(), Typography.Normal);
|
grid.Item(2).ValueCell().Text(Model.Location.Format());
|
||||||
|
|
||||||
grid.Item().LabelCell().Text("Comments", Typography.Normal);
|
grid.Item().LabelCell().Text("Comments");
|
||||||
grid.Item(5).ValueCell().Text(Model.Comments, Typography.Normal);
|
grid.Item(5).ValueCell().Text(Model.Comments);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Linq;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Helpers;
|
using QuestPDF.Helpers;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
@@ -28,13 +29,13 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
{
|
{
|
||||||
foreach (var part in Model.Parts)
|
foreach (var part in Model.Parts)
|
||||||
{
|
{
|
||||||
stack.Item().Row(row =>
|
stack.Item().EnsureSpace(25).Row(row =>
|
||||||
{
|
{
|
||||||
row.ConstantColumn(150).LabelCell().Text(part.Label, Typography.Normal);
|
row.ConstantColumn(150).LabelCell().Text(part.Label);
|
||||||
var frame = row.RelativeColumn().ValueCell();
|
var frame = row.RelativeColumn().ValueCell();
|
||||||
|
|
||||||
if (part is ReportSectionText text)
|
if (part is ReportSectionText text)
|
||||||
frame.Text(text.Text, Typography.Normal);
|
frame.ShowEntire().Text(text.Text);
|
||||||
|
|
||||||
if (part is ReportSectionMap map)
|
if (part is ReportSectionMap map)
|
||||||
frame.Element(x => MapElement(x, map));
|
frame.Element(x => MapElement(x, map));
|
||||||
@@ -49,9 +50,9 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
|
|
||||||
void MapElement(IContainer container, ReportSectionMap model)
|
void MapElement(IContainer container, ReportSectionMap model)
|
||||||
{
|
{
|
||||||
if (model.ImageSource == null || model.Location == null)
|
if (model.Location == null)
|
||||||
{
|
{
|
||||||
container.Text("No location provided", Typography.Normal);
|
container.Text("No location provided");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,25 +60,28 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
{
|
{
|
||||||
stack.Spacing(5);
|
stack.Spacing(5);
|
||||||
|
|
||||||
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Image(Placeholders.Image);
|
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||||
stack.Item().Text(model.Location.Format(), Typography.Normal);
|
stack.Item().Text(model.Location.Format());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhotosElement(IContainer container, ReportSectionPhotos model)
|
void PhotosElement(IContainer container, ReportSectionPhotos model)
|
||||||
{
|
{
|
||||||
if (model.Photos.Count == 0)
|
if (model.PhotoCount == 0)
|
||||||
{
|
{
|
||||||
container.Text("No photos", Typography.Normal);
|
container.Text("No photos", Typography.Normal);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
container.Debug("Photo gallery").Grid(grid =>
|
container.DebugArea("Photos").Grid(grid =>
|
||||||
{
|
{
|
||||||
grid.Spacing(5);
|
grid.Spacing(5);
|
||||||
grid.Columns(3);
|
grid.Columns(3);
|
||||||
|
|
||||||
model.Photos.ForEach(x => grid.Item().AspectRatio(4 / 3f).Image(Placeholders.Image));
|
Enumerable
|
||||||
|
.Range(0, model.PhotoCount)
|
||||||
|
.ToList()
|
||||||
|
.ForEach(x => grid.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,21 +18,31 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
{
|
{
|
||||||
return new DocumentMetadata()
|
return new DocumentMetadata()
|
||||||
{
|
{
|
||||||
Title = Model.Title,
|
Title = Model.Title
|
||||||
Size = PageSizes.A4
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Compose(IContainer container)
|
public void Compose(IDocumentContainer container)
|
||||||
{
|
{
|
||||||
container
|
container
|
||||||
.PaddingVertical(40)
|
|
||||||
.PaddingHorizontal(50)
|
|
||||||
.Page(page =>
|
.Page(page =>
|
||||||
{
|
{
|
||||||
|
page.DefaultTextStyle(Typography.Normal);
|
||||||
|
|
||||||
|
page.MarginVertical(40);
|
||||||
|
page.MarginHorizontal(50);
|
||||||
|
|
||||||
|
page.Size(PageSizes.A4);
|
||||||
|
|
||||||
page.Header().Element(ComposeHeader);
|
page.Header().Element(ComposeHeader);
|
||||||
page.Content().Element(ComposeContent);
|
page.Content().Element(ComposeContent);
|
||||||
page.Footer().AlignCenter().PageNumber("Page {number}");
|
|
||||||
|
page.Footer().AlignCenter().Text(text =>
|
||||||
|
{
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" / ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +55,7 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
row.Spacing(50);
|
row.Spacing(50);
|
||||||
|
|
||||||
row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
|
row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
|
||||||
row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData);
|
row.ConstantColumn(90).ExternalLink("https://www.questpdf.com").MaxHeight(30).Component<ImagePlaceholder>();
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
|
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
|
||||||
@@ -57,10 +67,10 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
|
|
||||||
foreach (var field in Model.HeaderFields)
|
foreach (var field in Model.HeaderFields)
|
||||||
{
|
{
|
||||||
grid.Item().Stack(row =>
|
grid.Item().Text(text =>
|
||||||
{
|
{
|
||||||
row.Item().AlignLeft().Text(field.Label, Typography.Normal.SemiBold());
|
text.Span($"{field.Label}: ", TextStyle.Default.SemiBold());
|
||||||
row.Item().Text(field.Value, Typography.Normal);
|
text.Span(field.Value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -75,6 +85,8 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
|
|
||||||
stack.Item().Component(new TableOfContentsTemplate(Model.Sections));
|
stack.Item().Component(new TableOfContentsTemplate(Model.Sections));
|
||||||
|
|
||||||
|
stack.Item().PageBreak();
|
||||||
|
|
||||||
foreach (var section in Model.Sections)
|
foreach (var section in Model.Sections)
|
||||||
stack.Item().Location(section.Title).Component(new SectionTemplate(section));
|
stack.Item().Location(section.Title).Component(new SectionTemplate(section));
|
||||||
|
|
||||||
|
|||||||
@@ -41,8 +41,9 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
.InternalLink(locationName)
|
.InternalLink(locationName)
|
||||||
.Row(row =>
|
.Row(row =>
|
||||||
{
|
{
|
||||||
row.ConstantColumn(25).Text($"{number}.", Typography.Normal);
|
row.ConstantColumn(25).Text($"{number}.");
|
||||||
row.RelativeColumn().Text(locationName, Typography.Normal);
|
row.RelativeColumn().Text(locationName);
|
||||||
|
row.ConstantColumn(150).AlignRight().Text(text => text.PageNumberOfLocation(locationName));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,22 +44,16 @@ namespace QuestPDF.ReportSample
|
|||||||
|
|
||||||
public class ReportSectionMap : ReportSectionElement
|
public class ReportSectionMap : ReportSectionElement
|
||||||
{
|
{
|
||||||
public Func<Size, byte[]> ImageSource { get; set; }
|
|
||||||
public Location Location { get; set; }
|
public Location Location { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ReportSectionPhotos : ReportSectionElement
|
public class ReportSectionPhotos : ReportSectionElement
|
||||||
{
|
{
|
||||||
public List<byte[]> Photos { get; set; }
|
public int PhotoCount { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ReportPhoto
|
public class ReportPhoto
|
||||||
{
|
{
|
||||||
public byte[] PhotoData { get; set; }
|
|
||||||
|
|
||||||
public Func<Size, byte[]> MapDetailsSource { get; set; }
|
|
||||||
public Func<Size, byte[]> MapContextSource { get; set; }
|
|
||||||
|
|
||||||
public Location Location { get; set; }
|
public Location Location { get; set; }
|
||||||
|
|
||||||
public DateTime? Date { get; set; }
|
public DateTime? Date { get; set; }
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using BenchmarkDotNet.Configs;
|
||||||
|
using BenchmarkDotNet.Engines;
|
||||||
|
using BenchmarkDotNet.Running;
|
||||||
|
using Microsoft.VisualStudio.TestPlatform.TestHost;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Drawing.Proxy;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.ReportSample.Layouts;
|
||||||
|
|
||||||
|
namespace QuestPDF.ReportSample
|
||||||
|
{
|
||||||
|
[SimpleJob(RunStrategy.Monitoring, launchCount: 0, warmupCount: 1, targetCount: 256)]
|
||||||
|
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
|
||||||
|
public class PerformanceTests
|
||||||
|
{
|
||||||
|
private PageContext PageContext { get; set; }
|
||||||
|
private DocumentMetadata Metadata { get; set; }
|
||||||
|
private Container Content { get; set; }
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
ImagePlaceholder.Solid = true;
|
||||||
|
|
||||||
|
var configuration = ManualConfig
|
||||||
|
.Create(DefaultConfig.Instance)
|
||||||
|
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
|
||||||
|
|
||||||
|
BenchmarkRunner.Run<PerformanceTests>(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
[IterationSetup]
|
||||||
|
public void GenerateReportData()
|
||||||
|
{
|
||||||
|
ImagePlaceholder.Solid = true;
|
||||||
|
|
||||||
|
var model = DataSource.GetReport();
|
||||||
|
var report = new StandardReport(model);
|
||||||
|
Metadata = report.GetMetadata();
|
||||||
|
|
||||||
|
var documentContainer = new DocumentContainer();
|
||||||
|
report.Compose(documentContainer);
|
||||||
|
Content = documentContainer.Compose();
|
||||||
|
|
||||||
|
PageContext = new PageContext();
|
||||||
|
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
|
||||||
|
|
||||||
|
var sw = new Stopwatch();
|
||||||
|
sw.Start();
|
||||||
|
|
||||||
|
Content.HandleVisitor(x =>
|
||||||
|
{
|
||||||
|
if (x is ICacheable)
|
||||||
|
x.CreateProxy(y => new CacheProxy(y));
|
||||||
|
});
|
||||||
|
|
||||||
|
sw.Stop();
|
||||||
|
Console.WriteLine($"Creating cache took: {sw.ElapsedMilliseconds}");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void GenerationTest()
|
||||||
|
{
|
||||||
|
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,11 +8,11 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DeepCloner" Version="0.10.2" />
|
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
|
||||||
<PackageReference Include="nunit" Version="3.12.0" />
|
<PackageReference Include="nunit" Version="3.13.2" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
|
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
|
||||||
<PackageReference Include="SkiaSharp" Version="2.80.2" />
|
<PackageReference Include="SkiaSharp" Version="2.80.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -3,60 +3,54 @@ using System.Diagnostics;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.ReportSample.Layouts;
|
using QuestPDF.ReportSample.Layouts;
|
||||||
|
|
||||||
namespace QuestPDF.ReportSample
|
namespace QuestPDF.ReportSample
|
||||||
{
|
{
|
||||||
public class ReportGeneration
|
public class ReportGeneration
|
||||||
{
|
{
|
||||||
[Test]
|
private StandardReport Report { get; set; }
|
||||||
public void GenerateAndShow()
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
var model = DataSource.GetReport();
|
||||||
|
Report = new StandardReport(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GenerateAndShowPdf()
|
||||||
{
|
{
|
||||||
var reportModel = DataSource.GetReport();
|
|
||||||
var report = new StandardReport(reportModel);
|
|
||||||
|
|
||||||
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
|
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
|
||||||
report.GeneratePdf(path);
|
Report.GeneratePdf(path);
|
||||||
|
|
||||||
Process.Start("explorer.exe", path);
|
Process.Start("explorer.exe", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void PerformanceBenchmark()
|
public void GenerateAndShowXps()
|
||||||
{
|
{
|
||||||
// test size
|
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.xps");
|
||||||
const int testSize = 100;
|
Report.GenerateXps(path);
|
||||||
const decimal performanceTarget = 5; // documents per second
|
Process.Start("explorer.exe", path);
|
||||||
|
}
|
||||||
// create report models
|
|
||||||
var reports = Enumerable
|
[Test]
|
||||||
.Range(0, testSize)
|
public void Profile()
|
||||||
.Select(x =>
|
{
|
||||||
{
|
ImagePlaceholder.Solid = true;
|
||||||
var reportModel = DataSource.GetReport();
|
|
||||||
return new StandardReport(reportModel);
|
|
||||||
})
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
// generate documents
|
|
||||||
var sw = new Stopwatch();
|
|
||||||
|
|
||||||
sw.Start();
|
var container = new DocumentContainer();
|
||||||
var totalSize = reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length);
|
Report.Compose(container);
|
||||||
sw.Stop();
|
var content = container.Compose();
|
||||||
|
|
||||||
// show summary
|
|
||||||
Console.WriteLine($"Total size: {totalSize:N0} bytes");
|
|
||||||
|
|
||||||
var performance = sw.ElapsedMilliseconds / (decimal)testSize;
|
var metadata = Report.GetMetadata();
|
||||||
var speed = 1000M / performance;
|
var pageContext = new PageContext();
|
||||||
Console.WriteLine($"Test time: {sw.ElapsedMilliseconds} ms");
|
|
||||||
Console.WriteLine($"Time per document: {performance:N} ms");
|
|
||||||
Console.WriteLine($"Documents per second: {speed:N} d/s");
|
|
||||||
|
|
||||||
if (speed < performanceTarget)
|
DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
|
||||||
throw new Exception("Rendering algorithm is too slow.");
|
DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,6 @@ namespace QuestPDF.ReportSample
|
|||||||
{
|
{
|
||||||
public static TextStyle Title => TextStyle.Default.FontType(Fonts.Calibri).Color(Colors.Blue.Darken3).Size(26).Black();
|
public static TextStyle Title => TextStyle.Default.FontType(Fonts.Calibri).Color(Colors.Blue.Darken3).Size(26).Black();
|
||||||
public static TextStyle Headline => TextStyle.Default.FontType(Fonts.Calibri).Color(Colors.Blue.Medium).Size(16).SemiBold();
|
public static TextStyle Headline => TextStyle.Default.FontType(Fonts.Calibri).Color(Colors.Blue.Medium).Size(16).SemiBold();
|
||||||
public static TextStyle Normal => TextStyle.Default.FontType(Fonts.Calibri).Color(Colors.Black).Size(11).LineHeight(1.25f).AlignLeft();
|
public static TextStyle Normal => TextStyle.Default.FontType(Fonts.Verdana).Color(Colors.Black).Size(10).LineHeight(1.2f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -10,11 +10,7 @@ namespace QuestPDF.UnitTests
|
|||||||
public class AlignmentTests
|
public class AlignmentTests
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ShouldHandleNullChild() => new Alignment().MeasureWithoutChild();
|
public void Measure() => SimpleContainerTests.Measure<Alignment>();
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new Alignment().DrawWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Draw_HorizontalCenter_VerticalCenter()
|
public void Draw_HorizontalCenter_VerticalCenter()
|
||||||
{
|
{
|
||||||
@@ -27,7 +23,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(1000, 500))
|
.DrawElement(new Size(1000, 500))
|
||||||
.ExpectChildMeasure(expectedInput: new Size(1000, 500), returns: new PartialRender(new Size(400, 200)))
|
.ExpectChildMeasure(expectedInput: new Size(1000, 500), returns: SpacePlan.PartialRender(new Size(400, 200)))
|
||||||
.ExpectCanvasTranslate(new Position(300, 150))
|
.ExpectCanvasTranslate(new Position(300, 150))
|
||||||
.ExpectChildDraw(new Size(400, 200))
|
.ExpectChildDraw(new Size(400, 200))
|
||||||
.ExpectCanvasTranslate(new Position(-300, -150))
|
.ExpectCanvasTranslate(new Position(-300, -150))
|
||||||
@@ -46,7 +42,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
|
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
|
||||||
.ExpectCanvasTranslate(new Position(0, 125))
|
.ExpectCanvasTranslate(new Position(0, 125))
|
||||||
.ExpectChildDraw(new Size(100, 50))
|
.ExpectChildDraw(new Size(100, 50))
|
||||||
.ExpectCanvasTranslate(new Position(0, -125))
|
.ExpectCanvasTranslate(new Position(0, -125))
|
||||||
@@ -65,7 +61,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
|
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
|
||||||
.ExpectCanvasTranslate(new Position(150, 250))
|
.ExpectCanvasTranslate(new Position(150, 250))
|
||||||
.ExpectChildDraw(new Size(100, 50))
|
.ExpectChildDraw(new Size(100, 50))
|
||||||
.ExpectCanvasTranslate(new Position(-150, -250))
|
.ExpectCanvasTranslate(new Position(-150, -250))
|
||||||
@@ -84,7 +80,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
|
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
|
||||||
.ExpectCanvasTranslate(new Position(300, 0))
|
.ExpectCanvasTranslate(new Position(300, 0))
|
||||||
.ExpectChildDraw(new Size(100, 50))
|
.ExpectChildDraw(new Size(100, 50))
|
||||||
.ExpectCanvasTranslate(new Position(-300, 0))
|
.ExpectCanvasTranslate(new Position(-300, 0))
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -9,12 +9,6 @@ namespace QuestPDF.UnitTests
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class AspectRatioTests
|
public class AspectRatioTests
|
||||||
{
|
{
|
||||||
[Test]
|
|
||||||
public void Measure_ShouldHandleNullChild() => new AspectRatio().MeasureWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new AspectRatio().DrawWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_FitWidth_EnoughSpace_FullRender()
|
public void Measure_FitWidth_EnoughSpace_FullRender()
|
||||||
{
|
{
|
||||||
@@ -26,8 +20,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 201))
|
.MeasureElement(new Size(400, 201))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -41,8 +35,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 201))
|
.MeasureElement(new Size(400, 201))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new PartialRender(100, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(100, 50))
|
||||||
.CheckMeasureResult(new PartialRender(400, 200));
|
.CheckMeasureResult(SpacePlan.PartialRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -56,8 +50,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 201))
|
.MeasureElement(new Size(400, 201))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new Wrap())
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -71,8 +65,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 201))
|
.MeasureElement(new Size(400, 201))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -86,7 +80,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 199))
|
.MeasureElement(new Size(400, 199))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -100,8 +94,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(401, 200))
|
.MeasureElement(new Size(401, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -115,7 +109,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(399, 200))
|
.MeasureElement(new Size(399, 200))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -129,8 +123,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -144,8 +138,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Ratio = 2f
|
Ratio = 2f
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(500, 200))
|
.MeasureElement(new Size(500, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ namespace QuestPDF.UnitTests
|
|||||||
public class BackgroundTests
|
public class BackgroundTests
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ShouldHandleNullChild() => new Background().MeasureWithoutChild();
|
public void Measure() => SimpleContainerTests.Measure<Background>();
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Draw_ShouldHandleNullChild()
|
public void Draw_ShouldHandleNullChild()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Helpers;
|
using QuestPDF.Helpers;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
@@ -11,8 +11,8 @@ namespace QuestPDF.UnitTests
|
|||||||
public class BorderTests
|
public class BorderTests
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ShouldHandleNullChild() => new Border().MeasureWithoutChild();
|
public void Measure() => SimpleContainerTests.Measure<Border>();
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void ComponentShouldNotAffectLayout()
|
public void ComponentShouldNotAffectLayout()
|
||||||
{
|
{
|
||||||
@@ -27,8 +27,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
|
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
|
||||||
.CheckMeasureResult( new FullRender(new Size(100, 50)));
|
.CheckMeasureResult( SpacePlan.FullRender(new Size(100, 50)));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class BoxTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Measure() => SimpleContainerTests.Measure<Box>();
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_Wrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Box
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.Wrap())
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_PartialRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Box
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.PartialRender(200, 100))
|
||||||
|
.ExpectChildDraw(new Size(200, 100))
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_FullRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Box
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(500, 400))
|
||||||
|
.ExpectChildMeasure(expectedInput: new Size(500, 400), returns: SpacePlan.FullRender(300, 200))
|
||||||
|
.ExpectChildDraw(new Size(300, 200))
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -9,12 +9,8 @@ namespace QuestPDF.UnitTests
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ConstrainedTests
|
public class ConstrainedTests
|
||||||
{
|
{
|
||||||
[Test]
|
#region Height
|
||||||
public void Measure_ShouldHandleNullChild() => new Constrained().MeasureWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new Constrained().DrawWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_MinHeight_ExpectWrap()
|
public void Measure_MinHeight_ExpectWrap()
|
||||||
{
|
{
|
||||||
@@ -24,7 +20,7 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 100
|
MinHeight = 100
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 50))
|
.MeasureElement(new Size(400, 50))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -37,8 +33,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(400, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 100));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -51,8 +47,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(400, 150))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 150))
|
||||||
.CheckMeasureResult(new FullRender(400, 150));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -64,7 +60,7 @@ namespace QuestPDF.UnitTests
|
|||||||
MaxHeight = 100
|
MaxHeight = 100
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 150))
|
.MeasureElement(new Size(400, 150))
|
||||||
.CheckMeasureResult(new FullRender(0, 0));
|
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -77,8 +73,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new PartialRender(400, 75))
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(400, 75))
|
||||||
.CheckMeasureResult(new PartialRender(400, 75));
|
.CheckMeasureResult(SpacePlan.PartialRender(400, 75));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -91,8 +87,94 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new Wrap())
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Width
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_MinWidth_ExpectWrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 100
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(50, 400))
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_MinWidth_ExtendHeight()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 100,
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(200, 400))
|
||||||
|
.ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(50, 400))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(100, 400));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_MinWidth_PassHeight()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 100,
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(200, 400))
|
||||||
|
.ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(150, 400))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(150, 400));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_MaxWidth_Empty()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Constrained
|
||||||
|
{
|
||||||
|
MaxWidth = 100
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(150, 400))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_MaxWidth_PartialRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Constrained
|
||||||
|
{
|
||||||
|
MaxWidth = 100,
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(200, 400))
|
||||||
|
.ExpectChildMeasure(new Size(100, 400), SpacePlan.PartialRender(75, 400))
|
||||||
|
.CheckMeasureResult(SpacePlan.PartialRender(75, 400));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_MaxWidth_ExpectWrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Constrained
|
||||||
|
{
|
||||||
|
MaxWidth = 100,
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(200, 400))
|
||||||
|
.ExpectChildMeasure(new Size(100, 400), SpacePlan.Wrap())
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
using NUnit.Framework;
|
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
public class DebugTests
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -15,78 +15,78 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Measure_ReturnsWrap_WhenDecorationReturnsWrap()
|
public void Measure_ReturnsWrap_WhenDecorationReturnsWrap()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Append,
|
Type = DecorationType.Append,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new Wrap())
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsWrap_WhenDecorationReturnsPartialRender()
|
public void Measure_ReturnsWrap_WhenDecorationReturnsPartialRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Append,
|
Type = DecorationType.Append,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new PartialRender(300, 200))
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsWrap_WhenContentReturnsWrap()
|
public void Measure_ReturnsWrap_WhenContentReturnsWrap()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Append,
|
Type = DecorationType.Append,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||||
.ExpectChildMeasure("content", new Size(400, 200), new Wrap())
|
.ExpectChildMeasure("content", new Size(400, 200), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsPartialRender_WhenContentReturnsPartialRender()
|
public void Measure_ReturnsPartialRender_WhenContentReturnsPartialRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Append,
|
Type = DecorationType.Append,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||||
.ExpectChildMeasure("content", new Size(400, 200), new PartialRender(200, 150))
|
.ExpectChildMeasure("content", new Size(400, 200), SpacePlan.PartialRender(200, 150))
|
||||||
.CheckMeasureResult(new PartialRender(400, 250));
|
.CheckMeasureResult(SpacePlan.PartialRender(400, 250));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsFullRender_WhenContentReturnsFullRender()
|
public void Measure_ReturnsFullRender_WhenContentReturnsFullRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Append,
|
Type = DecorationType.Append,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||||
.ExpectChildMeasure("content", new Size(400, 200), new FullRender(200, 150))
|
.ExpectChildMeasure("content", new Size(400, 200), SpacePlan.FullRender(200, 150))
|
||||||
.CheckMeasureResult(new FullRender(400, 250));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 250));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -97,14 +97,14 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_Prepend()
|
public void Draw_Prepend()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Prepend,
|
Type = DecorationType.Prepend,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||||
.ExpectChildDraw("decoration", new Size(400, 100))
|
.ExpectChildDraw("decoration", new Size(400, 100))
|
||||||
.ExpectCanvasTranslate(0, 100)
|
.ExpectCanvasTranslate(0, 100)
|
||||||
.ExpectChildDraw("content", new Size(400, 200))
|
.ExpectChildDraw("content", new Size(400, 200))
|
||||||
@@ -116,14 +116,14 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_Append()
|
public void Draw_Append()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleDecoration
|
.For(x => new BinaryDecoration
|
||||||
{
|
{
|
||||||
Type = DecorationType.Append,
|
Type = DecorationType.Append,
|
||||||
DecorationElement = x.CreateChild("decoration"),
|
DecorationElement = x.CreateChild("decoration"),
|
||||||
ContentElement = x.CreateChild("content")
|
ContentElement = x.CreateChild("content")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||||
.ExpectChildDraw("content", new Size(400, 200))
|
.ExpectChildDraw("content", new Size(400, 200))
|
||||||
.ExpectCanvasTranslate(0, 200)
|
.ExpectCanvasTranslate(0, 200)
|
||||||
.ExpectChildDraw("decoration", new Size(400, 100))
|
.ExpectChildDraw("decoration", new Size(400, 100))
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -20,7 +20,7 @@ namespace QuestPDF.UnitTests
|
|||||||
Source = GenerateImage
|
Source = GenerateImage
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(300, 200))
|
.MeasureElement(new Size(300, 200))
|
||||||
.CheckMeasureResult(new FullRender(300, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -51,7 +51,7 @@ namespace QuestPDF.UnitTests
|
|||||||
[Test]
|
[Test]
|
||||||
public void Draw_PassesCorrectSizeToSource()
|
public void Draw_PassesCorrectSizeToSource()
|
||||||
{
|
{
|
||||||
Size passedSize = null;
|
Size passedSize = default;
|
||||||
|
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new DynamicImage
|
.For(x => new DynamicImage
|
||||||
@@ -66,7 +66,7 @@ namespace QuestPDF.UnitTests
|
|||||||
.ExpectCanvasDrawImage(Position.Zero, new Size(400, 300))
|
.ExpectCanvasDrawImage(Position.Zero, new Size(400, 300))
|
||||||
.CheckDrawResult();
|
.CheckDrawResult();
|
||||||
|
|
||||||
passedSize.Should().Be(new Size(400, 300));
|
passedSize.Should().BeEquivalentTo(new Size(400, 300));
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] GenerateImage(Size size)
|
byte[] GenerateImage(Size size)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -19,8 +19,8 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 200
|
MinHeight = 200
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 100))
|
.MeasureElement(new Size(400, 100))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new Wrap())
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 200
|
MinHeight = 200
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 100))
|
.MeasureElement(new Size(400, 100))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new PartialRender(300, 50))
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(300, 50))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -47,8 +47,8 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 200
|
MinHeight = 200
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 250))
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 250))
|
||||||
.CheckMeasureResult(new PartialRender(300, 250));
|
.CheckMeasureResult(SpacePlan.PartialRender(300, 250));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -61,8 +61,8 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 200
|
MinHeight = 200
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 100))
|
.MeasureElement(new Size(400, 100))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new FullRender(300, 50))
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.FullRender(300, 50))
|
||||||
.CheckMeasureResult(new FullRender(300, 50));
|
.CheckMeasureResult(SpacePlan.FullRender(300, 50));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -75,8 +75,11 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 200
|
MinHeight = 200
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(400, 300), new FullRender(300, 250))
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 250))
|
||||||
.CheckMeasureResult(new FullRender(300, 250));
|
.CheckMeasureResult(SpacePlan.FullRender(300, 250));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw() => SimpleContainerTests.Draw<EnsureSpace>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -9,12 +9,6 @@ namespace QuestPDF.UnitTests
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ExtendTests
|
public class ExtendTests
|
||||||
{
|
{
|
||||||
[Test]
|
|
||||||
public void Measure_ShouldHandleNullChild() => new Extend().MeasureWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new Extend().DrawWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsWrap_WhenChildReturnsWrap()
|
public void Measure_ReturnsWrap_WhenChildReturnsWrap()
|
||||||
{
|
{
|
||||||
@@ -24,8 +18,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new Wrap())
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -39,8 +33,8 @@ namespace QuestPDF.UnitTests
|
|||||||
ExtendVertical = true
|
ExtendVertical = true
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new PartialRender(300, 100))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(300, 100))
|
||||||
.CheckMeasureResult(new PartialRender(400, 200));
|
.CheckMeasureResult(SpacePlan.PartialRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -54,8 +48,8 @@ namespace QuestPDF.UnitTests
|
|||||||
ExtendVertical = true
|
ExtendVertical = true
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(300, 100))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(300, 100))
|
||||||
.CheckMeasureResult(new FullRender(400, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -69,8 +63,8 @@ namespace QuestPDF.UnitTests
|
|||||||
ExtendVertical = false
|
ExtendVertical = false
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 100))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
|
||||||
.CheckMeasureResult(new FullRender(400, 100));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -84,8 +78,11 @@ namespace QuestPDF.UnitTests
|
|||||||
ExtendVertical = true
|
ExtendVertical = true
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 100))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
|
||||||
.CheckMeasureResult(new FullRender(100, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(100, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw() => SimpleContainerTests.Draw<Extend>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class ExternalLinkTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Measure() => SimpleContainerTests.Measure<ExternalLink>();
|
||||||
|
|
||||||
|
// TODO: consider tests for the Draw method
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ using QuestPDF.UnitTests.TestEngine;
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests
|
namespace QuestPDF.UnitTests
|
||||||
{
|
{
|
||||||
/*[TestFixture]
|
[TestFixture]
|
||||||
public class GridTests
|
public class GridTests
|
||||||
{
|
{
|
||||||
#region Alignment
|
#region Alignment
|
||||||
@@ -45,24 +45,24 @@ namespace QuestPDF.UnitTests
|
|||||||
{
|
{
|
||||||
row.RelativeColumn(6).Element(childA);
|
row.RelativeColumn(6).Element(childA);
|
||||||
row.RelativeColumn(4).Element(childB);
|
row.RelativeColumn(4).Element(childB);
|
||||||
row.RelativeColumn(2).Element(Empty.Instance);
|
row.RelativeColumn(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(4).Element(childC);
|
row.RelativeColumn(4).Element(childC);
|
||||||
row.RelativeColumn(2).Element(childD);
|
row.RelativeColumn(2).Element(childD);
|
||||||
row.RelativeColumn(6).Element(Empty.Instance);
|
row.RelativeColumn(6);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(8).Element(childE);
|
row.RelativeColumn(8).Element(childE);
|
||||||
row.RelativeColumn(4).Element(Empty.Instance);
|
row.RelativeColumn(4);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
structure.Child.Should().BeEquivalentTo(expected, o => o.WithStrictOrdering().IncludingAllRuntimeProperties());
|
TestPlan.CompareOperations(structure, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -97,29 +97,29 @@ namespace QuestPDF.UnitTests
|
|||||||
{
|
{
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(1).Element(Empty.Instance);
|
row.RelativeColumn(1);
|
||||||
row.RelativeColumn(6).Element(childA);
|
row.RelativeColumn(6).Element(childA);
|
||||||
row.RelativeColumn(4).Element(childB);
|
row.RelativeColumn(4).Element(childB);
|
||||||
row.RelativeColumn(1).Element(Empty.Instance);
|
row.RelativeColumn(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(3).Element(Empty.Instance);
|
row.RelativeColumn(3);
|
||||||
row.RelativeColumn(4).Element(childC);
|
row.RelativeColumn(4).Element(childC);
|
||||||
row.RelativeColumn(2).Element(childD);
|
row.RelativeColumn(2).Element(childD);
|
||||||
row.RelativeColumn(3).Element(Empty.Instance);
|
row.RelativeColumn(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(2).Element(Empty.Instance);
|
row.RelativeColumn(2);
|
||||||
row.RelativeColumn(8).Element(childE);
|
row.RelativeColumn(8).Element(childE);
|
||||||
row.RelativeColumn(2).Element(Empty.Instance);
|
row.RelativeColumn(2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
structure.Child.Should().BeEquivalentTo(expected, o => o.WithStrictOrdering().IncludingAllRuntimeProperties());
|
TestPlan.CompareOperations(structure, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -150,32 +150,102 @@ namespace QuestPDF.UnitTests
|
|||||||
// assert
|
// assert
|
||||||
var expected = new Container();
|
var expected = new Container();
|
||||||
|
|
||||||
expected.Container().Stack(stack =>
|
expected.Stack(stack =>
|
||||||
{
|
{
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(2).Element(Empty.Instance);
|
row.RelativeColumn(2);
|
||||||
row.RelativeColumn(6).Element(childA);
|
row.RelativeColumn(6).Element(childA);
|
||||||
row.RelativeColumn(4).Element(childB);
|
row.RelativeColumn(4).Element(childB);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(6).Element(Empty.Instance);
|
row.RelativeColumn(6);
|
||||||
row.RelativeColumn(4).Element(childC);
|
row.RelativeColumn(4).Element(childC);
|
||||||
row.RelativeColumn(2).Element(childD);
|
row.RelativeColumn(2).Element(childD);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().Row(row =>
|
stack.Item().Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(4).Element(Empty.Instance);
|
row.RelativeColumn(4);
|
||||||
row.RelativeColumn(8).Element(childE);
|
row.RelativeColumn(8).Element(childE);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
structure.Child.Should().BeEquivalentTo(expected, o => o.WithStrictOrdering().IncludingAllRuntimeProperties());
|
TestPlan.CompareOperations(structure, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}*/
|
|
||||||
|
#region Spacing
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Spacing()
|
||||||
|
{
|
||||||
|
// arrange
|
||||||
|
var structure = new Container();
|
||||||
|
|
||||||
|
var childA = TestPlan.CreateUniqueElement();
|
||||||
|
var childB = TestPlan.CreateUniqueElement();
|
||||||
|
var childC = TestPlan.CreateUniqueElement();
|
||||||
|
var childD = TestPlan.CreateUniqueElement();
|
||||||
|
|
||||||
|
// act
|
||||||
|
structure
|
||||||
|
.Grid(grid =>
|
||||||
|
{
|
||||||
|
grid.Columns(16);
|
||||||
|
grid.AlignCenter();
|
||||||
|
|
||||||
|
grid.VerticalSpacing(20);
|
||||||
|
grid.HorizontalSpacing(30);
|
||||||
|
|
||||||
|
grid.Item(5).Element(childA);
|
||||||
|
grid.Item(5).Element(childB);
|
||||||
|
grid.Item(10).Element(childC);
|
||||||
|
grid.Item(12).Element(childD);
|
||||||
|
});
|
||||||
|
|
||||||
|
// assert
|
||||||
|
var expected = new Container();
|
||||||
|
|
||||||
|
expected.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Spacing(20);
|
||||||
|
|
||||||
|
stack.Item().Row(row =>
|
||||||
|
{
|
||||||
|
row.Spacing(30);
|
||||||
|
|
||||||
|
row.RelativeColumn(3);
|
||||||
|
row.RelativeColumn(5).Element(childA);
|
||||||
|
row.RelativeColumn(5).Element(childB);
|
||||||
|
row.RelativeColumn(3);
|
||||||
|
});
|
||||||
|
|
||||||
|
stack.Item().Row(row =>
|
||||||
|
{
|
||||||
|
row.Spacing(30);
|
||||||
|
|
||||||
|
row.RelativeColumn(3);
|
||||||
|
row.RelativeColumn(10).Element(childC);
|
||||||
|
row.RelativeColumn(3);
|
||||||
|
});
|
||||||
|
|
||||||
|
stack.Item().Row(row =>
|
||||||
|
{
|
||||||
|
row.Spacing(30);
|
||||||
|
|
||||||
|
row.RelativeColumn(2);
|
||||||
|
row.RelativeColumn(12).Element(childD);
|
||||||
|
row.RelativeColumn(2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
TestPlan.CompareOperations(structure, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using FluentAssertions;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests
|
|
||||||
{
|
|
||||||
public static class Helpers
|
|
||||||
{
|
|
||||||
public static Random Random = new Random();
|
|
||||||
|
|
||||||
public static Size RandomSize => new Size(Random.Next(200, 400), Random.Next(100, 200));
|
|
||||||
|
|
||||||
public static void ShouldEqual(this IEnumerable<OperationBase> commands, IEnumerable<OperationBase> expected)
|
|
||||||
{
|
|
||||||
commands.Should().HaveSameCount(expected);
|
|
||||||
|
|
||||||
commands
|
|
||||||
.Zip(expected)
|
|
||||||
.ToList()
|
|
||||||
.ForEach(x =>
|
|
||||||
{
|
|
||||||
x.First.Should().BeOfType(x.Second.GetType());
|
|
||||||
x.First.Should().BeEquivalentTo(x.Second, y => y.RespectingRuntimeTypes());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
@@ -11,12 +11,6 @@ namespace QuestPDF.UnitTests
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ImageTests
|
public class ImageTests
|
||||||
{
|
{
|
||||||
[Test]
|
|
||||||
public void Measure_ShouldHandleNullChild() => new AspectRatio().MeasureWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new AspectRatio().DrawWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_TakesAvailableSpaceRegardlessOfSize()
|
public void Measure_TakesAvailableSpaceRegardlessOfSize()
|
||||||
{
|
{
|
||||||
@@ -26,7 +20,7 @@ namespace QuestPDF.UnitTests
|
|||||||
InternalImage = GenerateImage(400, 300)
|
InternalImage = GenerateImage(400, 300)
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(300, 200))
|
.MeasureElement(new Size(300, 200))
|
||||||
.CheckMeasureResult(new FullRender(300, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -55,7 +49,7 @@ namespace QuestPDF.UnitTests
|
|||||||
return container;
|
return container;
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(300, 200))
|
.MeasureElement(new Size(300, 200))
|
||||||
.CheckMeasureResult(new FullRender(300, 100));;
|
.CheckMeasureResult(SpacePlan.FullRender(300, 100));;
|
||||||
}
|
}
|
||||||
|
|
||||||
SKImage GenerateImage(int width, int height)
|
SKImage GenerateImage(int width, int height)
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class InternalLinkTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Measure() => SimpleContainerTests.Measure<InternalLink>();
|
||||||
|
|
||||||
|
// TODO: consider tests for the Draw method
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class InternalLocationTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Measure() => SimpleContainerTests.Measure<InternalLink>();
|
||||||
|
|
||||||
|
// TODO: consider tests for the Draw method
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class LayersTests
|
||||||
|
{
|
||||||
|
private const string BackgroundLayer = "background";
|
||||||
|
private const string MainLayer = "main";
|
||||||
|
private const string ForegroundLayer = "foreground";
|
||||||
|
|
||||||
|
private static Layers GetLayers(TestPlan x)
|
||||||
|
{
|
||||||
|
return new Layers
|
||||||
|
{
|
||||||
|
Children = new List<Layer>
|
||||||
|
{
|
||||||
|
new Layer
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(BackgroundLayer)
|
||||||
|
},
|
||||||
|
new Layer
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(MainLayer),
|
||||||
|
IsPrimary = true
|
||||||
|
},
|
||||||
|
new Layer
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(ForegroundLayer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#region measure
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_Wrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(GetLayers)
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.Wrap())
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_PartialRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(GetLayers)
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(700, 500))
|
||||||
|
.CheckMeasureResult(SpacePlan.PartialRender(700, 500));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_FullRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(GetLayers)
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.FullRender(500, 400))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(500, 400));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region draw
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_Simple()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(GetLayers)
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
|
||||||
|
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.FullRender(100, 200))
|
||||||
|
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
|
||||||
|
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.FullRender(300, 400))
|
||||||
|
|
||||||
|
|
||||||
|
.ExpectChildDraw(BackgroundLayer, new Size(800, 600))
|
||||||
|
.ExpectChildDraw(MainLayer, new Size(800, 600))
|
||||||
|
.ExpectChildDraw(ForegroundLayer, new Size(800, 600))
|
||||||
|
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_WhenSecondaryLayerReturnsWrap_SkipThatLayer_1()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(GetLayers)
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
|
||||||
|
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.PartialRender(100, 200))
|
||||||
|
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
|
||||||
|
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.Wrap())
|
||||||
|
|
||||||
|
.ExpectChildDraw(BackgroundLayer, new Size(800, 600))
|
||||||
|
.ExpectChildDraw(MainLayer, new Size(800, 600))
|
||||||
|
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_WhenSecondaryLayerReturnsWrap_SkipThatLayer_2()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(GetLayers)
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
|
||||||
|
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.Wrap())
|
||||||
|
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
|
||||||
|
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.PartialRender(300, 400))
|
||||||
|
|
||||||
|
.ExpectChildDraw(MainLayer, new Size(800, 600))
|
||||||
|
.ExpectChildDraw(ForegroundLayer, new Size(800, 600))
|
||||||
|
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -9,12 +9,6 @@ namespace QuestPDF.UnitTests
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class PaddingTests
|
public class PaddingTests
|
||||||
{
|
{
|
||||||
[Test]
|
|
||||||
public void Measure_ShouldHandleNullChild() => new Padding().MeasureWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new Padding().DrawWithoutChild();
|
|
||||||
|
|
||||||
private Padding GetPadding(TestPlan plan)
|
private Padding GetPadding(TestPlan plan)
|
||||||
{
|
{
|
||||||
return new Padding()
|
return new Padding()
|
||||||
@@ -34,8 +28,8 @@ namespace QuestPDF.UnitTests
|
|||||||
TestPlan
|
TestPlan
|
||||||
.For(GetPadding)
|
.For(GetPadding)
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(340, 260), new FullRender(140, 60))
|
.ExpectChildMeasure(new Size(340, 260), SpacePlan.FullRender(140, 60))
|
||||||
.CheckMeasureResult(new FullRender(200, 100));
|
.CheckMeasureResult(SpacePlan.FullRender(200, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -44,7 +38,7 @@ namespace QuestPDF.UnitTests
|
|||||||
TestPlan
|
TestPlan
|
||||||
.For(GetPadding)
|
.For(GetPadding)
|
||||||
.MeasureElement(new Size(50, 300))
|
.MeasureElement(new Size(50, 300))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -53,7 +47,7 @@ namespace QuestPDF.UnitTests
|
|||||||
TestPlan
|
TestPlan
|
||||||
.For(GetPadding)
|
.For(GetPadding)
|
||||||
.MeasureElement(new Size(20, 300))
|
.MeasureElement(new Size(20, 300))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -62,8 +56,8 @@ namespace QuestPDF.UnitTests
|
|||||||
TestPlan
|
TestPlan
|
||||||
.For(GetPadding)
|
.For(GetPadding)
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(340, 260), new PartialRender(40, 160))
|
.ExpectChildMeasure(new Size(340, 260), SpacePlan.PartialRender(40, 160))
|
||||||
.CheckMeasureResult(new PartialRender(100, 200));
|
.CheckMeasureResult(SpacePlan.PartialRender(100, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -72,8 +66,8 @@ namespace QuestPDF.UnitTests
|
|||||||
TestPlan
|
TestPlan
|
||||||
.For(GetPadding)
|
.For(GetPadding)
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(340, 260), new Wrap())
|
.ExpectChildMeasure(new Size(340, 260), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -16,13 +16,13 @@ namespace QuestPDF.UnitTests
|
|||||||
.For(x => new PageBreak())
|
.For(x => new PageBreak())
|
||||||
|
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.CheckMeasureResult(new PartialRender(400, 300))
|
.CheckMeasureResult(SpacePlan.PartialRender(Size.Zero))
|
||||||
|
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.CheckDrawResult()
|
.CheckDrawResult()
|
||||||
|
|
||||||
.MeasureElement(new Size(500, 400))
|
.MeasureElement(new Size(500, 400))
|
||||||
.CheckMeasureResult(new FullRender(Size.Zero));
|
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
using NUnit.Framework;
|
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
public class PageNumberTests
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,12 +6,11 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentAssertions" Version="5.10.3" />
|
<PackageReference Include="FluentAssertions" Version="6.1.0" />
|
||||||
<PackageReference Include="Moq" Version="4.13.1" />
|
<PackageReference Include="nunit" Version="3.13.2" />
|
||||||
<PackageReference Include="nunit" Version="3.13.1" />
|
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
|
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.0" />
|
||||||
<PackageReference Include="SkiaSharp" Version="2.80.2" />
|
<PackageReference Include="SkiaSharp" Version="2.80.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class RotateTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Measure() => SimpleContainerTests.Measure<Rotate>();
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Rotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
Angle = 123
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(400, 300))
|
||||||
|
.ExpectCanvasRotate(123)
|
||||||
|
.ExpectChildDraw(new Size(400, 300))
|
||||||
|
.ExpectCanvasRotate(-123)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+176
-25
@@ -1,6 +1,7 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
@@ -15,74 +16,74 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Measure_ReturnsWrap_WhenLeftChildReturnsWrap()
|
public void Measure_ReturnsWrap_WhenLeftChildReturnsWrap()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleRow
|
.For(x => new BinaryRow
|
||||||
{
|
{
|
||||||
Left = x.CreateChild("left"),
|
Left = x.CreateChild("left"),
|
||||||
Right = x.CreateChild("right")
|
Right = x.CreateChild("right")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("left", new Size(400, 300), new Wrap())
|
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsWrap_WhenRightChildReturnsWrap()
|
public void Measure_ReturnsWrap_WhenRightChildReturnsWrap()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleRow
|
.For(x => new BinaryRow
|
||||||
{
|
{
|
||||||
Left = x.CreateChild("left"),
|
Left = x.CreateChild("left"),
|
||||||
Right = x.CreateChild("right")
|
Right = x.CreateChild("right")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
|
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||||
.ExpectChildMeasure("right", new Size(150, 300), new Wrap())
|
.ExpectChildMeasure("right", new Size(150, 300), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsPartialRender_WhenLeftChildReturnsPartialRender()
|
public void Measure_ReturnsPartialRender_WhenLeftChildReturnsPartialRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleRow
|
.For(x => new BinaryRow
|
||||||
{
|
{
|
||||||
Left = x.CreateChild("left"),
|
Left = x.CreateChild("left"),
|
||||||
Right = x.CreateChild("right")
|
Right = x.CreateChild("right")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("left", new Size(400, 300), new PartialRender(250, 150))
|
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.PartialRender(250, 150))
|
||||||
.ExpectChildMeasure("right", new Size(150, 300), new FullRender(100, 100))
|
.ExpectChildMeasure("right", new Size(150, 300), SpacePlan.FullRender(100, 100))
|
||||||
.CheckMeasureResult(new PartialRender(350, 150));
|
.CheckMeasureResult(SpacePlan.PartialRender(350, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsPartialRender_WhenRightChildReturnsPartialRender()
|
public void Measure_ReturnsPartialRender_WhenRightChildReturnsPartialRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleRow
|
.For(x => new BinaryRow
|
||||||
{
|
{
|
||||||
Left = x.CreateChild("left"),
|
Left = x.CreateChild("left"),
|
||||||
Right = x.CreateChild("right")
|
Right = x.CreateChild("right")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
|
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||||
.ExpectChildMeasure("right", new Size(150, 300), new PartialRender(100, 100))
|
.ExpectChildMeasure("right", new Size(150, 300), SpacePlan.PartialRender(100, 100))
|
||||||
.CheckMeasureResult(new PartialRender(350, 150));
|
.CheckMeasureResult(SpacePlan.PartialRender(350, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsFullRender_WhenBothChildrenReturnFullRender()
|
public void Measure_ReturnsFullRender_WhenBothChildrenReturnFullRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleRow
|
.For(x => new BinaryRow
|
||||||
{
|
{
|
||||||
Left = x.CreateChild("left"),
|
Left = x.CreateChild("left"),
|
||||||
Right = x.CreateChild("right")
|
Right = x.CreateChild("right")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(200, 150))
|
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(200, 150))
|
||||||
.ExpectChildMeasure("right", new Size(200, 300), new FullRender(100, 100))
|
.ExpectChildMeasure("right", new Size(200, 300), SpacePlan.FullRender(100, 100))
|
||||||
.CheckMeasureResult(new FullRender(300, 150));
|
.CheckMeasureResult(SpacePlan.FullRender(300, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -93,13 +94,13 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw()
|
public void Draw()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleRow
|
.For(x => new BinaryRow
|
||||||
{
|
{
|
||||||
Left = x.CreateChild("left"),
|
Left = x.CreateChild("left"),
|
||||||
Right = x.CreateChild("right")
|
Right = x.CreateChild("right")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
|
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||||
.ExpectChildDraw("left", new Size(250, 300))
|
.ExpectChildDraw("left", new Size(250, 300))
|
||||||
.ExpectCanvasTranslate(250, 0)
|
.ExpectCanvasTranslate(250, 0)
|
||||||
.ExpectChildDraw("right", new Size(150, 300))
|
.ExpectChildDraw("right", new Size(150, 300))
|
||||||
@@ -109,8 +110,158 @@ namespace QuestPDF.UnitTests
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
// TODO: add tests for the spacing property
|
#region Structure
|
||||||
// TODO: add tests for the tree builder method
|
|
||||||
// TODO: add tests for relative column
|
[Test]
|
||||||
|
public void Structure_RelativeColumnsHandling()
|
||||||
|
{
|
||||||
|
// arrange
|
||||||
|
var childA = TestPlan.CreateUniqueElement();
|
||||||
|
var childB = TestPlan.CreateUniqueElement();
|
||||||
|
var childC = TestPlan.CreateUniqueElement();
|
||||||
|
var childD = TestPlan.CreateUniqueElement();
|
||||||
|
var childE = TestPlan.CreateUniqueElement();
|
||||||
|
|
||||||
|
const int spacing = 25;
|
||||||
|
var availableSpace = new Size(1100, 400);
|
||||||
|
|
||||||
|
// act
|
||||||
|
var value = new Container();
|
||||||
|
|
||||||
|
value.Row(row =>
|
||||||
|
{
|
||||||
|
row.Spacing(spacing);
|
||||||
|
|
||||||
|
row.ConstantColumn(150).Element(childA);
|
||||||
|
row.ConstantColumn(250).Element(childB);
|
||||||
|
row.RelativeColumn(1).Element(childC);
|
||||||
|
row.RelativeColumn(2).Element(childD);
|
||||||
|
row.RelativeColumn(3).Element(childE);
|
||||||
|
});
|
||||||
|
|
||||||
|
// assert
|
||||||
|
var expected = new Container();
|
||||||
|
|
||||||
|
expected.Row(row =>
|
||||||
|
{
|
||||||
|
row.Spacing(spacing);
|
||||||
|
|
||||||
|
row.ConstantColumn(150).Element(childA);
|
||||||
|
row.ConstantColumn(250).Element(childB);
|
||||||
|
row.ConstantColumn(100).Element(childC);
|
||||||
|
row.ConstantColumn(200).Element(childD);
|
||||||
|
row.ConstantColumn(300).Element(childE);
|
||||||
|
});
|
||||||
|
|
||||||
|
TestPlan.CompareOperations(value, expected, availableSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Structure_Tree()
|
||||||
|
{
|
||||||
|
// arrange
|
||||||
|
var childA = TestPlan.CreateUniqueElement();
|
||||||
|
var childB = TestPlan.CreateUniqueElement();
|
||||||
|
var childC = TestPlan.CreateUniqueElement();
|
||||||
|
var childD = TestPlan.CreateUniqueElement();
|
||||||
|
var childE = TestPlan.CreateUniqueElement();
|
||||||
|
|
||||||
|
const int spacing = 25;
|
||||||
|
var availableSpace = new Size(1200, 400);
|
||||||
|
|
||||||
|
// act
|
||||||
|
var value = new Container();
|
||||||
|
|
||||||
|
value.Row(row =>
|
||||||
|
{
|
||||||
|
row.Spacing(spacing);
|
||||||
|
|
||||||
|
row.ConstantColumn(150).Element(childA);
|
||||||
|
row.ConstantColumn(200).Element(childB);
|
||||||
|
row.ConstantColumn(250).Element(childC);
|
||||||
|
row.RelativeColumn(2).Element(childD);
|
||||||
|
row.RelativeColumn(3).Element(childE);
|
||||||
|
});
|
||||||
|
|
||||||
|
// assert
|
||||||
|
var expected = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 150,
|
||||||
|
MaxWidth = 150,
|
||||||
|
Child = childA
|
||||||
|
},
|
||||||
|
Right = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 25,
|
||||||
|
MaxWidth = 25
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Right = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 200,
|
||||||
|
MaxWidth = 200,
|
||||||
|
Child = childB
|
||||||
|
},
|
||||||
|
Right = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 25,
|
||||||
|
MaxWidth = 25
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Right = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 250,
|
||||||
|
MaxWidth = 250,
|
||||||
|
Child = childC
|
||||||
|
},
|
||||||
|
Right = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 25,
|
||||||
|
MaxWidth = 25
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Right = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 200,
|
||||||
|
MaxWidth = 200,
|
||||||
|
Child = childD
|
||||||
|
},
|
||||||
|
Right = new BinaryRow
|
||||||
|
{
|
||||||
|
Left = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 25,
|
||||||
|
MaxWidth = 25
|
||||||
|
},
|
||||||
|
Right = new Constrained
|
||||||
|
{
|
||||||
|
MinWidth = 300,
|
||||||
|
MaxWidth = 300,
|
||||||
|
Child = childE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TestPlan.CompareOperations(value, expected, availableSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class ScaleTests
|
||||||
|
{
|
||||||
|
#region measure
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_Wrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = 3,
|
||||||
|
ScaleY = 2
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(new Size(300, 400), SpacePlan.Wrap())
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_PartialRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = 3,
|
||||||
|
ScaleY = 2
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(new Size(300, 400), SpacePlan.PartialRender(200, 350))
|
||||||
|
.CheckMeasureResult(SpacePlan.PartialRender(600, 700));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_FullRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = 3,
|
||||||
|
ScaleY = 2
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(new Size(300, 400), SpacePlan.FullRender(250, 300))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(750, 600));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_NegativeScaleX()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = -2,
|
||||||
|
ScaleY = 1
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
.ExpectChildMeasure(new Size(400, 600), SpacePlan.FullRender(300, 500))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(600, 500));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_NegativeScaleY()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = 1,
|
||||||
|
ScaleY = -3
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(800, 600))
|
||||||
|
.ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(800, 100))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(800, 300));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region draw
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_Simple()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = 3,
|
||||||
|
ScaleY = 2
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(900, 800))
|
||||||
|
.ExpectCanvasTranslate(0, 0)
|
||||||
|
.ExpectCanvasScale(3, 2)
|
||||||
|
.ExpectChildDraw(new Size(300, 400))
|
||||||
|
.ExpectCanvasScale(1/3f, 1/2f)
|
||||||
|
.ExpectCanvasTranslate(0, 0)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_NegativeScaleX()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = -3,
|
||||||
|
ScaleY = 2
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(900, 800))
|
||||||
|
.ExpectCanvasTranslate(900, 0)
|
||||||
|
.ExpectCanvasScale(-3, 2)
|
||||||
|
.ExpectChildDraw(new Size(300, 400))
|
||||||
|
.ExpectCanvasScale(-1/3f, 1/2f)
|
||||||
|
.ExpectCanvasTranslate(-900, 0)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_NegativeScaleY()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Scale
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
ScaleX = 3,
|
||||||
|
ScaleY = -2
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(900, 800))
|
||||||
|
.ExpectCanvasTranslate(0, 800)
|
||||||
|
.ExpectCanvasScale(3, -2)
|
||||||
|
.ExpectChildDraw(new Size(300, 400))
|
||||||
|
.ExpectCanvasScale(1/3f, -1/2f)
|
||||||
|
.ExpectCanvasTranslate(0, -800)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -18,8 +18,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(400, 300), new Wrap())
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -31,8 +31,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 200))
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -44,8 +44,11 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure(new Size(400, 300), new FullRender(300, 200))
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 200))
|
||||||
.CheckMeasureResult(new FullRender(300, 200));
|
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw() => SimpleContainerTests.Draw<ShowEntire>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using Moq;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -11,33 +10,7 @@ namespace QuestPDF.UnitTests
|
|||||||
public class ShowOnceTest
|
public class ShowOnceTest
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ShouldHandleNullChild() => new ShowOnce().MeasureWithoutChild();
|
public void Draw()
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_ShouldHandleNullChild() => new ShowOnce().DrawWithoutChild();
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void ShouldRenderOnce_WhenRenderingCalledMultipleTimes()
|
|
||||||
{
|
|
||||||
var child = new Mock<Element>();
|
|
||||||
|
|
||||||
child
|
|
||||||
.Setup(x => x.Measure(It.IsAny<Size>()))
|
|
||||||
.Returns(() => new FullRender(Size.Zero));
|
|
||||||
|
|
||||||
var element = new ShowOnce()
|
|
||||||
{
|
|
||||||
Child = child.Object
|
|
||||||
};
|
|
||||||
|
|
||||||
element.Draw(null, Size.Zero);
|
|
||||||
element.Draw(null, Size.Zero);
|
|
||||||
|
|
||||||
child.Verify(x => x.Draw(It.IsAny<ICanvas>(), It.IsAny<Size>()), Times.Once);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Draw_HorizontalRight_VerticalTop()
|
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new ShowOnce()
|
.For(x => new ShowOnce()
|
||||||
@@ -47,31 +20,31 @@ namespace QuestPDF.UnitTests
|
|||||||
|
|
||||||
// Measure the element and return result
|
// Measure the element and return result
|
||||||
.MeasureElement(new Size(300, 200))
|
.MeasureElement(new Size(300, 200))
|
||||||
.ExpectChildMeasure("child", new Size(300, 200), new PartialRender(new Size(200, 200)))
|
.ExpectChildMeasure("child", new Size(300, 200), SpacePlan.PartialRender(new Size(200, 200)))
|
||||||
.CheckMeasureResult(new PartialRender(new Size(200, 200)))
|
.CheckMeasureResult(SpacePlan.PartialRender(new Size(200, 200)))
|
||||||
|
|
||||||
// Draw element partially
|
// Draw element partially
|
||||||
.DrawElement(new Size(200, 200))
|
.DrawElement(new Size(200, 200))
|
||||||
.ExpectChildMeasure(new Size(200, 200), new PartialRender(new Size(200, 200)))
|
.ExpectChildMeasure(new Size(200, 200), SpacePlan.PartialRender(new Size(200, 200)))
|
||||||
.ExpectChildDraw(new Size(200, 200))
|
.ExpectChildDraw(new Size(200, 200))
|
||||||
.CheckDrawResult()
|
.CheckDrawResult()
|
||||||
|
|
||||||
// Element was not fully drawn
|
// Element was not fully drawn
|
||||||
// It should be measured again for rendering on next page
|
// It should be measured again for rendering on next page
|
||||||
.MeasureElement(new Size(800, 200))
|
.MeasureElement(new Size(800, 200))
|
||||||
.ExpectChildMeasure(new Size(800, 200), new FullRender(new Size(400, 200)))
|
.ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(new Size(400, 200)))
|
||||||
.CheckMeasureResult(new FullRender(new Size(400, 200)))
|
.CheckMeasureResult(SpacePlan.FullRender(new Size(400, 200)))
|
||||||
|
|
||||||
// Draw element on next page
|
// Draw element on next page
|
||||||
// Element was fully drawn at this point
|
// Element was fully drawn at this point
|
||||||
.DrawElement(new Size(400, 200))
|
.DrawElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(new Size(400, 200)))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(new Size(400, 200)))
|
||||||
.ExpectChildDraw(new Size(400, 200))
|
.ExpectChildDraw(new Size(400, 200))
|
||||||
.CheckDrawResult()
|
.CheckDrawResult()
|
||||||
|
|
||||||
// In the next attempt of measuring element, it should behave like empty parent.
|
// In the next attempt of measuring element, it should behave like empty parent.
|
||||||
.MeasureElement(new Size(600, 200))
|
.MeasureElement(new Size(600, 200))
|
||||||
.CheckMeasureResult(new FullRender(Size.Zero))
|
.CheckMeasureResult(SpacePlan.FullRender(0, 0))
|
||||||
|
|
||||||
// In the next attempt of measuring element, it should not draw its child
|
// In the next attempt of measuring element, it should not draw its child
|
||||||
.DrawElement(new Size(600, 200))
|
.DrawElement(new Size(600, 200))
|
||||||
|
|||||||
@@ -0,0 +1,162 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class SimpleRotateTests
|
||||||
|
{
|
||||||
|
#region measure
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_Wrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 0
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_PartialRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 0
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||||
|
.CheckMeasureResult(SpacePlan.PartialRender(300, 200));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_RotateRight()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 1
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(300, 400), SpacePlan.FullRender(200, 300))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_RotateFlip()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 2
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(200, 100));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_RotateLeft()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 3 // or -1
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(500, 400))
|
||||||
|
.ExpectChildMeasure(new Size(400, 500), SpacePlan.FullRender(300, 350))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(350, 300));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region draw
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_Simple()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 0
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(640, 480))
|
||||||
|
.ExpectCanvasTranslate(0, 0)
|
||||||
|
.ExpectCanvasRotate(0)
|
||||||
|
.ExpectChildDraw(new Size(640, 480))
|
||||||
|
.ExpectCanvasRotate(0)
|
||||||
|
.ExpectCanvasTranslate(0, 0)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_RotateRight()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 1
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(640, 480))
|
||||||
|
.ExpectCanvasTranslate(640, 0)
|
||||||
|
.ExpectCanvasRotate(90)
|
||||||
|
.ExpectChildDraw(new Size(480, 640))
|
||||||
|
.ExpectCanvasRotate(-90)
|
||||||
|
.ExpectCanvasTranslate(-640, 0)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_RotateFlip()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 2
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(640, 480))
|
||||||
|
.ExpectCanvasTranslate(640, 480)
|
||||||
|
.ExpectCanvasRotate(180)
|
||||||
|
.ExpectChildDraw(new Size(640, 480))
|
||||||
|
.ExpectCanvasRotate(-180)
|
||||||
|
.ExpectCanvasTranslate(-640, -480)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_RotateLeft()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new SimpleRotate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TurnCount = 3 // or -1
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(640, 480))
|
||||||
|
.ExpectCanvasTranslate(0, 480)
|
||||||
|
.ExpectCanvasRotate(270)
|
||||||
|
.ExpectChildDraw(new Size(480, 640))
|
||||||
|
.ExpectCanvasRotate(-270)
|
||||||
|
.ExpectCanvasTranslate(0, -480)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
@@ -15,80 +16,80 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Measure_ReturnsWrap_WhenFirstChildWraps()
|
public void Measure_ReturnsWrap_WhenFirstChildWraps()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new Wrap())
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsPartialRender_WhenFirstChildReturnsPartialRender()
|
public void Measure_ReturnsPartialRender_WhenFirstChildReturnsPartialRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new PartialRender(300, 200))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||||
.CheckMeasureResult(new PartialRender(300, 200));
|
.CheckMeasureResult(SpacePlan.PartialRender(300, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsPartialRender_WhenSecondChildWraps()
|
public void Measure_ReturnsPartialRender_WhenSecondChildWraps()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
.ExpectChildMeasure("second", new Size(400, 200), new Wrap())
|
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new PartialRender(200, 100));
|
.CheckMeasureResult(SpacePlan.PartialRender(200, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsPartialRender_WhenSecondChildReturnsPartialRender()
|
public void Measure_ReturnsPartialRender_WhenSecondChildReturnsPartialRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
.ExpectChildMeasure("second", new Size(400, 200), new PartialRender(300, 150))
|
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(300, 150))
|
||||||
.CheckMeasureResult(new PartialRender(300, 250));
|
.CheckMeasureResult(SpacePlan.PartialRender(300, 250));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_ReturnsFullRender_WhenSecondChildReturnsFullRender()
|
public void Measure_ReturnsFullRender_WhenSecondChildReturnsFullRender()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
.ExpectChildMeasure("second", new Size(400, 200), new FullRender(100, 50))
|
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||||
.CheckMeasureResult(new FullRender(200, 150));
|
.CheckMeasureResult(SpacePlan.FullRender(200, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void Measure_UsesEmpty_WhenFirstChildIsRendered()
|
public void Measure_UsesEmpty_WhenFirstChildIsRendered()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second"),
|
Second = x.CreateChild("second"),
|
||||||
@@ -96,8 +97,8 @@ namespace QuestPDF.UnitTests
|
|||||||
IsFirstRendered = true
|
IsFirstRendered = true
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 300))
|
.MeasureElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("second", new Size(400, 300), new FullRender(200, 300))
|
.ExpectChildMeasure("second", new Size(400, 300), SpacePlan.FullRender(200, 300))
|
||||||
.CheckMeasureResult(new FullRender(200, 300));
|
.CheckMeasureResult(SpacePlan.FullRender(200, 300));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -108,13 +109,13 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_WhenFirstChildWraps()
|
public void Draw_WhenFirstChildWraps()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new Wrap())
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
|
||||||
.CheckDrawResult();
|
.CheckDrawResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,13 +123,13 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_WhenFirstChildPartiallyRenders()
|
public void Draw_WhenFirstChildPartiallyRenders()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new PartialRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.PartialRender(200, 100))
|
||||||
.ExpectChildDraw("first", new Size(400, 100))
|
.ExpectChildDraw("first", new Size(400, 100))
|
||||||
.CheckDrawResult();
|
.CheckDrawResult();
|
||||||
}
|
}
|
||||||
@@ -137,15 +138,15 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_WhenFirstChildFullyRenders_AndSecondChildWraps()
|
public void Draw_WhenFirstChildFullyRenders_AndSecondChildWraps()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
.ExpectChildDraw("first", new Size(400, 100))
|
.ExpectChildDraw("first", new Size(400, 100))
|
||||||
.ExpectChildMeasure("second", new Size(400, 200), new Wrap())
|
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
|
||||||
.CheckDrawResult();
|
.CheckDrawResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,15 +154,15 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_WhenFirstChildFullyRenders_AndSecondChildPartiallyRenders()
|
public void Draw_WhenFirstChildFullyRenders_AndSecondChildPartiallyRenders()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
.ExpectChildDraw("first", new Size(400, 100))
|
.ExpectChildDraw("first", new Size(400, 100))
|
||||||
.ExpectChildMeasure("second", new Size(400, 200), new PartialRender(250, 150))
|
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(250, 150))
|
||||||
.ExpectCanvasTranslate(0, 100)
|
.ExpectCanvasTranslate(0, 100)
|
||||||
.ExpectChildDraw("second", new Size(400, 150))
|
.ExpectChildDraw("second", new Size(400, 150))
|
||||||
.ExpectCanvasTranslate(0, -100)
|
.ExpectCanvasTranslate(0, -100)
|
||||||
@@ -172,15 +173,15 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_WhenFirstChildFullyRenders_AndSecondChildFullyRenders()
|
public void Draw_WhenFirstChildFullyRenders_AndSecondChildFullyRenders()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second")
|
Second = x.CreateChild("second")
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||||
.ExpectChildDraw("first", new Size(400, 100))
|
.ExpectChildDraw("first", new Size(400, 100))
|
||||||
.ExpectChildMeasure("second", new Size(400, 200), new FullRender(250, 150))
|
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(250, 150))
|
||||||
.ExpectCanvasTranslate(0, 100)
|
.ExpectCanvasTranslate(0, 100)
|
||||||
.ExpectChildDraw("second", new Size(400, 150))
|
.ExpectChildDraw("second", new Size(400, 150))
|
||||||
.ExpectCanvasTranslate(0, -100)
|
.ExpectCanvasTranslate(0, -100)
|
||||||
@@ -191,7 +192,7 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_UsesEmpty_WhenFirstChildIsRendered()
|
public void Draw_UsesEmpty_WhenFirstChildIsRendered()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second"),
|
Second = x.CreateChild("second"),
|
||||||
@@ -199,11 +200,11 @@ namespace QuestPDF.UnitTests
|
|||||||
IsFirstRendered = true
|
IsFirstRendered = true
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("second", new Size(400, 300), new PartialRender(200, 300))
|
.ExpectChildMeasure("second", new Size(400, 300), SpacePlan.PartialRender(200, 300))
|
||||||
.ExpectCanvasTranslate(0, 0)
|
.ExpectCanvasTranslate(0, 0)
|
||||||
.ExpectChildDraw("second", new Size(400, 300))
|
.ExpectChildDraw("second", new Size(400, 300))
|
||||||
.ExpectCanvasTranslate(0, 0)
|
.ExpectCanvasTranslate(0, 0)
|
||||||
.CheckState<SimpleStack>(x => x.IsFirstRendered)
|
.CheckState<BinaryStack>(x => x.IsFirstRendered)
|
||||||
.CheckDrawResult();
|
.CheckDrawResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,7 +212,7 @@ namespace QuestPDF.UnitTests
|
|||||||
public void Draw_TogglesFirstRenderedFlag_WhenSecondFullyRenders()
|
public void Draw_TogglesFirstRenderedFlag_WhenSecondFullyRenders()
|
||||||
{
|
{
|
||||||
TestPlan
|
TestPlan
|
||||||
.For(x => new SimpleStack
|
.For(x => new BinaryStack
|
||||||
{
|
{
|
||||||
First = x.CreateChild("first"),
|
First = x.CreateChild("first"),
|
||||||
Second = x.CreateChild("second"),
|
Second = x.CreateChild("second"),
|
||||||
@@ -219,17 +220,91 @@ namespace QuestPDF.UnitTests
|
|||||||
IsFirstRendered = true
|
IsFirstRendered = true
|
||||||
})
|
})
|
||||||
.DrawElement(new Size(400, 300))
|
.DrawElement(new Size(400, 300))
|
||||||
.ExpectChildMeasure("second", new Size(400, 300), new FullRender(200, 300))
|
.ExpectChildMeasure("second", new Size(400, 300), SpacePlan.FullRender(200, 300))
|
||||||
.ExpectCanvasTranslate(0, 0)
|
.ExpectCanvasTranslate(0, 0)
|
||||||
.ExpectChildDraw("second", new Size(400, 300))
|
.ExpectChildDraw("second", new Size(400, 300))
|
||||||
.ExpectCanvasTranslate(0, 0)
|
.ExpectCanvasTranslate(0, 0)
|
||||||
.CheckDrawResult()
|
.CheckDrawResult()
|
||||||
.CheckState<SimpleStack>(x => !x.IsFirstRendered);
|
.CheckState<BinaryStack>(x => !x.IsFirstRendered);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
// TODO: add tests for the spacing property
|
#region Structure
|
||||||
// TODO: add tests for the tree builder method
|
|
||||||
|
[Test]
|
||||||
|
public void Structure_Simple()
|
||||||
|
{
|
||||||
|
// arrange
|
||||||
|
var childA = TestPlan.CreateUniqueElement();
|
||||||
|
var childB = TestPlan.CreateUniqueElement();
|
||||||
|
var childC = TestPlan.CreateUniqueElement();
|
||||||
|
var childD = TestPlan.CreateUniqueElement();
|
||||||
|
var childE = TestPlan.CreateUniqueElement();
|
||||||
|
|
||||||
|
const int spacing = 20;
|
||||||
|
|
||||||
|
// act
|
||||||
|
var structure = new Container();
|
||||||
|
|
||||||
|
structure.Stack(stack =>
|
||||||
|
{
|
||||||
|
stack.Spacing(spacing);
|
||||||
|
|
||||||
|
stack.Item().Element(childA);
|
||||||
|
stack.Item().Element(childB);
|
||||||
|
stack.Item().Element(childC);
|
||||||
|
stack.Item().Element(childD);
|
||||||
|
stack.Item().Element(childE);
|
||||||
|
});
|
||||||
|
|
||||||
|
// assert
|
||||||
|
var expected = new Padding
|
||||||
|
{
|
||||||
|
Bottom = -spacing,
|
||||||
|
|
||||||
|
Child = new BinaryStack
|
||||||
|
{
|
||||||
|
First = new BinaryStack
|
||||||
|
{
|
||||||
|
First = new Padding
|
||||||
|
{
|
||||||
|
Bottom = spacing,
|
||||||
|
Child = childA
|
||||||
|
},
|
||||||
|
Second = new Padding
|
||||||
|
{
|
||||||
|
Bottom = spacing,
|
||||||
|
Child = childB
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Second = new BinaryStack
|
||||||
|
{
|
||||||
|
First = new Padding
|
||||||
|
{
|
||||||
|
Bottom = spacing,
|
||||||
|
Child = childC
|
||||||
|
},
|
||||||
|
Second = new BinaryStack
|
||||||
|
{
|
||||||
|
First = new Padding
|
||||||
|
{
|
||||||
|
Bottom = spacing,
|
||||||
|
Child = childD
|
||||||
|
},
|
||||||
|
Second = new Padding
|
||||||
|
{
|
||||||
|
Bottom = spacing,
|
||||||
|
Child = childE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TestPlan.CompareOperations(structure, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine
|
namespace QuestPDF.UnitTests.TestEngine
|
||||||
@@ -7,10 +7,10 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
internal class ElementMock : Element
|
internal class ElementMock : Element
|
||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public Func<Size, ISpacePlan> MeasureFunc { get; set; }
|
public Func<Size, SpacePlan> MeasureFunc { get; set; }
|
||||||
public Action<Size> DrawFunc { get; set; }
|
public Action<Size> DrawFunc { get; set; }
|
||||||
|
|
||||||
internal override ISpacePlan Measure(Size availableSpace) => MeasureFunc(availableSpace);
|
internal override SpacePlan Measure(Size availableSpace) => MeasureFunc(availableSpace);
|
||||||
internal override void Draw(ICanvas canvas, Size availableSpace) => DrawFunc(availableSpace);
|
internal override void Draw(Size availableSpace) => DrawFunc(availableSpace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+11
-26
@@ -4,40 +4,25 @@ using SkiaSharp;
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine
|
namespace QuestPDF.UnitTests.TestEngine
|
||||||
{
|
{
|
||||||
internal class CanvasMock : ICanvas
|
internal class MockCanvas : ICanvas
|
||||||
{
|
{
|
||||||
public Action<Position> TranslateFunc { get; set; }
|
public Action<Position> TranslateFunc { get; set; }
|
||||||
|
public Action<float> RotateFunc { get; set; }
|
||||||
|
public Action<float, float> ScaleFunc { get; set; }
|
||||||
public Action<SKImage, Position, Size> DrawImageFunc { get; set; }
|
public Action<SKImage, Position, Size> DrawImageFunc { get; set; }
|
||||||
public Action<string, Position, TextStyle> DrawTextFunc { get; set; }
|
public Action<string, Position, TextStyle> DrawTextFunc { get; set; }
|
||||||
public Action<Position, Size, string> DrawRectFunc { get; set; }
|
public Action<Position, Size, string> DrawRectFunc { get; set; }
|
||||||
|
|
||||||
public void Translate(Position vector) => TranslateFunc(vector);
|
public void Translate(Position vector) => TranslateFunc(vector);
|
||||||
|
public void Rotate(float angle) => RotateFunc(angle);
|
||||||
|
public void Scale(float scaleX, float scaleY) => ScaleFunc(scaleX, scaleY);
|
||||||
|
|
||||||
public void DrawRectangle(Position vector, Size size, string color) => DrawRectFunc(vector, size, color);
|
public void DrawRectangle(Position vector, Size size, string color) => DrawRectFunc(vector, size, color);
|
||||||
public void DrawText(string text, Position position, TextStyle style) => DrawTextFunc(text, position, style);
|
public void DrawText(string text, Position position, TextStyle style) => DrawTextFunc(text, position, style);
|
||||||
public void DrawImage(SKImage image, Position position, Size size) => DrawImageFunc(image, position, size);
|
public void DrawImage(SKImage image, Position position, Size size) => DrawImageFunc(image, position, size);
|
||||||
public void DrawExternalLink(string url, Size size)
|
|
||||||
{
|
public void DrawExternalLink(string url, Size size) => throw new NotImplementedException();
|
||||||
throw new NotImplementedException();
|
public void DrawLocationLink(string locationName, Size size) => throw new NotImplementedException();
|
||||||
}
|
public void DrawLocation(string locationName) => throw new NotImplementedException();
|
||||||
|
|
||||||
public void DrawLocationLink(string locationName, Size size)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawLocation(string locationName)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawLink(string url, Size size)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Size MeasureText(string text, TextStyle style)
|
|
||||||
{
|
|
||||||
return new Size(text.Length * style.Size, style.Size);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine.Operations;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests.TestEngine
|
||||||
|
{
|
||||||
|
internal class OperationRecordingCanvas : ICanvas
|
||||||
|
{
|
||||||
|
public ICollection<OperationBase> Operations { get; } = new List<OperationBase>();
|
||||||
|
|
||||||
|
public void Translate(Position vector) => Operations.Add(new CanvasTranslateOperation(vector));
|
||||||
|
public void Rotate(float angle) => Operations.Add(new CanvasRotateOperation(angle));
|
||||||
|
public void Scale(float scaleX, float scaleY) => Operations.Add(new CanvasScaleOperation(scaleX, scaleY));
|
||||||
|
|
||||||
|
public void DrawRectangle(Position vector, Size size, string color) => Operations.Add(new CanvasDrawRectangleOperation(vector, size, color));
|
||||||
|
public void DrawText(string text, Position position, TextStyle style) => Operations.Add(new CanvasDrawTextOperation(text, position, style));
|
||||||
|
public void DrawImage(SKImage image, Position position, Size size) => Operations.Add(new CanvasDrawImageOperation(position, size));
|
||||||
|
|
||||||
|
public void DrawExternalLink(string url, Size size) => throw new NotImplementedException();
|
||||||
|
public void DrawLocationLink(string locationName, Size size) => throw new NotImplementedException();
|
||||||
|
public void DrawLocation(string locationName) => throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
internal class CanvasDrawImageOperationBase : OperationBase
|
internal class CanvasDrawImageOperation : OperationBase
|
||||||
{
|
{
|
||||||
public Position Position { get; }
|
public Position Position { get; }
|
||||||
public Size Size { get; }
|
public Size Size { get; }
|
||||||
|
|
||||||
public CanvasDrawImageOperationBase(Position position, Size size)
|
public CanvasDrawImageOperation(Position position, Size size)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
Size = size;
|
Size = size;
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
internal class CanvasDrawRectangleOperationBase : OperationBase
|
internal class CanvasDrawRectangleOperation : OperationBase
|
||||||
{
|
{
|
||||||
public Position Position { get; }
|
public Position Position { get; }
|
||||||
public Size Size { get; }
|
public Size Size { get; }
|
||||||
public string Color { get; }
|
public string Color { get; }
|
||||||
|
|
||||||
public CanvasDrawRectangleOperationBase(Position position, Size size, string color)
|
public CanvasDrawRectangleOperation(Position position, Size size, string color)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
Size = size;
|
Size = size;
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
internal class CanvasDrawTextOperationBase : OperationBase
|
internal class CanvasDrawTextOperation : OperationBase
|
||||||
{
|
{
|
||||||
public string Text { get; }
|
public string Text { get; }
|
||||||
public Position Position { get; }
|
public Position Position { get; }
|
||||||
public TextStyle Style { get; }
|
public TextStyle Style { get; }
|
||||||
|
|
||||||
public CanvasDrawTextOperationBase(string text, Position position, TextStyle style)
|
public CanvasDrawTextOperation(string text, Position position, TextStyle style)
|
||||||
{
|
{
|
||||||
Text = text;
|
Text = text;
|
||||||
Position = position;
|
Position = position;
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
|
{
|
||||||
|
public class CanvasRotateOperation : OperationBase
|
||||||
|
{
|
||||||
|
public float Angle { get; }
|
||||||
|
|
||||||
|
public CanvasRotateOperation(float angle)
|
||||||
|
{
|
||||||
|
Angle = angle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
|
{
|
||||||
|
public class CanvasScaleOperation : OperationBase
|
||||||
|
{
|
||||||
|
public float ScaleX { get; }
|
||||||
|
public float ScaleY { get; }
|
||||||
|
|
||||||
|
public CanvasScaleOperation(float scaleX, float scaleY)
|
||||||
|
{
|
||||||
|
ScaleX = scaleX;
|
||||||
|
ScaleY = scaleY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
internal class CanvasTranslateOperationBase : OperationBase
|
internal class CanvasTranslateOperation : OperationBase
|
||||||
{
|
{
|
||||||
public Position Position { get; }
|
public Position Position { get; }
|
||||||
|
|
||||||
public CanvasTranslateOperationBase(Position position)
|
public CanvasTranslateOperation(Position position)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
public class ChildDrawOperationBase : OperationBase
|
public class ChildDrawOperation : OperationBase
|
||||||
{
|
{
|
||||||
public string ChildId { get; }
|
public string ChildId { get; }
|
||||||
public Size Input { get; }
|
public Size Input { get; }
|
||||||
|
|
||||||
public ChildDrawOperationBase(string childId, Size input)
|
public ChildDrawOperation(string childId, Size input)
|
||||||
{
|
{
|
||||||
ChildId = childId;
|
ChildId = childId;
|
||||||
Input = input;
|
Input = input;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
internal class ChildMeasureOperationBase : OperationBase
|
internal class ChildMeasureOperation : OperationBase
|
||||||
{
|
{
|
||||||
public string ChildId { get; }
|
public string ChildId { get; }
|
||||||
public Size Input { get; }
|
public Size Input { get; }
|
||||||
public ISpacePlan Output { get; }
|
public SpacePlan Output { get; }
|
||||||
|
|
||||||
public ChildMeasureOperationBase(string childId, Size input, ISpacePlan output)
|
public ChildMeasureOperation(string childId, Size input, SpacePlan output)
|
||||||
{
|
{
|
||||||
ChildId = childId;
|
ChildId = childId;
|
||||||
Input = input;
|
Input = input;
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||||
{
|
{
|
||||||
public class ElementMeasureOperationBase : OperationBase
|
public class ElementMeasureOperation : OperationBase
|
||||||
{
|
{
|
||||||
public ElementMeasureOperationBase(Size input)
|
public ElementMeasureOperation(Size input)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests.TestEngine
|
||||||
|
{
|
||||||
|
internal static class SimpleContainerTests
|
||||||
|
{
|
||||||
|
#region measure
|
||||||
|
|
||||||
|
public static void Measure<TElement>() where TElement : Element, IContainer, new()
|
||||||
|
{
|
||||||
|
Measure_Wrap<TElement>();
|
||||||
|
Measure_PartialRender<TElement>();
|
||||||
|
Measure_FullRender<TElement>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Measure_Wrap<TElement>() where TElement : Element, IContainer, new()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new TElement
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Measure_PartialRender<TElement>() where TElement : Element, IContainer, new()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new TElement
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(200, 100))
|
||||||
|
.CheckMeasureResult(SpacePlan.PartialRender(200, 100));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Measure_FullRender<TElement>() where TElement : Element, IContainer, new()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new TElement
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(400, 300))
|
||||||
|
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(250, 150));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public static void Draw<TElement>() where TElement : Element, IContainer, new()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new TElement
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(1200, 900))
|
||||||
|
.ExpectChildDraw(new Size(1200, 900))
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using FluentAssertions;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests.TestEngine
|
|
||||||
{
|
|
||||||
public static class SingleChildTests
|
|
||||||
{
|
|
||||||
internal static void MeasureWithoutChild<T>(this T element) where T : ContainerElement
|
|
||||||
{
|
|
||||||
element.Child = null;
|
|
||||||
element.Measure(Size.Zero).Should().BeEquivalentTo(new FullRender(Size.Zero));
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void DrawWithoutChild<T>(this T element) where T : ContainerElement
|
|
||||||
{
|
|
||||||
// component does not throw an exception when called with null child
|
|
||||||
Assert.DoesNotThrow(() =>
|
|
||||||
{
|
|
||||||
element.Child = null;
|
|
||||||
|
|
||||||
// component does not perform any canvas operation when called with null child
|
|
||||||
TestPlan
|
|
||||||
.For(x => element)
|
|
||||||
.DrawElement(new Size(200, 100))
|
|
||||||
.CheckDrawResult();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine.Operations;
|
using QuestPDF.UnitTests.TestEngine.Operations;
|
||||||
|
|
||||||
@@ -12,6 +14,8 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
internal class TestPlan
|
internal class TestPlan
|
||||||
{
|
{
|
||||||
private const string DefaultChildName = "child";
|
private const string DefaultChildName = "child";
|
||||||
|
|
||||||
|
private static Random Random { get; } = new Random();
|
||||||
|
|
||||||
private Element Element { get; set; }
|
private Element Element { get; set; }
|
||||||
private ICanvas Canvas { get; }
|
private ICanvas Canvas { get; }
|
||||||
@@ -44,20 +48,31 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
|
|
||||||
private ICanvas CreateCanvas()
|
private ICanvas CreateCanvas()
|
||||||
{
|
{
|
||||||
return new CanvasMock
|
return new MockCanvas
|
||||||
{
|
{
|
||||||
TranslateFunc = position =>
|
TranslateFunc = position =>
|
||||||
{
|
{
|
||||||
var expected = GetExpected<CanvasTranslateOperationBase>();
|
var expected = GetExpected<CanvasTranslateOperation>();
|
||||||
|
|
||||||
Assert.AreEqual(expected.Position.X, position.X, "Translate X");
|
Assert.AreEqual(expected.Position.X, position.X, "Translate X");
|
||||||
Assert.AreEqual(expected.Position.Y, position.Y, "Translate Y");
|
Assert.AreEqual(expected.Position.Y, position.Y, "Translate Y");
|
||||||
|
},
|
||||||
//position.Should().BeEquivalentTo(expected.Position);
|
RotateFunc = angle =>
|
||||||
|
{
|
||||||
|
var expected = GetExpected<CanvasRotateOperation>();
|
||||||
|
|
||||||
|
Assert.AreEqual(expected.Angle, angle, "Rotate angle");
|
||||||
|
},
|
||||||
|
ScaleFunc = (scaleX, scaleY) =>
|
||||||
|
{
|
||||||
|
var expected = GetExpected<CanvasScaleOperation>();
|
||||||
|
|
||||||
|
Assert.AreEqual(expected.ScaleX, scaleX, "Scale X");
|
||||||
|
Assert.AreEqual(expected.ScaleY, scaleY, "Scale Y");
|
||||||
},
|
},
|
||||||
DrawRectFunc = (position, size, color) =>
|
DrawRectFunc = (position, size, color) =>
|
||||||
{
|
{
|
||||||
var expected = GetExpected<CanvasDrawRectangleOperationBase>();
|
var expected = GetExpected<CanvasDrawRectangleOperation>();
|
||||||
|
|
||||||
Assert.AreEqual(expected.Position.X, position.X, "Draw rectangle: X");
|
Assert.AreEqual(expected.Position.X, position.X, "Draw rectangle: X");
|
||||||
Assert.AreEqual(expected.Position.Y, position.Y, "Draw rectangle: Y");
|
Assert.AreEqual(expected.Position.Y, position.Y, "Draw rectangle: Y");
|
||||||
@@ -66,14 +81,10 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
Assert.AreEqual(expected.Size.Height, size.Height, "Draw rectangle: height");
|
Assert.AreEqual(expected.Size.Height, size.Height, "Draw rectangle: height");
|
||||||
|
|
||||||
Assert.AreEqual(expected.Color, color, "Draw rectangle: color");
|
Assert.AreEqual(expected.Color, color, "Draw rectangle: color");
|
||||||
|
|
||||||
/*position.Should().BeEquivalentTo(expected.Position);
|
|
||||||
size.Should().BeEquivalentTo(expected.Size);
|
|
||||||
color.Should().Be(expected.Color);*/
|
|
||||||
},
|
},
|
||||||
DrawTextFunc = (text, position, style) =>
|
DrawTextFunc = (text, position, style) =>
|
||||||
{
|
{
|
||||||
var expected = GetExpected<CanvasDrawTextOperationBase>();
|
var expected = GetExpected<CanvasDrawTextOperation>();
|
||||||
|
|
||||||
Assert.AreEqual(expected.Text, text);
|
Assert.AreEqual(expected.Text, text);
|
||||||
|
|
||||||
@@ -83,23 +94,16 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
Assert.AreEqual(expected.Style.Color, style.Color, "Draw text: color");
|
Assert.AreEqual(expected.Style.Color, style.Color, "Draw text: color");
|
||||||
Assert.AreEqual(expected.Style.FontType, style.FontType, "Draw text: font");
|
Assert.AreEqual(expected.Style.FontType, style.FontType, "Draw text: font");
|
||||||
Assert.AreEqual(expected.Style.Size, style.Size, "Draw text: size");
|
Assert.AreEqual(expected.Style.Size, style.Size, "Draw text: size");
|
||||||
|
|
||||||
/*text.Should().Be(expected.Text);
|
|
||||||
position.Should().BeEquivalentTo(expected.Position);
|
|
||||||
style.Should().BeEquivalentTo(expected.Style);*/
|
|
||||||
},
|
},
|
||||||
DrawImageFunc = (image, position, size) =>
|
DrawImageFunc = (image, position, size) =>
|
||||||
{
|
{
|
||||||
var expected = GetExpected<CanvasDrawImageOperationBase>();
|
var expected = GetExpected<CanvasDrawImageOperation>();
|
||||||
|
|
||||||
Assert.AreEqual(expected.Position.X, position.X, "Draw image: X");
|
Assert.AreEqual(expected.Position.X, position.X, "Draw image: X");
|
||||||
Assert.AreEqual(expected.Position.Y, position.Y, "Draw image: Y");
|
Assert.AreEqual(expected.Position.Y, position.Y, "Draw image: Y");
|
||||||
|
|
||||||
Assert.AreEqual(expected.Size.Width, size.Width, "Draw image: width");
|
Assert.AreEqual(expected.Size.Width, size.Width, "Draw image: width");
|
||||||
Assert.AreEqual(expected.Size.Height, size.Height, "Draw image: height");
|
Assert.AreEqual(expected.Size.Height, size.Height, "Draw image: height");
|
||||||
|
|
||||||
/*position.Should().BeEquivalentTo(expected.Position);
|
|
||||||
size.Should().BeEquivalentTo(expected.Size);*/
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -113,29 +117,23 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
Id = id,
|
Id = id,
|
||||||
MeasureFunc = availableSpace =>
|
MeasureFunc = availableSpace =>
|
||||||
{
|
{
|
||||||
var expected = GetExpected<ChildMeasureOperationBase>();
|
var expected = GetExpected<ChildMeasureOperation>();
|
||||||
|
|
||||||
Assert.AreEqual(expected.ChildId, id);
|
Assert.AreEqual(expected.ChildId, id);
|
||||||
|
|
||||||
Assert.AreEqual(expected.Input.Width, availableSpace.Width, $"Measure: width of child '{expected.ChildId}'");
|
Assert.AreEqual(expected.Input.Width, availableSpace.Width, $"Measure: width of child '{expected.ChildId}'");
|
||||||
Assert.AreEqual(expected.Input.Height, availableSpace.Height, $"Measure: height of child '{expected.ChildId}'");
|
Assert.AreEqual(expected.Input.Height, availableSpace.Height, $"Measure: height of child '{expected.ChildId}'");
|
||||||
|
|
||||||
// id.Should().Be(expected.ChildId);
|
|
||||||
// availableSpace.Should().Be(expected.Input);
|
|
||||||
|
|
||||||
return expected.Output;
|
return expected.Output;
|
||||||
},
|
},
|
||||||
DrawFunc = availableSpace =>
|
DrawFunc = availableSpace =>
|
||||||
{
|
{
|
||||||
var expected = GetExpected<ChildDrawOperationBase>();
|
var expected = GetExpected<ChildDrawOperation>();
|
||||||
|
|
||||||
Assert.AreEqual(expected.ChildId, id);
|
Assert.AreEqual(expected.ChildId, id);
|
||||||
|
|
||||||
Assert.AreEqual(expected.Input.Width, availableSpace.Width, $"Draw: width of child '{expected.ChildId}'");
|
Assert.AreEqual(expected.Input.Width, availableSpace.Width, $"Draw: width of child '{expected.ChildId}'");
|
||||||
Assert.AreEqual(expected.Input.Height, availableSpace.Height, $"Draw: width of child '{expected.ChildId}'");
|
Assert.AreEqual(expected.Input.Height, availableSpace.Height, $"Draw: width of child '{expected.ChildId}'");
|
||||||
|
|
||||||
/*id.Should().Be(expected.ChildId);
|
|
||||||
availableSpace.Should().Be(expected.Input);*/
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -158,14 +156,14 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectChildMeasure(Size expectedInput, ISpacePlan returns)
|
public TestPlan ExpectChildMeasure(Size expectedInput, SpacePlan returns)
|
||||||
{
|
{
|
||||||
return ExpectChildMeasure(DefaultChildName, expectedInput, returns);
|
return ExpectChildMeasure(DefaultChildName, expectedInput, returns);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectChildMeasure(string child, Size expectedInput, ISpacePlan returns)
|
public TestPlan ExpectChildMeasure(string child, Size expectedInput, SpacePlan returns)
|
||||||
{
|
{
|
||||||
return AddOperation(new ChildMeasureOperationBase(child, expectedInput, returns));
|
return AddOperation(new ChildMeasureOperation(child, expectedInput, returns));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectChildDraw(Size expectedInput)
|
public TestPlan ExpectChildDraw(Size expectedInput)
|
||||||
@@ -175,55 +173,63 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
|
|
||||||
public TestPlan ExpectChildDraw(string child, Size expectedInput)
|
public TestPlan ExpectChildDraw(string child, Size expectedInput)
|
||||||
{
|
{
|
||||||
return AddOperation(new ChildDrawOperationBase(child, expectedInput));
|
return AddOperation(new ChildDrawOperation(child, expectedInput));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectCanvasTranslate(Position position)
|
public TestPlan ExpectCanvasTranslate(Position position)
|
||||||
{
|
{
|
||||||
return AddOperation(new CanvasTranslateOperationBase(position));
|
return AddOperation(new CanvasTranslateOperation(position));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectCanvasTranslate(float left, float top)
|
public TestPlan ExpectCanvasTranslate(float left, float top)
|
||||||
{
|
{
|
||||||
return AddOperation(new CanvasTranslateOperationBase(new Position(left, top)));
|
return AddOperation(new CanvasTranslateOperation(new Position(left, top)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TestPlan ExpectCanvasScale(float scaleX, float scaleY)
|
||||||
|
{
|
||||||
|
return AddOperation(new CanvasScaleOperation(scaleX, scaleY));
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestPlan ExpectCanvasRotate(float angle)
|
||||||
|
{
|
||||||
|
return AddOperation(new CanvasRotateOperation(angle));
|
||||||
|
}
|
||||||
|
|
||||||
public TestPlan ExpectCanvasDrawRectangle(Position position, Size size, string color)
|
public TestPlan ExpectCanvasDrawRectangle(Position position, Size size, string color)
|
||||||
{
|
{
|
||||||
return AddOperation(new CanvasDrawRectangleOperationBase(position, size, color));
|
return AddOperation(new CanvasDrawRectangleOperation(position, size, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectCanvasDrawText(string text, Position position, TextStyle style)
|
public TestPlan ExpectCanvasDrawText(string text, Position position, TextStyle style)
|
||||||
{
|
{
|
||||||
return AddOperation(new CanvasDrawTextOperationBase(text, position, style));
|
return AddOperation(new CanvasDrawTextOperation(text, position, style));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan ExpectCanvasDrawImage(Position position, Size size)
|
public TestPlan ExpectCanvasDrawImage(Position position, Size size)
|
||||||
{
|
{
|
||||||
return AddOperation(new CanvasDrawImageOperationBase(position, size));
|
return AddOperation(new CanvasDrawImageOperation(position, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan CheckMeasureResult(ISpacePlan expected)
|
public TestPlan CheckMeasureResult(SpacePlan expected)
|
||||||
{
|
{
|
||||||
|
Element.HandleVisitor(x => x?.Initialize(null, Canvas));
|
||||||
|
|
||||||
var actual = Element.Measure(OperationInput);
|
var actual = Element.Measure(OperationInput);
|
||||||
|
|
||||||
Assert.AreEqual(expected.GetType(), actual.GetType());
|
Assert.AreEqual(expected.GetType(), actual.GetType());
|
||||||
|
|
||||||
var expectedSize = expected as Size;
|
Assert.AreEqual(expected.Width, actual.Width, "Measure: width");
|
||||||
var actualSize = actual as Size;
|
Assert.AreEqual(expected.Height, actual.Height, "Measure: height");
|
||||||
|
Assert.AreEqual(expected.Type, actual.Type, "Measure: height");
|
||||||
if (expectedSize != null)
|
|
||||||
{
|
|
||||||
Assert.AreEqual(expectedSize.Width, actualSize.Width, "Measure: width");
|
|
||||||
Assert.AreEqual(expectedSize.Height, actualSize.Height, "Measure: height");
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestPlan CheckDrawResult()
|
public TestPlan CheckDrawResult()
|
||||||
{
|
{
|
||||||
Element.Draw(Canvas, OperationInput);
|
Element.HandleVisitor(x => x?.Initialize(null, Canvas));
|
||||||
|
Element.Draw(OperationInput);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,10 +248,51 @@ namespace QuestPDF.UnitTests.TestEngine
|
|||||||
|
|
||||||
public static Element CreateUniqueElement()
|
public static Element CreateUniqueElement()
|
||||||
{
|
{
|
||||||
return new Text
|
return new Constrained
|
||||||
{
|
{
|
||||||
Value = Guid.NewGuid().ToString("N")
|
MinWidth = 90,
|
||||||
|
MinHeight = 60,
|
||||||
|
|
||||||
|
Child = new DynamicImage
|
||||||
|
{
|
||||||
|
Source = Placeholders.Image
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void CompareOperations(Element value, Element expected, Size? availableSpace = null)
|
||||||
|
{
|
||||||
|
CompareMeasureOperations(value, expected, availableSpace);
|
||||||
|
CompareDrawOperations(value, expected, availableSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CompareMeasureOperations(Element value, Element expected, Size? availableSpace = null)
|
||||||
|
{
|
||||||
|
availableSpace ??= new Size(400, 300);
|
||||||
|
|
||||||
|
var canvas = new FreeCanvas();
|
||||||
|
value.HandleVisitor(x => x.Initialize(null, canvas));
|
||||||
|
var valueMeasure = value.Measure(availableSpace.Value);
|
||||||
|
|
||||||
|
expected.HandleVisitor(x => x.Initialize(null, canvas));
|
||||||
|
var expectedMeasure = expected.Measure(availableSpace.Value);
|
||||||
|
|
||||||
|
valueMeasure.Should().BeEquivalentTo(expectedMeasure);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CompareDrawOperations(Element value, Element expected, Size? availableSpace = null)
|
||||||
|
{
|
||||||
|
availableSpace ??= new Size(400, 300);
|
||||||
|
|
||||||
|
var valueCanvas = new OperationRecordingCanvas();
|
||||||
|
value.HandleVisitor(x => x.Initialize(null, valueCanvas));
|
||||||
|
value.Draw(availableSpace.Value);
|
||||||
|
|
||||||
|
var expectedCanvas = new OperationRecordingCanvas();
|
||||||
|
expected.HandleVisitor(x => x.Initialize(null, expectedCanvas));
|
||||||
|
expected.Draw(availableSpace.Value);
|
||||||
|
|
||||||
|
valueCanvas.Operations.Should().BeEquivalentTo(expectedCanvas.Operations);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[SetUpFixture]
|
||||||
|
public class TestsBase
|
||||||
|
{
|
||||||
|
[OneTimeSetUp]
|
||||||
|
public void RunBeforeAnyTests()
|
||||||
|
{
|
||||||
|
AssertionOptions.AssertEquivalencyUsing(options => options
|
||||||
|
.IncludingNestedObjects()
|
||||||
|
.IncludingInternalProperties()
|
||||||
|
.IncludingInternalFields()
|
||||||
|
.AllowingInfiniteRecursion()
|
||||||
|
.RespectingRuntimeTypes()
|
||||||
|
.WithTracing()
|
||||||
|
.WithStrictOrdering());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
using NUnit.Framework;
|
|
||||||
|
|
||||||
namespace QuestPDF.UnitTests
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
public class TextTests
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class TranslateTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Measure() => SimpleContainerTests.Measure<Translate>();
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Translate
|
||||||
|
{
|
||||||
|
Child = x.CreateChild(),
|
||||||
|
TranslateX = 50,
|
||||||
|
TranslateY = 75
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(400, 300))
|
||||||
|
.ExpectCanvasTranslate(50, 75)
|
||||||
|
.ExpectChildDraw(new Size(400, 300))
|
||||||
|
.ExpectCanvasTranslate(-50, -75)
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
|
|
||||||
|
namespace QuestPDF.UnitTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class UnconstrainedTests
|
||||||
|
{
|
||||||
|
#region measure
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_Wrap()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Unconstrained
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(Size.Max, SpacePlan.Wrap())
|
||||||
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_PartialRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Unconstrained
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(Size.Max, SpacePlan.PartialRender(1200, 1600))
|
||||||
|
.CheckMeasureResult(SpacePlan.PartialRender(Size.Zero));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Measure_FullRender()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Unconstrained
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.MeasureElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(Size.Max, SpacePlan.FullRender(1200, 1600))
|
||||||
|
.CheckMeasureResult(SpacePlan.FullRender(Size.Zero));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region draw
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_SkipWhenChildWraps()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Unconstrained
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(Size.Max, SpacePlan.Wrap())
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_WhenChildPartiallyRenders()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Unconstrained
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(Size.Max, SpacePlan.PartialRender(1200, 1600))
|
||||||
|
.ExpectChildDraw(new Size(1200, 1600))
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Draw_WhenChildFullyRenders()
|
||||||
|
{
|
||||||
|
TestPlan
|
||||||
|
.For(x => new Unconstrained
|
||||||
|
{
|
||||||
|
Child = x.CreateChild()
|
||||||
|
})
|
||||||
|
.DrawElement(new Size(900, 800))
|
||||||
|
.ExpectChildMeasure(Size.Max, SpacePlan.FullRender(1600, 1000))
|
||||||
|
.ExpectChildDraw(new Size(1600, 1000))
|
||||||
|
.CheckDrawResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
||||||
[assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
|
[assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
|
||||||
[assembly: InternalsVisibleTo("QuestPDF.Examples")]
|
[assembly: InternalsVisibleTo("QuestPDF.Examples")]
|
||||||
|
[assembly: InternalsVisibleTo("QuestPDF.ReportSample")]
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
using QuestPDF.Infrastructure;
|
|
||||||
using SkiaSharp;
|
|
||||||
|
|
||||||
namespace QuestPDF.Drawing
|
|
||||||
{
|
|
||||||
internal class Canvas : ICanvas
|
|
||||||
{
|
|
||||||
internal SKCanvas SkiaCanvas { get; }
|
|
||||||
|
|
||||||
public Canvas(SKCanvas skiaCanvas)
|
|
||||||
{
|
|
||||||
SkiaCanvas = skiaCanvas;
|
|
||||||
}
|
|
||||||
|
|
||||||
~Canvas()
|
|
||||||
{
|
|
||||||
SkiaCanvas.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Translate(Position vector)
|
|
||||||
{
|
|
||||||
SkiaCanvas.Translate(vector.X, vector.Y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawRectangle(Position vector, Size size, string color)
|
|
||||||
{
|
|
||||||
if (size.Width < Size.Epsilon || size.Height < Size.Epsilon)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var paint = color.ColorToPaint();
|
|
||||||
SkiaCanvas.DrawRect(vector.X, vector.Y, size.Width, size.Height, paint);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawText(string text, Position vector, TextStyle style)
|
|
||||||
{
|
|
||||||
SkiaCanvas.DrawText(text, vector.X, vector.Y, style.ToPaint());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawImage(SKImage image, Position vector, Size size)
|
|
||||||
{
|
|
||||||
SkiaCanvas.DrawImage(image, new SKRect(vector.X, vector.Y, size.Width, size.Height));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawExternalLink(string url, Size size)
|
|
||||||
{
|
|
||||||
SkiaCanvas.DrawUrlAnnotation(new SKRect(0, 0, size.Width, size.Height), url);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawLocationLink(string locationName, Size size)
|
|
||||||
{
|
|
||||||
SkiaCanvas.DrawLinkDestinationAnnotation(new SKRect(0, 0, size.Width, size.Height), locationName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawLocation(string locationName)
|
|
||||||
{
|
|
||||||
SkiaCanvas.DrawNamedDestinationAnnotation(new SKPoint(0, 0), locationName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
using System.Collections.Concurrent;
|
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
using SkiaSharp;
|
|
||||||
|
|
||||||
namespace QuestPDF.Drawing
|
|
||||||
{
|
|
||||||
internal static class CanvasCache
|
|
||||||
{
|
|
||||||
private static ConcurrentDictionary<string, SKPaint> Paints = new ConcurrentDictionary<string, SKPaint>();
|
|
||||||
private static ConcurrentDictionary<string, SKPaint> ColorPaint = new ConcurrentDictionary<string, SKPaint>();
|
|
||||||
|
|
||||||
internal static SKPaint ColorToPaint(this string color)
|
|
||||||
{
|
|
||||||
return ColorPaint.GetOrAdd(color, Convert);
|
|
||||||
|
|
||||||
static SKPaint Convert(string color)
|
|
||||||
{
|
|
||||||
return new SKPaint
|
|
||||||
{
|
|
||||||
Color = SKColor.Parse(color)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static SKPaint ToPaint(this TextStyle style)
|
|
||||||
{
|
|
||||||
return Paints.GetOrAdd(style.ToString(), key => Convert(style));
|
|
||||||
|
|
||||||
static SKPaint Convert(TextStyle style)
|
|
||||||
{
|
|
||||||
var slant = style.IsItalic ? SKFontStyleSlant.Italic : SKFontStyleSlant.Upright;
|
|
||||||
|
|
||||||
return new SKPaint
|
|
||||||
{
|
|
||||||
Color = SKColor.Parse(style.Color),
|
|
||||||
Typeface = SKTypeface.FromFamilyName(style.FontType, (int)style.FontWeight, (int)SKFontStyleWidth.Normal, slant),
|
|
||||||
TextSize = style.Size,
|
|
||||||
TextEncoding = SKTextEncoding.Utf32,
|
|
||||||
|
|
||||||
TextAlign = style.Alignment switch
|
|
||||||
{
|
|
||||||
HorizontalAlignment.Left => SKTextAlign.Left,
|
|
||||||
HorizontalAlignment.Center => SKTextAlign.Center,
|
|
||||||
HorizontalAlignment.Right => SKTextAlign.Right,
|
|
||||||
_ => SKTextAlign.Left
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static TextMeasurement BreakText(this TextStyle style, string text, float availableWidth)
|
|
||||||
{
|
|
||||||
var index = (int)style.ToPaint().BreakText(text, availableWidth, out var width);
|
|
||||||
|
|
||||||
return new TextMeasurement()
|
|
||||||
{
|
|
||||||
LineIndex = index,
|
|
||||||
FragmentWidth = width
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Drawing
|
||||||
|
{
|
||||||
|
internal class DocumentContainer : IDocumentContainer
|
||||||
|
{
|
||||||
|
internal List<IComponent> Pages { get; set; } = new List<IComponent>();
|
||||||
|
|
||||||
|
internal Container Compose()
|
||||||
|
{
|
||||||
|
var container = new Container();
|
||||||
|
|
||||||
|
container
|
||||||
|
.Stack(stack =>
|
||||||
|
{
|
||||||
|
Pages
|
||||||
|
.SelectMany(x => new List<Action>()
|
||||||
|
{
|
||||||
|
() => stack.Item().PageBreak(),
|
||||||
|
() => stack.Item().Component(x)
|
||||||
|
})
|
||||||
|
.Skip(1)
|
||||||
|
.ToList()
|
||||||
|
.ForEach(x => x());
|
||||||
|
});
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using QuestPDF.Drawing.Exceptions;
|
using QuestPDF.Drawing.Exceptions;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing.Proxy;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Helpers;
|
using QuestPDF.Elements.Text;
|
||||||
|
using QuestPDF.Elements.Text.Items;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using SkiaSharp;
|
|
||||||
|
|
||||||
namespace QuestPDF.Drawing
|
namespace QuestPDF.Drawing
|
||||||
{
|
{
|
||||||
@@ -14,115 +15,158 @@ namespace QuestPDF.Drawing
|
|||||||
{
|
{
|
||||||
internal static void GeneratePdf(Stream stream, IDocument document)
|
internal static void GeneratePdf(Stream stream, IDocument document)
|
||||||
{
|
{
|
||||||
var content = ElementExtensions.Create(document.Compose);
|
|
||||||
var metadata = document.GetMetadata();
|
var metadata = document.GetMetadata();
|
||||||
|
var canvas = new PdfCanvas(stream, metadata);
|
||||||
|
RenderDocument(canvas, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void GenerateXps(Stream stream, IDocument document)
|
||||||
|
{
|
||||||
|
var metadata = document.GetMetadata();
|
||||||
|
var canvas = new XpsCanvas(stream, metadata);
|
||||||
|
RenderDocument(canvas, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static ICollection<byte[]> GenerateImages(IDocument document)
|
||||||
|
{
|
||||||
|
var metadata = document.GetMetadata();
|
||||||
|
var canvas = new ImageCanvas(metadata);
|
||||||
|
RenderDocument(canvas, document);
|
||||||
|
|
||||||
|
return canvas.Images;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RenderDocument<TCanvas>(TCanvas canvas, IDocument document)
|
||||||
|
where TCanvas : ICanvas, IRenderingCanvas
|
||||||
|
{
|
||||||
|
var container = new DocumentContainer();
|
||||||
|
document.Compose(container);
|
||||||
|
var content = container.Compose();
|
||||||
|
|
||||||
using var pdf = SKDocument.CreatePdf(stream, MapMetadata(metadata));
|
var metadata = document.GetMetadata();
|
||||||
var totalPages = 1;
|
var pageContext = new PageContext();
|
||||||
|
|
||||||
|
DebuggingState debuggingState = null;
|
||||||
|
|
||||||
|
if (System.Diagnostics.Debugger.IsAttached)
|
||||||
|
{
|
||||||
|
debuggingState = ApplyDebugging(content);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ApplyCaching(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderPass(pageContext, new FreeCanvas(), content, metadata, debuggingState);
|
||||||
|
RenderPass(pageContext, canvas, content, metadata, debuggingState);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void RenderPass<TCanvas>(PageContext pageContext, TCanvas canvas, Container content, DocumentMetadata documentMetadata, DebuggingState? debuggingState)
|
||||||
|
where TCanvas : ICanvas, IRenderingCanvas
|
||||||
|
{
|
||||||
|
content.HandleVisitor(x => x?.Initialize(pageContext, canvas));
|
||||||
|
content.HandleVisitor(x => (x as IStateResettable)?.ResetState());
|
||||||
|
|
||||||
|
canvas.BeginDocument();
|
||||||
|
|
||||||
|
var currentPage = 1;
|
||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
var spacePlan = content.Measure(metadata.Size);
|
pageContext.SetPageNumber(currentPage);
|
||||||
|
debuggingState?.Reset();
|
||||||
|
|
||||||
|
var spacePlan = content.Measure(Size.Max);
|
||||||
|
|
||||||
using var skiaCanvas = pdf.BeginPage(metadata.Size.Width, metadata.Size.Height);
|
if (spacePlan.Type == SpacePlanType.Wrap)
|
||||||
var canvas = new Canvas(skiaCanvas);
|
{
|
||||||
|
canvas.EndDocument();
|
||||||
|
ThrowLayoutException();
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
content.Draw(canvas, metadata.Size);
|
canvas.BeginPage(spacePlan);
|
||||||
|
content.Draw(spacePlan);
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
pdf.Close();
|
canvas.EndDocument();
|
||||||
throw new DocumentDrawingException("An exception occured during document drawing.", exception);
|
throw new DocumentDrawingException("An exception occured during document drawing.", exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
pdf.EndPage();
|
canvas.EndPage();
|
||||||
|
|
||||||
if (totalPages >= metadata.DocumentLayoutExceptionThreshold)
|
if (currentPage >= documentMetadata.DocumentLayoutExceptionThreshold)
|
||||||
{
|
{
|
||||||
pdf.Close();
|
canvas.EndDocument();
|
||||||
throw new DocumentLayoutException("Composed layout generates infinite document.");
|
ThrowLayoutException();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spacePlan is FullRender)
|
if (spacePlan.Type == SpacePlanType.FullRender)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
totalPages++;
|
currentPage++;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdf.Close();
|
canvas.EndDocument();
|
||||||
}
|
|
||||||
|
|
||||||
internal static IEnumerable<byte[]> GenerateImages(IDocument document)
|
void ThrowLayoutException()
|
||||||
{
|
|
||||||
var content = ElementExtensions.Create(document.Compose);
|
|
||||||
var metadata = document.GetMetadata();
|
|
||||||
|
|
||||||
var totalPages = 1;
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
var spacePlan = content.Measure(metadata.Size);
|
var message = $"Composed layout generates infinite document. This may happen in two cases. " +
|
||||||
byte[] result;
|
$"1) Your document and its layout configuration is correct but the content takes more than {documentMetadata.DocumentLayoutExceptionThreshold} pages. " +
|
||||||
|
$"In this case, please increase the value {nameof(DocumentMetadata)}.{nameof(DocumentMetadata.DocumentLayoutExceptionThreshold)} property configured in the {nameof(IDocument.GetMetadata)} method. " +
|
||||||
try
|
$"2) The layout configuration of your document is invalid. Some of the elements require more space than is provided." +
|
||||||
{
|
$"Please analyze your documents structure to detect this element and fix its size constraints.";
|
||||||
result = RenderPage(content);
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
throw new DocumentDrawingException("An exception occured during document drawing.", exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
yield return result;
|
|
||||||
|
|
||||||
if (totalPages >= metadata.DocumentLayoutExceptionThreshold)
|
|
||||||
{
|
|
||||||
throw new DocumentLayoutException("Composed layout generates infinite document.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spacePlan is FullRender)
|
|
||||||
break;
|
|
||||||
|
|
||||||
totalPages++;
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] RenderPage(Element element)
|
|
||||||
{
|
|
||||||
// scale the result so it is more readable
|
|
||||||
var scalingFactor = metadata.RasterDpi / (float) PageSizes.PointsPerInch;
|
|
||||||
|
|
||||||
var imageInfo = new SKImageInfo((int) (metadata.Size.Width * scalingFactor), (int) (metadata.Size.Height * scalingFactor));
|
throw new DocumentLayoutException(message)
|
||||||
using var surface = SKSurface.Create(imageInfo);
|
{
|
||||||
surface.Canvas.Scale(scalingFactor);
|
ElementTrace = debuggingState?.BuildTrace() ?? "Debug trace is available only in the DEBUG mode."
|
||||||
|
};
|
||||||
var canvas = new Canvas(surface.Canvas);
|
|
||||||
element?.Draw(canvas, metadata.Size);
|
|
||||||
|
|
||||||
surface.Canvas.Save();
|
|
||||||
return surface.Snapshot().Encode(SKEncodedImageFormat.Png, 100).ToArray();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SKDocumentPdfMetadata MapMetadata(DocumentMetadata metadata)
|
private static void ApplyCaching(Container content)
|
||||||
{
|
{
|
||||||
return new SKDocumentPdfMetadata
|
content.HandleVisitor(x =>
|
||||||
{
|
{
|
||||||
Title = metadata.Title,
|
if (x is ICacheable)
|
||||||
Author = metadata.Author,
|
x.CreateProxy(y => new CacheProxy(y));
|
||||||
Subject = metadata.Subject,
|
});
|
||||||
Keywords = metadata.Keywords,
|
}
|
||||||
Creator = metadata.Creator,
|
|
||||||
Producer = metadata.Producer,
|
private static DebuggingState ApplyDebugging(Container content)
|
||||||
|
{
|
||||||
|
var debuggingState = new DebuggingState();
|
||||||
|
|
||||||
|
content.HandleVisitor(x =>
|
||||||
|
{
|
||||||
|
x.CreateProxy(y => new DebuggingProxy(debuggingState, y));
|
||||||
|
});
|
||||||
|
|
||||||
|
return debuggingState;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void ApplyDefaultTextStyle(this Element content, TextStyle documentDefaultTextStyle)
|
||||||
|
{
|
||||||
|
documentDefaultTextStyle.ApplyGlobalStyle(TextStyle.LibraryDefault);
|
||||||
|
|
||||||
|
content.HandleVisitor(element =>
|
||||||
|
{
|
||||||
|
var text = element as TextBlock;
|
||||||
|
|
||||||
Creation = metadata.CreationDate,
|
if (text == null)
|
||||||
Modified = metadata.ModifiedDate,
|
return;
|
||||||
|
|
||||||
RasterDpi = metadata.RasterDpi,
|
foreach (var child in text.Children)
|
||||||
EncodingQuality = metadata.ImageQuality,
|
{
|
||||||
PdfA = metadata.PdfA
|
if (child is TextBlockSpan textSpan)
|
||||||
};
|
textSpan.Style.ApplyGlobalStyle(documentDefaultTextStyle);
|
||||||
|
|
||||||
|
if (child is TextBlockElement textElement)
|
||||||
|
ApplyDefaultTextStyle(textElement.Element, documentDefaultTextStyle);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using QuestPDF.Helpers;
|
|
||||||
using QuestPDF.Infrastructure;
|
|
||||||
|
|
||||||
namespace QuestPDF.Drawing
|
namespace QuestPDF.Drawing
|
||||||
{
|
{
|
||||||
public class DocumentMetadata
|
public class DocumentMetadata
|
||||||
{
|
{
|
||||||
public Size Size { get; set; } = PageSizes.A4;
|
|
||||||
public int ImageQuality { get; set; } = 101;
|
public int ImageQuality { get; set; } = 101;
|
||||||
public int RasterDpi { get; set; } = 72;
|
public int RasterDpi { get; set; } = 72;
|
||||||
public bool PdfA { get; set; }
|
public bool PdfA { get; set; }
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ namespace QuestPDF.Drawing.Exceptions
|
|||||||
{
|
{
|
||||||
public class DocumentLayoutException : Exception
|
public class DocumentLayoutException : Exception
|
||||||
{
|
{
|
||||||
|
public string ElementTrace { get; set; }
|
||||||
|
|
||||||
public DocumentLayoutException()
|
public DocumentLayoutException()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.IO;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace QuestPDF.Drawing
|
||||||
|
{
|
||||||
|
public static class FontManager
|
||||||
|
{
|
||||||
|
private static ConcurrentDictionary<string, SKTypeface> Typefaces = new ConcurrentDictionary<string, SKTypeface>();
|
||||||
|
private static ConcurrentDictionary<string, SKFontMetrics> FontMetrics = new ConcurrentDictionary<string, SKFontMetrics>();
|
||||||
|
private static ConcurrentDictionary<string, SKPaint> Paints = new ConcurrentDictionary<string, SKPaint>();
|
||||||
|
private static ConcurrentDictionary<string, SKPaint> ColorPaint = new ConcurrentDictionary<string, SKPaint>();
|
||||||
|
|
||||||
|
public static void RegisterFontType(string fontName, Stream stream)
|
||||||
|
{
|
||||||
|
Typefaces.TryAdd(fontName, SKTypeface.FromStream(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static SKPaint ColorToPaint(this string color)
|
||||||
|
{
|
||||||
|
return ColorPaint.GetOrAdd(color, Convert);
|
||||||
|
|
||||||
|
static SKPaint Convert(string color)
|
||||||
|
{
|
||||||
|
return new SKPaint
|
||||||
|
{
|
||||||
|
Color = SKColor.Parse(color)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static SKPaint ToPaint(this TextStyle style)
|
||||||
|
{
|
||||||
|
return Paints.GetOrAdd(style.Key, key => Convert(style));
|
||||||
|
|
||||||
|
static SKPaint Convert(TextStyle style)
|
||||||
|
{
|
||||||
|
return new SKPaint
|
||||||
|
{
|
||||||
|
Color = SKColor.Parse(style.Color),
|
||||||
|
Typeface = GetTypeface(style),
|
||||||
|
TextSize = (style.Size ?? 12),
|
||||||
|
TextEncoding = SKTextEncoding.Utf32
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static SKTypeface GetTypeface(TextStyle style)
|
||||||
|
{
|
||||||
|
if (Typefaces.TryGetValue(style.FontType, out var result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
var slant = (style.IsItalic ?? false) ? SKFontStyleSlant.Italic : SKFontStyleSlant.Upright;
|
||||||
|
|
||||||
|
return SKTypeface.FromFamilyName(style.FontType, (int)(style.FontWeight ?? FontWeight.Normal), (int)SKFontStyleWidth.Normal, slant)
|
||||||
|
?? throw new ArgumentException($"The typeface {style.FontType} could not be found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static SKFontMetrics ToFontMetrics(this TextStyle style)
|
||||||
|
{
|
||||||
|
return FontMetrics.GetOrAdd(style.Key, key => style.ToPaint().FontMetrics);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace QuestPDF.Drawing
|
||||||
|
{
|
||||||
|
internal class FreeCanvas : ICanvas, IRenderingCanvas
|
||||||
|
{
|
||||||
|
#region IRenderingCanvas
|
||||||
|
|
||||||
|
public void BeginDocument()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EndDocument()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BeginPage(Size size)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EndPage()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ICanvas
|
||||||
|
|
||||||
|
public void Translate(Position vector)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawRectangle(Position vector, Size size, string color)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawText(string text, Position position, TextStyle style)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawImage(SKImage image, Position position, Size size)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawExternalLink(string url, Size size)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawLocationLink(string locationName, Size size)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawLocation(string locationName)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Rotate(float angle)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Scale(float scaleX, float scaleY)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user