package cucumber.runtime.table;
import cucumber.api.DataTable;
import cucumber.deps.com.thoughtworks.xstream.annotations.XStreamConverter;
import cucumber.deps.com.thoughtworks.xstream.converters.javabean.JavaBeanConverter;
import cucumber.runtime.ParameterInfo;
import org.junit.Test;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
public class TableConverterTest {
private static final String YYYY_MM_DD = "yyyy-MM-dd";
private static final ParameterInfo PARAMETER_INFO = new ParameterInfo(null, YYYY_MM_DD, null, null);
@Test
public void converts_table_of_single_column_to_list_of_integers() {
DataTable table = TableParser.parse("|3|\n|5|\n|6|\n|7|\n", null);
assertEquals(asList(3, 5, 6, 7), table.asList(Integer.class));
}
@Test
public void converts_table_of_two_columns_to_map() {
DataTable table = TableParser.parse("|3|c|\n|5|e|\n|6|f|\n", null);
Map<Integer, String> expected = new HashMap<Integer, String>() {{
put(3, "c");
put(5, "e");
put(6, "f");
}};
assertEquals(expected, table.asMap(Integer.class, String.class));
}
public static class WithoutStringConstructor {
public String count;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
WithoutStringConstructor thingie = (WithoutStringConstructor) o;
if (!count.equals(thingie.count)) return false;
return true;
}
@Override
public int hashCode() {
return count.hashCode();
}
@Override
public String toString() {
return "Thingie{" +
"count=" + count +
'}';
}
public WithoutStringConstructor val(String s) {
count = s;
return this;
}
}
@Test
public void converts_table_of_single_column_to_list_of_without_string_constructor() {
DataTable table = TableParser.parse("|count|\n|5|\n|6|\n|7|\n", null);
List<WithoutStringConstructor> expected = asList(new WithoutStringConstructor().val("5"), new WithoutStringConstructor().val("6"), new WithoutStringConstructor().val("7"));
assertEquals(expected, table.asList(WithoutStringConstructor.class));
}
public static class WithStringConstructor extends WithoutStringConstructor {
public WithStringConstructor(String anything) {
count = anything;
}
}
@Test
public void converts_table_of_single_column_to_list_of_with_string_constructor() {
DataTable table = TableParser.parse("|count|\n|5|\n|6|\n|7|\n", null);
List<WithStringConstructor> expected = asList(new WithStringConstructor("count"), new WithStringConstructor("5"), new WithStringConstructor("6"), new WithStringConstructor("7"));
assertEquals(expected, table.asList(WithStringConstructor.class));
}
@Test
public void converts_table_of_several_columns_to_list_of_integers() {
DataTable table = TableParser.parse("|3|5|\n|6|7|\n", null);
List<Integer> converted = table.asList(Integer.class);
assertEquals(asList(3, 5, 6, 7), converted);
}
@Test
public void converts_table_to_list_of_list_of_integers_and_back() {
DataTable table = TableParser.parse("|3|5|\n|6|7|\n", null);
List<List<Integer>> converted = table.asLists(Integer.class);
assertEquals(asList(asList(3, 5), asList(6, 7)), converted);
assertEquals(" | 3 | 5 |\n | 6 | 7 |\n", table.toTable(converted).toString());
}
public static enum Color {
RED, GREEN, BLUE
}
@Test
public void converts_table_of_single_column_to_enums() {
DataTable table = TableParser.parse("|RED|\n|GREEN|\n", null);
assertEquals(asList(Color.RED, Color.GREEN), table.asList(Color.class));
}
@Test
public void converts_table_of_single_column_to_nullable_enums() {
DataTable table = TableParser.parse("|RED|\n||\n", null);
assertEquals(asList(Color.RED, null), table.asList(Color.class));
}
@Test
public void converts_to_map_of_enum_to_int() {
DataTable table = TableParser.parse("|RED|BLUE|\n|6|7|\n|8|9|\n", null);
HashMap<Color, Integer> map1 = new HashMap<Color, Integer>() {{
put(Color.RED, 6);
put(Color.BLUE, 7);
}};
HashMap<Color, Integer> map2 = new HashMap<Color, Integer>() {{
put(Color.RED, 8);
put(Color.BLUE, 9);
}};
List<Map<Color, Integer>> converted = table.asMaps(Color.class, Integer.class);
assertEquals(asList(map1, map2), converted);
}
public static class UserPojo {
private Date birthDate;
private Calendar deathCal;
}
@Test
public void converts_table_to_list_of_pojo_and_almost_back() {
DataTable table = TableParser.parse("|Birth Date|Death Cal|\n|1957-05-10|1979-02-02|\n", PARAMETER_INFO);
List<UserPojo> converted = table.asList(UserPojo.class);
assertEquals(sidsBirthday(), converted.get(0).birthDate);
assertEquals(sidsDeathcal(), converted.get(0).deathCal);
assertEquals(" | birthDate | deathCal |\n | 1957-05-10 | 1979-02-02 |\n", table.toTable(converted).toString());
}
@XStreamConverter(JavaBeanConverter.class)
public static class UserBean {
private Date birthDateX;
private Calendar deathCalX;
public Date getBirthDate() {
return this.birthDateX;
}
public void setBirthDate(Date birthDate) {
this.birthDateX = birthDate;
}
public Calendar getDeathCal() {
return deathCalX;
}
public void setDeathCal(Calendar deathCal) {
this.deathCalX = deathCal;
}
}
@Test
public void converts_to_list_of_java_bean_and_almost_back() {
DataTable table = TableParser.parse("|Birth Date|Death Cal|\n|1957-05-10|1979-02-02|\n", PARAMETER_INFO);
List<UserBean> converted = table.asList(UserBean.class);
assertEquals(sidsBirthday(), converted.get(0).getBirthDate());
assertEquals(sidsDeathcal(), converted.get(0).getDeathCal());
assertEquals(" | birthDate | deathCal |\n | 1957-05-10 | 1979-02-02 |\n", table.toTable(converted).toString());
}
@Test
public void converts_to_list_of_map_of_date() {
DataTable table = TableParser.parse("|Birth Date|Death Cal|\n|1957-05-10|1979-02-02|\n", PARAMETER_INFO);
List<Map<String, Date>> converted = table.asMaps(String.class, Date.class);
assertEquals(sidsBirthday(), converted.get(0).get("Birth Date"));
}
@Test
public void converts_to_list_of_map_of_string() {
DataTable table = TableParser.parse("|Birth Date|Death Cal|\n|1957-05-10|1979-02-02|\n", null);
List<Map<String, String>> converted = table.asMaps(String.class, String.class);
assertEquals("1957-05-10", converted.get(0).get("Birth Date"));
}
private Date sidsBirthday() {
Calendar sidsBirthday = Calendar.getInstance(Locale.US);
sidsBirthday.set(1957, 4, 10, 0, 0, 0);
sidsBirthday.set(Calendar.MILLISECOND, 0);
return sidsBirthday.getTime();
}
private Calendar sidsDeathcal() {
Calendar sidsDeathcal = Calendar.getInstance(Locale.US);
sidsDeathcal.set(1979, 1, 2, 0, 0, 0);
sidsDeathcal.set(Calendar.MILLISECOND, 0);
return sidsDeathcal;
}
@Test
public void converts_distinct_tostring_objects_correctly() {
DataTable table = TableParser.parse("|first|second|\n|row1.first|row1.second|\n|row2.first|row2.second|\n", null);
List<ContainsTwoFromStringableFields> converted = table.asList(ContainsTwoFromStringableFields.class);
List<ContainsTwoFromStringableFields> expected = Arrays.asList(
new ContainsTwoFromStringableFields(new FirstFromStringable("row1.first"), new SecondFromStringable("row1.second")),
new ContainsTwoFromStringableFields(new FirstFromStringable("row2.first"), new SecondFromStringable("row2.second"))
);
assertEquals(expected, converted);
}
public static class ContainsTwoFromStringableFields {
private FirstFromStringable first;
private SecondFromStringable second;
public ContainsTwoFromStringableFields(FirstFromStringable first, SecondFromStringable second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ContainsTwoFromStringableFields that = (ContainsTwoFromStringableFields) o;
if (first != null ? !first.equals(that.first) : that.first != null) return false;
if (second != null ? !second.equals(that.second) : that.second != null) return false;
return true;
}
@Override
public int hashCode() {
int result = first != null ? first.hashCode() : 0;
result = 31 * result + (second != null ? second.hashCode() : 0);
return result;
}
}
public static class FirstFromStringable {
private final String value;
public FirstFromStringable(String value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FirstFromStringable that = (FirstFromStringable) o;
if (value != null ? !value.equals(that.value) : that.value != null) return false;
return true;
}
@Override
public int hashCode() {
return value != null ? value.hashCode() : 0;
}
}
public static class SecondFromStringable {
private final String value;
public SecondFromStringable(String value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SecondFromStringable that = (SecondFromStringable) o;
if (value != null ? !value.equals(that.value) : that.value != null) return false;
return true;
}
@Override
public int hashCode() {
return value != null ? value.hashCode() : 0;
}
}
}