Sfoglia il codice sorgente

Added structural tests for: Row, Stack.

Marcin Ziąbek 4 anni fa
parent
commit
188fbc22a7

+ 15 - 0
QuestPDF.UnitTests/ExternalLinkTests.cs

@@ -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
+    }
+}

+ 27 - 27
QuestPDF.UnitTests/GridTests.cs

@@ -40,30 +40,30 @@ 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(6).Container().Element(childA);
-                    row.RelativeColumn(4).Container().Element(childB);
+                    row.RelativeColumn(6).Element(childA);
+                    row.RelativeColumn(4).Element(childB);
                     row.RelativeColumn(2);
                     row.RelativeColumn(2);
                 });
                 });
                 
                 
                 stack.Item().Row(row =>
                 stack.Item().Row(row =>
                 {
                 {
-                    row.RelativeColumn(4).Container().Element(childC);
-                    row.RelativeColumn(2).Container().Element(childD);
+                    row.RelativeColumn(4).Element(childC);
+                    row.RelativeColumn(2).Element(childD);
                     row.RelativeColumn(6);
                     row.RelativeColumn(6);
                 });
                 });
                 
                 
                 stack.Item().Row(row =>
                 stack.Item().Row(row =>
                 {
                 {
-                    row.RelativeColumn(8).Container().Element(childE);
+                    row.RelativeColumn(8).Element(childE);
                     row.RelativeColumn(4);
                     row.RelativeColumn(4);
                 });
                 });
             });
             });
             
             
-            structure.Should().BeEquivalentTo(expected);
+            TestPlan.CompareOperations(structure, expected);
         }
         }
         
         
         [Test]
         [Test]
@@ -94,33 +94,33 @@ 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(1);
                     row.RelativeColumn(1);
-                    row.RelativeColumn(6).Container().Element(childA);
-                    row.RelativeColumn(4).Container().Element(childB);
+                    row.RelativeColumn(6).Element(childA);
+                    row.RelativeColumn(4).Element(childB);
                     row.RelativeColumn(1);
                     row.RelativeColumn(1);
                 });
                 });
                 
                 
                 stack.Item().Row(row =>
                 stack.Item().Row(row =>
                 {
                 {
                     row.RelativeColumn(3);
                     row.RelativeColumn(3);
-                    row.RelativeColumn(4).Container().Element(childC);
-                    row.RelativeColumn(2).Container().Element(childD);
+                    row.RelativeColumn(4).Element(childC);
+                    row.RelativeColumn(2).Element(childD);
                     row.RelativeColumn(3);
                     row.RelativeColumn(3);
                 });
                 });
                 
                 
                 stack.Item().Row(row =>
                 stack.Item().Row(row =>
                 {
                 {
                     row.RelativeColumn(2);
                     row.RelativeColumn(2);
-                    row.RelativeColumn(8).Container().Element(childE);
+                    row.RelativeColumn(8).Element(childE);
                     row.RelativeColumn(2);
                     row.RelativeColumn(2);
                 });
                 });
             });
             });
 
 
-            structure.Should().BeEquivalentTo(expected);
+            TestPlan.CompareOperations(structure, expected);
         }
         }
         
         
         [Test]
         [Test]
@@ -151,30 +151,30 @@ 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);
                     row.RelativeColumn(2);
-                    row.RelativeColumn(6).Container().Element(childA);
-                    row.RelativeColumn(4).Container().Element(childB);
+                    row.RelativeColumn(6).Element(childA);
+                    row.RelativeColumn(4).Element(childB);
                 });
                 });
                 
                 
                 stack.Item().Row(row =>
                 stack.Item().Row(row =>
                 {
                 {
                     row.RelativeColumn(6);
                     row.RelativeColumn(6);
-                    row.RelativeColumn(4).Container().Element(childC);
-                    row.RelativeColumn(2).Container().Element(childD);
+                    row.RelativeColumn(4).Element(childC);
+                    row.RelativeColumn(2).Element(childD);
                 });
                 });
                 
                 
                 stack.Item().Row(row =>
                 stack.Item().Row(row =>
                 {
                 {
                     row.RelativeColumn(4);
                     row.RelativeColumn(4);
-                    row.RelativeColumn(8).Container().Element(childE);
+                    row.RelativeColumn(8).Element(childE);
                 });
                 });
             });
             });
             
             
-            structure.Should().BeEquivalentTo(expected);
+            TestPlan.CompareOperations(structure, expected);
         }
         }
         
         
         #endregion
         #endregion
@@ -211,7 +211,7 @@ namespace QuestPDF.UnitTests
             // assert
             // assert
             var expected = new Container();
             var expected = new Container();
             
             
-            expected.Container().Stack(stack =>
+            expected.Stack(stack =>
             {
             {
                 stack.Spacing(20);
                 stack.Spacing(20);
                 
                 
@@ -220,8 +220,8 @@ namespace QuestPDF.UnitTests
                     row.Spacing(30);
                     row.Spacing(30);
                     
                     
                     row.RelativeColumn(3);
                     row.RelativeColumn(3);
-                    row.RelativeColumn(5).Container().Element(childA);
-                    row.RelativeColumn(5).Container().Element(childB);
+                    row.RelativeColumn(5).Element(childA);
+                    row.RelativeColumn(5).Element(childB);
                     row.RelativeColumn(3);
                     row.RelativeColumn(3);
                 });
                 });
                 
                 
@@ -230,7 +230,7 @@ namespace QuestPDF.UnitTests
                     row.Spacing(30);
                     row.Spacing(30);
                     
                     
                     row.RelativeColumn(3);
                     row.RelativeColumn(3);
-                    row.RelativeColumn(10).Container().Element(childC);
+                    row.RelativeColumn(10).Element(childC);
                     row.RelativeColumn(3);
                     row.RelativeColumn(3);
                 });
                 });
                 
                 
@@ -239,12 +239,12 @@ namespace QuestPDF.UnitTests
                     row.Spacing(30);
                     row.Spacing(30);
                     
                     
                     row.RelativeColumn(2);
                     row.RelativeColumn(2);
-                    row.RelativeColumn(12).Container().Element(childD);
+                    row.RelativeColumn(12).Element(childD);
                     row.RelativeColumn(2);
                     row.RelativeColumn(2);
                 });
                 });
             });
             });
             
             
-            structure.Should().BeEquivalentTo(expected);
+            TestPlan.CompareOperations(structure, expected);
         }
         }
         
         
         #endregion
         #endregion

+ 15 - 0
QuestPDF.UnitTests/InternalLinkTests.cs

@@ -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
+    }
+}

+ 15 - 0
QuestPDF.UnitTests/InternalLocationTests.cs

@@ -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
+    }
+}

+ 154 - 3
QuestPDF.UnitTests/RowTests.cs

@@ -1,6 +1,7 @@
 using NUnit.Framework;
 using NUnit.Framework;
 using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
+using QuestPDF.Fluent;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
 
 
@@ -109,8 +110,158 @@ namespace QuestPDF.UnitTests
 
 
         #endregion
         #endregion
         
         
-        // TODO: add tests for the spacing property
-        // TODO: add tests for the tree builder method
-        // TODO: add tests for relative column
+        #region Structure
+        
+        [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 SimpleRow
+            {
+                Left = new SimpleRow
+                {
+                    Left = new SimpleRow
+                    {
+                        Left = new Constrained
+                        {
+                            MinWidth = 150,
+                            MaxWidth = 150,
+                            Child = childA
+                        },
+                        Right = new Constrained
+                        {
+                            MinWidth = 25,
+                            MaxWidth = 25
+                        }
+                    },
+                    Right = new SimpleRow
+                    {
+                        Left = new Constrained
+                        {
+                            MinWidth = 200,
+                            MaxWidth = 200,
+                            Child = childB
+                        },
+                        Right = new Constrained
+                        {
+                            MinWidth = 25,
+                            MaxWidth = 25
+                        }
+                    }
+                },
+                Right = new SimpleRow
+                {
+                    Left = new SimpleRow
+                    {
+                        Left = new Constrained
+                        {
+                            MinWidth = 250,
+                            MaxWidth = 250,
+                            Child = childC
+                        },
+                        Right = new Constrained
+                        {
+                            MinWidth = 25,
+                            MaxWidth = 25
+                        }
+                    },
+                    Right = new SimpleRow
+                    {
+                        Left = new Constrained
+                        {
+                            MinWidth = 200,
+                            MaxWidth = 200,
+                            Child = childD
+                        },
+                        Right = new SimpleRow
+                        {
+                            Left = new Constrained
+                            {
+                                MinWidth = 25,
+                                MaxWidth = 25
+                            },
+                            Right = new Constrained
+                            {
+                                MinWidth = 300,
+                                MaxWidth = 300,
+                                Child = childE
+                            }
+                        }
+                    }
+                }
+            };
+            
+            TestPlan.CompareOperations(value, expected, availableSpace);
+        }
+        
+        #endregion
     }
     }
 }
 }

+ 79 - 3
QuestPDF.UnitTests/StackTests.cs

@@ -1,6 +1,8 @@
-using NUnit.Framework;
+using FluentAssertions;
+using NUnit.Framework;
 using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
+using QuestPDF.Fluent;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
 
 
@@ -229,7 +231,81 @@ namespace QuestPDF.UnitTests
         
         
         #endregion
         #endregion
         
         
-        // TODO: add tests for the spacing property
-        // TODO: add tests for the tree builder method
+        #region Structure
+        
+        [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 SimpleStack
+                {
+                    First = new SimpleStack
+                    {
+                        First = new Padding
+                        {
+                            Bottom = spacing,
+                            Child = childA
+                        },
+                        Second = new Padding
+                        {
+                            Bottom = spacing,
+                            Child = childB
+                        }
+                    },
+                    Second = new SimpleStack
+                    {
+                        First = new Padding
+                        {
+                            Bottom = spacing,
+                            Child = childC
+                        },
+                        Second = new SimpleStack
+                        {
+                            First = new Padding
+                            {
+                                Bottom = spacing,
+                                Child = childD
+                            },
+                            Second = new Padding
+                            {
+                                Bottom = spacing,
+                                Child = childE
+                            }
+                        }
+                    }
+                }
+            };
+
+            TestPlan.CompareOperations(structure, expected);
+        }
+        
+        #endregion
     }
     }
 }
 }

+ 4 - 25
QuestPDF.UnitTests/TestEngine/CanvasMock.cs → QuestPDF.UnitTests/TestEngine/MockCanvas.cs

@@ -4,7 +4,7 @@ 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> RotateFunc { get; set; }
@@ -21,29 +21,8 @@ namespace QuestPDF.UnitTests.TestEngine
         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)
-        {
-            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);
-        }
+        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();
     }
     }
 }
 }

+ 25 - 0
QuestPDF.UnitTests/TestEngine/OperationRecordingCanvas.cs

@@ -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 - 2
QuestPDF.UnitTests/TestEngine/Operations/CanvasDrawImageOperation.cs

@@ -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 - 2
QuestPDF.UnitTests/TestEngine/Operations/CanvasDrawRectangleOperation.cs

@@ -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 - 2
QuestPDF.UnitTests/TestEngine/Operations/CanvasDrawTextOperation.cs

@@ -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;

+ 2 - 2
QuestPDF.UnitTests/TestEngine/Operations/CanvasTranslateOperation.cs

@@ -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 - 2
QuestPDF.UnitTests/TestEngine/Operations/ChildDrawOperation.cs

@@ -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;

+ 2 - 2
QuestPDF.UnitTests/TestEngine/Operations/ChildMeasureOperation.cs

@@ -3,13 +3,13 @@ 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 ISpacePlan Output { get; }
 
 
-        public ChildMeasureOperationBase(string childId, Size input, ISpacePlan output)
+        public ChildMeasureOperation(string childId, Size input, ISpacePlan output)
         {
         {
             ChildId = childId;
             ChildId = childId;
             Input = input;
             Input = input;

+ 2 - 2
QuestPDF.UnitTests/TestEngine/Operations/ElementMeasureOperation.cs

@@ -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)
         {
         {
             
             
         }
         }

+ 57 - 39
QuestPDF.UnitTests/TestEngine/TestPlan.cs

@@ -1,7 +1,9 @@
 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;
 using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
@@ -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,24 +48,20 @@ 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 =>
                 RotateFunc = angle =>
                 {
                 {
                     var expected = GetExpected<CanvasRotateOperation>();
                     var expected = GetExpected<CanvasRotateOperation>();
 
 
                     Assert.AreEqual(expected.Angle, angle, "Rotate angle");
                     Assert.AreEqual(expected.Angle, angle, "Rotate angle");
-                    
-                    //position.Should().BeEquivalentTo(expected.Position);
                 },
                 },
                 ScaleFunc = (scaleX, scaleY) =>
                 ScaleFunc = (scaleX, scaleY) =>
                 {
                 {
@@ -69,12 +69,10 @@ namespace QuestPDF.UnitTests.TestEngine
 
 
                     Assert.AreEqual(expected.ScaleX, scaleX, "Scale X");
                     Assert.AreEqual(expected.ScaleX, scaleX, "Scale X");
                     Assert.AreEqual(expected.ScaleY, scaleY, "Scale Y");
                     Assert.AreEqual(expected.ScaleY, scaleY, "Scale Y");
-                    
-                    //position.Should().BeEquivalentTo(expected.Position);
                 },
                 },
                 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");
@@ -83,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);
                     
                     
@@ -100,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);*/
                 }
                 }
             };
             };
         }
         }
@@ -130,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);*/
                 }
                 }
             };
             };
         }
         }
@@ -182,7 +163,7 @@ namespace QuestPDF.UnitTests.TestEngine
         
         
         public TestPlan ExpectChildMeasure(string child, Size expectedInput, ISpacePlan returns)
         public TestPlan ExpectChildMeasure(string child, Size expectedInput, ISpacePlan 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)
@@ -192,17 +173,17 @@ 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)
         public TestPlan ExpectCanvasScale(float scaleX, float scaleY)
@@ -217,17 +198,17 @@ namespace QuestPDF.UnitTests.TestEngine
         
         
         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(ISpacePlan expected)
@@ -272,10 +253,47 @@ namespace QuestPDF.UnitTests.TestEngine
         
         
         public static Element CreateUniqueElement()
         public static Element CreateUniqueElement()
         {
         {
-            return new Text
+            var value = Random.Next(0x1000000);
+            
+            return new Background
             {
             {
-                Value = Guid.NewGuid().ToString("N")
+                Color = $"#{value:X6}"
             };
             };
         }
         }
+
+        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);
+            
+            expected.HandleVisitor(x => x.Initialize(null, canvas));
+            var expectedMeasure = expected.Measure(availableSpace);
+            
+            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);
+            
+            var expectedCanvas = new OperationRecordingCanvas();
+            expected.HandleVisitor(x => x.Initialize(null, expectedCanvas));
+            expected.Draw(availableSpace);
+            
+            valueCanvas.Operations.Should().BeEquivalentTo(expectedCanvas.Operations);
+        }
     }
     }
 }
 }

+ 1 - 0
QuestPDF.UnitTests/TestsBase.cs

@@ -12,6 +12,7 @@ namespace QuestPDF.UnitTests
             AssertionOptions.AssertEquivalencyUsing(options => options
             AssertionOptions.AssertEquivalencyUsing(options => options
                 .IncludingNestedObjects()
                 .IncludingNestedObjects()
                 .IncludingInternalProperties()
                 .IncludingInternalProperties()
+                .IncludingInternalFields()
                 .AllowingInfiniteRecursion()
                 .AllowingInfiniteRecursion()
                 .RespectingRuntimeTypes()
                 .RespectingRuntimeTypes()
                 .WithTracing()
                 .WithTracing()

+ 1 - 1
QuestPDF/Elements/Grid.cs

@@ -16,7 +16,7 @@ namespace QuestPDF.Elements
     {
     {
         public const int DefaultColumnsCount = 12;
         public const int DefaultColumnsCount = 12;
         
         
-        public List<GridElement> Children { get; set; } = new List<GridElement>();
+        public List<GridElement> Children { get; } = new List<GridElement>();
         public Queue<GridElement> ChildrenQueue { get; set; } = new Queue<GridElement>();
         public Queue<GridElement> ChildrenQueue { get; set; } = new Queue<GridElement>();
         public int ColumnsCount { get; set; } = DefaultColumnsCount;
         public int ColumnsCount { get; set; } = DefaultColumnsCount;
 
 

+ 1 - 1
QuestPDF/Elements/Stack.cs

@@ -92,7 +92,7 @@ namespace QuestPDF.Elements
     
     
     internal class Stack : IComponent
     internal class Stack : IComponent
     {
     {
-        public ICollection<Element> Children { get; internal set; } = new List<Element>();
+        public ICollection<Element> Children { get; } = new List<Element>();
         public float Spacing { get; set; } = 0;
         public float Spacing { get; set; } = 0;
         
         
         public void Compose(IContainer container)
         public void Compose(IContainer container)