static void Test_Hook()
        {
            Document           doc = new Document();
            KeywordHighlighter h;

            //---------------------------------------------
            h = new KeywordHighlighter();
            {
                h.AddKeywordSet(new string[] { "int" }, CharClass.Keyword);
                doc.Highlighter = h;

                doc.Text = @"int x";
                h.Highlight(doc);
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(0));
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(1));
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(2));
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(3));
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(4));

                h.HookProc = delegate(Document d, string token, int index, CharClass klass) {
                    return(token == "int");
                };
                doc.Text = @"int x";
                h.Highlight(doc);
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(1));
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(2));
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(3));
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(4));
            }
        }
예제 #2
0
        public void ShouldReplaceTextWithKeyword()
        {
            string[]           inputKeywords       = { "as", "we", "if", "then" };
            const string       toDecorateWith      = "[blue]";
            string             statementToSearchIn = "if we write";
            KeywordHighlighter highlighter         = new  KeywordHighlighter(toDecorateWith, inputKeywords);
            string             output = highlighter.HighlightKeyword(statementToSearchIn);

            Assert.Equal(string.Concat(toDecorateWith, "if", toDecorateWith, toDecorateWith, "we", toDecorateWith, "write"), output);
        }
        static void Test_LineComment()
        {
            Document           doc = new Document();
            KeywordHighlighter h   = new KeywordHighlighter();

            h.AddLineHighlight("///", CharClass.DocComment);
            h.AddLineHighlight("//", CharClass.Comment);
            doc.Highlighter = h;
            //---------------------------------------------

            const string initText =
                @"hoge
//hoge
ho///ge
hoge//
ho//ge";

            doc.Text = initText;
            h.Highlight(doc);

            int i = 0;

            for ( ; i < 6; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 14; i++)
            {
                TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(i));
            }
            for ( ; i < 16; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 23; i++)
            {
                TestUtl.AssertEquals(CharClass.DocComment, doc.GetCharClass(i));
            }
            for ( ; i < 27; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 31; i++)
            {
                TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(i));
            }
            for ( ; i < 33; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 37; i++)
            {
                TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(i));
            }
        }
예제 #4
0
        /* ----------------------------------------------------------------- */
        ///
        /// Highlight
        ///
        /// <summary>
        /// 検索結果を強調表示します。
        /// </summary>
        ///
        /* ----------------------------------------------------------------- */
        private void Highlight(Page page, string keyword, bool sensitive)
        {
            var src = page?.Document as Document;

            if (src == null)
            {
                return;
            }

            var highlight = new KeywordHighlighter();

            highlight.AddRegex(Regex.Escape(keyword), !sensitive, CharClass.Keyword);
            src.Highlighter = highlight;
        }
        static void Test_WordChar()
        {
            Document           doc = new Document();
            KeywordHighlighter h;

            //---------------------------------------------
            h = new KeywordHighlighter();
            {
                h.AddKeywordSet(new string[] { "SELECT" }, CharClass.Keyword);
                doc.Highlighter = h;

                doc.Text = @"SELECT ABC-SELECT SELECT-ABC";
                h.Highlight(doc);
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(0));                           // S<--
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(5));                           // SELECT<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(6));                            // SELECT <--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(7));                            // SELECT A<--
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(11));                          // SELECT ABC-S<--
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(16));                          // SELECT ABC-SELECT<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(17));                           // SELECT ABC-SELECT <--
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(23));                          // SELECT ABC-SELECT SELECT<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(26));                           // SELECT ABC-SELECT SELECT-ABC<--
            }

            h = new KeywordHighlighter();
            {
                h.AddKeywordSet(new string[] { "SELECT" }, CharClass.Keyword);
                h.WordCharSet   = "-ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                doc.Highlighter = h;

                doc.Text = @"SELECT ABC-SELECT SELECT-ABC";
                h.Highlight(doc);
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(0));                   // S<--
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(5));                   // SELECT<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(6));                    // SELECT <--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(7));                    // SELECT A<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(11));                   // SELECT ABC-S<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(16));                   // SELECT ABC-SELECT<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(17));                   // SELECT ABC-SELECT <--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(23));                   // SELECT ABC-SELECT SELECT<--
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(26));                   // SELECT ABC-SELECT SELECT-ABC<--
            }
        }
        static void Test_Enclosure()
        {
            Document           doc = new Document();
            KeywordHighlighter h   = new KeywordHighlighter();

            h.AddEnclosure("\"", "\"", CharClass.String, false, '\\');
            h.AddEnclosure("/*", "*/", CharClass.Comment, true);
            doc.Highlighter = h;
            //---------------------------------------------

            doc.Text = @"""";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(0));

            doc.Text = @"a""";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(1));

            doc.Text = @"a""b";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(2));

            doc.Text = @"a""b""";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(3));

            doc.Text = @"a""b""c";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(3));
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(4));

            doc.Text = @"a""b\""c";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(3));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(4));
            TestUtl.AssertEquals(CharClass.String, doc.GetCharClass(5));

            doc.Text = @"/";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));

            doc.Text = @"/*";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));

            doc.Text = @"/**";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(2));

            doc.Text = @"/**a";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(3));

            doc.Text = @"/*a*";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(3));

            doc.Text = @"/**/";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(3));

            doc.Text = @"/*a*/";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(3));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(4));

            doc.Text = @"a/*a*/a";
            h.Highlight(doc);
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(0));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(1));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(2));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(3));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(4));
            TestUtl.AssertEquals(CharClass.Comment, doc.GetCharClass(5));
            TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(6));
        }
        static void Test_Keywords()
        {
            Document           doc = new Document();
            KeywordHighlighter h   = new KeywordHighlighter();

            h.AddEnclosure("\"", "\"", CharClass.String, '\\');
            h.AddEnclosure("/*", "*/", CharClass.Comment);
            h.AddKeywordSet(new string[] {
                "for", "if", "int", "interface", "join"
            }, CharClass.Keyword);
            doc.Highlighter = h;
            //---------------------------------------------

            int i;

            // "int" --> "int "
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace(" ", 3, 3);
            h.Highlight(doc);
            TestUtl.AssertEquals("int ", doc.Text);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            for ( ; i < 4; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(4); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // "int" --> "-int"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("-", 0, 0);
            h.Highlight(doc);
            TestUtl.AssertEquals("-int", doc.Text);
            for (i = 0; i < 1; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 4; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(4); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // in --> int
            doc.Text = "in";
            h.Highlight(doc);
            for (i = 0; i < 2; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("t", 2, 2);
            h.Highlight(doc);
            TestUtl.AssertEquals("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(3); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // it --> int
            doc.Text = "it";
            h.Highlight(doc);
            for (i = 0; i < 2; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("n", 1, 1);
            h.Highlight(doc);
            TestUtl.AssertEquals("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(3); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // nt --> int
            doc.Text = "nt";
            h.Highlight(doc);
            for (i = 0; i < 2; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("i", 0, 0);
            h.Highlight(doc);
            TestUtl.AssertEquals("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(3); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // "insert at" --> int
            doc.Text = "insert at";
            h.Highlight(doc);
            for (i = 0; i < 9; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("n", 1, 8);
            h.Highlight(doc);
            TestUtl.AssertEquals("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(3); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // "hoge" --> "h int e"
            doc.Text = "hoge";
            h.Highlight(doc);
            for (i = 0; i < 4; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace(" int ", 1, 3);
            h.Highlight(doc);
            TestUtl.AssertEquals("h int e", doc.Text);
            for (i = 0; i < 2; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 5; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            for ( ; i < 7; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(7); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // "int" --> "if!"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("f!", 1, 3);
            h.Highlight(doc);
            TestUtl.AssertEquals("if!", doc.Text);
            for (i = 0; i < 2; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            for ( ; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(3); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // "int" --> "inte"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("e", 3, 3);
            h.Highlight(doc);
            TestUtl.AssertEquals("inte", doc.Text);
            for (i = 0; i < 4; i++)
            {
                TestUtl.AssertEquals(CharClass.Normal, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(4); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }

            // "int" --> "interface"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("erface", 3, 3);
            h.Highlight(doc);
            TestUtl.AssertEquals("interface", doc.Text);
            for (i = 0; i < 9; i++)
            {
                TestUtl.AssertEquals(CharClass.Keyword, doc.GetCharClass(i));
            }
            try{ doc.GetCharClass(10); TestUtl.Fail("Exception wasn't thrown as expected."); }
            catch (Exception ex) { TestUtl.AssertType <ArgumentOutOfRangeException>(ex); }
        }
예제 #8
0
        public void Keywords()
        {
            Document           doc = new Document();
            KeywordHighlighter h   = new KeywordHighlighter();

            h.AddEnclosure("\"", "\"", CharClass.String, '\\');
            h.AddEnclosure("/*", "*/", CharClass.Comment);
            h.AddKeywordSet(new string[] {
                "for", "if", "int", "interface", "join"
            }, CharClass.Keyword);
            doc.Highlighter = h;
            //---------------------------------------------

            int i;

            // "int" --> "int "
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace(" ", 3, 3);
            h.Highlight(doc);
            Assert.AreEqual("int ", doc.Text);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            for ( ; i < 4; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(4);
            });

            // "int" --> "-int"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("-", 0, 0);
            h.Highlight(doc);
            Assert.AreEqual("-int", doc.Text);
            for (i = 0; i < 1; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 4; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(4);
            });

            // in --> int
            doc.Text = "in";
            h.Highlight(doc);
            for (i = 0; i < 2; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("t", 2, 2);
            h.Highlight(doc);
            Assert.AreEqual("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(3);
            });

            // it --> int
            doc.Text = "it";
            h.Highlight(doc);
            for (i = 0; i < 2; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("n", 1, 1);
            h.Highlight(doc);
            Assert.AreEqual("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(3);
            });

            // nt --> int
            doc.Text = "nt";
            h.Highlight(doc);
            for (i = 0; i < 2; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("i", 0, 0);
            h.Highlight(doc);
            Assert.AreEqual("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(3);
            });

            // "insert at" --> int
            doc.Text = "insert at";
            h.Highlight(doc);
            for (i = 0; i < 9; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace("n", 1, 8);
            h.Highlight(doc);
            Assert.AreEqual("int", doc.Text);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(3);
            });

            // "hoge" --> "h int e"
            doc.Text = "hoge";
            h.Highlight(doc);
            for (i = 0; i < 4; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            doc.Replace(" int ", 1, 3);
            h.Highlight(doc);
            Assert.AreEqual("h int e", doc.Text);
            for (i = 0; i < 2; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            for ( ; i < 5; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            for ( ; i < 7; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(7);
            });

            // "int" --> "if!"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("f!", 1, 3);
            h.Highlight(doc);
            Assert.AreEqual("if!", doc.Text);
            for (i = 0; i < 2; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            for ( ; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(3);
            });

            // "int" --> "inte"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("e", 3, 3);
            h.Highlight(doc);
            Assert.AreEqual("inte", doc.Text);
            for (i = 0; i < 4; i++)
            {
                Assert.AreEqual(CharClass.Normal, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(4);
            });

            // "int" --> "interface"
            doc.Text = "int";
            h.Highlight(doc);
            for (i = 0; i < 3; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            doc.Replace("erface", 3, 3);
            h.Highlight(doc);
            Assert.AreEqual("interface", doc.Text);
            for (i = 0; i < 9; i++)
            {
                Assert.AreEqual(CharClass.Keyword, doc.GetCharClass(i));
            }
            MyAssert.Throws <ArgumentOutOfRangeException>(delegate {
                doc.GetCharClass(10);
            });
        }