diff --git a/.classpath b/.classpath index 9ba41a249..b3a434205 100644 --- a/.classpath +++ b/.classpath @@ -31,6 +31,19 @@ + + + + + + + + + + + + + diff --git a/.project b/.project index 700a32c79..ab0742645 100644 --- a/.project +++ b/.project @@ -20,4 +20,15 @@ org.eclipse.jdt.core.javanature org.eclipse.m2e.core.maven2Nature + + + 1685771014683 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..f9fe34593 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..c995aa5ce --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.debug.settings.onBuildFailureProceed": true +} \ No newline at end of file diff --git a/src/main/java/com/mycompany/fibonacci/FibonacciTest.java b/src/main/java/com/mycompany/fibonacci/FibonacciTest.java new file mode 100644 index 000000000..61de1d5ca --- /dev/null +++ b/src/main/java/com/mycompany/fibonacci/FibonacciTest.java @@ -0,0 +1,7 @@ +package com.mycompany.fibonacci; + +public class FibonacciTest { + int fib(int n){ + return 0; + } +} diff --git a/src/main/java/com/mycompany/money/Bank.java b/src/main/java/com/mycompany/money/Bank.java new file mode 100644 index 000000000..c6bfaf550 --- /dev/null +++ b/src/main/java/com/mycompany/money/Bank.java @@ -0,0 +1,18 @@ +package com.mycompany.money; + +import java.util.HashMap; +import java.util.Map; + +public class Bank { + private Map rates = new HashMap<>(); + Money reduce(Expression source, String to){ + return source.reduce(this, to); + } + void addRate(String from, String to, int rate){ + rates.put(new Pair(from, to), rate); + } + int rate(String from, String to){ + if(from.equals(to)) return 1; + return rates.get(new Pair(from, to)); + } +} diff --git a/src/main/java/com/mycompany/money/Dollar.java b/src/main/java/com/mycompany/money/Dollar.java new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/com/mycompany/money/Expression.java b/src/main/java/com/mycompany/money/Expression.java new file mode 100644 index 000000000..e331749df --- /dev/null +++ b/src/main/java/com/mycompany/money/Expression.java @@ -0,0 +1,5 @@ +package com.mycompany.money; + +public interface Expression { + Money reduce(Bank bank, String to); +} diff --git a/src/main/java/com/mycompany/money/Franc.java b/src/main/java/com/mycompany/money/Franc.java new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/com/mycompany/money/Money.java b/src/main/java/com/mycompany/money/Money.java new file mode 100644 index 000000000..f57d48ebc --- /dev/null +++ b/src/main/java/com/mycompany/money/Money.java @@ -0,0 +1,46 @@ +package com.mycompany.money; + +class Money implements Expression { + protected int amount; + protected String currency; + + Money(int amount, String currency) { + this.amount = amount; + this.currency = currency; + } + + Money times(int multiplier) { + return new Money(amount * multiplier, currency); + }; + + Expression plus(Money addend) { + return new Sum(this, addend); + } + + public Money reduce(Bank bank, String to) { + int rate = bank.rate(currency, to); + return new Money(amount / rate, to); + } + + String currency() { + return currency; + } + + public boolean equals(Object object) { + Money money = (Money) object; + return amount == money.amount + && currency().equals(money.currency()); + } + + public String toString() { + return amount + " " + currency; + } + + static Money dollar(int amount) { + return new Money(amount, "USD"); + } + + static Money franc(int amount) { + return new Money(amount, "CHF"); + } +} diff --git a/src/main/java/com/mycompany/money/Pair.java b/src/main/java/com/mycompany/money/Pair.java new file mode 100644 index 000000000..e87311a46 --- /dev/null +++ b/src/main/java/com/mycompany/money/Pair.java @@ -0,0 +1,17 @@ +package com.mycompany.money; + +public class Pair { + private String from; + private String to; + Pair(String from, String to){ + this.from = from; + this.to = to; + } + public boolean equals(Object object){ + Pair pair = (Pair) object; + return from.equals(pair.from) && to.equals(pair.to); + } + public int hashCode(){ + return 0; + } +} diff --git a/src/main/java/com/mycompany/money/Sum.java b/src/main/java/com/mycompany/money/Sum.java new file mode 100644 index 000000000..a126239a5 --- /dev/null +++ b/src/main/java/com/mycompany/money/Sum.java @@ -0,0 +1,14 @@ +package com.mycompany.money; + +public class Sum implements Expression{ + Money augend; + Money addend; + Sum(Money augend, Money addend){ + this.augend = augend; + this.addend = addend; + } + public Money reduce(Bank bank, String to){ + int amount = augend.reduce(bank, to).amount + addend.reduce(bank, to).amount; + return new Money(amount, to); + } +} diff --git a/src/test/java/com/mycompany/fibonacci/FibonacciTest.java b/src/test/java/com/mycompany/fibonacci/FibonacciTest.java new file mode 100644 index 000000000..f009b6563 --- /dev/null +++ b/src/test/java/com/mycompany/fibonacci/FibonacciTest.java @@ -0,0 +1,16 @@ +package com.mycompany.fibonacci; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class FibonacciTest { + int fib(int n){ + return 0; + } + @Test + public void testFibonacci() { + assertEquals(0, fib(0)); + assertEquals(1, fib(1)); + } +} diff --git a/src/test/java/com/mycompany/money/MoneyTest.java b/src/test/java/com/mycompany/money/MoneyTest.java new file mode 100644 index 000000000..f4e96393e --- /dev/null +++ b/src/test/java/com/mycompany/money/MoneyTest.java @@ -0,0 +1,85 @@ +package com.mycompany.money; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class MoneyTest { + @Test + public void testMultiplication() { + Money five = Money.dollar(5); + assertEquals(Money.dollar(10), five.times(2)); + assertEquals(Money.dollar(15), five.times(3)); + } + + @Test + public void testEquality() { + assertTrue(Money.dollar(5).equals(Money.dollar(5))); + assertFalse(Money.dollar(5).equals(Money.dollar(6))); + assertFalse(Money.franc(5).equals(Money.dollar(5))); + } + + @Test + public void testCurrency() { + assertEquals("USD", Money.dollar(1).currency()); + assertEquals("CHF", Money.franc(1).currency()); + } + + @Test + public void testSimpleAddition() { + Money five = Money.dollar(5); + Expression sum = five.plus(five); + Bank bank = new Bank(); + Money reduced = bank.reduce(sum, "USD"); + assertEquals(Money.dollar(10), reduced); + } + + @Test + public void testPlusReturnsSum() { + Money five = Money.dollar(5); + Expression result = five.plus(five); + Sum sum = (Sum) result; + assertEquals(five, sum.augend); + assertEquals(five, sum.addend); + } + + @Test + public 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 + public void testReduceMoney() { + Bank bank = new Bank(); + Money result = bank.reduce(Money.dollar(1), "USD"); + assertEquals(Money.dollar(1), result); + } + + @Test + public void testReduceMoneyDifferentCurrency() { + Bank bank = new Bank(); + bank.addRate("CHF", "USD", 2); + Money result = bank.reduce(Money.franc(2), "USD"); + assertEquals(Money.dollar(1), result); + } + + @Test + public void testIdentityRate() { + assertEquals(1, new Bank().rate("USD", "USD")); + } + + @Test + public void testMixedAddition() { + Money fiveBucks = Money.dollar(5); + Money tenFrancs = Money.franc(10); + Bank bank = new Bank(); + bank.addRate("CHF", "USD", 2); + Money result = bank.reduce(fiveBucks.plus(tenFrancs), "USD"); + assertEquals(Money.dollar(10), result); + } +}