From 4311256bbfdcc051cc1bfc5874ea260ffe482b8e Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Tue, 22 Jul 2008 09:19:51 +0000 Subject: Added advanced conversion capability when setting query filter properties. This is used to ensure that BigDecimal values are properly normalized. --- .../java/com/amazon/carbonado/TestStorables.java | 53 +++++- .../carbonado/info/TestConversionComparator.java | 177 --------------------- .../carbonado/util/TestConversionComparator.java | 177 +++++++++++++++++++++ 3 files changed, 225 insertions(+), 182 deletions(-) delete mode 100644 src/test/java/com/amazon/carbonado/info/TestConversionComparator.java create mode 100644 src/test/java/com/amazon/carbonado/util/TestConversionComparator.java (limited to 'src') diff --git a/src/test/java/com/amazon/carbonado/TestStorables.java b/src/test/java/com/amazon/carbonado/TestStorables.java index 9d05056..a170409 100644 --- a/src/test/java/com/amazon/carbonado/TestStorables.java +++ b/src/test/java/com/amazon/carbonado/TestStorables.java @@ -3050,11 +3050,22 @@ public class TestStorables extends TestCase { s = query.with(BigInteger.ZERO).tryLoadOne(); assertEquals(null, s); + + s = storage.prepare(); + s.setId(3); + s.setNumber(BigInteger.ONE); + s.insert(); + + s = query.with(BigInteger.ONE).loadOne(); + assertEquals(BigInteger.ONE, s.getNumber()); + + s = query.with(1).loadOne(); + assertEquals(BigInteger.ONE, s.getNumber()); } public void test_BigDecimal() throws Exception { BigDecimal bd = new BigDecimal("12345678901234567890.1234567890"); - BigDecimal normalized = bd.stripTrailingZeros(); + BigDecimal normalized = expectedNormalization(bd); Storage storage = getRepository().storageFor(WithBigDecimal.class); @@ -3069,9 +3080,18 @@ public class TestStorables extends TestCase { s = storage.prepare(); s.setId(1); s.load(); - assertFalse(bd.equals(s.getNumber())); assertEquals(normalized, s.getNumber()); + { + s = storage.prepare(); + s.setId(1); + BigDecimal bd2 = new BigDecimal("123.0"); + s.setNumber(bd2); + assertFalse(s.tryInsert()); + // Verify that normalization is rolled back if insert fails. + assertEquals(bd2, s.getNumber()); + } + s = storage.prepare(); s.setId(2); s.setNumber(null); @@ -3088,11 +3108,10 @@ public class TestStorables extends TestCase { s = query.with(bd).loadOne(); assertEquals(1, s.getId()); - assertFalse(bd.equals(s.getNumber())); assertEquals(normalized, s.getNumber()); BigDecimal bd2 = new BigDecimal("123.0"); - BigDecimal nm2 = bd2.stripTrailingZeros(); + BigDecimal nm2 = expectedNormalization(bd2); s.setNumber(bd2); s.update(); @@ -3100,12 +3119,36 @@ public class TestStorables extends TestCase { // Ensure update behaves as if Storable was reloaded. assertEquals(nm2, s.getNumber()); + { + WithBigDecimal s2 = storage.prepare(); + s2.setId(999); + BigDecimal bd3 = new BigDecimal("123.0"); + s2.setNumber(bd3); + assertFalse(s2.tryUpdate()); + // Verify that normalization is rolled back if update fails. + assertEquals(bd3, s2.getNumber()); + } + s.load(); - assertFalse(bd2.equals(s.getNumber())); assertEquals(nm2, s.getNumber()); s = query.with(BigDecimal.ZERO).tryLoadOne(); assertEquals(null, s); + + s = storage.prepare(); + s.setId(3); + s.setNumber(BigDecimal.ONE); + s.insert(); + + s = query.with(BigDecimal.ONE).loadOne(); + assertEquals(BigDecimal.ONE, s.getNumber()); + + s = query.with(1).loadOne(); + assertEquals(BigDecimal.ONE, s.getNumber()); + } + + protected BigDecimal expectedNormalization(BigDecimal bd) { + return bd.stripTrailingZeros(); } private void assertUninitialized(boolean expected, Storable storable, String... properties) { diff --git a/src/test/java/com/amazon/carbonado/info/TestConversionComparator.java b/src/test/java/com/amazon/carbonado/info/TestConversionComparator.java deleted file mode 100644 index a4e5614..0000000 --- a/src/test/java/com/amazon/carbonado/info/TestConversionComparator.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2006 Amazon Technologies, Inc. or its affiliates. - * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks - * of Amazon Technologies, Inc. or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.amazon.carbonado.info; - -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Test cases for {@link ConversionComparator}. - * - * @author Brian S O'Neill - */ -public class TestConversionComparator extends TestCase { - private static final int BOOLEAN_CODE = 0; - private static final int BYTE_CODE = 1; - private static final int SHORT_CODE = 2; - private static final int CHAR_CODE = 3; - private static final int INT_CODE = 4; - private static final int FLOAT_CODE = 5; - private static final int LONG_CODE = 6; - private static final int DOUBLE_CODE = 7; - - private static final Class[] PRIMITIVE_CLASSES = { - boolean.class, byte.class, short.class, char.class, - int.class, float.class, long.class, double.class - }; - - private static final Class[] BOXED_PRIMITIVE_CLASSES = { - Boolean.class, Byte.class, Short.class, Character.class, - Integer.class, Float.class, Long.class, Double.class - }; - - // States which primitive conversions are allowed. - private static final boolean[][] PRIMITIVE_MATRIX = { - // from... - // boolean byte short char int float long double - { true, false, false, false, false, false, false, false }, // to boolean - { false, true, false, false, false, false, false, false }, // to byte - { false, true, true, false, false, false, false, false }, // to short - { false, false, false, true, false, false, false, false }, // to char - { false, true, true, false, true, false, false, false }, // to int - { false, true, true, false, false, true, false, false }, // to float - { false, true, true, false, true, false, true, false }, // to long - { false, true, true, false, true, true, false, true }, // to double - }; - - public static void main(String[] args) { - junit.textui.TestRunner.run(suite()); - } - - public static TestSuite suite() { - return new TestSuite(TestConversionComparator.class); - } - - public TestConversionComparator(String name) { - super(name); - } - - public void test_isConversionPossible_basics() { - ConversionComparator cc = new ConversionComparator(Object.class); - assertEquals(true, cc.isConversionPossible(Object.class)); - assertEquals(false, cc.isConversionPossible(String.class)); - assertEquals(false, cc.isConversionPossible(boolean.class)); - assertEquals(false, cc.isConversionPossible(Integer.class)); - assertEquals(false, cc.isConversionPossible(int.class)); - - cc = new ConversionComparator(String.class); - assertEquals(true, cc.isConversionPossible(Object.class)); - assertEquals(true, cc.isConversionPossible(String.class)); - assertEquals(false, cc.isConversionPossible(boolean.class)); - assertEquals(false, cc.isConversionPossible(Integer.class)); - assertEquals(false, cc.isConversionPossible(int.class)); - - cc = new ConversionComparator(boolean.class); - assertEquals(true, cc.isConversionPossible(Object.class)); - assertEquals(false, cc.isConversionPossible(String.class)); - assertEquals(true, cc.isConversionPossible(boolean.class)); - assertEquals(false, cc.isConversionPossible(Integer.class)); - assertEquals(false, cc.isConversionPossible(int.class)); - - cc = new ConversionComparator(Integer.class); - assertEquals(true, cc.isConversionPossible(Object.class)); - assertEquals(false, cc.isConversionPossible(String.class)); - assertEquals(false, cc.isConversionPossible(boolean.class)); - assertEquals(true, cc.isConversionPossible(Integer.class)); - assertEquals(true, cc.isConversionPossible(int.class)); - - cc = new ConversionComparator(int.class); - assertEquals(true, cc.isConversionPossible(Object.class)); - assertEquals(false, cc.isConversionPossible(String.class)); - assertEquals(false, cc.isConversionPossible(boolean.class)); - assertEquals(true, cc.isConversionPossible(Integer.class)); - assertEquals(true, cc.isConversionPossible(int.class)); - } - - public void test_isConversionPossible_primitives() { - test_isConversionPossible_primitives(false, false); - test_isConversionPossible_primitives(false, true); - test_isConversionPossible_primitives(true, false); - test_isConversionPossible_primitives(true, true); - } - - private void test_isConversionPossible_primitives(boolean fromBoxed, boolean toBoxed) { - for (int fromCode = BOOLEAN_CODE; fromCode <= DOUBLE_CODE; fromCode++) { - ConversionComparator cc = new ConversionComparator - (fromBoxed ? BOXED_PRIMITIVE_CLASSES[fromCode] : PRIMITIVE_CLASSES[fromCode]); - for (int toCode = BOOLEAN_CODE; toCode <= DOUBLE_CODE; toCode++) { - boolean expected = PRIMITIVE_MATRIX[toCode][fromCode]; - Class toType = toBoxed ? BOXED_PRIMITIVE_CLASSES[toCode] : PRIMITIVE_CLASSES[toCode]; - assertEquals(expected, cc.isConversionPossible(toType)); - } - } - } - - public void test_compare() { - ConversionComparator cc = new ConversionComparator(Object.class); - assertEquals(true, cc.compare(Object.class, String.class) < 0); - assertEquals(true, cc.compare(String.class, Object.class) > 0); - assertEquals(0, cc.compare(Object.class, Object.class)); - assertEquals(0, cc.compare(String.class, String.class)); - assertEquals(0, cc.compare(String.class, String.class)); - assertEquals(0, cc.compare(int.class, Number.class)); - - cc = new ConversionComparator(String.class); - assertEquals(true, cc.compare(String.class, Object.class) < 0); - assertEquals(true, cc.compare(Object.class, String.class) > 0); - assertEquals(0, cc.compare(String.class, String.class)); - assertEquals(true, cc.compare(int.class, String.class) > 0); - - cc = new ConversionComparator(Integer.class); - assertEquals(true, cc.compare(String.class, Object.class) > 0); - assertEquals(true, cc.compare(Object.class, String.class) < 0); - assertEquals(true, cc.compare(Object.class, Number.class) > 0); - assertEquals(true, cc.compare(Integer.class, Number.class) < 0); - assertEquals(true, cc.compare(int.class, Number.class) > 0); - assertEquals(true, cc.compare(long.class, Number.class) > 0); - assertEquals(true, cc.compare(long.class, Long.class) < 0); - - cc = new ConversionComparator(int.class); - assertEquals(true, cc.compare(String.class, Object.class) > 0); - assertEquals(true, cc.compare(Object.class, String.class) < 0); - assertEquals(true, cc.compare(Object.class, Number.class) > 0); - assertEquals(true, cc.compare(Integer.class, Number.class) < 0); - assertEquals(true, cc.compare(int.class, Number.class) < 0); - assertEquals(true, cc.compare(long.class, Number.class) < 0); - assertEquals(true, cc.compare(long.class, Long.class) < 0); - - cc = new ConversionComparator(Byte.class); - assertEquals(true, cc.compare(int.class, Number.class) > 0); - assertEquals(true, cc.compare(long.class, Number.class) > 0); - assertEquals(true, cc.compare(long.class, Integer.class) < 0); - - cc = new ConversionComparator(byte.class); - assertEquals(true, cc.compare(short.class, int.class) < 0); - assertEquals(true, cc.compare(long.class, int.class) > 0); - - cc = new ConversionComparator(java.util.Date.class); - assertEquals(true, cc.compare(Object.class, Comparable.class) > 0); - assertEquals(0, cc.compare(java.io.Serializable.class, Comparable.class)); - } -} diff --git a/src/test/java/com/amazon/carbonado/util/TestConversionComparator.java b/src/test/java/com/amazon/carbonado/util/TestConversionComparator.java new file mode 100644 index 0000000..bb4cb7f --- /dev/null +++ b/src/test/java/com/amazon/carbonado/util/TestConversionComparator.java @@ -0,0 +1,177 @@ +/* + * Copyright 2006 Amazon Technologies, Inc. or its affiliates. + * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks + * of Amazon Technologies, Inc. or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.amazon.carbonado.util; + +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Test cases for {@link ConversionComparator}. + * + * @author Brian S O'Neill + */ +public class TestConversionComparator extends TestCase { + private static final int BOOLEAN_CODE = 0; + private static final int BYTE_CODE = 1; + private static final int SHORT_CODE = 2; + private static final int CHAR_CODE = 3; + private static final int INT_CODE = 4; + private static final int FLOAT_CODE = 5; + private static final int LONG_CODE = 6; + private static final int DOUBLE_CODE = 7; + + private static final Class[] PRIMITIVE_CLASSES = { + boolean.class, byte.class, short.class, char.class, + int.class, float.class, long.class, double.class + }; + + private static final Class[] BOXED_PRIMITIVE_CLASSES = { + Boolean.class, Byte.class, Short.class, Character.class, + Integer.class, Float.class, Long.class, Double.class + }; + + // States which primitive conversions are allowed. + private static final boolean[][] PRIMITIVE_MATRIX = { + // from... + // boolean byte short char int float long double + { true, false, false, false, false, false, false, false }, // to boolean + { false, true, false, false, false, false, false, false }, // to byte + { false, true, true, false, false, false, false, false }, // to short + { false, false, false, true, false, false, false, false }, // to char + { false, true, true, false, true, false, false, false }, // to int + { false, true, true, false, false, true, false, false }, // to float + { false, true, true, false, true, false, true, false }, // to long + { false, true, true, false, true, true, false, true }, // to double + }; + + public static void main(String[] args) { + junit.textui.TestRunner.run(suite()); + } + + public static TestSuite suite() { + return new TestSuite(TestConversionComparator.class); + } + + public TestConversionComparator(String name) { + super(name); + } + + public void test_isConversionPossible_basics() { + ConversionComparator cc = new ConversionComparator(Object.class); + assertEquals(true, cc.isConversionPossible(Object.class)); + assertEquals(false, cc.isConversionPossible(String.class)); + assertEquals(false, cc.isConversionPossible(boolean.class)); + assertEquals(false, cc.isConversionPossible(Integer.class)); + assertEquals(false, cc.isConversionPossible(int.class)); + + cc = new ConversionComparator(String.class); + assertEquals(true, cc.isConversionPossible(Object.class)); + assertEquals(true, cc.isConversionPossible(String.class)); + assertEquals(false, cc.isConversionPossible(boolean.class)); + assertEquals(false, cc.isConversionPossible(Integer.class)); + assertEquals(false, cc.isConversionPossible(int.class)); + + cc = new ConversionComparator(boolean.class); + assertEquals(true, cc.isConversionPossible(Object.class)); + assertEquals(false, cc.isConversionPossible(String.class)); + assertEquals(true, cc.isConversionPossible(boolean.class)); + assertEquals(false, cc.isConversionPossible(Integer.class)); + assertEquals(false, cc.isConversionPossible(int.class)); + + cc = new ConversionComparator(Integer.class); + assertEquals(true, cc.isConversionPossible(Object.class)); + assertEquals(false, cc.isConversionPossible(String.class)); + assertEquals(false, cc.isConversionPossible(boolean.class)); + assertEquals(true, cc.isConversionPossible(Integer.class)); + assertEquals(true, cc.isConversionPossible(int.class)); + + cc = new ConversionComparator(int.class); + assertEquals(true, cc.isConversionPossible(Object.class)); + assertEquals(false, cc.isConversionPossible(String.class)); + assertEquals(false, cc.isConversionPossible(boolean.class)); + assertEquals(true, cc.isConversionPossible(Integer.class)); + assertEquals(true, cc.isConversionPossible(int.class)); + } + + public void test_isConversionPossible_primitives() { + test_isConversionPossible_primitives(false, false); + test_isConversionPossible_primitives(false, true); + test_isConversionPossible_primitives(true, false); + test_isConversionPossible_primitives(true, true); + } + + private void test_isConversionPossible_primitives(boolean fromBoxed, boolean toBoxed) { + for (int fromCode = BOOLEAN_CODE; fromCode <= DOUBLE_CODE; fromCode++) { + ConversionComparator cc = new ConversionComparator + (fromBoxed ? BOXED_PRIMITIVE_CLASSES[fromCode] : PRIMITIVE_CLASSES[fromCode]); + for (int toCode = BOOLEAN_CODE; toCode <= DOUBLE_CODE; toCode++) { + boolean expected = PRIMITIVE_MATRIX[toCode][fromCode]; + Class toType = toBoxed ? BOXED_PRIMITIVE_CLASSES[toCode] : PRIMITIVE_CLASSES[toCode]; + assertEquals(expected, cc.isConversionPossible(toType)); + } + } + } + + public void test_compare() { + ConversionComparator cc = new ConversionComparator(Object.class); + assertEquals(true, cc.compare(Object.class, String.class) < 0); + assertEquals(true, cc.compare(String.class, Object.class) > 0); + assertEquals(0, cc.compare(Object.class, Object.class)); + assertEquals(0, cc.compare(String.class, String.class)); + assertEquals(0, cc.compare(String.class, String.class)); + assertEquals(0, cc.compare(int.class, Number.class)); + + cc = new ConversionComparator(String.class); + assertEquals(true, cc.compare(String.class, Object.class) < 0); + assertEquals(true, cc.compare(Object.class, String.class) > 0); + assertEquals(0, cc.compare(String.class, String.class)); + assertEquals(true, cc.compare(int.class, String.class) > 0); + + cc = new ConversionComparator(Integer.class); + assertEquals(true, cc.compare(String.class, Object.class) > 0); + assertEquals(true, cc.compare(Object.class, String.class) < 0); + assertEquals(true, cc.compare(Object.class, Number.class) > 0); + assertEquals(true, cc.compare(Integer.class, Number.class) < 0); + assertEquals(true, cc.compare(int.class, Number.class) > 0); + assertEquals(true, cc.compare(long.class, Number.class) > 0); + assertEquals(true, cc.compare(long.class, Long.class) < 0); + + cc = new ConversionComparator(int.class); + assertEquals(true, cc.compare(String.class, Object.class) > 0); + assertEquals(true, cc.compare(Object.class, String.class) < 0); + assertEquals(true, cc.compare(Object.class, Number.class) > 0); + assertEquals(true, cc.compare(Integer.class, Number.class) < 0); + assertEquals(true, cc.compare(int.class, Number.class) < 0); + assertEquals(true, cc.compare(long.class, Number.class) < 0); + assertEquals(true, cc.compare(long.class, Long.class) < 0); + + cc = new ConversionComparator(Byte.class); + assertEquals(true, cc.compare(int.class, Number.class) > 0); + assertEquals(true, cc.compare(long.class, Number.class) > 0); + assertEquals(true, cc.compare(long.class, Integer.class) < 0); + + cc = new ConversionComparator(byte.class); + assertEquals(true, cc.compare(short.class, int.class) < 0); + assertEquals(true, cc.compare(long.class, int.class) > 0); + + cc = new ConversionComparator(java.util.Date.class); + assertEquals(true, cc.compare(Object.class, Comparable.class) > 0); + assertEquals(0, cc.compare(java.io.Serializable.class, Comparable.class)); + } +} -- cgit v1.2.3