// 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 fit.exception.NoSuchFieldFitFailureException; import fit.exception.NoSuchMethodFitFailureException; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import static util.RegexTestCase.assertSubString; public class BindingTest { private TestFixture fixture; private Parse cell1; private Parse cell2; private Parse cell3; private Parse cell4; @Before public void setUp() throws Exception { fixture = new TestFixture(); Parse table = new Parse("<table><tr><td>123</td><td>321</td><td>abc</td><td></td></tr></table>"); cell1 = table.parts.parts; cell2 = table.parts.parts.more; cell3 = table.parts.parts.more.more; cell4 = table.parts.parts.more.more.more; } @Test public void testConstruction() throws Throwable { assertEquals(Binding.QueryBinding.class, Binding.create(fixture, "intMethod()").getClass()); assertEquals(Binding.QueryBinding.class, Binding.create(fixture, "intMethod?").getClass()); assertEquals(Binding.QueryBinding.class, Binding.create(fixture, "intMethod!").getClass()); assertEquals(Binding.SetBinding.class, Binding.create(fixture, "intField").getClass()); assertEquals(Binding.RecallBinding.class, Binding.create(fixture, "intField=").getClass()); assertEquals(Binding.SaveBinding.class, Binding.create(fixture, "=intMethod()").getClass()); assertEquals(Binding.SaveBinding.class, Binding.create(fixture, "=intField").getClass()); assertEquals(Binding.SetBinding.class, Binding.create(fixture, "privateIntField").getClass()); assertEquals(Binding.RecallBinding.class, Binding.create(fixture, "privateIntField=").getClass()); assertEquals(Binding.SaveBinding.class, Binding.create(fixture, "=privateIntField").getClass()); assertEquals(Binding.RegexQueryBinding.class, Binding.create(fixture, "intMethod!!").getClass()); assertEquals(Binding.RegexQueryBinding.class, Binding.create(fixture, "intMethod??").getClass()); } @Test public void unmatchedPattern() throws Throwable { assertEquals(Binding.NullBinding.class, Binding.create(fixture, "**=**").getClass()); } public static class TestFixture extends ParentTestFixture { } public static class ParentTestFixture extends Fixture { public int intField = 0; private int privateIntField = 0; public boolean spyWasCalled = false; public int intMethod() { return intField; } public int getPrivateIntField() { return privateIntField; } public Integer integerField = new Integer(42); public Integer integerMethodIsNull() { return integerField; } public String spyMethod() { spyWasCalled = true; return "spyMethod"; } } @Test public void testQueryBinding() throws Throwable { Binding binding = Binding.create(fixture, "intMethod()"); binding.doCell(fixture, cell1); assertEquals(1, fixture.counts.wrong); fixture.intField = 321; binding.doCell(fixture, cell2); assertEquals(1, fixture.counts.right); } @Test public void regexSetBindingCallsMethod() throws Throwable { Binding binding = Binding.create(fixture, "spyMethod!!"); binding.doCell(fixture, cell1); assertTrue(fixture.spyWasCalled); assertTrue(binding.adapter.isRegex); } @Test public void testSetBinding() throws Throwable { Binding binding = Binding.create(fixture, "intField"); binding.doCell(fixture, cell1); assertEquals(123, fixture.intField); binding.doCell(fixture, cell2); assertEquals(321, fixture.intField); } @Test public void testPrivateSetBinding() throws Throwable { Binding binding = Binding.create(fixture, "privateIntField"); binding.doCell(fixture, cell1); assertEquals(123, fixture.getPrivateIntField()); binding.doCell(fixture, cell2); assertEquals(321, fixture.getPrivateIntField()); } @Test public void testQueryBindingWithBlankCell() throws Throwable { Binding binding = Binding.create(fixture, "intField"); binding.doCell(fixture, cell4); assertSubString("0", cell4.text()); } @Test public void testPrivateQueryBindingWithBlankCell() throws Throwable { Binding binding = Binding.create(fixture, "privateIntField"); binding.doCell(fixture, cell4); assertSubString("0", cell4.text()); } @Test public void testSaveBinding() throws Throwable { Binding binding = Binding.create(fixture, "=intMethod()"); binding.doCell(fixture, cell1); assertEquals("0", Fixture.getSymbol("123")); assertSubString("123 = 0", cell1.text()); fixture.intField = 999; binding.doCell(fixture, cell2); assertEquals("999", Fixture.getSymbol("321")); } @Test public void testSaveBindingWithNull() throws Throwable { Binding binding = Binding.create(fixture, "=integerMethodIsNull()"); fixture.integerField = null; binding.doCell(fixture, cell1); assertEquals("null", Fixture.getSymbol("123")); assertSubString("123 = null", cell1.text()); binding.doCell(fixture, cell2); assertEquals("null", Fixture.getSymbol("321")); } @Test public void testRecallBinding() throws Throwable { Binding binding = Binding.create(fixture, "intField="); Fixture.setSymbol("123", "999"); binding.doCell(fixture, cell1); assertEquals(999, fixture.intField); binding.doCell(fixture, cell3); assertSubString("No such symbol: abc", cell3.text()); } @Test public void testPrivateRecallBinding() throws Throwable { Binding binding = Binding.create(fixture, "privateIntField="); Fixture.setSymbol("123", "999"); binding.doCell(fixture, cell1); assertEquals(999, fixture.getPrivateIntField()); binding.doCell(fixture, cell3); assertSubString("No such symbol: abc", cell3.text()); } // -AcD- Found this while testing with nulls @Test public void testRecallBindingWithNull() throws Throwable { Binding binding = Binding.create(fixture, "integerField="); Fixture.setSymbol("123", null); binding.doCell(fixture, cell1); assertEquals(null, fixture.integerField); } @Test public void testRecallBindingSymbolTableText() throws Throwable { Binding binding = Binding.create(fixture, "intField="); Fixture.setSymbol("123", "999"); binding.doCell(fixture, cell1); assertEquals("123 = 999", cell1.text()); } @Test public void testPrivateRecallBindingSymbolTableText() throws Throwable { Binding binding = Binding.create(fixture, "privateIntField="); Fixture.setSymbol("123", "999"); binding.doCell(fixture, cell1); assertEquals("123 = 999", cell1.text()); } @Test public void testUseOfGracefulNamingForMethods() throws Throwable { checkForMethodBinding("intMethod()", true); checkForMethodBinding("int Method?", true); checkForMethodBinding("int method?", true); checkForMethodBinding("intmethod?", false); checkForMethodBinding("Intmethod?", false); checkForMethodBinding("IntMethod?", false); } @Test public void testUseOfGracefulNamingForFields() throws Throwable { checkForFieldBinding("intField", true); checkForFieldBinding("int Field", true); checkForFieldBinding("int field", true); checkForFieldBinding("intfield", false); checkForFieldBinding("Intfield", false); checkForFieldBinding("IntField", false); } @Test public void testUseOfGracefulNamingForPrivateFields() throws Throwable { checkForPrivateFieldBinding("privateIntField", true); checkForPrivateFieldBinding("private int Field", true); checkForPrivateFieldBinding("private Int field", true); checkForPrivateFieldBinding("private int field", true); checkForPrivateFieldBinding("private Int Field", true); checkForPrivateFieldBinding("privateintfield", false); checkForPrivateFieldBinding("PrivateIntfield", false); checkForPrivateFieldBinding("privateintField", false); checkForPrivateFieldBinding("PrivateIntField", false); } private void checkForMethodBinding(String name, boolean expected) throws Throwable { Binding binding = null; try { binding = Binding.create(fixture, name); } catch (NoSuchMethodFitFailureException e) { assertFalse("method not found", expected); return; } assertTrue("method was found", expected); assertTrue(binding instanceof Binding.QueryBinding); assertEquals("intMethod", binding.adapter.method.getName()); } private void checkForFieldBinding(String name, boolean expected) throws Throwable { Binding binding = null; try { binding = Binding.create(fixture, name); } catch (NoSuchFieldFitFailureException e) { assertFalse("field not found", expected); return; } assertTrue("field was found", expected); assertTrue(binding instanceof Binding.SetBinding); assertEquals("intField", binding.adapter.field.getName()); } private void checkForPrivateFieldBinding(String name, boolean expected) throws Throwable { Binding binding = null; try { binding = Binding.create(fixture, name); } catch (NoSuchFieldFitFailureException e) { assertFalse("field not found", expected); return; } assertTrue("field was found", expected); assertTrue(binding instanceof Binding.SetBinding); assertEquals("privateIntField", binding.adapter.field.getName()); } }