// 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. // Copyright (c) 2002 Cunningham & Cunningham, Inc. // Released under the terms of the GNU General Public License version 2 or later. package fit; import junit.framework.TestCase; import java.lang.reflect.Field; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class RowFixtureTest extends TestCase { class BusinessObject { private String[] strs; public BusinessObject(String[] strs) { this.strs = Arrays.copyOf(strs, strs.length); } public String[] getStrings() { return strs; } } public RowFixtureTest(String name) { super(name); } public void testMatch() throws Exception { /* Now back to the bug I found: The problem stems from the fact that java doesn't do deep equality for arrays. Little known to me (I forget easily ;-), java arrays are equal only if they are identical. Unfortunately the 2 sort methods returns a map that is directly keyed on the value of the column without considering this little fact. Conclusion there is a missing and a surplus row where there should be one right row. -- Jacques Morel */ RowFixture fixture = new TestRowFixture(); TypeAdapter arrayAdapter = TypeAdapter.on(fixture, BusinessObject.class.getMethod("getStrings", new Class[0])); Binding binding = new Binding.QueryBinding(); binding.adapter = arrayAdapter; fixture.columnBindings = new Binding[]{binding}; List<BusinessObject> computed = new LinkedList<>(); computed.add(new BusinessObject(new String[]{"1"})); LinkedList<Parse> expected = new LinkedList<>(); expected.add(new Parse("tr", "", new Parse("td", "1", null, null), null)); fixture.match(expected, computed, 0); assertEquals("right", 1, fixture.counts.right); assertEquals("exceptions", 0, fixture.counts.exceptions); assertEquals("missing", 0, fixture.missing.size()); assertEquals("surplus", 0, fixture.surplus.size()); } public void testBindColumnToField() throws Exception { RowFixture fixture = new SimpleRowFixture(); Parse table = new Parse("<table><tr><td>field</td></tr></table>"); Parse tableHead = table.parts.parts; fixture.bindColumnHeadersToMethodsAndFields(tableHead); assertNotNull(fixture.columnBindings[0]); Field field = fixture.columnBindings[0].adapter.field; assertNotNull(field); assertEquals("field", field.getName()); assertEquals(int.class, field.getType()); } private class SimpleRowFixture extends RowFixture { @Override public Class<?> getTargetClass() // get expected type of row { return SimpleBusinessObject.class; } @Override public Object[] query() throws Exception // get rows to be compared { return new Object[0]; } } private class SimpleBusinessObject { /** referenced via reflection */ @SuppressWarnings("unused") public int field; } private class TestRowFixture extends RowFixture { @Override public Object[] query() throws Exception // get rows to be compared { return new Object[0]; } @Override public Class<?> getTargetClass() // get expected type of row { return BusinessObject.class; } } }