// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.testsystems.slim; import java.util.Arrays; import org.htmlparser.util.ParserException; import org.junit.Test; import static org.junit.Assert.assertEquals; import static util.RegexTestCase.assertHasRegexp; public class HtmlTableScannerTest { private HtmlTableScanner ts; private void scan(String page) throws ParserException { ts = new HtmlTableScanner(page); } @Test public void canHandleEmptyInput() throws Exception { scan(""); assertEquals(0, ts.getTableCount()); } @Test public void canParseOneSimpleTable() throws Exception { scan("<table><tr><td>x</td></tr></table>"); assertEquals(1, ts.getTableCount()); Table t = ts.getTable(0); assertEquals(1, t.getRowCount()); assertEquals(1, t.getColumnCountInRow(0)); assertEquals("x", t.getCellContents(0, 0)); } @Test public void canParseOneSimpleTableWithGunkAroundIt() throws Exception { scan( "" + "<body>Gunk" + "<table>gunk" + " <tr> gunk" + " <td>x</td>gunk" + " </tr>gunk" + "</table>gunk" + "</body>"); assertEquals(1, ts.getTableCount()); Table t = ts.getTable(0); assertEquals(1, t.getRowCount()); assertEquals(1, t.getColumnCountInRow(0)); assertEquals("x", t.getCellContents(0, 0)); } @Test public void canParseComplexTable() throws Exception { scan( " <table>" + " <th>" + " <td>Name</td>" + " <td>Address</td>" + " </th>" + " <tr>" + " <td>Bob</td>" + " <td>Here</td>" + " </tr>" + "</table> "); assertEquals(1, ts.getTableCount()); Table t = ts.getTable(0); assertEquals(2, t.getRowCount()); assertEquals(2, t.getColumnCountInRow(0)); assertEquals(2, t.getColumnCountInRow(1)); assertEquals("Name", t.getCellContents(0, 0)); assertEquals("Address", t.getCellContents(1, 0)); assertEquals("Bob", t.getCellContents(0, 1)); assertEquals("Here", t.getCellContents(1, 1)); } @Test public void canParseMultipleTables() throws Exception { scan( "" + "<table><tr><td>1</td></tr></table>" + "<table><tr><td>2</td></tr></table>" ); assertEquals(2, ts.getTableCount()); Table t1 = ts.getTable(0); Table t2 = ts.getTable(1); assertEquals(1, t1.getRowCount()); assertEquals(1, t2.getRowCount()); assertEquals(1, t1.getColumnCountInRow(0)); assertEquals(1, t2.getColumnCountInRow(0)); assertEquals("1", t1.getCellContents(0, 0)); assertEquals("2", t2.getCellContents(0, 0)); } @Test public void canSetCellContents() throws Exception { scan("<table><tr><td>x</td></tr></table>"); Table t = ts.getTable(0); t.substitute(0, 0, "Wow"); assertEquals("Wow", t.getCellContents(0, 0)); } @Test public void canAppendCellToRow() throws Exception { scan("<table><tr><td>x</td></tr></table>"); Table t = ts.getTable(0); t.addColumnToRow(0, "ray"); assertEquals("ray", t.getCellContents(1, 0)); } @Test public void canAddRow() throws Exception { scan("<table><tr><td>x</td></tr></table>"); Table t = ts.getTable(0); t.addRow(Arrays.asList("y", "z")); assertEquals("y", t.getCellContents(0, 1)); assertEquals("z", t.getCellContents(1, 1)); } @Test public void canConvertBackToHtmlAfterAddingRows() throws Exception { scan("<table><tr><td>x</td></tr></table>"); Table t = ts.getTable(0); t.addRow(Arrays.asList("y", "z")); assertHasRegexp("<table><tr><td>x</td></tr><tr><td>y</td><td>z</td></tr></table>",ts.toHtml().toLowerCase()); } @Test public void canConvertGunkBackToHtml() throws Exception { String html = "gunk<body>gunk<table>gunk<tr>gunk<td>x</td>gunk<br>gunk</tr>gunk</table>gunk</body>"; scan(html); assertHasRegexp(html, ts.toHtml()); } @Test public void nonBreakingSpaceInTableCellReturnsEmptyString() throws Exception { //Some browsers need   in empty table cells. We should detect this and //return an empty string. String html = "<table><tr><td> </td></tr></table>"; scan(html); assertEquals("", ts.getTable(0).getCellContents(0, 0)); } @Test public void tablesCanBeRepresentedAsStringLists() throws Exception { String html = "<table><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>"; scan(html); assertEquals("[[a, b], [c, d]]", ts.getTable(0).toString()); } @Test public void canExtractTablesFromHtml() throws Exception { String table1_fmt = "<body>GunkHeader gunk<table>gunk</table>gunk middle directions"; String table2_fmt = "<table>gunk 2</table>gunk middle directions2"; String table3_fmt = "<table>gunk 3</table>gunkend gunk</body>"; String MULTI_TABLE_HTML = String.format(table1_fmt + table2_fmt + table3_fmt, "", "", ""); scan(MULTI_TABLE_HTML); assertHasRegexp(table1_fmt + table2_fmt + table3_fmt, ts.toHtml(null, null)); assertHasRegexp(table1_fmt, ts.toHtml(null, ts.getTable(1))); assertHasRegexp(table2_fmt, ts.toHtml(ts.getTable(1), ts.getTable(2))); assertHasRegexp(table3_fmt, ts.toHtml(ts.getTable(2), null)); } }