libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

AmountTest.kt (2897B)


      1 /*
      2  * This file is part of LibEuFin.
      3  * Copyright (C) 2024 Taler Systems S.A.
      4 
      5  * LibEuFin is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU Affero General Public License as
      7  * published by the Free Software Foundation; either version 3, or
      8  * (at your option) any later version.
      9 
     10  * LibEuFin is distributed in the hope that it will be useful, but
     11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
     13  * Public License for more details.
     14 
     15  * You should have received a copy of the GNU Affero General Public
     16  * License along with LibEuFin; see the file COPYING.  If not, see
     17  * <http://www.gnu.org/licenses/>
     18  */
     19 
     20 import org.junit.Test
     21 import tech.libeufin.common.TalerAmount
     22 import kotlin.test.assertEquals
     23 
     24 class AmountTest {
     25     @Test
     26     fun parse() {
     27         assertEquals(TalerAmount("EUR:4"), TalerAmount(4L, 0, "EUR"))
     28         assertEquals(TalerAmount("EUR:0.02"), TalerAmount(0L, 2000000, "EUR"))
     29         assertEquals(TalerAmount("EUR:4.12"), TalerAmount(4L, 12000000, "EUR"))
     30         assertEquals(TalerAmount("LOCAL:4444.1000"), TalerAmount(4444L, 10000000, "LOCAL"))
     31         assertEquals(TalerAmount("EUR:${TalerAmount.MAX_VALUE}.99999999"), TalerAmount(TalerAmount.MAX_VALUE, 99999999, "EUR"))
     32 
     33         assertException("Invalid amount format") {TalerAmount("")}
     34         assertException("Invalid amount format") {TalerAmount("EUR")}
     35         assertException("Invalid amount format") {TalerAmount("eur:12")}
     36         assertException("Invalid amount format") {TalerAmount(" EUR:12")}
     37         assertException("Invalid amount format") {TalerAmount("EUR:1.")}
     38         assertException("Invalid amount format") {TalerAmount("EUR:.1")}
     39         assertException("Invalid amount format") {TalerAmount("AZERTYUIOPQSD:12")}
     40         assertException("Value specified in amount is too large") {TalerAmount("EUR:${Long.MAX_VALUE}")}
     41         assertException("Invalid amount format") {TalerAmount("EUR:4.000000000")}
     42         assertException("Invalid amount format") {TalerAmount("EUR:4.4a")}
     43     }
     44 
     45     @Test
     46     fun parseRoundTrip() {
     47         for (amount in sequenceOf("EUR:4", "EUR:0.02", "EUR:4.12")) {
     48             assertEquals(amount, TalerAmount(amount).toString())
     49         }
     50     }
     51 
     52     @Test
     53     fun subCent() {
     54         for (ok in sequenceOf("EUR:1", "EUR:0.1", "EUR:0.01", "EUR:1.23")) {
     55             assert(!TalerAmount(ok).isSubCent())
     56         }
     57         for (subCent in sequenceOf("EUR:0.001", "EUR:1.001", "EUR:99.991", "EUR:0.0000012")) {
     58             assert(TalerAmount(subCent).isSubCent())
     59         }
     60     }
     61 
     62     fun assertException(msg: String, lambda: () -> Unit) {
     63         try {
     64             lambda()
     65             throw Exception("Expected failure")
     66         } catch (e: Exception) {
     67             assert(e.message!!.startsWith(msg)) { "${e.message}" }
     68         }
     69     }
     70 }