diff --git a/src/main/java/guru/springframework/Bank.java b/src/main/java/guru/springframework/Bank.java new file mode 100644 index 00000000..587ddfed --- /dev/null +++ b/src/main/java/guru/springframework/Bank.java @@ -0,0 +1,11 @@ +package guru.springframework; + +public class Bank { + + Money reduce(Expression expr, String currency){ + return expr.reduce(currency); +// if (expr instanceof Money) return (Money) expr; +// Sum expressionCasted= (Sum) expr; +// return expressionCasted.reduce(currency); + } +} diff --git a/src/main/java/guru/springframework/Expression.java b/src/main/java/guru/springframework/Expression.java new file mode 100644 index 00000000..b791adf9 --- /dev/null +++ b/src/main/java/guru/springframework/Expression.java @@ -0,0 +1,5 @@ +package guru.springframework; + +public interface Expression { + Money reduce(String to); +} diff --git a/src/main/java/guru/springframework/Money.java b/src/main/java/guru/springframework/Money.java new file mode 100644 index 00000000..d6ceaf9d --- /dev/null +++ b/src/main/java/guru/springframework/Money.java @@ -0,0 +1,54 @@ +package guru.springframework; + +public class Money implements Expression { + + protected int amount; + protected String currency; + + public Money(int amount,String currency) { + this.amount=amount; + this.currency=currency; + } + + protected String currency(){ + return currency; + }; + + public boolean equals(Object object){ + Money testObject =(Money) object; + return testObject.amount == amount + && currency==testObject.currency; + } + + public Money times(int multiplyBy) { + return new Money(amount * multiplyBy,currency); + + } + + public static Money dollar(int amount){ + return new Money(amount, "USD") { + }; + } + + public static Money franc(int amount){ + return new Money(amount, "CHF") { + }; + } + + public Expression plus(Money addend){ + return new Sum(this,addend); + } + + @Override + public Money reduce(String to){ + return this; + } + + @Override + public String toString() { + return "Money{" + + "amount=" + amount + + ", currency='" + currency + '\'' + + '}'; + } +} diff --git a/src/main/java/guru/springframework/Sum.java b/src/main/java/guru/springframework/Sum.java new file mode 100644 index 00000000..78da9f40 --- /dev/null +++ b/src/main/java/guru/springframework/Sum.java @@ -0,0 +1,17 @@ +package guru.springframework; + +import java.util.Currency; + +public class Sum implements Expression { + Money augmend; + Money addmend; + + public Sum(Money augmend, Money addmend) { + this.augmend = augmend; + this.addmend = addmend; + } + + public Money reduce(String curr){ + return new Money(augmend.amount + addmend.amount, curr); + } +} diff --git a/src/test/java/guru/springframework/MoneyTest.java b/src/test/java/guru/springframework/MoneyTest.java new file mode 100644 index 00000000..15f4f892 --- /dev/null +++ b/src/test/java/guru/springframework/MoneyTest.java @@ -0,0 +1,60 @@ +package guru.springframework; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class MoneyTest { + @Test + void testMultiplication(){ + Money five= Money.dollar(5); + assertEquals(Money.dollar(10), five.times(2)); + assertEquals(Money.dollar(15), five.times(3)); + + Money fivef= Money.franc(5); + assertEquals(Money.franc(10), fivef.times(2)); + assertEquals(Money.franc(15), fivef.times(3)); + } + + @Test + void testEqualityFranc(){ + assertEquals(false,Money.franc(1).equals(Money.franc(2))); + assertEquals(true,Money.franc(1).equals(Money.franc(1))); + } + + @Test + void testCurrency(){ + assertEquals("USD",Money.dollar(1).currency()); + assertEquals("CHF",Money.franc(1).currency()); + } + + @Test + void testAddition(){ + Money five=Money.dollar(5); + Expression result=five.plus(five); + Sum sum=(Sum) result; + assertEquals(five, sum.addmend); + assertEquals(five, sum.augmend); + } + + @Test + void testReduceSum(){ + Expression sum =new Sum(Money.dollar(3),Money.dollar(4)); + Bank bank =new Bank(); + Money result=bank.reduce(sum,"USD"); + assertEquals(Money.dollar(7),result); + + } + + @Test + void testReduceMoney(){ + Bank bank=new Bank(); + Money result=bank.reduce(Money.dollar(1),"USD"); + assertEquals(Money.dollar(1),result); + + } + + + +}