package org.osgl.util; import org.junit.Test; import org.osgl.TestBase; import static org.osgl.util.StringValueResolver.predefined; public abstract class StringValueResolverTest extends TestBase { public abstract static class PredefinedTest { private final StringValueResolver _p; private final StringValueResolver _r; private final Object empty; protected PredefinedTest(Class primitive, Class reference, Object empty) { _p = predefined(primitive); _r = predefined(reference); this.empty = empty; } @Test public void testEmptyStr() { eq(empty, _p.resolve("")); assertNull(_r.resolve("")); } protected void verify(Object expected, String s) { eq(expected, _p.resolve(s)); eq(expected, _r.resolve(s)); } protected void verifyException(Class<? extends Exception> expected, String s) { try { _p.resolve(s); assertFalse(S.fmt("Expection %s expected", expected), true); } catch (Exception e) { if (!expected.isAssignableFrom(e.getClass())) { assertFalse(S.fmt("Expection %s expected, found: %s", expected, e.getClass()), true); } } try { _r.resolve(s); assertFalse(S.fmt("Expection %s expected", expected), true); } catch (Exception e) { if (!expected.isAssignableFrom(e.getClass())) { assertFalse(S.fmt("Expection %s expected, found: %s", expected, e.getClass()), true); } } } } public static class CharResolverTest extends PredefinedTest { public CharResolverTest() { super(char.class, Character.class, ' '); } @Test public void testBlankStr() { verify(' ', " "); } @Test public void testValid() { verify('a', "a"); } @Test public void testMultiByteChar() { verify('林', "林"); } @Test public void testMultiCharStr() { verify('H', "Hello"); } } public static class ByteResolverTest extends PredefinedTest { public ByteResolverTest() { super(byte.class, Byte.class, (byte)0); } @Test public void testValidStr() { verify((byte)127, "127"); } @Test public void testNegative() { verify((byte)-127, "-127"); } @Test public void testOutOfRange() { verifyException(NumberFormatException.class, "128"); } @Test public void testInvalidStr() { verifyException(NumberFormatException.class, "af3"); } } public static class ShortResolverTest extends PredefinedTest { public ShortResolverTest() { super(short.class, Short.class, (short)0); } @Test public void testValidStr() { verify((short)256, "256"); } @Test public void testNegative() { verify((short)-32768, "-32768"); } @Test public void testOutOfRange() { verifyException(NumberFormatException.class, "32768"); } @Test public void testInvalidStr() { verifyException(NumberFormatException.class, "ad032"); } } public static class IntResolverTest extends PredefinedTest { public IntResolverTest() { super(int.class, Integer.class, 0); } @Test public void testValidStr() { verify(5, "5"); } @Test public void testOutOfRange() { verifyException(NumberFormatException.class, (((Long)(((long)Integer.MAX_VALUE) + 1l)).toString())); } @Test public void testNegative() { verify(-342134, "-342134"); } @Test public void testWithRounding() { verify(6, "5.5"); verify(5, "5.4"); } @Test public void testInvalidStr() { verifyException(IllegalArgumentException.class, "$14"); } } public static class LongResolverTest extends PredefinedTest { public LongResolverTest() { super(long.class, Long.class, 0l); } @Test public void testValidStr() { verify(9999999999999l, "9999999999999"); } @Test public void testNegative() { verify(-1l, "-1"); } @Test public void testInvalidStr() { verifyException(NumberFormatException.class, "3dsf"); } } public static class FloatResolverTest extends PredefinedTest { public FloatResolverTest() { super(float.class, Float.class, 0f); } @Test public void testValidStr() { verify(342.34f, "342.34"); } @Test public void testNegative() { verify(-32.120f, "-32.120"); } @Test public void testInvalidStr() { verifyException(NumberFormatException.class, "ac3d"); } } public static class DoubleResolverTest extends PredefinedTest { public DoubleResolverTest() { super(double.class, Double.class, 0d); } @Test public void testValidStr() { verify(342.3443242432d, "342.3443242432"); } @Test public void testNegative() { verify(-32.120d, "-32.120"); } @Test public void testInvalidStr() { verifyException(NumberFormatException.class, "ac3d"); } } public static class BooleanResolverTest extends PredefinedTest { public BooleanResolverTest() { super(boolean.class, Boolean.class, false); } @Test public void testValidStr() { verify(false, "False"); verify(true, "tRue"); verify(false, "abc"); } } }