package org.springframework.data.simpledb.attributeutil; import org.junit.Before; import org.junit.Test; import java.lang.reflect.Array; import java.math.BigDecimal; import java.text.ParseException; import java.util.Arrays; import java.util.Date; import java.util.List; import static org.junit.Assert.*; public class SimpleDBAttributeConverterTest { static class SampleEntity { int intField; float floatField; double doubleField; short shortField; long longField; byte byteField; boolean booleanField; Date dateField; } private SampleEntity domainEntity; @Before public void setUp() { domainEntity = new SampleEntity(); domainEntity.intField = Integer.MAX_VALUE; domainEntity.floatField = Float.MAX_VALUE; domainEntity.doubleField = Double.MAX_VALUE; domainEntity.shortField = Short.MAX_VALUE; domainEntity.longField = Long.MAX_VALUE; domainEntity.byteField = Byte.MAX_VALUE; domainEntity.booleanField = true; domainEntity.dateField = new Date(200); } private String toDomainFieldPrimitive(String value, Class<?> clazz) throws ParseException { return SimpleDBAttributeConverter.decodeToFieldOfType(value, clazz).toString(); } private String toSimpleDBAttributeValue(SampleEntity domainEntity, String fieldName) throws IllegalAccessException, NoSuchFieldException { return SimpleDBAttributeConverter.encode(domainEntity.getClass().getDeclaredField(fieldName).get(domainEntity)); } @Test public void toDomainFieldPrimitive_int_test() throws Exception { /* test positive */ String convertedValue = toSimpleDBAttributeValue(domainEntity, "intField"); assertNotNull(convertedValue); assertTrue(Integer.parseInt(toDomainFieldPrimitive(convertedValue, Integer.class)) == domainEntity.intField); /* test negative */ domainEntity.intField = Integer.MIN_VALUE; convertedValue = toSimpleDBAttributeValue(domainEntity, "intField"); assertNotNull(convertedValue); assertTrue(Integer.parseInt(toDomainFieldPrimitive(convertedValue, Integer.class)) == domainEntity.intField); } @Test public void toDomainFieldPrimitive_float_test() throws Exception { /* test positive */ String convertedValue = toSimpleDBAttributeValue(domainEntity, "floatField"); assertNotNull(convertedValue); assertTrue(Float.parseFloat(toDomainFieldPrimitive(convertedValue, Float.class)) == domainEntity.floatField); /* test negative */ /* TODO: Float.MIN_VALUE is not converted correctly */ domainEntity.floatField = Float.MIN_VALUE; convertedValue = toSimpleDBAttributeValue(domainEntity, "floatField"); assertNotNull(convertedValue); assertTrue(Float.parseFloat(toDomainFieldPrimitive(convertedValue, Float.class)) != domainEntity.floatField); domainEntity.floatField = Float.MIN_VALUE + 1; convertedValue = toSimpleDBAttributeValue(domainEntity, "floatField"); assertNotNull(convertedValue); assertTrue(Float.parseFloat(toDomainFieldPrimitive(convertedValue, Float.class)) == domainEntity.floatField); } @Test public void toDomainFieldPrimitive_double_test() throws Exception { /* test positive */ String convertedValue = toSimpleDBAttributeValue(domainEntity, "doubleField"); assertNotNull(convertedValue); assertTrue(Double.parseDouble(toDomainFieldPrimitive(convertedValue, Double.class)) == domainEntity.doubleField); /* test negative */ /* TODO: Double.MIN_VALUE is not converted correctly */ domainEntity.doubleField = Double.MIN_VALUE; convertedValue = toSimpleDBAttributeValue(domainEntity, "doubleField"); assertNotNull(convertedValue); assertTrue(Double.parseDouble(toDomainFieldPrimitive(convertedValue, Double.class)) != domainEntity.doubleField); domainEntity.doubleField = -0.000000000001d; convertedValue = toSimpleDBAttributeValue(domainEntity, "doubleField"); assertNotNull(convertedValue); assertTrue(Double.parseDouble(toDomainFieldPrimitive(convertedValue, Double.class)) == domainEntity.doubleField); } @Test public void toDomainFieldPrimitive_short_test() throws Exception { /* test positive */ String convertedValue = toSimpleDBAttributeValue(domainEntity, "shortField"); assertNotNull(convertedValue); assertTrue(Short.parseShort(toDomainFieldPrimitive(convertedValue, Short.class)) == domainEntity.shortField); /* test negative */ domainEntity.shortField = Short.MIN_VALUE; convertedValue = toSimpleDBAttributeValue(domainEntity, "shortField"); assertNotNull(convertedValue); assertTrue(Short.parseShort(toDomainFieldPrimitive(convertedValue, Short.class)) == domainEntity.shortField); } @Test public void toDomainFieldPrimitive_long_test() throws Exception { String convertedValue = toSimpleDBAttributeValue(domainEntity, "longField"); assertNotNull(convertedValue); assertTrue(Long.parseLong(toDomainFieldPrimitive(convertedValue, Long.class)) == domainEntity.longField); } @Test public void toDomainFieldPrimitive_byte_test() throws Exception { /* test positive */ String convertedValue = toSimpleDBAttributeValue(domainEntity, "byteField"); assertNotNull(convertedValue); assertTrue(Byte.parseByte(toDomainFieldPrimitive(convertedValue, Byte.class)) == domainEntity.byteField); /* test negative */ domainEntity.byteField = Byte.MIN_VALUE; convertedValue = toSimpleDBAttributeValue(domainEntity, "byteField"); assertNotNull(convertedValue); assertTrue(Byte.parseByte(toDomainFieldPrimitive(convertedValue, Byte.class)) == domainEntity.byteField); } @Test public void toDomainFieldPrimitive_boolean_test() throws Exception { String convertedValue = toSimpleDBAttributeValue(domainEntity, "booleanField"); assertNotNull(convertedValue); assertTrue(Boolean.parseBoolean(toDomainFieldPrimitive(convertedValue, Boolean.class)) == domainEntity.booleanField); } /* ********************* individually test converter methods ********************** */ @Test public void test_encode_int_value_number_of_digits() { int x = 1, numberOfDigits = 11; BigDecimal bdx = new BigDecimal(x); String encoded = AmazonSimpleDBUtil.encodeRealNumberRange(bdx, numberOfDigits, new BigDecimal(Integer.MIN_VALUE).negate()); assertEquals(numberOfDigits, encoded.length()); x = 1; numberOfDigits = 20; bdx = new BigDecimal(x); encoded = AmazonSimpleDBUtil.encodeRealNumberRange(bdx, numberOfDigits, new BigDecimal(Integer.MIN_VALUE).negate()); assertEquals(numberOfDigits, encoded.length()); } @Test public void test_encode_and_decode_long() { long x; x = 209323021234234498L; encodeAndDecode(x); x = Long.MAX_VALUE; encodeAndDecode(x); x = Long.MIN_VALUE; encodeAndDecode(x); } @Test public void test_encode_and_decode_double() { double x; x = 500.0; encodeAndDecode(x); x = 20932304234498.039; encodeAndDecode(x); x = Double.MAX_VALUE; encodeAndDecode(x); /* * Does not work x = Double.MIN_VALUE; encodeAndDecode(x); */ x = -209323021234234498.902938903849082349; encodeAndDecode(x); } @Test public void test_encode_and_decode_big_decimal() { BigDecimal x; x = new BigDecimal("20932304234498.039"); encodeAndDecode(x); x = new BigDecimal("-209323021234234498.902938903849082349"); encodeAndDecode(x); } @Test public void toSimpleDBAttributeValues_should_return_an_string_representation_of_concatenated_array_elements() throws ParseException { final int[] expectedIntArray = { 1, 2, 3, 4 }; final List<String> simpleDBValues = Arrays.asList("1", "2", "3", "4"); Object returnedPrimitiveCol = SimpleDBAttributeConverter.decodeToPrimitiveArray(simpleDBValues, int.class); int arrayLength = Array.getLength(returnedPrimitiveCol); for(int idx = 0; idx < arrayLength; idx++) { assertEquals(expectedIntArray[idx], Array.get(returnedPrimitiveCol, idx)); } } @Test public void encode_decode_primitive_arrays() throws ParseException { int[] someInts = { 1, 2, 3, 4 }; List<String> returnedMappedAttributeValues = SimpleDBAttributeConverter.encodeArray(someInts); Object returnedPrimitiveCol = SimpleDBAttributeConverter.decodeToPrimitiveArray(returnedMappedAttributeValues, int.class); int arrayLength = Array.getLength(returnedPrimitiveCol); for(int idx = 0; idx < arrayLength; idx++) { assertEquals(someInts[idx], Array.get(returnedPrimitiveCol, idx)); } } @Test public void encode_decode_core_type() throws ParseException { Object date = new Date(1); String encodedDate = SimpleDBAttributeConverter.encode(date); Object decodedDate = SimpleDBAttributeConverter.decodeToFieldOfType(encodedDate, Date.class); assertEquals(date, decodedDate); } private void encodeAndDecode(double x) { encodeAndDecode(new BigDecimal(x)); } private void encodeAndDecode(long x) { String encoded; BigDecimal bgdecoded; BigDecimal bdx = new BigDecimal(x); encoded = AmazonSimpleDBUtil.encodeRealNumberRange(bdx, 20, new BigDecimal(Long.MIN_VALUE).negate()); bgdecoded = AmazonSimpleDBUtil.decodeRealNumberRange(encoded, new BigDecimal(Long.MIN_VALUE).negate()); assertEquals(bdx, bgdecoded); } private void encodeAndDecode(BigDecimal bdx) { String encoded; BigDecimal bgdecoded; encoded = AmazonSimpleDBUtil.encodeRealNumberRange(bdx, 20, 20, new BigDecimal(Long.MIN_VALUE).negate()); bgdecoded = AmazonSimpleDBUtil.decodeRealNumberRange(encoded, 20, new BigDecimal(Long.MIN_VALUE).negate()); assertTrue(bdx.compareTo(bgdecoded) == 0); } }