blob: 1e861a37673296ca9737922d4d8cfc512b6dc034 [file] [log] [blame]
package groovy
/**
* Basic NumberMath test.
* @see org.codehaus.groovy.runtime.NumberMath
*/
class NumberMathTest extends GroovyTestCase {
void testPromotions() {
def C = '1'.toCharacter();
def B = new Byte("1");
def I = new Integer(1);
def L = new Long(1);
def F = new Float("1.0");
def D = new Double("1.0");
def BI = new BigInteger("1");
def BD = new BigDecimal("1.0");
//+, -, and * all promote the same way, so sample the matrix
assert C+B instanceof Integer;
assert C-BD instanceof BigDecimal;
assert B+F instanceof Double;
assert B+I instanceof Integer;
assert I+I instanceof Integer;
assert I-F instanceof Double;
assert I*D instanceof Double;
assert I+BI instanceof BigInteger;
assert I-BD instanceof BigDecimal;
assert F*L instanceof Double;
assert D+L instanceof Double;
assert BI-L instanceof BigInteger;
assert BD*L instanceof BigDecimal;
assert F+F instanceof Double;
assert F-BI instanceof Double;
assert F*BD instanceof Double;
assert F+D instanceof Double;
assert BI-D instanceof Double;
assert BD*D instanceof Double;
assert BI+BI instanceof BigInteger;
assert BD-BI instanceof BigDecimal;
assert BD*BD instanceof BigDecimal;
//Division (/) promotes differently so change the expected results:
assert I/I instanceof BigDecimal;
assert I/F instanceof Double;
assert I/D instanceof Double;
assert I/BI instanceof BigDecimal;
assert I/BD instanceof BigDecimal;
assert F/L instanceof Double;
assert D/L instanceof Double;
assert BI/L instanceof BigDecimal;
assert BD/L instanceof BigDecimal;
assert F/F instanceof Double;
assert F/BI instanceof Double;
assert F/BD instanceof Double;
assert F/D instanceof Double;
assert BI/D instanceof Double;
assert BD/D instanceof Double;
assert BI/BI instanceof BigDecimal;
assert BD/BI instanceof BigDecimal;
assert BD/BD instanceof BigDecimal;
}
void testOperations() {
def I1 = new Integer(1);
def I2 = new Integer(2);
def I3 = new Integer(3);
def L1 = new Long(1);
def L2 = new Long(2);
def L3 = new Long(3);
def F1 = new Float("1.0");
def F2 = new Float("2.0");
def D1 = new Double("1.0");
def D2 = new Double("2.0");
def BI1 = new BigInteger("1");
def BI2 = new BigInteger("2");
def BD1 = new BigDecimal("1.0");
def BD2 = new BigDecimal("2.0");
def BD20 = new BigDecimal("2.00");
assert I1/I2 instanceof BigDecimal;
assert I1/I2 == new BigDecimal("0.5");
assert I1.intdiv(I2) instanceof Integer;
assert I1.intdiv(I2) == 0;
assert I3.intdiv(I2) instanceof Integer;
assert I3.intdiv(I2) == 1;
assert L1.intdiv(I2) instanceof Long;
assert L1.intdiv(I2) == 0;
assert L3.intdiv(L2) instanceof Long;
assert L3.intdiv(L2) == 1;
assert BI1.intdiv(BI2) instanceof BigInteger;
assert BI1.intdiv(BI2) == 0;
assert I1/I3 instanceof BigDecimal;
assert I1/I3 == new BigDecimal("0.3333333333");
assert I2/I3 instanceof BigDecimal;
assert I2/I3 == new BigDecimal("0.6666666667");
assert I1/BD2 instanceof BigDecimal;
//Test keeping max scale of (L, R or 10)
def BBD1 = new BigDecimal("0.12345678901234567");
assert BD1 + BBD1 == new BigDecimal("1.12345678901234567");
def BBD2 = new BigDecimal(".000000000000000008");
assert BBD1 + BBD2 == new BigDecimal("0.123456789012345678");
}
void testUnsupportedIntDivision() {
try {
1.0 .intdiv(3);
} catch (UnsupportedOperationException uoe) {
return
}
fail("Should catch an UnsupportedOperationException")
try {
1.0G .intdiv(3);
} catch (UnsupportedOperationException uoe) {
return
}
fail("Should catch an UnsupportedOperationException")
}
}