AmountTests.swift (7649B)
1 /* 2 * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. 3 * See LICENSE.md 4 */ 5 import XCTest 6 @testable import taler_swift 7 8 class AmountTests: XCTestCase { 9 func testParsing() { 10 var str = "TESTKUDOS:23.42" 11 var amt = try! Amount(fromString: str) 12 XCTAssert(str == amt.description) 13 XCTAssert("TESTKUDOS" == amt.currencyStr) 14 XCTAssert(23 == amt.value) 15 XCTAssert(UInt64(0.42 * 1e8) == amt.fraction) 16 17 str = "EUR:500000000.00000001" 18 amt = try! Amount(fromString: str) 19 XCTAssert(str == amt.description) 20 XCTAssert("EUR" == amt.currencyStr) 21 XCTAssert(500000000 == amt.value) 22 XCTAssert(1 == amt.fraction) 23 24 str = "EUR:1500000000.00000003" 25 amt = try! Amount(fromString: str) 26 XCTAssert(str == amt.description) 27 XCTAssert("EUR" == amt.currencyStr) 28 XCTAssert(1500000000 == amt.value) 29 XCTAssert(3 == amt.fraction) 30 31 let maxValue = 4503599627370496 // 16 significant digits are 1 too many for double 32 str = "TESTKUDOS123:\(maxValue).99999999" 33 amt = try! Amount(fromString: str) 34 XCTAssert(str == amt.description) 35 XCTAssert("TESTKUDOS123" == amt.currencyStr) 36 XCTAssert(Double(maxValue) == amt.value) 37 38 XCTAssertThrowsError(try Amount(fromString: "TESTKUDOS1234:\(maxValue).99999999")) 39 XCTAssertThrowsError(try Amount(fromString: "TESTKUDOS123:\(maxValue + 1).99999999")) 40 XCTAssertThrowsError(try Amount(fromString: "TESTKUDOS123:\(maxValue).999999990")) 41 XCTAssertThrowsError(try Amount(fromString: "TESTKUDOS:0,5")) 42 XCTAssertThrowsError(try Amount(fromString: "+TESTKUDOS:0.5")) 43 XCTAssertThrowsError(try Amount(fromString: "0.5")) 44 XCTAssertThrowsError(try Amount(fromString: ":0.5")) 45 XCTAssertThrowsError(try Amount(fromString: "EUR::0.5")) 46 XCTAssertThrowsError(try Amount(fromString: "EUR:.5")) 47 } 48 49 func testAddition() { 50 XCTAssert(try Amount(fromString: "EUR:1") + Amount(fromString: "EUR:1") == Amount(fromString: "EUR:2")) 51 XCTAssert(try Amount(fromString: "EUR:1.5") + Amount(fromString: "EUR:1.5") == Amount(fromString: "EUR:3")) 52 XCTAssert(try Amount(fromString: "EUR:500000000.00000001") + Amount(fromString: "EUR:0.00000001") == Amount(fromString: "EUR:500000000.00000002")) 53 XCTAssertThrowsError(try Amount(fromString: "EUR:1") + Amount(fromString: "USD:1")) 54 XCTAssertThrowsError(try Amount(fromString: "EUR:4503599627370496.99999999") + Amount(fromString: "EUR:4503599627370496.99999999")) 55 XCTAssertThrowsError(try Amount(fromString: "EUR:4000000000000000") + Amount(fromString: "EUR:4000000000000000")) 56 } 57 58 func testSubtraction() { 59 XCTAssert(try Amount(fromString: "EUR:1") - Amount(fromString: "EUR:1") == Amount(fromString: "EUR:0")) 60 XCTAssert(try Amount(fromString: "EUR:3") - Amount(fromString: "EUR:1.5") == Amount(fromString: "EUR:1.5")) 61 XCTAssert(try Amount(fromString: "EUR:500000000.00000002") - Amount(fromString: "EUR:0.00000001") == Amount(fromString: "EUR:500000000.00000001")) 62 XCTAssertThrowsError(try Amount(fromString: "EUR:3") - Amount(fromString: "USD:1.5")) 63 XCTAssertThrowsError(try Amount(fromString: "EUR:23.42") - Amount(fromString: "EUR:42.23")) 64 XCTAssertThrowsError(try Amount(fromString: "EUR:0.5") - Amount(fromString: "EUR:0.50000001")) 65 } 66 67 func testMultiplication() { 68 XCTAssert(try Amount(fromString: "EUR:2") * 1 == Amount(fromString: "EUR:2")) 69 XCTAssert(try Amount(fromString: "EUR:1") * 2 == Amount(fromString: "EUR:2")) 70 XCTAssert(try Amount(fromString: "EUR:1.5") * 3 == Amount(fromString: "EUR:4.5")) 71 XCTAssert(try Amount(fromString: "EUR:1.11") * 0 == Amount(fromString: "EUR:0")) 72 XCTAssert(try Amount(fromString: "EUR:1.11") * 1 == Amount(fromString: "EUR:1.11")) 73 XCTAssert(try Amount(fromString: "EUR:1.11") * 2 == Amount(fromString: "EUR:2.22")) 74 XCTAssert(try Amount(fromString: "EUR:1.11") * 3 == Amount(fromString: "EUR:3.33")) 75 XCTAssert(try Amount(fromString: "EUR:1.11") * 4 == Amount(fromString: "EUR:4.44")) 76 XCTAssert(try Amount(fromString: "EUR:1.11") * 5 == Amount(fromString: "EUR:5.55")) 77 XCTAssert(try Amount(fromString: "EUR:500000000.00000001") * 3 == Amount(fromString: "EUR:1500000000.00000003")) 78 XCTAssertThrowsError(try Amount(fromString: "4000000000000000") * 2) 79 } 80 81 func testDivision() { 82 XCTAssert(try Amount(fromString: "EUR:2") / 1 == Amount(fromString: "EUR:2")) 83 XCTAssert(try Amount(fromString: "EUR:2") / 2 == Amount(fromString: "EUR:1")) 84 XCTAssert(try Amount(fromString: "EUR:4.5") / 3 == Amount(fromString: "EUR:1.5")) 85 XCTAssert(try Amount(fromString: "EUR:0") / 5 == Amount(fromString: "EUR:0")) 86 XCTAssert(try Amount(fromString: "EUR:1.11") / 1 == Amount(fromString: "EUR:1.11")) 87 XCTAssert(try Amount(fromString: "EUR:2.22") / 2 == Amount(fromString: "EUR:1.11")) 88 XCTAssert(try Amount(fromString: "EUR:3.33") / 3 == Amount(fromString: "EUR:1.11")) 89 XCTAssert(try Amount(fromString: "EUR:4.44") / 4 == Amount(fromString: "EUR:1.11")) 90 XCTAssert(try Amount(fromString: "EUR:5.55") / 5 == Amount(fromString: "EUR:1.11")) 91 XCTAssert(try Amount(fromString: "EUR:1500000000.00000003") / 3 == Amount(fromString: "EUR:500000000.00000001")) 92 XCTAssert(try Amount(fromString: "EUR:0.00000003") / 2 == Amount(fromString: "EUR:0.00000001")) 93 XCTAssertThrowsError(try Amount(fromString: "EUR:1") / 0) 94 } 95 96 func testZero() { 97 XCTAssert(try Amount(fromString: "EUR") == Amount.zero(currency: "EUR")) 98 XCTAssert(Amount.zero(currency: "EUR").isZero) 99 XCTAssert(try Amount(fromString: "EUR:0").isZero) 100 XCTAssert(try Amount(fromString: "EUR:0.0").isZero) 101 XCTAssert(try Amount(fromString: "EUR:0.00000").isZero) 102 XCTAssert(try (Amount(fromString: "EUR:1.001") - Amount(fromString: "EUR:1.001")).isZero) 103 XCTAssert(try !Amount(fromString: "EUR:0.00000001").isZero) 104 XCTAssert(try !Amount(fromString: "EUR:1.0").isZero) 105 XCTAssert(try !Amount(fromString: "EUR:0001.0").isZero) 106 } 107 108 func testComparison() { 109 XCTAssert(try Amount(fromString: "EUR:0") <= Amount(fromString: "EUR:0")) 110 XCTAssert(try Amount(fromString: "EUR:0") <= Amount(fromString: "EUR:0.00000001")) 111 XCTAssert(try Amount(fromString: "EUR:0") < Amount(fromString: "EUR:0.00000001")) 112 XCTAssert(try Amount(fromString: "EUR:0") < Amount(fromString: "EUR:1")) 113 XCTAssert(try Amount(fromString: "EUR:0") == Amount(fromString: "EUR:0")) 114 XCTAssert(try Amount(fromString: "EUR:42") == Amount(fromString: "EUR:42")) 115 XCTAssert(try Amount(fromString: "EUR:42.00000001") == Amount(fromString: "EUR:42.00000001")) 116 XCTAssert(try Amount(fromString: "EUR:42.00000001") >= Amount(fromString: "EUR:42.00000001")) 117 XCTAssert(try Amount(fromString: "EUR:42.00000002") >= Amount(fromString: "EUR:42.00000001")) 118 XCTAssert(try Amount(fromString: "EUR:42.00000002") > Amount(fromString: "EUR:42.00000001")) 119 XCTAssert(try Amount(fromString: "EUR:0.00000002") > Amount(fromString: "EUR:0.00000001")) 120 XCTAssert(try Amount(fromString: "EUR:0.00000001") > Amount(fromString: "EUR:0")) 121 XCTAssert(try Amount(fromString: "EUR:2") > Amount(fromString: "EUR:1")) 122 XCTAssertThrowsError(try Amount(fromString: "EUR:0.5") < Amount(fromString: "USD:0.50000001")) 123 } 124 }