package cucumber.runtime.xstream;
import cucumber.deps.com.thoughtworks.xstream.converters.ConversionException;
import org.junit.Test;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class StandardConvertersTest {
@Test
public void shouldThrowInformativeErrorMessageWhenTransformationFails() {
try {
new IntegerConverter(new Locale("pt")).fromString("hello");
fail();
} catch (ConversionException e) {
assertEquals("Couldn't convert \"hello\" to an instance of: [class java.lang.Integer, int]", e.getShortMessage());
}
}
@Test
public void shouldConvertToNullWhenArgumentIsNull() {
assertEquals(null, new IntegerConverter(Locale.US).fromString(null));
}
@Test
public void shouldTransformBigDecimal() {
BigDecimal englishBigDecimal = new BigDecimalConverter(Locale.US).transform("300.15");
BigDecimal englishBigDecimal2 = new BigDecimalConverter(Locale.US).transform("30000000.15");
BigDecimal englishInteger = new BigDecimalConverter(Locale.US).transform("300.15");
BigDecimal frenchBigDecimal = new BigDecimalConverter(Locale.FRANCE).transform("300.0");
assertEquals(new BigDecimal("300.15"), englishBigDecimal);
assertEquals(new BigDecimal("30000000.15"), englishBigDecimal2);
assertEquals(new BigDecimal("300.15"), englishInteger);
assertEquals(new BigDecimal("300.0"), frenchBigDecimal);
}
@Test
public void shouldTransformDate() {
assertEquals(getDateToTest(), new DateConverter(Locale.US).fromString("11/29/2011"));
assertEquals(getDateToTest(), new DateConverter(Locale.FRANCE).fromString("29/11/2011"));
}
@Test(expected = ConversionException.class)
public void shouldThrowConversionExceptionWhenConvertingInvalidDate() {
assertEquals(getDateToTest(), new DateConverter(Locale.US).fromString("29/11/2011"));
}
private Date getDateToTest() {
Calendar calendar = Calendar.getInstance(Locale.US);
calendar.set(2011, 10, 29, 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
@Test
public void shouldTransformIntegers() {
Integer expected = 1000;
assertEquals(expected, new IntegerConverter(Locale.US).fromString("1000"));
assertEquals(expected, new IntegerConverter(Locale.US).fromString("1,000"));
assertEquals(expected, new IntegerConverter(new Locale("pt")).fromString("1.000"));
}
@Test
public void shouldTransformDoubles() {
Double expected = 3000.15;
assertEquals(expected, new DoubleConverter(Locale.US).fromString("3000.15"));
assertEquals(expected, new DoubleConverter(Locale.US).fromString("3,000.15"));
assertEquals(expected, new DoubleConverter(new Locale("pt")).fromString("3.000,15"));
assertEquals(expected, new DoubleConverter(Locale.FRANCE).fromString("3000,15"));
assertEquals(null, new DoubleConverter(Locale.FRANCE).fromString(""));
}
@Test
public void shouldTransformLongs() {
Long expected = 8589934592L;
assertEquals(expected, new LongConverter(Locale.US).fromString("8589934592"));
assertEquals(expected, new LongConverter(Locale.US).fromString("8,589,934,592"));
}
@Test
public void shouldTransformShorts() {
Short expected = (short) 32767;
Short expected2 = (short) -32768;
assertEquals(expected, new ShortConverter(Locale.US).fromString("32767"));
assertEquals(expected, new ShortConverter(Locale.US).fromString("32,767"));
assertEquals(expected2, new ShortConverter(Locale.US).fromString("-32,768"));
}
@Test
public void shouldTransformBytes() {
Byte expected = (byte) 127;
assertEquals(expected, new ByteConverter(Locale.US).fromString("127"));
assertEquals(expected, new ByteConverter(Locale.US).fromString("127"));
}
@Test
public void shouldTransformFloats() {
Float expected = 3000.15f;
assertEquals(expected, new FloatConverter(Locale.US).fromString("3000.15"));
assertEquals(expected, new FloatConverter(Locale.US).fromString("3,000.15"));
}
@Test
public void shouldTransformBigInteger() {
BigInteger expected = BigInteger.valueOf(8589934592L);
assertEquals(expected, new BigIntegerConverter(Locale.US).fromString("8589934592"));
assertEquals(expected, new BigIntegerConverter(Locale.US).fromString("8,589,934,592"));
}
@Test
public void shouldTransformEnums() {
EnumConverter enumConverter = new EnumConverter(Locale.US, Color.class);
assertEquals(Color.GREEN, enumConverter.fromString("GREEN"));
assertEquals(Color.GREEN, enumConverter.fromString("Green"));
assertEquals(Color.GREEN, enumConverter.fromString("GrEeN"));
assertEquals(Color.RED, enumConverter.fromString("red"));
}
@Test
public void shouldListAllowedEnumsWhenConversionFails() {
EnumConverter enumConverter = new EnumConverter(Locale.US, Color.class);
try {
enumConverter.fromString("YELLOW");
fail();
} catch (ConversionException expected) {
String expectedMessage = "Couldn't convert YELLOW to cucumber.runtime.xstream.StandardConvertersTest$Color. Legal values are [RED, GREEN, BLUE]";
if (!expected.getMessage().startsWith(expectedMessage)) {
fail("'" + expected.getMessage() + "' didn't start with '" + expectedMessage + "'");
}
}
}
@Test
public void shouldTransformList() {
ListConverter listConverter = new ListConverter(",", new EnumConverter(Locale.US, Color.class));
assertEquals(Arrays.asList(Color.GREEN, Color.RED, Color.GREEN), listConverter.fromString("green,red,green"));
}
public static enum Color {
RED, GREEN, BLUE
}
}