// Modified or written by Object Mentor, Inc. for inclusion with FitNesse. // Copyright (c) 2002 Cunningham & Cunningham, Inc. // Released under the terms of the GNU General Public License version 2 or later. package fit; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static util.RegexTestCase.assertNotSubString; import static util.RegexTestCase.assertSubString; import java.text.ParseException; import java.util.Date; import java.util.Locale; import org.junit.After; import org.junit.Before; import org.junit.Test; public class FixtureTest { private Locale saveLocale; static class HasParseMethod { public static Object parse(String s) { return s + " found"; } } static class HasNoParseMethod { } @Before public void setUp() throws Exception { saveLocale = Locale.getDefault(); Locale.setDefault(Locale.US); } @After public void tearDown() throws Exception { Locale.setDefault(saveLocale); } @Test public void testHasParseMethod() throws Exception { assertTrue(Fixture.hasParseMethod(HasParseMethod.class)); assertFalse(Fixture.hasParseMethod(HasNoParseMethod.class)); } @Test public void testCallParseMethod() throws Exception { Object o = Fixture.callParseMethod(HasParseMethod.class, "target"); assertTrue(o instanceof String); String s = (String) o; assertEquals("target found", s); } @Test public void testObjectWithParseMethod() throws Exception { Fixture f = new Fixture(); Object o = f.parse("target", HasParseMethod.class); assertTrue(o instanceof String); assertEquals("target found", (String) o); try { f.parse("target", HasNoParseMethod.class); } catch (Exception e) { assertTrue(e.getMessage().startsWith("Could not parse")); } } @Test public void testScientificDouble() throws Exception { Fixture f = new Fixture(); Object o = f.parse("13.4", ScientificDouble.class); assertTrue(o instanceof ScientificDouble); assertEquals(new ScientificDouble(13.4), o); } @Test public void testRelationalMatching() throws Exception { final String[][] table = { {"fitnesse.fixtures.ColumnFixtureTestFixture"}, {"input", "output?"}, {"1", "_>0"} }; Parse page = executeFixture(table); String colTwoResult = page.at(0, 2, 1).body; assertTrue(colTwoResult.contains("<b>1</b>>0")); String colTwoTag = page.at(0, 2, 1).tag; assertTrue(colTwoTag.contains("pass")); } @Test public void testNullAndBlankStrings() throws Exception { Fixture fixture = new Fixture(); assertNull(fixture.parse("null", String.class)); assertEquals("", fixture.parse("blank", String.class)); TypeAdapter adapter = new TypeAdapter(); assertEquals("null", adapter.toString((String) null)); assertEquals("blank", adapter.toString("")); } @Test public void testEscape() { String junk = "!@#$%^*()_-+={}|[]\\:\";',./?`"; assertEquals(junk, Fixture.escape(junk)); assertEquals("", Fixture.escape("")); assertEquals("<", Fixture.escape("<")); assertEquals("<<", Fixture.escape("<<")); assertEquals("x<", Fixture.escape("x<")); assertEquals("&", Fixture.escape("&")); assertEquals("<&<", Fixture.escape("<&<")); assertEquals("&<&", Fixture.escape("&<&")); assertEquals("a < b && c < d", Fixture.escape("a < b && c < d")); } @Test public void testFixtureArguments() throws Exception { String[] args = getArgsForTableWith("<td>1</td>"); assertEquals(1, args.length); assertEquals("1", args[0]); args = getArgsForTableWith(""); assertEquals(0, args.length); args = getArgsForTableWith("<td>1</td><td>2</td>"); assertEquals(2, args.length); assertEquals("1", args[0]); assertEquals("2", args[1]); } private String[] getArgsForTableWith(String argsDefinition) throws Exception { String prefix = "<table><tr><td>fit.Fixture</td>"; String suffix = "</tr></table>"; Parse table = new Parse(prefix + argsDefinition + suffix); Fixture f = new Fixture(); f.getArgsForTable(table); return f.getArgs(); } @Test public void testFixtureArgumentsWithEscapedSymbols() throws Exception { // "<", ">" are usually escaped (unless surrounded by !- .. -!) String[] args = getArgsForTableWith("<td>a < 3 and b > 1</td>"); assertArrayEquals(new String[]{"a < 3 and b > 1"}, args); } @Test public void testFixtureArgumentsWithSpecialSymbols() throws Exception { // "<", ">" are usually escaped but may come in plan text from !- .. -! String[] args = getArgsForTableWith("<td>a < 3 and b > 1</td>"); assertArrayEquals(new String[] {"a < 3 and b > 1"}, args); } @Test public void testParseDate() throws Exception { Fixture f = new Fixture(); Object o = f.parse("1/2/2004", Date.class); assertEquals(java.util.Date.class, o.getClass()); } public static Parse executeFixture(String[][] table) throws ParseException { String pageString = makeFixtureTable(table); Parse page = new Parse(pageString); Fixture fixture = new Fixture(); fixture.doTables(page); return page; } @Test public void testCanChangeFriendlyExceptions() throws Exception { Fixture fixture = new Fixture() { @Override public boolean isFriendlyException(Throwable exception) { return true; } }; Parse cell = new Parse("td", "", null, null); fixture.exception(cell, new NullPointerException("gobble gobble")); assertSubString("gobble gobble", cell.body); assertNotSubString("Exception", cell.body); } @Test public void testClearingSymbols() throws Exception { Fixture.setSymbol("blah", "blah"); assertEquals("blah", Fixture.getSymbol("blah")); Fixture.ClearSymbols(); assertEquals(null, Fixture.getSymbol("blah")); } private static String makeFixtureTable(String table[][]) { StringBuilder buf = new StringBuilder(); buf.append("<table>\n"); for (String[] row : table) { buf.append(" <tr>"); for (String cell : row) { buf.append("<td>").append(cell).append("</td>"); } buf.append("</tr>\n"); } buf.append("</table>\n"); return buf.toString(); } } class FixtureOne extends Fixture { } class FixtureTwo extends Fixture { } class TheThirdFixture extends Fixture { }