public void GetTextRange_WhenLengthNegative_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetTextRange(0, -1));
        }
Example #2
0
        /// <summary>
        /// Creates a layout for a document.
        /// </summary>
        /// <param name="document">The document.</param>
        /// <param name="parentControl">The parent control to which embedded objects can
        /// attach themselves.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="document"/>
        /// or <paramref name="parentControl"/> is null.</exception>
        public SplashLayout(SplashDocument document, Control parentControl)
        {
            if (document == null)
                throw new ArgumentNullException("document");
            if (parentControl == null)
                throw new ArgumentNullException("parentControl");

            this.document = document;
            this.parentControl = parentControl;

            recursionGuard = new RecursionGuard();

            scriptMetricsCache = new ScriptMetricsCache();
            scriptLineBuffer = new UnmanagedBuffer(InitialCapacityForLinesPerDocument, sizeof(ScriptLine));

            tempScriptItemBuffer = new UnmanagedBuffer(InitialCapacityForScriptRunsPerParagraph, sizeof(SCRIPT_ITEM));
            tempEmbeddingLevelBuffer = new UnmanagedBuffer(InitialCapacityForScriptRunsPerParagraph, sizeof(byte));
            tempVisualToLogicalMapBuffer = new UnmanagedBuffer(InitialCapacityForScriptRunsPerParagraph, sizeof(int));
            tempLogicalClustersBuffer = new UnmanagedBuffer(InitialCapacityForCharsPerScriptRun, sizeof(short));

            scriptParagraphCache = new ScriptParagraphCache(ScriptParagraphCacheSize);

            embeddedObjectHosts = new Dictionary<int, EmbeddedObjectHost>();
            pendingEmbeddedObjectHostsToCreate = new Queue<EmbeddedObjectHost>();
            pendingEmbeddedObjectHostsToShow = new Queue<EmbeddedObjectHost>();

            desiredLayoutWidth = 400; // arbitrary
            desiredLayoutRightToLeft = false; // arbitrary

            AttachDocumentEvents();
            Reset();
        }
Example #3
0
        public void BeginAnnotationAndEndAnnotation_PushAndPopAnnotationsOnStack()
        {
            var    document = new SplashDocument();
            var    key      = new Key <string>("href");
            string value;

            Assert.IsFalse(document.TryGetCurrentAnnotation(key, out value));
            Assert.IsNull(value);

            document.BeginAnnotation(key, "a");
            Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
            Assert.AreEqual("a", value);

            document.EndAnnotation(key);
            Assert.IsFalse(document.TryGetCurrentAnnotation(key, out value));
            Assert.IsNull(value);

            using (document.BeginAnnotation(key, "b"))
            {
                Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
                Assert.AreEqual("b", value);

                using (document.BeginAnnotation(key, "c"))
                {
                    Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
                    Assert.AreEqual("c", value);
                }

                Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
                Assert.AreEqual("b", value);
            }

            Assert.IsFalse(document.TryGetCurrentAnnotation(key, out value));
            Assert.IsNull(value);
        }
Example #4
0
        public void GetStyleAtIndex_WhenIndexValid_ReturnsStyleAtIndex()
        {
            var document = new SplashDocument();
            var style    = new StyleBuilder()
            {
                Color = Color.Red
            }.ToStyle();

            document.AppendText("some ");
            using (document.BeginStyle(style))
                document.AppendText("text");
            document.AppendText("...");

            Assert.Multiple(() =>
            {
                for (int i = 0; i < 5; i++)
                {
                    Assert.AreEqual(Style.Default, document.GetStyleAtIndex(i));
                }
                for (int i = 5; i < 9; i++)
                {
                    Assert.AreEqual(style, document.GetStyleAtIndex(i));
                }
                for (int i = 9; i < 12; i++)
                {
                    Assert.AreEqual(Style.Default, document.GetStyleAtIndex(i));
                }
            });
        }
Example #5
0
        public void GetTextRange_WhenStartIndexPlusLengthExceedsDocument_Throws()
        {
            var document = new SplashDocument();

            document.AppendText("some text...");

            Assert.Throws <ArgumentOutOfRangeException>(() => document.GetTextRange(10, 3));
        }
Example #6
0
        public void GetObjectAtIndex_WhenIndexBeyondDocument_Throws()
        {
            var document = new SplashDocument();

            document.AppendText("some text...");

            Assert.Throws <ArgumentOutOfRangeException>(() => document.GetObjectAtIndex(12));
        }
Example #7
0
        public void GetStyleAtIndex_WhenIndexNegative_Throws()
        {
            var document = new SplashDocument();

            document.AppendText("some text...");

            Assert.Throws <ArgumentOutOfRangeException>(() => document.GetStyleAtIndex(-1));
        }
Example #8
0
        public void GetTextRange_WhenLengthNegative_Throws()
        {
            var document = new SplashDocument();

            document.AppendText("some text...");

            Assert.Throws <ArgumentOutOfRangeException>(() => document.GetTextRange(0, -1));
        }
Example #9
0
        public void GetTextRange_WhenRangeValid_ReturnsRange(int startIndex, int length)
        {
            var document = new SplashDocument();

            document.AppendText("some text...");

            Assert.AreEqual("some text...".Substring(startIndex, length), document.GetTextRange(startIndex, length));
        }
Example #10
0
        public void TryGetAnnotationAtIndex_WhenIndexBeyondDocument_Throws()
        {
            var    document = new SplashDocument();
            var    key      = new Key <string>("href");
            string value;

            document.AppendText("some text...");

            Assert.Throws <ArgumentOutOfRangeException>(() => document.TryGetAnnotationAtIndex(key, 12, out value));
        }
Example #11
0
        public void TryGetAnnotationAtIndex_WhenIndexValidAndAtLeastOneAnnotation_ReturnsAnnotationAtIndex()
        {
            var document = new SplashDocument();
            var key      = new Key <string>("href");

            // begin/end an empty block of annotations, these will get stripped out
            document.BeginAnnotation(key, "empty");
            document.BeginAnnotation(key, "empty2");
            document.EndAnnotation(key);
            document.EndAnnotation(key);

            // add some unannotated text
            document.AppendText("some ");

            // add some annotated text
            using (document.BeginAnnotation(key, "a"))
            {
                document.AppendText("text ");

                using (document.BeginAnnotation(key, "b"))
                    document.AppendText("more");
            }

            // add some unannotated text
            document.AppendText("...");

            // begin another empty annotation at the end, should have no effect on current text
            document.BeginAnnotation(key, "trailer");

            Assert.Multiple(() =>
            {
                string value;
                for (int i = 0; i < 5; i++)
                {
                    Assert.IsFalse(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.IsNull(value);
                }
                for (int i = 5; i < 10; i++)
                {
                    Assert.IsTrue(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.AreEqual("a", value);
                }
                for (int i = 10; i < 14; i++)
                {
                    Assert.IsTrue(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.AreEqual("b", value);
                }
                for (int i = 14; i < 17; i++)
                {
                    Assert.IsFalse(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.IsNull(value);
                }
            });
        }
Example #12
0
        public void BeginStyle_CoalescesEqualStyles()
        {
            var document = new SplashDocument();
            var style    = new StyleBuilder().ToStyle(); // equal to default style

            document.BeginStyle(style);
            Assert.AreSame(Style.Default, document.CurrentStyle);

            document.EndStyle();
            Assert.AreSame(Style.Default, document.CurrentStyle);
        }
Example #13
0
        public void TryGetAnnotationAtIndex_WhenIndexValidAndNoAnnotations_ReturnsFalse()
        {
            var document = new SplashDocument();
            var key      = new Key <string>("href");

            document.AppendText("foo");

            string value;

            Assert.IsFalse(document.TryGetAnnotationAtIndex(key, 0, out value));
            Assert.IsNull(value);
        }
Example #14
0
        public void EndAnnotation_WhenNoCurrentAnnotation_Throws()
        {
            var document = new SplashDocument();
            var key      = new Key <string>("href");

            // 1st case: no annotation table exists
            Assert.Throws <InvalidOperationException>(() => document.EndAnnotation(key));

            // 2nd case: annotation table exists but there is no current annotation
            document.BeginAnnotation(key, "value");
            document.EndAnnotation(key);
            Assert.Throws <InvalidOperationException>(() => document.EndAnnotation(key));
        }
Example #15
0
        public void Constructor_CreatesAnEmptyDocument()
        {
            var document = new SplashDocument();

            Assert.Multiple(() =>
            {
                Assert.AreEqual(0, document.CharCount);
                Assert.AreEqual(1, document.ParagraphCount);
                Assert.AreEqual(1, document.StyleCount);
                Assert.AreEqual(0, document.ObjectCount);
                Assert.AreEqual(0, document.RunCount);
                Assert.AreEqual("", document.ToString());
            });
        }
        public void Constructor_CreatesAnEmptyDocument()
        {
            var document = new SplashDocument();

            Assert.Multiple(() =>
            {
                Assert.AreEqual(0, document.CharCount);
                Assert.AreEqual(1, document.ParagraphCount);
                Assert.AreEqual(1, document.StyleCount);
                Assert.AreEqual(0, document.ObjectCount);
                Assert.AreEqual(0, document.RunCount);
                Assert.AreEqual("", document.ToString());
            });
        }
Example #17
0
        /// <summary>
        /// Creates an empty SplashView.
        /// </summary>
        public SplashView()
        {
            document = new SplashDocument();

            layout = new SplashLayout(document, this);
            paintOptions = new PaintOptions();

            SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw
                | ControlStyles.Selectable | ControlStyles.UserMouse
                | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);

            base.BackColor = paintOptions.BackgroundColor;
            Padding = new Padding(5);

            AttachLayoutEvents();
            InitializeContextMenu();
        }
        public void Clear_EmptiesTheDocumentAndRaisesEvent()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            bool documentClearedEventRaised = false;
            document.DocumentCleared += (sender, e) => documentClearedEventRaised = true;
            document.Clear();

            Assert.Multiple(() =>
            {
                Assert.AreEqual(0, document.CharCount);
                Assert.AreEqual(1, document.ParagraphCount);
                Assert.AreEqual(1, document.StyleCount);
                Assert.AreEqual(0, document.ObjectCount);
                Assert.AreEqual(0, document.RunCount);
                Assert.AreEqual("", document.ToString());

                Assert.IsTrue(documentClearedEventRaised);
            });
        }
Example #19
0
        public void GetObjectAtIndex_WhenIndexValid_ReturnsEmbeddedObject()
        {
            var document = new SplashDocument();
            var obj      = new EmbeddedImage(new Bitmap(16, 16));

            document.AppendText("obj");
            document.AppendObject(obj);
            document.AppendText("...");

            Assert.Multiple(() =>
            {
                for (int i = 0; i < 3; i++)
                {
                    Assert.IsNull(document.GetObjectAtIndex(i));
                }
                Assert.AreEqual(obj, document.GetObjectAtIndex(3));
                for (int i = 4; i < 7; i++)
                {
                    Assert.IsNull(document.GetObjectAtIndex(i));
                }
            });
        }
Example #20
0
        public void BeginStyleAndEndStyle_PushAndPopStylesOnStack()
        {
            var document = new SplashDocument();
            var style1   = new StyleBuilder()
            {
                Color = Color.Red
            }.ToStyle();
            var style2 = new StyleBuilder()
            {
                Color = Color.Green
            }.ToStyle();
            var style3 = new StyleBuilder()
            {
                Color = Color.Blue
            }.ToStyle();

            Assert.AreEqual(Style.Default, document.CurrentStyle);

            document.BeginStyle(style1);
            Assert.AreEqual(style1, document.CurrentStyle);

            document.EndStyle();
            Assert.AreEqual(Style.Default, document.CurrentStyle);

            using (document.BeginStyle(style2))
            {
                Assert.AreEqual(style2, document.CurrentStyle);

                using (document.BeginStyle(style3))
                {
                    Assert.AreEqual(style3, document.CurrentStyle);
                }

                Assert.AreEqual(style2, document.CurrentStyle);
            }

            Assert.AreEqual(Style.Default, document.CurrentStyle);
        }
Example #21
0
        public void Clear_EmptiesTheDocumentAndRaisesEvent()
        {
            var document = new SplashDocument();

            document.AppendText("some text...");

            bool documentClearedEventRaised = false;

            document.DocumentCleared += (sender, e) => documentClearedEventRaised = true;
            document.Clear();

            Assert.Multiple(() =>
            {
                Assert.AreEqual(0, document.CharCount);
                Assert.AreEqual(1, document.ParagraphCount);
                Assert.AreEqual(1, document.StyleCount);
                Assert.AreEqual(0, document.ObjectCount);
                Assert.AreEqual(0, document.RunCount);
                Assert.AreEqual("", document.ToString());

                Assert.IsTrue(documentClearedEventRaised);
            });
        }
Example #22
0
        public unsafe void AppendText_WhenRunIsExtremelyLong_SplitsRun(int length)
        {
            var document = new SplashDocument();
            var content  = new string(' ', length);

            document.AppendText(content);

            Assert.Multiple(() =>
            {
                // Check char content.
                Assert.AreEqual(content, document.ToString());

                // Check paragraph table.
                Assert.AreEqual(1, document.ParagraphCount);
                Paragraph *paragraphs = document.GetParagraphZero();

                int expectedRuns = (length + SplashDocument.MaxCharsPerRun - 1) / SplashDocument.MaxCharsPerRun;
                Assert.AreEqual(0, paragraphs[0].CharIndex);
                Assert.AreEqual(length, paragraphs[0].CharCount);
                Assert.AreEqual(0, paragraphs[0].RunIndex);
                Assert.AreEqual(expectedRuns, paragraphs[0].RunCount);

                // Check run table.
                Assert.AreEqual(expectedRuns, document.RunCount);
                Run *runs = document.GetRunZero();

                for (int i = 0; i < expectedRuns; i++)
                {
                    Assert.AreEqual(RunKind.Text, runs[i].RunKind);
                    Assert.AreEqual(Math.Min(length, SplashDocument.MaxCharsPerRun), runs[i].CharCount);
                    Assert.AreEqual(0, runs[i].StyleIndex);

                    length -= SplashDocument.MaxCharsPerRun;
                }
            });
        }
        public unsafe void AppendStuff()
        {
            var style1 = new StyleBuilder() { Color = Color.Red }.ToStyle();
            var style2 = new StyleBuilder() { LeftMargin = 10, RightMargin = 10 }.ToStyle();
            var style3 = new StyleBuilder() { Font = SystemFonts.SmallCaptionFont, Color = Color.Blue }.ToStyle();
            var embeddedObject = new EmbeddedImage(new Bitmap(16, 16));

            var document = new SplashDocument();
            var changedParagraphIndices = new List<int>();

            document.ParagraphChanged += (sender, e) => changedParagraphIndices.Add(e.ParagraphIndex);

            using (document.BeginStyle(style1))
                document.AppendText("Some text, lalala.\nMore text.");

            using (document.BeginStyle(style2))
            {
                document.AppendText("Tab\t.\n");

                document.AppendText("\0\r"); // these control characters will be discarded

                using (document.BeginStyle(style3))
                {
                    document.AppendLine();
                    document.AppendText(""); // to verify that no change event is raised for empty text
                }

                document.AppendText("(");
                document.AppendObject(embeddedObject);
                document.AppendText(")");
            }

            Assert.Multiple(() =>
            {
                // Check char content.
                Assert.AreEqual("Some text, lalala.\nMore text.Tab\t.\n\n( )", document.ToString());

                // Check style table.
                Assert.AreEqual(4, document.StyleCount);
                Assert.AreEqual(Style.Default, document.LookupStyle(0));
                Assert.AreEqual(style1, document.LookupStyle(1));
                Assert.AreEqual(style2, document.LookupStyle(2));
                Assert.AreEqual(style3, document.LookupStyle(3));

                // Check object table.
                Assert.AreEqual(1, document.ObjectCount);
                Assert.AreEqual(embeddedObject, document.LookupObject(0));

                // Check paragraph table.
                Assert.AreEqual(4, document.ParagraphCount);
                Paragraph* paragraphs = document.GetParagraphZero();

                Assert.AreEqual(0, paragraphs[0].CharIndex); // "Some text, lalala.\n"
                Assert.AreEqual(19, paragraphs[0].CharCount);
                Assert.AreEqual(0, paragraphs[0].RunIndex);
                Assert.AreEqual(1, paragraphs[0].RunCount);

                Assert.AreEqual(19, paragraphs[1].CharIndex); // "More text.Tab\t.\n"
                Assert.AreEqual(16, paragraphs[1].CharCount);
                Assert.AreEqual(1, paragraphs[1].RunIndex);
                Assert.AreEqual(4, paragraphs[1].RunCount);

                Assert.AreEqual(35, paragraphs[2].CharIndex); // "\n"
                Assert.AreEqual(1, paragraphs[2].CharCount);
                Assert.AreEqual(5, paragraphs[2].RunIndex);
                Assert.AreEqual(1, paragraphs[2].RunCount);

                Assert.AreEqual(36, paragraphs[3].CharIndex); // "( )"
                Assert.AreEqual(3, paragraphs[3].CharCount);
                Assert.AreEqual(6, paragraphs[3].RunIndex);
                Assert.AreEqual(3, paragraphs[3].RunCount);

                // Check run table.
                Assert.AreEqual(9, document.RunCount);
                Run* runs = document.GetRunZero();

                Assert.AreEqual(RunKind.Text, runs[0].RunKind); // "Some text, lalala.\n"
                Assert.AreEqual(19, runs[0].CharCount);
                Assert.AreEqual(1, runs[0].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[1].RunKind); // "More text."
                Assert.AreEqual(10, runs[1].CharCount);
                Assert.AreEqual(1, runs[1].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[2].RunKind); // "Tab"
                Assert.AreEqual(3, runs[2].CharCount);
                Assert.AreEqual(2, runs[2].StyleIndex);

                Assert.AreEqual(RunKind.Tab, runs[3].RunKind); // "\t"
                Assert.AreEqual(1, runs[3].CharCount);
                Assert.AreEqual(2, runs[3].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[4].RunKind); // ".\n"
                Assert.AreEqual(2, runs[4].CharCount);
                Assert.AreEqual(2, runs[4].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[5].RunKind); // "\n"
                Assert.AreEqual(1, runs[5].CharCount);
                Assert.AreEqual(3, runs[5].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[6].RunKind); // "("
                Assert.AreEqual(1, runs[6].CharCount);
                Assert.AreEqual(2, runs[6].StyleIndex);

                Assert.AreEqual(RunKind.Object, runs[7].RunKind); // "("
                Assert.AreEqual(1, runs[7].CharCount);
                Assert.AreEqual(2, runs[7].StyleIndex);
                Assert.AreEqual(0, runs[7].ObjectIndex);

                Assert.AreEqual(RunKind.Text, runs[8].RunKind); // ")"
                Assert.AreEqual(1, runs[8].CharCount);
                Assert.AreEqual(2, runs[8].StyleIndex);

                // Check that paragraph changed notifications were raised as needed.
                Assert.AreElementsEqual(new[] { 0, 1, 2, 2, 3, 3, 3 }, changedParagraphIndices);
            });
        }
 public void AppendObject_WhenObjectIsNull_Throws()
 {
     var document = new SplashDocument();
     Assert.Throws<ArgumentNullException>(() => document.AppendObject(null));
 }
        public void GetObjectAtIndex_WhenIndexValid_ReturnsEmbeddedObject()
        {
            var document = new SplashDocument();
            var obj = new EmbeddedImage(new Bitmap(16, 16));
            document.AppendText("obj");
            document.AppendObject(obj);
            document.AppendText("...");

            Assert.Multiple(() =>
            {
                for (int i = 0; i < 3; i++)
                    Assert.IsNull(document.GetObjectAtIndex(i));
                Assert.AreEqual(obj, document.GetObjectAtIndex(3));
                for (int i = 4; i < 7; i++)
                    Assert.IsNull(document.GetObjectAtIndex(i));
            });
        }
        public void GetObjectAtIndex_WhenIndexBeyondDocument_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetObjectAtIndex(12));
        }
Example #27
0
        public void BeginStyle_WhenStyleIsNull_Throws()
        {
            var document = new SplashDocument();

            Assert.Throws <ArgumentNullException>(() => document.BeginStyle(null));
        }
        public void GetTextRange_WhenRangeValid_ReturnsRange(int startIndex, int length)
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.AreEqual("some text...".Substring(startIndex, length), document.GetTextRange(startIndex, length));
        }
Example #29
0
        public void EndStyle_WhenOnlyDefaultStyleOnStack_Throws()
        {
            var document = new SplashDocument();

            Assert.Throws <InvalidOperationException>(() => document.EndStyle());
        }
        public void TryGetAnnotationAtIndex_WhenIndexBeyondDocument_Throws()
        {
            var document = new SplashDocument();
            var key = new Key<string>("href");
            string value;
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.TryGetAnnotationAtIndex(key, 12, out value));
        }
        public void BeginAnnotationAndEndAnnotation_PushAndPopAnnotationsOnStack()
        {
            var document = new SplashDocument();
            var key = new Key<string>("href");
            string value;

            Assert.IsFalse(document.TryGetCurrentAnnotation(key, out value));
            Assert.IsNull(value);

            document.BeginAnnotation(key, "a");
            Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
            Assert.AreEqual("a", value);

            document.EndAnnotation(key);
            Assert.IsFalse(document.TryGetCurrentAnnotation(key, out value));
            Assert.IsNull(value);

            using (document.BeginAnnotation(key, "b"))
            {
                Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
                Assert.AreEqual("b", value);

                using (document.BeginAnnotation(key, "c"))
                {
                    Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
                    Assert.AreEqual("c", value);
                }

                Assert.IsTrue(document.TryGetCurrentAnnotation(key, out value));
                Assert.AreEqual("b", value);
            }

            Assert.IsFalse(document.TryGetCurrentAnnotation(key, out value));
            Assert.IsNull(value);
        }
        public void EndAnnotation_WhenNoCurrentAnnotation_Throws()
        {
            var document = new SplashDocument();
            var key = new Key<string>("href");

            // 1st case: no annotation table exists
            Assert.Throws<InvalidOperationException>(() => document.EndAnnotation(key));

            // 2nd case: annotation table exists but there is no current annotation
            document.BeginAnnotation(key, "value");
            document.EndAnnotation(key);
            Assert.Throws<InvalidOperationException>(() => document.EndAnnotation(key));
        }
        public void GetStyleAtIndex_WhenIndexValid_ReturnsStyleAtIndex()
        {
            var document = new SplashDocument();
            var style = new StyleBuilder() { Color = Color.Red }.ToStyle();
            document.AppendText("some ");
            using (document.BeginStyle(style))
                document.AppendText("text");
            document.AppendText("...");

            Assert.Multiple(() =>
            {
                for (int i = 0; i < 5; i++)
                    Assert.AreEqual(Style.Default, document.GetStyleAtIndex(i));
                for (int i = 5; i < 9; i++)
                    Assert.AreEqual(style, document.GetStyleAtIndex(i));
                for (int i = 9; i < 12; i++)
                    Assert.AreEqual(Style.Default, document.GetStyleAtIndex(i));
            });
        }
        public void GetStyleAtIndex_WhenIndexNegative_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetStyleAtIndex(-1));
        }
        public void BeginStyle_CoalescesEqualStyles()
        {
            var document = new SplashDocument();
            var style = new StyleBuilder().ToStyle(); // equal to default style

            document.BeginStyle(style);
            Assert.AreSame(Style.Default, document.CurrentStyle);

            document.EndStyle();
            Assert.AreSame(Style.Default, document.CurrentStyle);
        }
        public void BeginStyleAndEndStyle_PushAndPopStylesOnStack()
        {
            var document = new SplashDocument();
            var style1 = new StyleBuilder() { Color = Color.Red }.ToStyle();
            var style2 = new StyleBuilder() { Color = Color.Green }.ToStyle();
            var style3 = new StyleBuilder() { Color = Color.Blue }.ToStyle();

            Assert.AreEqual(Style.Default, document.CurrentStyle);

            document.BeginStyle(style1);
            Assert.AreEqual(style1, document.CurrentStyle);

            document.EndStyle();
            Assert.AreEqual(Style.Default, document.CurrentStyle);

            using (document.BeginStyle(style2))
            {
                Assert.AreEqual(style2, document.CurrentStyle);

                using (document.BeginStyle(style3))
                {
                    Assert.AreEqual(style3, document.CurrentStyle);
                }

                Assert.AreEqual(style2, document.CurrentStyle);
            }

            Assert.AreEqual(Style.Default, document.CurrentStyle);
        }
Example #37
0
        public unsafe void AppendStuff()
        {
            var style1 = new StyleBuilder()
            {
                Color = Color.Red
            }.ToStyle();
            var style2 = new StyleBuilder()
            {
                LeftMargin = 10, RightMargin = 10
            }.ToStyle();
            var style3 = new StyleBuilder()
            {
                Font = SystemFonts.SmallCaptionFont, Color = Color.Blue
            }.ToStyle();
            var embeddedObject = new EmbeddedImage(new Bitmap(16, 16));

            var document = new SplashDocument();
            var changedParagraphIndices = new List <int>();

            document.ParagraphChanged += (sender, e) => changedParagraphIndices.Add(e.ParagraphIndex);

            using (document.BeginStyle(style1))
                document.AppendText("Some text, lalala.\nMore text.");

            using (document.BeginStyle(style2))
            {
                document.AppendText("Tab\t.\n");

                document.AppendText("\0\r"); // these control characters will be discarded

                using (document.BeginStyle(style3))
                {
                    document.AppendLine();
                    document.AppendText(""); // to verify that no change event is raised for empty text
                }

                document.AppendText("(");
                document.AppendObject(embeddedObject);
                document.AppendText(")");
            }

            Assert.Multiple(() =>
            {
                // Check char content.
                Assert.AreEqual("Some text, lalala.\nMore text.Tab\t.\n\n( )", document.ToString());

                // Check style table.
                Assert.AreEqual(4, document.StyleCount);
                Assert.AreEqual(Style.Default, document.LookupStyle(0));
                Assert.AreEqual(style1, document.LookupStyle(1));
                Assert.AreEqual(style2, document.LookupStyle(2));
                Assert.AreEqual(style3, document.LookupStyle(3));

                // Check object table.
                Assert.AreEqual(1, document.ObjectCount);
                Assert.AreEqual(embeddedObject, document.LookupObject(0));

                // Check paragraph table.
                Assert.AreEqual(4, document.ParagraphCount);
                Paragraph *paragraphs = document.GetParagraphZero();

                Assert.AreEqual(0, paragraphs[0].CharIndex); // "Some text, lalala.\n"
                Assert.AreEqual(19, paragraphs[0].CharCount);
                Assert.AreEqual(0, paragraphs[0].RunIndex);
                Assert.AreEqual(1, paragraphs[0].RunCount);

                Assert.AreEqual(19, paragraphs[1].CharIndex); // "More text.Tab\t.\n"
                Assert.AreEqual(16, paragraphs[1].CharCount);
                Assert.AreEqual(1, paragraphs[1].RunIndex);
                Assert.AreEqual(4, paragraphs[1].RunCount);

                Assert.AreEqual(35, paragraphs[2].CharIndex); // "\n"
                Assert.AreEqual(1, paragraphs[2].CharCount);
                Assert.AreEqual(5, paragraphs[2].RunIndex);
                Assert.AreEqual(1, paragraphs[2].RunCount);

                Assert.AreEqual(36, paragraphs[3].CharIndex); // "( )"
                Assert.AreEqual(3, paragraphs[3].CharCount);
                Assert.AreEqual(6, paragraphs[3].RunIndex);
                Assert.AreEqual(3, paragraphs[3].RunCount);

                // Check run table.
                Assert.AreEqual(9, document.RunCount);
                Run *runs = document.GetRunZero();

                Assert.AreEqual(RunKind.Text, runs[0].RunKind); // "Some text, lalala.\n"
                Assert.AreEqual(19, runs[0].CharCount);
                Assert.AreEqual(1, runs[0].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[1].RunKind); // "More text."
                Assert.AreEqual(10, runs[1].CharCount);
                Assert.AreEqual(1, runs[1].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[2].RunKind); // "Tab"
                Assert.AreEqual(3, runs[2].CharCount);
                Assert.AreEqual(2, runs[2].StyleIndex);

                Assert.AreEqual(RunKind.Tab, runs[3].RunKind); // "\t"
                Assert.AreEqual(1, runs[3].CharCount);
                Assert.AreEqual(2, runs[3].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[4].RunKind); // ".\n"
                Assert.AreEqual(2, runs[4].CharCount);
                Assert.AreEqual(2, runs[4].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[5].RunKind); // "\n"
                Assert.AreEqual(1, runs[5].CharCount);
                Assert.AreEqual(3, runs[5].StyleIndex);

                Assert.AreEqual(RunKind.Text, runs[6].RunKind); // "("
                Assert.AreEqual(1, runs[6].CharCount);
                Assert.AreEqual(2, runs[6].StyleIndex);

                Assert.AreEqual(RunKind.Object, runs[7].RunKind); // "("
                Assert.AreEqual(1, runs[7].CharCount);
                Assert.AreEqual(2, runs[7].StyleIndex);
                Assert.AreEqual(0, runs[7].ObjectIndex);

                Assert.AreEqual(RunKind.Text, runs[8].RunKind); // ")"
                Assert.AreEqual(1, runs[8].CharCount);
                Assert.AreEqual(2, runs[8].StyleIndex);

                // Check that paragraph changed notifications were raised as needed.
                Assert.AreElementsEqual(new[] { 0, 1, 2, 2, 3, 3, 3 }, changedParagraphIndices);
            });
        }
        public unsafe void AppendText_WhenRunIsExtremelyLong_SplitsRun(int length)
        {
            var document = new SplashDocument();
            var content = new string(' ', length);

            document.AppendText(content);

            Assert.Multiple(() =>
            {
                // Check char content.
                Assert.AreEqual(content, document.ToString());

                // Check paragraph table.
                Assert.AreEqual(1, document.ParagraphCount);
                Paragraph* paragraphs = document.GetParagraphZero();

                int expectedRuns = (length + SplashDocument.MaxCharsPerRun - 1) / SplashDocument.MaxCharsPerRun;
                Assert.AreEqual(0, paragraphs[0].CharIndex);
                Assert.AreEqual(length, paragraphs[0].CharCount);
                Assert.AreEqual(0, paragraphs[0].RunIndex);
                Assert.AreEqual(expectedRuns, paragraphs[0].RunCount);

                // Check run table.
                Assert.AreEqual(expectedRuns, document.RunCount);
                Run* runs = document.GetRunZero();

                for (int i = 0; i < expectedRuns; i++)
                {
                    Assert.AreEqual(RunKind.Text, runs[i].RunKind);
                    Assert.AreEqual(Math.Min(length, SplashDocument.MaxCharsPerRun), runs[i].CharCount);
                    Assert.AreEqual(0, runs[i].StyleIndex);

                    length -= SplashDocument.MaxCharsPerRun;
                }
            });
        }
        public void TryGetAnnotationAtIndex_WhenIndexValidAndNoAnnotations_ReturnsFalse()
        {
            var document = new SplashDocument();
            var key = new Key<string>("href");

            document.AppendText("foo");

            string value;
            Assert.IsFalse(document.TryGetAnnotationAtIndex(key, 0, out value));
            Assert.IsNull(value);
        }
        public void GetTextRange_WhenStartIndexPlusLengthExceedsDocument_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetTextRange(10, 3));
        }
        public void TryGetAnnotationAtIndex_WhenIndexValidAndAtLeastOneAnnotation_ReturnsAnnotationAtIndex()
        {
            var document = new SplashDocument();
            var key = new Key<string>("href");

            // begin/end an empty block of annotations, these will get stripped out
            document.BeginAnnotation(key, "empty");
            document.BeginAnnotation(key, "empty2");
            document.EndAnnotation(key);
            document.EndAnnotation(key);

            // add some unannotated text
            document.AppendText("some ");

            // add some annotated text
            using (document.BeginAnnotation(key, "a"))
            {
                document.AppendText("text ");

                using (document.BeginAnnotation(key, "b"))
                    document.AppendText("more");
            }

            // add some unannotated text
            document.AppendText("...");

            // begin another empty annotation at the end, should have no effect on current text
            document.BeginAnnotation(key, "trailer");

            Assert.Multiple(() =>
            {
                string value;
                for (int i = 0; i < 5; i++)
                {
                    Assert.IsFalse(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.IsNull(value);
                }
                for (int i = 5; i < 10; i++)
                {
                    Assert.IsTrue(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.AreEqual("a", value);
                }
                for (int i = 10; i < 14; i++)
                {
                    Assert.IsTrue(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.AreEqual("b", value);
                }
                for (int i = 14; i < 17; i++)
                {
                    Assert.IsFalse(document.TryGetAnnotationAtIndex(key, i, out value));
                    Assert.IsNull(value);
                }
            });
        }
        public void BeginStyle_WhenStyleIsNull_Throws()
        {
            var document = new SplashDocument();

            Assert.Throws<ArgumentNullException>(() => document.BeginStyle(null));
        }
Example #43
0
        public void AppendObject_WhenObjectIsNull_Throws()
        {
            var document = new SplashDocument();

            Assert.Throws <ArgumentNullException>(() => document.AppendObject(null));
        }
Example #44
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            SplashDocument document = splashView.Document;

            document.AppendText("Text...\nText 2... ");

            using (document.BeginStyle(new StyleBuilder()
            {
                Color = Color.Green,
                Font = new Font(FontFamily.GenericSerif, 16)
            }.ToStyle()))
            {
                document.AppendText("Text 3... ");

                using (document.BeginStyle(new StyleBuilder()
                {
                    Color = Color.Gold
                }.ToStyle(document.CurrentStyle)))
                {
                    document.AppendText("Text 4...\n");
                }

                document.AppendText("\nMore \tText...\n");
            }

            document.AppendText("Why Hello ????? ??????? World?  How are you?");
            document.AppendLine();
            document.AppendText("Tab1\tTab2\tTab3\tTab4\tTab5\tTab6\tTab7\tTab8\n");
            document.AppendText("Tab.1\tTab.2\tTab.3\tTab.4\tTab.5\tTab.6\tTab.7\tTab.8\n");

            using (document.BeginStyle(new StyleBuilder()
            {
                Font = new Font(Style.Default.Font, FontStyle.Underline),
                Color = Color.DarkBlue
            }.ToStyle()))
            {
                using (document.BeginAnnotation(HRefKey, "http://www.gallio.org/"))
                    document.AppendText("Gallio.org\n");
            }

            using (document.BeginStyle(new StyleBuilder()
            {
                Font = new Font(Style.Default.Font, FontStyle.Italic),
                LeftMargin = 30,
                RightMargin = 30,
                FirstLineIndent = 40
            }.ToStyle()))
            {
                document.AppendText(
                    "This paragraph has a first line indent, left margin and right margin.  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n");
            }

            using (document.BeginStyle(new StyleBuilder()
            {
                WordWrap = false,
                Color = Color.Blue,
                Font = new Font(Style.Default.Font, FontStyle.Bold)
            }.ToStyle()))
            {
                document.AppendText("Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.  Word wrap disabled.\n");
            }

            using (document.BeginStyle(new StyleBuilder()
            {
                Color = Color.Red,
                Font = new Font(FontFamily.GenericSerif, 16)
            }.ToStyle()))
            {
                document.AppendLine();
                document.AppendText("?????? ????? ?????? ??????? ???? ??? ? ??? ?????? ?????? ??????? ???????. ??? ?????? ??????? ????? ???? ???? ????? (??? ????? ????? ????? ? ??? ???? ?? ?????? ???????? ???? ?? ??????? ???? ????? ?????). ??? ?? ??? ???? ???? ??????? ???????? (???? ?? ??? ????? ???????).");
                document.AppendLine();
            }

            document.AppendLine();
            document.AppendText("Sample image. ");
            document.AppendObject(new EmbeddedImage(Resources.SampleImage)
            {
                Baseline = 10
            });
            document.AppendText(" (with baseline adjusted by 10 px).");
            document.AppendLine();

            document.AppendLine();
            document.AppendText("How many lambs did Mary have?");
            document.AppendObject(new EmbeddedControl(new TextBox())
            {
                Margin = new Padding(3, 3, 3, 3), Baseline = 6
            });

            document.AppendLine();
            document.AppendObject(new EmbeddedImage(Resources.Passed)
            {
                Margin = new Padding(3, 3, 3, 3)
            });
            document.AppendText("Passed 5 ");
            document.AppendObject(new EmbeddedImage(Resources.Failed)
            {
                Margin = new Padding(3, 3, 3, 3)
            });
            document.AppendText("Failed 1");
            document.AppendObject(new EmbeddedImage(Resources.Ignored)
            {
                Margin = new Padding(3, 3, 3, 3)
            });
            document.AppendText("Inconclusive 0");
            document.AppendLine();

            document.AppendLine();
            document.AppendText("What's the magic word?");
            document.AppendObject(new EmbeddedControl(new TextBox())
            {
                Margin = new Padding(3, 3, 3, 3), Baseline = 6
            });
            document.AppendLine();

            for (int i = 0; i < 1000; i++)
            {
                document.AppendText(string.Format("Line #{0}\n", i));
            }
        }
        public void EndStyle_WhenOnlyDefaultStyleOnStack_Throws()
        {
            var document = new SplashDocument();

            Assert.Throws<InvalidOperationException>(() => document.EndStyle());
        }