package cucumber.runtime.xstream;
import cucumber.deps.com.thoughtworks.xstream.converters.ConverterLookup;
import cucumber.deps.com.thoughtworks.xstream.converters.SingleValueConverter;
import org.junit.Before;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.Locale;
import java.util.regex.Pattern;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class ConvertersTest {
private ConverterLookup en;
private ConverterLookup no;
@Before
public void setUp() throws Exception {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
LocalizedXStreams transformers = new LocalizedXStreams(classLoader);
en = transformers.get(Locale.US).getConverterLookup();
no = transformers.get(new Locale("no")).getConverterLookup();
}
@Test
public void shouldTransformToTheRightType() {
assertTrue((Boolean) ((SingleValueConverter) en.lookupConverterForType(Boolean.class)).fromString("true"));
assertTrue((Boolean) ((SingleValueConverter) en.lookupConverterForType(Boolean.TYPE)).fromString("true"));
assertEquals(3000.15f, (Float) ((SingleValueConverter) en.lookupConverterForType(Float.class)).fromString("3000.15"), 0.000001);
assertEquals(3000.15f, (Float) ((SingleValueConverter) en.lookupConverterForType(Float.TYPE)).fromString("3000.15"), 0.000001);
assertEquals(new BigDecimal("3000.15"), ((SingleValueConverter) en.lookupConverterForType(BigDecimal.class)).fromString("3000.15"));
assertEquals(3000.15f, (Float) ((SingleValueConverter) no.lookupConverterForType(Float.TYPE)).fromString("3000,15"), 0.000001);
}
@Test
public void shouldTransformPatternWithFlags() {
Pattern expected = Pattern.compile("hello", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Pattern actual = (Pattern) ((SingleValueConverter) en.lookupConverterForType(Pattern.class)).fromString("/hello/im");
assertEquals(expected.pattern(), actual.pattern());
assertEquals(expected.flags(), actual.flags());
}
@Test
public void shouldTransformPatternWithoutFlags() {
Pattern expected = Pattern.compile("hello");
Pattern actual = (Pattern) ((SingleValueConverter) en.lookupConverterForType(Pattern.class)).fromString("hello");
assertEquals(expected.pattern(), actual.pattern());
assertEquals(expected.flags(), actual.flags());
}
@Test
public void shouldIncludeSlashesInPatternWhenThereAreNoFlags() {
Pattern expected = Pattern.compile("/hello/");
Pattern actual = (Pattern) ((SingleValueConverter) en.lookupConverterForType(Pattern.class)).fromString("/hello/");
assertEquals(expected.pattern(), actual.pattern());
assertEquals(expected.flags(), actual.flags());
}
@Test
public void shouldTransformToTypeWithStringCtor() {
SingleValueConverter c = ((DynamicClassBasedSingleValueConverter) en.lookupConverterForType(MyClass.class)).converterForClass(MyClass.class);
assertEquals("X", ((MyClass) c.fromString("X")).s);
}
@Test
public void shouldTransformToTypeWithObjectCtor() {
SingleValueConverter c = ((DynamicClassBasedSingleValueConverter) en.lookupConverterForType(MyOtherClass.class)).converterForClass(MyOtherClass.class);
assertEquals("X", ((MyOtherClass) c.fromString("X")).o);
}
public static class MyClass {
public final String s;
public MyClass(String s) {
this.s = s;
}
}
public static class MyOtherClass {
public final Object o;
public MyOtherClass(Object o) {
this.o = o;
}
}
}