Пример #1
0
        public void GetTextRange_WhenLengthNegative_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetTextRange(0, -1));
        }
Пример #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();
        }
Пример #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);
        }
Пример #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));
                }
            });
        }
Пример #5
0
        public void GetTextRange_WhenStartIndexPlusLengthExceedsDocument_Throws()
        {
            var document = new SplashDocument();

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

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

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

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

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

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

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

            Assert.Throws <ArgumentOutOfRangeException>(() => document.GetTextRange(0, -1));
        }
Пример #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));
        }
Пример #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));
        }
Пример #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);
                }
            });
        }
Пример #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);
        }
Пример #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);
        }
Пример #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));
        }
Пример #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());
            });
        }
Пример #16
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());
            });
        }
Пример #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();
        }
Пример #18
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);
            });
        }
Пример #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));
                }
            });
        }
Пример #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);
        }
Пример #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);
            });
        }
Пример #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;
                }
            });
        }
Пример #23
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);
            });
        }
Пример #24
0
 public void AppendObject_WhenObjectIsNull_Throws()
 {
     var document = new SplashDocument();
     Assert.Throws<ArgumentNullException>(() => document.AppendObject(null));
 }
Пример #25
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));
            });
        }
Пример #26
0
        public void GetObjectAtIndex_WhenIndexBeyondDocument_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

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

            Assert.Throws <ArgumentNullException>(() => document.BeginStyle(null));
        }
Пример #28
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));
        }
Пример #29
0
        public void EndStyle_WhenOnlyDefaultStyleOnStack_Throws()
        {
            var document = new SplashDocument();

            Assert.Throws <InvalidOperationException>(() => document.EndStyle());
        }
Пример #30
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));
        }
Пример #31
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);
        }
Пример #32
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));
        }
Пример #33
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));
            });
        }
Пример #34
0
        public void GetStyleAtIndex_WhenIndexNegative_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetStyleAtIndex(-1));
        }
Пример #35
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);
        }
Пример #36
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);
        }
Пример #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);
            });
        }
Пример #38
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;
                }
            });
        }
Пример #39
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);
        }
Пример #40
0
        public void GetTextRange_WhenStartIndexPlusLengthExceedsDocument_Throws()
        {
            var document = new SplashDocument();
            document.AppendText("some text...");

            Assert.Throws<ArgumentOutOfRangeException>(() => document.GetTextRange(10, 3));
        }
Пример #41
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);
                }
            });
        }
Пример #42
0
        public void BeginStyle_WhenStyleIsNull_Throws()
        {
            var document = new SplashDocument();

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

            Assert.Throws <ArgumentNullException>(() => document.AppendObject(null));
        }
Пример #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));
            }
        }
Пример #45
0
        public void EndStyle_WhenOnlyDefaultStyleOnStack_Throws()
        {
            var document = new SplashDocument();

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