public void AnalyzeTest_NormalizeAttribute()
        {
            HtmlRangeAnalyzer target = new HtmlRangeAnalyzer();
            string            text   = "<div>\r\n<input   readonly   type   =    \"text\" autofocus value=   '123' disabled placeholder   =占位符   />\r\n<a href=\"\"  ></a></div>";

            text = target.Normalize(text);
            Assert.AreEqual("<div>\r\n<input readonly=\"readonly\"   type   =    \"text\" autofocus=\"autofocus\" value=   '123' disabled=\"disabled\" placeholder   =占位符   />\r\n<a href=\"\"  ></a></div>", text);

            IHtmlRange tag = target.Analyze(text).ElementAt(0);
            ICollection <IHtmlAttribute> attributes = ((IHtmlElement)(tag.ToNode().ChildNodes[1])).Attributes;

            Assert.AreEqual <int>(6, attributes.Count);
            Assert.AreEqual <string>("readonly", attributes.ElementAt(0).Name);
            Assert.AreEqual <string>("readonly", attributes.ElementAt(0).Value);

            Assert.AreEqual <string>("type", attributes.ElementAt(1).Name);
            Assert.AreEqual <string>("text", attributes.ElementAt(1).Value);

            Assert.AreEqual <string>("autofocus", attributes.ElementAt(2).Name);
            Assert.AreEqual <string>("autofocus", attributes.ElementAt(2).Value);

            Assert.AreEqual <string>("value", attributes.ElementAt(3).Name);
            Assert.AreEqual <string>("123", attributes.ElementAt(3).Value);

            Assert.AreEqual <string>("disabled", attributes.ElementAt(4).Name);
            Assert.AreEqual <string>("disabled", attributes.ElementAt(4).Value);

            Assert.AreEqual <string>("placeholder", attributes.ElementAt(5).Name);
            Assert.AreEqual <string>("占位符", attributes.ElementAt(5).Value);
        }
        public void AnalyzeTest_Comment()
        {
            HtmlRangeAnalyzer        target = new HtmlRangeAnalyzer();
            string                   text   = "<!-- this is a HTML comment -->";
            IEnumerable <IHtmlRange> ranges = target.Analyze(text);

            Assert.AreEqual <int>(1, ranges.Count());

            IHtmlRange range = ranges.ElementAt(0);

            Assert.AreEqual <string>(text, range.RangeText);
            Assert.AreEqual <string>(" this is a HTML comment ", range.ChildRanges.ElementAt(0).RangeText);
        }
        public void AnalyzeTest_Declaration()
        {
            HtmlRangeAnalyzer        target = new HtmlRangeAnalyzer();
            string                   text   = "<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
            IEnumerable <IHtmlRange> ranges = target.Analyze(text);

            Assert.AreEqual <int>(1, ranges.Count());

            IHtmlRange range = ranges.ElementAt(0);

            Assert.AreEqual <string>("<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">", range.RangeText);
            Assert.AreEqual <string>("html", range.ChildRanges.ElementAt(0).RangeText);
            Assert.AreEqual <string>("PUBLIC", range.ChildRanges.ElementAt(1).RangeText);
            Assert.AreEqual <string>(" -//W3C//DTD XHTML 1.0 Transitional//EN", range.ChildRanges.ElementAt(2).RangeText);
            Assert.AreEqual <string>("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", range.ChildRanges.ElementAt(3).RangeText);
        }
        public void AnalyzeTest_Attribute()
        {
            HtmlRangeAnalyzer target = new HtmlRangeAnalyzer();
            string            text   = "<a href=\"http://www.163.com\" target='_blank' title=网易></a>";

            IHtmlRange tag = target.Analyze(text).ElementAt(0);
            ICollection <IHtmlAttribute> attributes = ((IHtmlElement)tag.ToNode()).Attributes;

            Assert.AreEqual <int>(3, attributes.Count);
            Assert.AreEqual <string>("href", attributes.ElementAt(0).Name);
            Assert.AreEqual <string>("http://www.163.com", attributes.ElementAt(0).Value);
            Assert.AreEqual <string>("target", attributes.ElementAt(1).Name);
            Assert.AreEqual <string>("_blank", attributes.ElementAt(1).Value);
            Assert.AreEqual <string>("title", attributes.ElementAt(2).Name);
            Assert.AreEqual <string>("网易", attributes.ElementAt(2).Value);
        }
        public void AnalyzeTest_Multiple()
        {
            HtmlRangeAnalyzer        target = new HtmlRangeAnalyzer();
            string                   text   = "<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">jsie.sjie<div class=\"block\"><a href=\"1.html\"><span>123<span>456</span></span></a></div>sjie.sieji<div style=\"margin: 0px;\"><p>789<p>101112<span>131415</span></p>161718</p></div>sjiea.ehisi";
            IEnumerable <IHtmlRange> ranges = null;

            ranges = target.Analyze(text);
            //ranges = target.Analyze(System.IO.File.ReadAllText(@"d:\1\beian.html", System.Text.Encoding.UTF8));

            Assert.AreEqual <int>(3, ranges.Count());

            IHtmlRange range = ranges.ElementAt(0);

            Assert.AreEqual <string>("<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">", range.RangeText);

            range = ranges.ElementAt(1);
            Assert.AreEqual <string>("<div class=\"block\"><a href=\"1.html\"><span>123<span>456</span></span></a></div>", range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<a href=\"1.html\"><span>123<span>456</span></span></a>", range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<span>123<span>456</span></span>", range.RangeText);

            range = range.ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<span>456</span>", range.RangeText);

            range = ranges.ElementAt(2);
            Assert.AreEqual <string>("<div style=\"margin: 0px;\"><p>789<p>101112<span>131415</span></p>161718</p></div>", range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<p>789<p>101112<span>131415</span></p>161718</p>", range.RangeText);

            range = range.ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<p>101112<span>131415</span></p>", range.RangeText);

            range = range.ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<span>131415</span>", range.RangeText);
        }
        public void AnalyzeTest_Nesting_Comment()
        {
            HtmlRangeAnalyzer        target = new HtmlRangeAnalyzer();
            string                   text   = "<div class=\"block\"><!--<div></div>--><a href=\"1.html\"><!--<a />--><span>123<span>456</span><!--<div></div>--><span>789<!--123--></span></span><!--<a />--></a></div>";
            IEnumerable <IHtmlRange> ranges = target.Analyze(text);

            Assert.AreEqual <int>(1, ranges.Count());

            IHtmlRange range = ranges.ElementAt(0);

            Assert.AreEqual <string>(text, range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<!--<div></div>-->", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(2);
            Assert.AreEqual <string>("<a href=\"1.html\"><!--<a />--><span>123<span>456</span><!--<div></div>--><span>789<!--123--></span></span><!--<a />--></a>", range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<!--<a />-->", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(2);
            Assert.AreEqual <string>("<span>123<span>456</span><!--<div></div>--><span>789<!--123--></span></span>", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(3);
            Assert.AreEqual <string>("<!--<a />-->", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(2).ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<span>456</span>", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<!--<div></div>-->", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(2);
            Assert.AreEqual <string>("<span>789<!--123--></span>", range.RangeText);

            range = range.ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<!--123-->", range.RangeText);
        }
        public void AnalyzeTest_CloseSelfNesting_Comment()
        {
            HtmlRangeAnalyzer        target = new HtmlRangeAnalyzer();
            string                   text   = "ajies.<!--<div style=\"\"></div>--><img href=\"1.gif\" />sj<!--<input type=\"text\" />-->i<div><input type=\"text\" value='123' title=haha /><a href=\"1.html\">1.html<!--Test--></a><br /></div>sjieh<!--456-->ji18h";
            IEnumerable <IHtmlRange> ranges = target.Analyze(text);

            Assert.AreEqual <int>(5, ranges.Count());

            IHtmlRange range = ranges.ElementAt(0);

            Assert.AreEqual <string>("<!--<div style=\"\"></div>-->", range.RangeText);

            range = ranges.ElementAt(1);
            Assert.AreEqual <string>("<img href=\"1.gif\" />", range.RangeText);

            range = ranges.ElementAt(2);
            Assert.AreEqual <string>("<!--<input type=\"text\" />-->", range.RangeText);

            range = ranges.ElementAt(3);
            Assert.AreEqual <string>("<div><input type=\"text\" value='123' title=haha /><a href=\"1.html\">1.html<!--Test--></a><br /></div>", range.RangeText);

            range = ranges.ElementAt(4);
            Assert.AreEqual <string>("<!--456-->", range.RangeText);

            range = ranges.ElementAt(3).ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<input type=\"text\" value='123' title=haha />", range.RangeText);

            range = range.ParentRange.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<a href=\"1.html\">1.html<!--Test--></a>", range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<!--Test-->", range.RangeText);

            range = range.ParentRange.ParentRange.ChildRanges.ElementAt(2);
            Assert.AreEqual <string>("<br />", range.RangeText);
        }
        public void AnalyzeTest_Error()
        {
            HtmlRangeAnalyzer        target = new HtmlRangeAnalyzer();
            string                   text   = "<div class=\"block\"><a href='1.html'><span>123<span>456</span></span></a>spacing<span>789</span>";
            IEnumerable <IHtmlRange> ranges = target.Analyze(text);

            Assert.AreEqual <int>(3, ranges.Count());

            IHtmlRange range = ranges.ElementAt(0);

            Assert.AreEqual <string>("<div class=\"block\">", range.RangeText);

            range = ranges.ElementAt(1);
            Assert.AreEqual <string>("<a href='1.html'><span>123<span>456</span></span></a>", range.RangeText);

            range = range.ChildRanges.ElementAt(1);
            Assert.AreEqual <string>("<span>123<span>456</span></span>", range.RangeText);

            range = range.ChildRanges.ElementAt(0);
            Assert.AreEqual <string>("<span>456</span>", range.RangeText);

            range = ranges.ElementAt(2);
            Assert.AreEqual <string>("<span>789</span>", range.RangeText);
        }