package cucumber.runtime.table; import cucumber.api.DataTable; import cucumber.runtime.CucumberException; import cucumber.runtime.xstream.LocalizedXStreams; import gherkin.formatter.model.Comment; import gherkin.formatter.model.DataTableRow; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; public class DataTableTest { @Test public void rawShouldHaveThreeColumnsAndTwoRows() { List<List<String>> raw = createSimpleTable().raw(); assertEquals("Rows size", 2, raw.size()); for (List<String> list : raw) { assertEquals("Cols size: " + list, 3, list.size()); } } @Test public void transposedRawShouldHaveTwoColumnsAndThreeRows() { List<List<String>> raw = createSimpleTable().transpose().raw(); assertEquals("Rows size", 3, raw.size()); for (List<String> list : raw) { assertEquals("Cols size: " + list, 2, list.size()); } } @Test(expected = CucumberException.class) public void canNotSupportNonRectangularTablesMissingColumn() { createTable(asList("one", "four", "seven"), asList("a1", "a4444"), asList("b1")).raw(); } @Test(expected = CucumberException.class) public void canNotSupportNonRectangularTablesExceedingColumn() { createTable(asList("one", "four", "seven"), asList("a1", "a4444", "b7777777", "zero")).raw(); } @Test public void canCreateTableFromListOfListOfString() { DataTable dataTable = createSimpleTable(); List<List<String>> listOfListOfString = dataTable.raw(); DataTable other = dataTable.toTable(listOfListOfString); assertEquals("" + " | one | four | seven |\n" + " | 4444 | 55555 | 666666 |\n", other.toString()); } @Test(expected = UnsupportedOperationException.class) public void raw_row_is_immutable() { createSimpleTable().raw().remove(0); } @Test(expected = UnsupportedOperationException.class) public void raw_col_is_immutable() { createSimpleTable().raw().get(0).remove(0); } @Test(expected = UnsupportedOperationException.class) public void asMaps_is_immutable() { List<Map<String, String>> maps = createSimpleTable().asMaps(String.class, String.class); maps.remove(0); } @Test(expected = UnsupportedOperationException.class) public void asMap_is_immutable() { Map<String, Long> map = createTable(asList("hundred", "100"), asList("thousand", "1000")).asMap(String.class, Long.class); assertEquals(new Long(1000L), map.get("thousand")); map.remove("hundred"); } @Test public void two_identical_tables_are_considered_equal() { assertEquals(createSimpleTable(), createSimpleTable()); assertEquals(createSimpleTable().hashCode(), createSimpleTable().hashCode()); } @Test public void two_identical_transposed_tables_are_considered_equal() { assertEquals(createSimpleTable().transpose(), createSimpleTable().transpose()); assertEquals(createSimpleTable().transpose().hashCode(), createSimpleTable().transpose().hashCode()); } @Test public void two_different_tables_are_considered_non_equal() { assertFalse(createSimpleTable().equals(createTable(asList("one")))); assertNotSame(createSimpleTable().hashCode(), createTable(asList("one")).hashCode()); } @Test public void two_different_transposed_tables_are_considered_non_equal() { assertFalse(createSimpleTable().transpose().equals(createTable(asList("one")).transpose())); assertNotSame(createSimpleTable().transpose().hashCode(), createTable(asList("one")).transpose().hashCode()); } public DataTable createSimpleTable() { return createTable(asList("one", "four", "seven"), asList("4444", "55555", "666666")); } private DataTable createTable(List<String>... rows) { List<DataTableRow> simpleRows = new ArrayList<DataTableRow>(); for (int i = 0; i < rows.length; i++) { simpleRows.add(new DataTableRow(new ArrayList<Comment>(), rows[i], i + 1)); } ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); LocalizedXStreams.LocalizedXStream xStream = new LocalizedXStreams(classLoader).get(Locale.US); return new DataTable(simpleRows, new TableConverter(xStream, null)); } }