package jstellarapi.serialization; import static org.junit.Assert.*; import java.math.BigDecimal; import java.nio.ByteBuffer; import javax.xml.bind.DatatypeConverter; import jstellarapi.core.DenominatedIssuedCurrency; import jstellarapi.core.StellarAddress; import jstellarapi.serialization.StellarBinarySerializer; import org.junit.Test; public class ReferenceImplementationAmountTests { StellarBinarySerializer ser = new StellarBinarySerializer(); // @Test // public void testSerializing0STR() throws Exception { // DenominatedIssuedCurrency amt = new DenominatedIssuedCurrency(BigDecimal.ZERO); // String s = ser.writeAmount(null, amt); // assertEquals("4000000000000000", s); // assertEquals(Amount.cPosNative.toString(16), s); // } // @Test public void testSerializingNegativeIOU() throws Exception { // DenominatedIssuedCurrency amount = new DenominatedIssuedCurrency("-99.2643419677474", StellarAddress.Stellar_ADDRESS_NEUTRAL, "USD"); // // assertEquals(13, amount.amount.scale()); // assertTrue(amount.isNegative()); // assertFalse(amount.isNative()); // assertEquals("-99.2643419677474/USD/rrrrrrrrrrrrrrrrrrrrBZbvji", amount.toString()); // ByteBuffer output=ByteBuffer.allocate(48); // ser.writeAmount(output, amount); // String hex = DatatypeConverter.printHexBinary(output.array()); // String expectedHex = "94E3440A102F5F5400000000000000000000000055534400000000000000000000000000000000000000000000000001"; // assertEquals(expectedHex, hex); } // // @Test // public void testSTRIOULegacySupport() throws Exception { // String json = "{\n" + // " \"currency\": \"0000000000000000000000005852500000000000\",\n" + // " \"issuer\": \"rrrrrrrrrrrrrrrrrrrrBZbvji\",\n" + // " \"value\": \"0\"\n" + // "}"; // // Amount amount = ser.fromJSONObject(new JSONObject(json)); // assertEquals("STR", amount.currencyString()); // assertFalse(amount.isNative); // // JSONObject jsonObject = ser.toJSONObject(amount); // Amount rebuilt = ser.fromJSONObject(jsonObject); // assertEquals(amount, rebuilt); // // byte[] a1bytes = ser.toWireBytes(amount); // byte[] a2bytes = ser.toWireBytes(rebuilt); // // boolean equals = Arrays.equals(a1bytes, a2bytes); // assertTrue(equals); // // // String legacy = "{\n" + // " \"currency\": \"0000000000000000000000005852500000000000\",\n" + // " \"issuer\": \"rrrrrrrrrrrrrrrrrrrrBZbvji\",\n" + // //rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh // " \"value\": \"0\"\n" + // " }\n" + // " \n" + // ""; // String expected_hex = "800000000000000000000000000000000000000058525000000000000000000000000000000000000000000000000001"; // // Amount legacyAmount = ser.fromJSONObject(new JSONObject(legacy)); // assertEquals(expected_hex, ser.toWireHex(legacyAmount)); // // } // // @Test // public void test_Decimal_Parsing() { // assertEquals(0, amt("1.0").compareTo(amt("1000000"))); // assertEquals(0, amt("1").compareTo(amt("0.000001"))); // } // // // TODO: use a more specific Exception class // @Test(expected = RuntimeException.class) // public void tests_Mother_Fucker_Do_You_Write_Them() { // amt("-0.0001621621623423423234234234"); // } // // @Test // public void test_Scale_Assumption() { // assertScale("1.0", 0); // assertScale("1.000", 0); // assertScale("1", 0); // } // // private void assertScale(String s, int i) { // BigDecimal bd = new BigDecimal(s); // bd = bd.stripTrailingZeros(); // assertEquals(bd.scale(), i); // } // // @Test // public void test_Decimal_Equality() { // /*This is something to watch log for! Must delegate to compareTo() !*/ // assertFalse(decimal("1.0").equals(decimal("1.00"))); // } // // private BigDecimal decimal(String s) { // return new BigDecimal(s); // } // @Test public void test_Offset() { assertOffset(".9999999999999999", -16); assertOffset("9.999999999999999", -15); assertOffset("99.99999999999999", -14); assertOffset("999.9999999999999", -13); assertOffset("9999.999999999999", -12); assertOffset("99999.99999999999", -11); assertOffset("999999.9999999999", -10); assertOffset("9999999.999999999", -9); assertOffset("99999999.99999999", -8); assertOffset("999999999.9999999", -7); assertOffset("9999999999.999999", -6); assertOffset("99999999999.99999", -5); assertOffset("999999999999.9999", -4); assertOffset("9999999999999.999", -3); assertOffset("99999999999999.99", -2); assertOffset("999999999999999.9", -1); // assertOffset(".9", -16 ); // // assertOffset("9", -15 ); // assertOffset("99", -14 ); // assertOffset("999", -13 ); // assertOffset("9999", -12 ); // assertOffset("99999", -11 ); // assertOffset("999999", -10 ); // assertOffset("9999999", -9 ); // assertOffset("99999999", -8 ); // assertOffset("999999999", -7 ); // assertOffset("9999999999", -6 ); // assertOffset("99999999999", -5 ); // assertOffset("999999999999", -4 ); // assertOffset("9999999999999", -3 ); // assertOffset("99999999999999", -2 ); // assertOffset("999999999999999", -1 ); // assertOffset("9999999999999999", 0 ); } private void assertOffset(String s, int i) { // DenominatedIssuedCurrency amt = new DenominatedIssuedCurrency(s, StellarAddress.Stellar_ADDRESS_NEUTRAL, "USD"); // assertEquals(String.format("Offset for %s should be %d", s, i), i, -amt.amount.scale()); } // public Amount a50 = amt("50/USD/root"); // on the fly, cached, `passphrase to address` // public Amount b20 = amt("20/USD"); // public Amount c5 = amt("5/USD"); // // @Test // public void test_Division() { // Amount d = a50.divide(b20).multiply(c5); // assertEquals("50/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", a50.stringRepr()); // assertEquals("12.5/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", d.stringRepr()); // } // // @Test // public void test_Addition() { // Amount d = a50.add(b20).add(c5); // assertEquals("75/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", d.stringRepr()); // assertEquals("80/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", d.add(new BigInteger("5")).stringRepr()); // assertEquals("80/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", d.add(5).stringRepr()); // } // // @Test // public void test_Min_Max() { // Amount d75 = a50.add(b20).add(c5); // // assertEquals(a50.min(b20), b20); // assertEquals(b20.min(c5), c5); // assertEquals(b20.max(d75), d75); // assertEquals(b20.max(c5), b20); // assertEquals(amt("-5/USD").max(c5), c5); // } // // @Test // public void test_Equals() { // assertTrue(a50.equals(amt("50/USD/root"))); // assertFalse(a50.equals(amt("50/USD/bob"))); // assertTrue(a50.equalsExceptIssuer(amt("50/USD/bob"))); // // } // // private static Amount amt(String s) { // return Amount.fromString(s); // } // // @Test // public void test_IOUParsing() { // assertEquals("USD", amt("1.0/USD").currencyString()); // Amount amount = amt("1.0/USD/" + TestFixtures.master_seed_address); // assertEquals("USD", amount.currencyString()); // assertEquals(TestFixtures.master_seed_address, amount.issuerString()); // assertEquals(false, amount.isNative); // } // // @Test(expected = EncodingFormatException.class) // public void test_IOUIssuer_Validation() { // amt("1.0/USD/" + TestFixtures.root_account + "F"); // } // // @Test(expected = RuntimeException.class) // public void test_Check_Whole() { // Amount.checkDropsValueWhole("1.0"); // } // // // @Test // public void test_Zero_USDEquals_Zero_USD() { // Amount a = amt("0/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("0/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertTrue(a.equals(b)); // } // @Test // public void test_Zero_USDEquals_Negative_Zero_USD() { // Amount a = amt("0/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("-0/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertTrue(a.equals(b)); // } // @Test // public void test_Zero_STREquals_Zero_STR() { // Amount a = amt("0"); // Amount b = amt("0.0"); // assertTrue(a.equals(b)); // } // @Test // public void test_Zero_STREquals_Negative_Zero_STR() { // Amount a = amt("0"); // Amount b = amt("-0"); // assertTrue(a.equals(b)); // } // @Test // public void test_10_USD_Equals_10_USD() { // Amount a = amt("10/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("10/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertTrue(a.equals(b)); // } // @Test // public void test_Equality_Of_USD_with_Fraction() { // Amount a = amt("123.4567/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("123.4567/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertTrue(a.equals(b)); // } // @Test // public void test_10_Drops_Equals_10_Drops() { // Amount a = amt("10"); // Amount b = amt("10"); // assertTrue(a.equals(b)); // } // @Test // public void test_Fractional_STR_Equality() { // Amount a = amt("1.1"); // Amount b = amt("11.0").divide(10); // assertTrue(a.equals(b)); // } // @Test // public void test_Equality_Ignoring_Issuer() { // Amount a = amt("0/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("0/USD/rH5aWQJ4R7v4Mpyf4kDBUvDFT5cbpFq3XP"); // assertTrue(a.equalsExceptIssuer(b)); // } // @Test // public void test_Trailing_Zeros_Equality_Ignoring_Issuer() { // Amount a = amt("1.1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("1.10/USD/rH5aWQJ4R7v4Mpyf4kDBUvDFT5cbpFq3XP"); // assertTrue(a.equalsExceptIssuer(b)); // } // @Test // public void test_IOU_Exponent_Mismatch() { // Amount a = amt("10/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("100/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertFalse(a.equals(b)); // } // @Test // public void test_STR_Exponent_Mismatch() { // Amount a = amt("10"); // Amount b = amt("100"); // assertFalse(a.equals(b)); // } // @Test // public void test_Mantissa_Mismatch_One_IOU_Not_Equaling_Two() { // Amount a = amt("1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("2/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertFalse(a.equals(b)); // } // @Test // public void test_Mantissa_Mismatch_One_STR_Not_Equaling_Two() { // Amount a = amt("1"); // Amount b = amt("2"); // assertFalse(a.equals(b)); // } // @Test // public void test_Mantissa_Mismatch_Fractional_IOU() { // Amount a = amt("0.1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("0.2/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertFalse(a.equals(b)); // } // // Sign mismatch // @Test // public void test_Negativity_In_Equality_For_IOU() { // Amount a = amt("1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("-1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertFalse(a.equals(b)); // } // @Test // public void test_Negativity_In_Equality_For_STR() { // Amount a = amt("1"); // Amount b = amt("-1"); // assertFalse(a.equals(b)); // } // @Test // public void test_Issuer_Derived_Inequality() { // Amount a = amt("1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("1/USD/rH5aWQJ4R7v4Mpyf4kDBUvDFT5cbpFq3XP"); // assertFalse(a.equals(b)); // } // @Test // public void test_Currency_Inequality() { // Amount a = amt("1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("1/EUR/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertFalse(a.equals(b)); // } // @Test // public void test_Same_Value_Yet_Native_Vs_IOU_Inequality() { // Amount a = amt("1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // Amount b = amt("1"); // assertFalse(a.equals(b)); // } // @Test // public void test_Same_Value_Yet_Native_Vs_IOU_Inequality_Operand_Switch() { // Amount a = amt("1"); // Amount b = amt("1/USD/rNDKeo9RrCiRdfsMG8AdoZvNZxHASGzbZL"); // assertFalse(a.equals(b)); // } // // @Test // public void test_Negate_native_123() { // assertEquals("-0.000123/STR", amt("123").negate().toTextFull()); // } // @Test // public void test_Negate_native_123_2() { // assertEquals("0.000123/STR", amt("-123").negate().toTextFull()); // } // @Test // public void test_Negate_non_native_123() { // assertEquals("-123/USD/" + rootAddress, amt("123/USD/root").negate().toTextFull()); // } // @Test // public void test_Negate_non_native_123_2() { // assertEquals("123/USD/" + rootAddress, amt("-123/USD/root").negate().toTextFull()); // } // // @Test //// public void test_Clone_non_native_123_3() { //// assertEquals("-123/USD/" + rootAddress, amt("-123/USD/root").clone().toTextFull()); //// } // @Test // public void test_Add_STR_to_STR() { // assertEquals("0.0002/STR", amt("150").add(amt("50")).toTextFull()); // } // @Test // public void test_Add_USD_to_USD() { // assertEquals("200.52/USD/" + rootAddress, amt("150.02/USD/root").add(amt("50.5/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_0_STR_with_0_STR() { // assertEquals("0/STR", amt("0").multiply(amt("0")).toTextFull()); // } // @Test // public void test_Multiply_0_USD_with_0_STR() { // assertEquals("0/USD/" + rootAddress, amt("0/USD/root").multiply(amt("0")).toTextFull()); // } // @Test // public void test_Multiply_0_STR_with_0_USD() { // assertEquals("0/STR", amt("0").multiply(amt("0/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_1_STR_with_0_STR() { // assertEquals("0/STR", amt("1").multiply(amt("0")).toTextFull()); // } // @Test // public void test_Multiply_1_USD_with_0_STR() { // assertEquals("0/USD/" + rootAddress, amt("1/USD/root").multiply(amt("0")).toTextFull()); // } // @Test // public void test_Multiply_1_STR_with_0_USD() { // assertEquals("0/STR", amt("1").multiply(amt("0/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_0_STR_with_1_STR() { // assertEquals("0/STR", amt("0").multiply(amt("1")).toTextFull()); // } // @Test // public void test_Multiply_0_USD_with_1_STR() { // assertEquals("0/USD/" + rootAddress, amt("0/USD/root").multiply(amt("1")).toTextFull()); // } // @Test // public void test_Multiply_0_STR_with_1_USD() { // assertEquals("0/STR", amt("0").multiply(amt("1/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_STR_with_USD() { // assertEquals("2000/STR", amt("200.0").multiply(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_STR_with_USD2() { // assertEquals("0.2/STR", amt("20000").multiply(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_STR_with_USD3() { // assertEquals("20/STR", amt("2000000").multiply(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_STR_with_USD_neg() { // assertEquals("-0.002/STR", amt("200").multiply(amt("-10/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_STR_with_USD_neg_frac() { // assertEquals("-0.222/STR", amt("-6000").multiply(amt("37/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_USD_with_USD() { // assertEquals("20000/USD/" + rootAddress, amt("2000/USD/root").multiply(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_USD_with_USD2() { // assertEquals("200000000000/USD/" + rootAddress, amt("2000000/USD/root").multiply(amt("100000/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_EUR_with_USD_result_1() { // assertEquals("100000/EUR/" + rootAddress, amt("100/EUR/root").multiply(amt("1000/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_EUR_with_USD_neg() { // assertEquals("-48000000/EUR/" + rootAddress, amt("-24000/EUR/root").multiply(amt("2000/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_EUR_with_USD_neg_1() { // assertEquals("-100/EUR/" + rootAddress, amt("0.1/EUR/root").multiply(amt("-1000/USD/root")).toTextFull()); // } // @Test // public void test_Multiply_EUR_with_STR_factor_1() { // assertEquals("100/EUR/" + rootAddress, amt("0.05/EUR/root").multiply(amt("2000")).toTextFull()); // } // @Test // public void test_Multiply_EUR_with_STR_neg() { // assertEquals("-500/EUR/" + rootAddress, amt("-100/EUR/root").multiply(amt("5")).toTextFull()); // } // @Test // public void test_Multiply_EUR_with_STR_neg_1() { // assertEquals("-100/EUR/" + rootAddress, amt("-0.05/EUR/root").multiply(amt("2000")).toTextFull()); // } // @Test // public void test_Multiply_STR_with_STR() { // assertEquals("0.0001/STR", amt("10").multiply(amt("10")).toTextFull()); // } // @Test // public void test_Divide_STR_by_USD() { // assertEquals("0.00002/STR", amt("200").divide(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Divide_STR_by_USD2() { // assertEquals("0.002/STR", amt("20000").divide(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Divide_STR_by_USD3() { // assertEquals("0.2/STR", amt("2000000").divide(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Divide_STR_by_USD_neg() { // assertEquals("-0.00002/STR", amt("200").divide(amt("-10/USD/root")).toTextFull()); // } // @Test // public void test_Divide_STR_by_USD_neg_frac() { // assertEquals("-0.000162/STR", amt("-6000").divide(amt("37/USD/root")).toTextFull()); // } // @Test // public void test_Divide_USD_by_USD() { // assertEquals("200/USD/" + rootAddress, amt("2000/USD/root").divide(amt("10/USD/root")).toTextFull()); // } // @Test // public void test_Divide_USD_by_USD_fractional() { // assertEquals("57142.85714285714/USD/" + rootAddress, amt("2000000/USD/root").divide(amt("35/USD/root")).toTextFull()); // } // @Test // public void test_Divide_USD_by_USD2() { // assertEquals("20/USD/" + rootAddress, amt("2000000/USD/root").divide(amt("100000/USD/root")).toTextFull()); // } // @Test // public void test_Divide_EUR_by_USD_factor_1() { // assertEquals("0.1/EUR/" + rootAddress, amt("100/EUR/root").divide(amt("1000/USD/root")).toTextFull()); // } // @Test // public void test_Divide_EUR_by_USD_neg() { // assertEquals("-12/EUR/" + rootAddress, amt("-24000/EUR/root").divide(amt("2000/USD/root")).toTextFull()); // } // @Test // public void test_Divide_EUR_by_USD_neg_1() { // assertEquals("-0.1/EUR/" + rootAddress, amt("100/EUR/root").divide(amt("-1000/USD/root")).toTextFull()); // } // @Test // public void test_Divide_EUR_by_STR_result_1() { // assertEquals("0.05/EUR/" + rootAddress, amt("100/EUR/root").divide(amt("2000")).toTextFull()); // } // @Test // public void test_Divide_EUR_by_STR_neg() { // assertEquals("-20/EUR/" + rootAddress, amt("-100/EUR/root").divide(amt("5")).toTextFull()); // } // @Test // public void test_Divide_EUR_by_STR_neg_1() { // assertEquals("-0.05/EUR/" + rootAddress, amt("-100/EUR/root").divide(amt("2000")).toTextFull()); // } // // @Test // public void test_Parse_native_0(){ // assertEquals("0/STR", amt("0").toTextFull()); // } // @Test // public void test_Parse_native_0_pt_0(){ // assertEquals("0/STR", amt("0.0").toTextFull()); // } // @Test // public void test_Parse_native_negative_0(){ // assertEquals("0/STR", amt("-0").toTextFull()); // } // @Test // public void test_Parse_native_negative_0_pt_0(){ // assertEquals("0/STR", amt("-0.0").toTextFull()); // } // @Test // public void test_Parse_native_1000_drops(){ // assertEquals("0.001/STR", amt("1000").toTextFull()); // } // @Test // public void test_Parse_native_12_pt_3(){ // assertEquals("12.3/STR", amt("12.3").toTextFull()); // } // @Test // public void test_Parse_native__12_pt_3(){ // assertEquals("-12.3/STR", amt("-12.3").toTextFull()); // } // @Test // public void test_Parse_123_trailing_pt_USD(){ // assertEquals("123/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", amt("123./USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh").toTextFull()); // } // @Test // public void test_Parse_12300_USD(){ // assertEquals("12300/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", amt("12300/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh").toTextFull()); // } // @Test // public void test_Parse_12_pt_3_USD(){ // assertEquals("12.3/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", amt("12.3/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh").toTextFull()); // } // @Test // public void test_Parse_1_pt_23_with_trailing_00_USD(){ // assertEquals("1.23/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", amt("1.2300/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh").toTextFull()); // } // @Test // public void test_Parse_negative_0_USD(){ // assertEquals("0/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", amt("-0/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh").toTextFull()); // } // @Test // public void test_Parse__0_pt_0_USD(){ // assertEquals("0/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", amt("-0.0/USD/rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh").toTextFull()); // } }