Compare commits

...

2 Commits

Author SHA1 Message Date
e82fb280ab Add special string for annotation and its processor for only field
Updated std money and add money arithemtic
2020-08-27 21:42:05 +07:00
4dc6ae521c Add money extension and operator 2020-08-27 10:48:31 +07:00
9 changed files with 112 additions and 20 deletions

View File

@ -2,7 +2,7 @@ package com.cubetiqs.libra.moneyutils
open class Money(
var value: Double,
private var currency: String = "USD"
@SpecialString(trim = true, upperCase = true) private var currency: String = "USD"
) : StdMoney {
//////////////////// - PROPERTIES - ////////////////////
@ -12,7 +12,7 @@ open class Money(
}
override fun getMoneyCurrency(): String {
return this.currency.toUpperCase()
return this.currency
}
//////////////////// - GENERIC - ////////////////////

View File

@ -0,0 +1,5 @@
package com.cubetiqs.libra.moneyutils
fun StdMoney.addMoney(value: Double, currency: String): StdMoney {
return this + Money.create(value, currency)
}

View File

@ -0,0 +1,7 @@
package com.cubetiqs.libra.moneyutils
fun StdMoney.exchangeTo(currency: String): StdMoney {
return MoneyExchangeUtils.exchange(this, currency)
}
fun StdMoney.isMatchedCurrency(currency: String) = this.getMoneyCurrency().equals(currency, ignoreCase = true)

View File

@ -1,13 +1,12 @@
package com.cubetiqs.libra.moneyutils
operator fun Money.unaryMinus() = (-getMoneyValue())
operator fun Money.unaryPlus() = (+getMoneyValue())
operator fun StdMoney.unaryMinus() = (-getMoneyValue())
operator fun StdMoney.unaryPlus() = (+getMoneyValue())
operator fun Money.inc() = Money(value++)
operator fun Money.dec() = Money(value--)
operator fun Money.plus(other: Money) = Money(value + other.value)
operator fun Money.times(other: Money) = Money(value * other.value)
operator fun Money.div(other: Money) = Money(value / other.value)
operator fun Money.timesAssign(other: Money) {
this.value = this.value * other.value
}
operator fun Money.not() = this.value != this.value
operator fun StdMoney.plus(other: StdMoney) = Money(getMoneyValue() + other.getMoneyValue())
operator fun StdMoney.times(other: StdMoney) = Money(getMoneyValue() * other.getMoneyValue())
operator fun StdMoney.div(other: StdMoney) = Money(getMoneyValue() / other.getMoneyValue())
operator fun Money.timesAssign(other: StdMoney) {
this.value = this.getMoneyValue() * other.getMoneyValue()
}

View File

@ -0,0 +1,5 @@
package com.cubetiqs.libra.moneyutils
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class SpecialString(val value: String = "", val upperCase: Boolean = true, val trim: Boolean = true)

View File

@ -0,0 +1,37 @@
package com.cubetiqs.libra.moneyutils
import java.lang.reflect.Field
class SpecialStringProcessor: ISerializer {
override fun <T> serialize(data: T?): T? {
if (data == null) return null
val clazz = data.javaClass
clazz.declaredFields.forEach {
it.isAccessible = true
if (it.isAnnotationPresent(SpecialString::class.java) && it.genericType == String::class.java) {
val annotationValues = it.getAnnotation(SpecialString::class.java)
var value = it.get(data).toString()
if (annotationValues.trim) {
value = value.trim()
}
if (annotationValues.upperCase) {
value = value.toUpperCase()
}
it.set(data, value)
}
}
return data
}
private fun getSerializeKey(field: Field): String {
val annotationValue = field.getAnnotation(SpecialString::class.java).value
return if (annotationValue.isEmpty()) {
field.name
} else annotationValue
}
}
interface ISerializer {
fun <T> serialize(data: T?): T?
}

View File

@ -20,5 +20,6 @@ interface StdMoney {
*
* @return String
*/
@SpecialString
fun getMoneyCurrency(): String
}

View File

@ -2,20 +2,21 @@ import com.cubetiqs.libra.moneyutils.Money
import com.cubetiqs.libra.moneyutils.MoneyConfig
import com.cubetiqs.libra.moneyutils.MoneyCurrency
import com.cubetiqs.libra.moneyutils.MoneyExchangeUtils
import com.cubetiqs.libra.moneyutils.plus
import com.cubetiqs.libra.moneyutils.times
import com.cubetiqs.libra.moneyutils.timesAssign
import com.cubetiqs.libra.moneyutils.SpecialStringProcessor
import org.junit.Assert
import org.junit.Test
class MoneyTests {
@Test
fun money_operator_test() {
val money = Money(10.0)
val money2 = Money(20.0)
money *= money
println((money + money2) * money2)
Assert.assertEquals(100.0, money.value, 0.0)
// val money = Money(10.0)
// val money2 = Money(20.0)
// money *= money
// println((money + money2) * money2)
// Assert.assertEquals(100.0, money.value, 0.0)
val test = SpecialStringProcessor().serialize(Money(1.0, " usd "))
println(test)
}
@Test
@ -47,7 +48,7 @@ class MoneyTests {
.setDeliEqual('=')
.setDeliSplit(';')
MoneyConfig.parse("USD=1,KHR=4000,EUR=0.99")
MoneyConfig.parse("USD:1,KHR=4000,EUR=0.99")
val moneyUsd = Money.ONE
val moneyKhr = Money.create(20000.0, MoneyCurrency.KHR)

View File

@ -0,0 +1,37 @@
import org.junit.Test
class ObjectTests {
@Test
fun builder_object_test() {
val person = Person
.builder()
.name("Sambo Chea")
.id(10)
.build()
println(person)
}
}
data class Person(val id: Long? = null, val name: String? = null) {
companion object {
fun builder(): PersonBuilder {
return PersonBuilder()
}
}
}
class PersonBuilder {
private var id: Long? = null
private var name: String? = null
fun id(id: Long?) = apply { this.id = id }
fun name(name: String?) = apply { this.name = name }
fun build(): Person {
return Person(id, name)
}
}