// HTMLParser Library $Name: v1_6 $ - A java-based parser for HTML // http://sourceforge.org/projects/htmlparser // Copyright (C) 2004 Somik Raha // // Revision Control Information // // $Source: /cvsroot/htmlparser/htmlparser/src/org/htmlparser/tests/tagTests/TagTest.java,v $ // $Author: derrickoswald $ // $Date: 2004/09/02 02:28:14 $ // $Revision: 1.62 $ // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // package org.htmlparser.tests.tagTests; import org.htmlparser.Attribute; import org.htmlparser.Node; import org.htmlparser.PrototypicalNodeFactory; import org.htmlparser.Tag; import org.htmlparser.Text; import org.htmlparser.tags.BodyTag; import org.htmlparser.tags.Div; import org.htmlparser.tags.Html; import org.htmlparser.tags.LinkTag; import org.htmlparser.tests.ParserTestCase; import org.htmlparser.util.NodeIterator; import org.htmlparser.util.ParserException; public class TagTest extends ParserTestCase { static { System.setProperty ("org.htmlparser.tests.tagTests.TagTest", "TagTest"); } private static final boolean JSP_TESTS_ENABLED = false; public TagTest(String name) { super(name); } /** * The bug being reproduced is this : <BR> * <BODY aLink=#ff0000 bgColor=#ffffff link=#0000cc onload=setfocus() text=#000000 <BR> * vLink=#551a8b> * The above line is incorrectly parsed in that, the BODY tag is not identified. */ public void testBodyTagBug1() throws ParserException { String body = "<BODY aLink=#ff0000 bgColor=#ffffff link=#0000cc " + "onload=setfocus() text=#000000\nvLink=#551a8b>"; createParser(body); parseAndAssertNodeCount(1); // The node should be a body Tag assertTrue("Node should be a BodyTag",node[0] instanceof BodyTag); BodyTag tag = (BodyTag)node[0]; String text = tag.toHtml (); assertEquals("Contents of the tag",body + "</BODY>",text); } /** * The following should be identified as a tag : <BR> * <MYTAG abcd\n"+ * "efgh\n"+ * "ijkl\n"+ * "mnop> * Creation date: (6/17/2001 5:27:42 PM) */ public void testLargeTagBug() throws ParserException { String mytag = "MYTAG abcd\n"+ "efgh\n"+ "ijkl\n"+ "mnop"; createParser( "<" + mytag + ">" ); parseAndAssertNodeCount(1); // The node should be an Tag assertTrue("Node should be a Tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertEquals("Contents of the tag",mytag,tag.getText()); } /** * Bug reported by Gordon Deudney 2002-03-15 * Nested JSP Tags were not working */ public void testNestedTags() throws ParserException { if (JSP_TESTS_ENABLED) { String s = "input type=\"text\" value=\"<%=\"test\"%>\" name=\"text\""; String line = "<"+s+">"; createParser(line); parseAndAssertNodeCount(1); assertTrue("The node found should have been an Tag",node[0] instanceof Tag); Tag tag = (Tag) node[0]; assertEquals("Tag Contents",s,tag.getText()); } } /** * Test parseParameter method * Created by Kaarle Kaila (august 2001) * the tag name is here G */ public void testParseParameter3() throws ParserException { Tag tag; Node node=null; String lin1 = "<DIV class=\"userData\" id=\"oLayout\" name=\"oLayout\"></DIV>"; createParser(lin1); NodeIterator en = parser.elements(); try { if (en.hasMoreNodes()) { node = en.nextNode(); tag = (Tag)node; String classValue= tag.getAttribute ("CLASS"); assertEquals ("The class value should be ","userData",classValue); } } catch (ClassCastException ce) { fail("Bad class element = " + node.getClass().getName()); } } /** * Test parseParameter method * Created by Kaarle Kaila (august 2001) * the tag name is here A (and should be eaten up by linkScanner) */ public void testParseParameterA() throws ParserException { Tag tag; Tag etag; Text snode; Node node=null; String lin1 = "<A href=\"http://www.iki.fi/kaila\" myParameter yourParameter=\"Kaarle Kaaila\">Kaarle's homepage</A><p>Paragraph</p>"; createParser(lin1); NodeIterator en = parser.elements(); String a,href,myValue,nice; try { if (en.hasMoreNodes()) { node = en.nextNode(); tag = (Tag)node; a = ((Attribute)(tag.getAttributesEx ().elementAt (0))).getName (); href = tag.getAttribute ("HREF"); myValue = tag.getAttribute ("MYPARAMETER"); nice = tag.getAttribute ("YOURPARAMETER"); assertEquals ("Link tag (A)","A",a); assertEquals ("href value","http://www.iki.fi/kaila",href); assertEquals ("myparameter value",null,myValue); assertEquals ("yourparameter value","Kaarle Kaaila",nice); } if (!(node instanceof LinkTag)) { // linkscanner has eaten up this piece if ( en.hasMoreNodes()) { node = en.nextNode(); snode = (Text)node; assertEquals("Value of element","Kaarle's homepage",snode.getText()); } if (en.hasMoreNodes()) { node = en.nextNode(); etag = (Tag)node; assertEquals("endtag of link","/A", etag.getText()); } } // testing rest if (en.hasMoreNodes()) { node = en.nextNode(); tag = (Tag)node; assertEquals("following paragraph begins",tag.getText(),"p"); } if (en.hasMoreNodes()) { node = en.nextNode(); snode = (Text)node; assertEquals("paragraph contents","Paragraph",snode.getText()); } if (en.hasMoreNodes()) { node = en.nextNode(); etag = (Tag)node; assertEquals("paragrapg endtag","/p",etag.getText()); } } catch (ClassCastException ce) { fail("Bad class element = " + node.getClass().getName()); } } /** * Test parseParameter method * Created by Kaarle Kaila (august 2001) * the tag name is here G */ public void testParseParameterG() throws ParserException{ Tag tag; Tag etag; Text snode; Node node=null; String lin1 = "<G href=\"http://www.iki.fi/kaila\" myParameter yourParameter=\"Kaila\">Kaarle's homepage</G><p>Paragraph</p>"; createParser(lin1); NodeIterator en = parser.elements(); String a,href,myValue,nice; try { if (en.hasMoreNodes()) { node = en.nextNode(); tag = (Tag)node; a = ((Attribute)(tag.getAttributesEx ().elementAt (0))).getName (); href = tag.getAttribute ("HREF"); myValue = tag.getAttribute ("MYPARAMETER"); nice = tag.getAttribute ("YOURPARAMETER"); assertEquals ("The tagname should be G",a,"G"); assertEquals ("Check the http address",href,"http://www.iki.fi/kaila"); assertEquals ("myValue is not null",myValue,null); assertEquals ("The second parameter value",nice,"Kaila"); } if (en.hasMoreNodes()) { node = en.nextNode(); snode = (Text)node; assertEquals("The text of the element",snode.getText(),"Kaarle's homepage"); } if (en.hasMoreNodes()) { node = en.nextNode(); etag = (Tag)node; assertEquals("Endtag is G","/G", etag.getText()); } // testing rest if (en.hasMoreNodes()) { node = en.nextNode(); tag = (Tag)node; assertEquals("Follow up by p-tag","p", tag.getText()); } if (en.hasMoreNodes()) { node = en.nextNode(); snode = (Text)node; assertEquals("Verify the paragraph text","Paragraph", snode.getText()); } if (en.hasMoreNodes()) { node = en.nextNode(); etag = (Tag)node; assertEquals("Still patragraph endtag","/p", etag.getText()); } } catch (ClassCastException ce) { fail("Bad class element = " + node.getClass().getName()); } } /** * Test parseParameter method * Created by Kaarle Kaila (august 2002) * the tag name is here A (and should be eaten up by linkScanner) * Tests elements where = sign is surrounded by spaces */ public void testParseParameterSpace() throws ParserException{ Tag tag; Tag etag; Text snode; Node node=null; String lin1 = "<A yourParameter = \"Kaarle\">Kaarle's homepage</A>"; createParser(lin1); NodeIterator en = parser.elements(); String a,nice; try { if (en.hasMoreNodes()) { node = en.nextNode(); tag = (Tag)node; a = ((Attribute)(tag.getAttributesEx ().elementAt (0))).getName (); nice = tag.getAttribute ("YOURPARAMETER"); assertEquals ("Link tag (A)",a,"A"); assertEquals ("yourParameter value","Kaarle",nice); } if (!(node instanceof LinkTag)) { // linkscanner has eaten up this piece if ( en.hasMoreNodes()) { node = en.nextNode(); snode = (Text)node; assertEquals("Value of element","Kaarle's homepage",snode.getText()); } if (en.hasMoreNodes()) { node = en.nextNode(); etag = (Tag)node; assertEquals("Still patragraph endtag","/A",etag.getText()); } } // testing rest } catch (ClassCastException ce) { fail("Bad class element = " + node.getClass().getName()); } } /** * Reproduction of a bug reported by Annette Doyle * This is actually a pretty good example of dirty html - we are in a fix * here, bcos the font tag (the first one) has an erroneous inverted comma. In Tag, * we ignore anything in inverted commas, and dont if its outside. This kind of messes * up our parsing almost completely. */ public void testStrictParsing() throws ParserException { String testHTML = "<div align=\"center\">" + "<font face=\"Arial,\"helvetica,\" sans-serif=\"sans-serif\" size=\"2\" color=\"#FFFFFF\">" + "<a href=\"/index.html\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Home</font></a>\n"+ "<a href=\"/cia/notices.html\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Notices</font></a>\n"+ "<a href=\"/cia/notices.html#priv\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Privacy</font></a>\n"+ "<a href=\"/cia/notices.html#sec\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Security</font></a>\n"+ "<a href=\"/cia/contact.htm\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Contact Us</font></a>\n"+ "<a href=\"/cia/sitemap.html\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Site Map</font></a>\n"+ "<a href=\"/cia/siteindex.html\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Index</font></a>\n"+ "<a href=\"/search\" link=\"#000000\" vlink=\"#000000\"><font color=\"#FFFFFF\">Search</font></a>\n"+ "</font>" + "</div>"; createParser(testHTML,"http://www.cia.gov"); parseAndAssertNodeCount(1); // Check the tags assertType("node",Div.class,node[0]); Div div = (Div)node[0]; Tag fontTag = (Tag)div.children().nextNode(); // an alternate interpretation: assertEquals("Second tag should be corrected","font face=\"Arial,helvetica,\" sans-serif=\"sans-serif\" size=\"2\" color=\"#FFFFFF\"",fontTag.getText()); assertEquals("Second tag should be corrected","font face=\"Arial,\"helvetica,\" sans-serif=\"sans-serif\" size=\"2\" color=\"#FFFFFF\"",fontTag.getText()); assertEquals("font sans-serif parameter","sans-serif",fontTag.getAttribute("SANS-SERIF")); // an alternate interpretation: assertEquals("font face parameter","Arial,helvetica,",table.get("FACE")); // another: assertEquals("font face parameter","Arial,\"helvetica,",table.get("FACE")); assertEquals("font face parameter","Arial,",fontTag.getAttribute("FACE")); } public void testToHTML() throws ParserException { String tag1 = "<MYTAG abcd\n"+ "efgh\n"+ "ijkl\n"+ "mnop>"; String testHTML = tag1 + "\n"+ "<TITLE>Hello</TITLE>\n"+ "<A HREF=\"Hello.html\">Hey</A>"; createParser(testHTML); parser.setNodeFactory (new PrototypicalNodeFactory (true)); parseAndAssertNodeCount(9); // The node should be an Tag assertTrue("1st Node should be a Tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertStringEquals("toHTML()",tag1,tag.toHtml()); assertTrue("3rd Node should be a Tag",node[2] instanceof Tag); assertTrue("5th Node should be a Tag",node[6] instanceof Tag); tag = (Tag)node[2]; assertEquals("Raw String of the tag","<TITLE>",tag.toHtml()); tag = (Tag)node[6]; assertEquals("Raw String of the tag","<A HREF=\"Hello.html\">",tag.toHtml()); } /** * Test parseParameter method * Created by Kaarle Kaila (22 Oct 2001) * This test just wants the text in the element */ public void testWithoutParseParameter() throws ParserException{ Node node; String testHTML = "<A href=\"http://www.iki.fi/kaila\" myParameter yourParameter=\"Kaarle\">Kaarle's homepage</A><p>Paragraph</p>"; createParser(testHTML); NodeIterator en = parser.elements(); String result=""; while (en.hasMoreNodes()) { node = en.nextNode(); result += node.toHtml(); } assertStringEquals("Check collected contents to original", testHTML, result); } /** * Test parseParameter method * Created by Kaarle Kaila (09 Jan 2003) * This test just wants the text in the element */ public void testEmptyTagParseParameter() throws ParserException{ Node node; String testHTML = "<INPUT name=\"foo\" value=\"foobar\" type=\"text\" />"; createParser(testHTML); NodeIterator en = parser.elements(); String result=""; while (en.hasMoreNodes()) { node = en.nextNode(); result = node.toHtml(); } assertStringEquals("Check collected contents to original", testHTML, result); } public void testStyleSheetTag() throws ParserException{ String testHTML1 = new String("<link rel src=\"af.css\"/>"); createParser(testHTML1,"http://www.google.com/test/index.html"); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertEquals("StyleSheet Source","af.css",tag.getAttribute("src")); } /** * Bug report by Cedric Rosa, causing null pointer exceptions when encountering a broken tag, * and if this has no further lines to parse */ public void testBrokenTag() throws ParserException{ String testHTML1 = new String("<br"); createParser(testHTML1); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertEquals("Node contents","br",tag.getText()); } public void testTagInsideTag() throws ParserException { String testHTML = new String("<META name=\"Hello\" value=\"World </I>\">"); createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertEquals("Node contents","META name=\"Hello\" value=\"World </I>\"",tag.getText()); assertEquals("Meta Content","World </I>",tag.getAttribute("value")); } public void testIncorrectInvertedCommas() throws ParserException { String content = "DORIER-APPRILL E., GERVAIS-LAMBONY P., MORICONI-EBRARD F., NAVEZ-BOUCHANINE F."; String author = "Author"; String guts = "META NAME=\"" + author + "\" CONTENT = \"" + content + "\""; String testHTML = "<" + guts + ">"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertStringEquals("Node contents",guts,tag.getText()); assertEquals("Meta Content",author,tag.getAttribute("NAME")); // // Big todo here: // This involves a change in the lexer state machine from // six states to probably 8, or perhaps a half dozen 'substates' // on state zero... // we shy away from this at the moment: // assertEquals("Meta Content",content,tag.getAttribute("CONTENT")); } public void testIncorrectInvertedCommas2() throws ParserException { String guts = "META NAME=\"Keywords\" CONTENT=Moscou, modernisation, politique urbaine, sp\u00e9cificit\u00e9s culturelles, municipalit\u00e9, Moscou, modernisation, urban politics, cultural specificities, municipality\""; String testHTML = "<" + guts + ">"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertStringEquals("Node contents",guts,tag.getText()); } public void testIncorrectInvertedCommas3() throws ParserException { String testHTML = new String("<meta name=\"description\" content=\"Une base de donn\u00e9es sur les th\u00e8ses de g\"ographie soutenues en France \">"); createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertEquals("Node contents","meta name=\"description\" content=\"Une base de donn\u00e9es sur les th\u00e8ses de g\"ographie soutenues en France \"",tag.getText()); } /** * Ignore empty tags. */ public void testEmptyTag() throws ParserException { String testHTML = "<html><body><>text</body></html>"; createParser(testHTML); parser.setNodeFactory (new PrototypicalNodeFactory (true)); parseAndAssertNodeCount(5); assertTrue("Third node should be a string node",node[2] instanceof Text); Text stringNode = (Text)node[2]; assertEquals("Third node has incorrect text","<>text",stringNode.getText()); } /** * Ignore empty tags. */ public void testEmptyTag2() throws ParserException { String testHTML = "<html><body>text<></body></html>"; createParser(testHTML); parser.setNodeFactory (new PrototypicalNodeFactory (true)); parseAndAssertNodeCount(5); assertTrue("Third node should be a string node",node[2] instanceof Text); Text stringNode = (Text)node[2]; assertEquals("Third node has incorrect text","text<>",stringNode.getText()); } /** * Ignore empty tags. */ public void testEmptyTag3() throws ParserException { String testHTML = "<html><body>text<>text</body></html>"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Only node should be an HTML node",node[0] instanceof Html); Html html = (Html)node[0]; assertTrue("HTML node should have one child",1 == html.getChildCount ()); assertTrue("Only node should be an BODY node",html.getChild(0) instanceof BodyTag); BodyTag body = (BodyTag)html.getChild(0); assertTrue("BODY node should have one child",1 == body.getChildCount ()); assertTrue("Only node should be a string node",body.getChild(0) instanceof Text); Text stringNode = (Text)body.getChild(0); assertEquals("Third node has incorrect text","text<>text",stringNode.getText()); } /** * Ignore empty tags. */ public void testEmptyTag4() throws ParserException { String testHTML = "<html><body>text\n<>text</body></html>"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Only node should be an HTML node",node[0] instanceof Html); Html html = (Html)node[0]; assertTrue("HTML node should have one child",1 == html.getChildCount ()); assertTrue("Only node should be an BODY node",html.getChild(0) instanceof BodyTag); BodyTag body = (BodyTag)html.getChild(0); assertTrue("BODY node should have one child",1 == body.getChildCount ()); assertTrue("Only node should be a string node",body.getChild(0) instanceof Text); Text stringNode = (Text)body.getChild(0); String actual = stringNode.getText(); assertEquals("Third node has incorrect text","text\n<>text",actual); } /** * Ignore empty tags. */ public void testEmptyTag5() throws ParserException { String testHTML = "<html><body>text<\n>text</body></html>"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Only node should be an HTML node",node[0] instanceof Html); Html html = (Html)node[0]; assertTrue("HTML node should have one child",1 == html.getChildCount ()); assertTrue("Only node should be an BODY node",html.getChild(0) instanceof BodyTag); BodyTag body = (BodyTag)html.getChild(0); assertTrue("BODY node should have one child",1 == body.getChildCount ()); assertTrue("Only node should be a string node",body.getChild(0) instanceof Text); Text stringNode = (Text)body.getChild(0); String actual = stringNode.getText(); assertEquals("Third node has incorrect text","text<\n>text",actual); } /** * Ignore empty tags. */ public void testEmptyTag6() throws ParserException { String testHTML = "<html><body>text<>\ntext</body></html>"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Only node should be an HTML node",node[0] instanceof Html); Html html = (Html)node[0]; assertTrue("HTML node should have one child",1 == html.getChildCount ()); assertTrue("Only node should be an BODY node",html.getChild(0) instanceof BodyTag); BodyTag body = (BodyTag)html.getChild(0); assertTrue("BODY node should have one child",1 == body.getChildCount ()); assertTrue("Only node should be a string node",body.getChild(0) instanceof Text); Text stringNode = (Text)body.getChild(0); String actual = stringNode.getText(); assertEquals("Third node has incorrect text","text<>\ntext",actual); } public void testAttributesReconstruction() throws ParserException { String expectedHTML = "<TEXTAREA name=\"JohnDoe\" >"; String testHTML = expectedHTML + "</TEXTAREA>"; createParser(testHTML); parser.setNodeFactory (new PrototypicalNodeFactory (true)); parseAndAssertNodeCount(2); assertTrue("First node should be an HTMLtag",node[0] instanceof Tag); Tag htmlTag = (Tag)node[0]; assertStringEquals("Expected HTML",expectedHTML,htmlTag.toHtml()); } public void testIgnoreState() throws ParserException { String testHTML = "<A \n"+ "HREF=\"/a?b=c>d&e=f&g=h&i=http://localhost/Testing/Report1.html\">20020702 Report 1</A>"; createParser(testHTML); parseAndAssertNodeCount(1); assertTrue("Node should be a tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; String href = tag.getAttribute("HREF"); assertStringEquals("Resolved Link","/a?b=c>d&e=f&g=h&i=http://localhost/Testing/Report1.html",href); } /** * See bug #726913 toHtml() method incomplete */ public void testSetText() throws ParserException { String testHTML = "<LABEL ID=\"JohnDoe\">John Doe</LABEL>"; createParser(testHTML); parseAndAssertNodeCount(1); org.htmlparser.tags.LabelTag htmlTag = (org.htmlparser.tags.LabelTag)node[0]; String expectedHTML = "<LABEL ID=\"JohnDoe\">John Doe</LABEL>"; assertStringEquals("Expected HTML",expectedHTML,htmlTag.toHtml()); assertStringEquals("Expected HTML","John Doe",htmlTag.getLabel()); ((org.htmlparser.Text)((org.htmlparser.tags.CompositeTag)htmlTag).getChild(0)).setText("Jane Doe"); expectedHTML = "<LABEL ID=\"JohnDoe\">Jane Doe</LABEL>"; assertStringEquals("Expected HTML",expectedHTML,htmlTag.toHtml()); assertStringEquals("Expected HTML","Jane Doe",htmlTag.getLabel()); } /** * From oyoaha */ public void testTabText () throws ParserException { String testHTML = "<a\thref=\"http://cbc.ca\">"; createParser (testHTML); parseAndAssertNodeCount (1); assertTrue("Node should be a LinkTag", node[0] instanceof LinkTag); LinkTag tag = (LinkTag)node[0]; String href = tag.getAttribute ("HREF"); assertStringEquals("Resolved Link","http://cbc.ca", href); } /** * See bug #741026 registerScanners() mangles output HTML badly. */ public void testHTMLOutputOfDifficultLinksWithRegisterScanners () throws ParserException { // straight out of a real world example String html = "<a href=http://www.google.com/webhp?hl=en>"; createParser (html); String temp = null; for (NodeIterator e = parser.elements (); e.hasMoreNodes ();) { Node newNode = e.nextNode (); // Get the next HTML Node temp = newNode.toHtml(); } assertNotNull ("No nodes", temp); assertStringEquals ("Incorrect HTML output: ", html + "</a>", temp); } /** * See bug #740411 setParsed() has no effect on output. */ public void testParameterChange() throws ParserException { createParser("<TABLE BORDER=0>"); parser.setNodeFactory (new PrototypicalNodeFactory (true)); parseAndAssertNodeCount(1); // the node should be a Tag assertTrue("Node should be a Tag",node[0] instanceof Tag); Tag tag = (Tag)node[0]; assertEquals("Initial text should be","TABLE BORDER=0",tag.getText ()); tag.setAttribute ("BORDER","\"1\""); assertEquals("HTML should be","<TABLE BORDER=\"1\">", tag.toHtml ()); } }