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);
+ }
+}