taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

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 }