@SuppressWarnings("boxing")
  private void cipEqu(Number actual, Number expected, int flags) {
    Number res = OverloadedNumberUtil.addFallbackType(actual, flags);
    assertEquals(expected.getClass(), res.getClass());
    assertEquals(expected, res);

    // Some number types wrap the number with multiple types and equals() only compares one of them.
    // So we try to
    // catch any inconsistency:
    assertEquals(expected.byteValue(), res.byteValue());
    assertEquals(expected.shortValue(), res.shortValue());
    assertEquals(expected.intValue(), res.intValue());
    assertEquals(expected.longValue(), res.longValue());
    assertEquals(expected.floatValue(), res.floatValue());
    assertEquals(expected.doubleValue(), res.doubleValue());
  }
  public void testGetArgumentConversionPrice() {
    // Unknown number types:
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(RationalNumber.class, Integer.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, RationalNumber.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(RationalNumber.class, Float.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(Float.class, RationalNumber.class));
    assertEquals(
        0,
        OverloadedNumberUtil.getArgumentConversionPrice(
            RationalNumber.class, RationalNumber.class));

    // Fully check some rows (not all of them; the code is generated anyways):

    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, Byte.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, Short.class));
    assertEquals(0, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, Integer.class));
    assertEquals(10004, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, Long.class));
    assertEquals(
        10005, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, BigInteger.class));
    assertEquals(
        30006, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, Float.class));
    assertEquals(
        20007, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, Double.class));
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, BigDecimal.class));

    assertEquals(
        45001, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, Byte.class));
    assertEquals(
        44002, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, Short.class));
    assertEquals(
        41003, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, Integer.class));
    assertEquals(
        41004, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, Long.class));
    assertEquals(
        40005, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, BigInteger.class));
    assertEquals(
        33006, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, Float.class));
    assertEquals(
        32007, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, Double.class));
    assertEquals(
        0, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, BigDecimal.class));

    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, Byte.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, Short.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, Integer.class));
    assertEquals(
        21004,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, Long.class));
    assertEquals(
        21005,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, BigInteger.class));
    assertEquals(
        40006,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, Float.class));
    assertEquals(
        0,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, Double.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, BigDecimal.class));

    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, Byte.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, Short.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, Integer.class));
    assertEquals(
        Integer.MAX_VALUE,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, Long.class));
    assertEquals(
        0,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, BigInteger.class));
    assertEquals(
        40006,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, Float.class));
    assertEquals(
        20007,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, Double.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, BigDecimal.class));

    // Check if all fromC is present:
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Byte.class, BigDecimal.class));
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Short.class, BigDecimal.class));
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Integer.class, BigDecimal.class));
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Long.class, BigDecimal.class));
    assertEquals(
        10008, OverloadedNumberUtil.getArgumentConversionPrice(BigInteger.class, BigDecimal.class));
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Float.class, BigDecimal.class));
    assertEquals(
        20008, OverloadedNumberUtil.getArgumentConversionPrice(Double.class, BigDecimal.class));
    assertEquals(
        0, OverloadedNumberUtil.getArgumentConversionPrice(BigDecimal.class, BigDecimal.class));
    assertEquals(
        0,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.IntegerBigDecimal.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrFloat.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.FloatOrByte.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrShort.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.FloatOrByte.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.FloatOrShort.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.FloatOrInteger.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrByte.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrIntegerOrFloat.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrInteger.class, BigDecimal.class));
    assertEquals(
        20008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.DoubleOrLong.class, BigDecimal.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrByte.class, BigDecimal.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrShort.class, BigDecimal.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrInteger.class, BigDecimal.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrLong.class, BigDecimal.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrFloat.class, BigDecimal.class));
    assertEquals(
        10008,
        OverloadedNumberUtil.getArgumentConversionPrice(
            OverloadedNumberUtil.BigIntegerOrDouble.class, BigDecimal.class));
  }