aboutsummaryrefslogtreecommitdiffstats
path: root/service/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'service/src/test')
-rw-r--r--service/src/test/java/market/guess/service/mechanism/LmsrTradingMechanismTest.java37
-rw-r--r--service/src/test/java/market/guess/service/mechanism/OrderBookTradingMechanismTest.java51
2 files changed, 88 insertions, 0 deletions
diff --git a/service/src/test/java/market/guess/service/mechanism/LmsrTradingMechanismTest.java b/service/src/test/java/market/guess/service/mechanism/LmsrTradingMechanismTest.java
new file mode 100644
index 0000000..f5c6af5
--- /dev/null
+++ b/service/src/test/java/market/guess/service/mechanism/LmsrTradingMechanismTest.java
@@ -0,0 +1,37 @@
1package market.guess.service.mechanism;
2
3import static org.junit.Assert.assertArrayEquals;
4import static org.junit.Assert.assertEquals;
5
6import java.math.BigDecimal;
7import org.junit.Test;
8
9public class LmsrTradingMechanismTest {
10
11 @Test
12 public void openingCostMatchesLmsrFormula() {
13 var mechanism = new LmsrTradingMechanism(100, 2);
14
15 assertEquals(new BigDecimal("69.31"), mechanism.openingCost());
16 }
17
18 @Test
19 public void pricesStartEven() {
20 var mechanism = new LmsrTradingMechanism(100, 2);
21
22 assertArrayEquals(
23 new BigDecimal[] {new BigDecimal("0.50"), new BigDecimal("0.50")}, mechanism.prices());
24 }
25
26 @Test
27 public void buyingSharesShiftsCostAndPrice() {
28 var mechanism = new LmsrTradingMechanism(100, 2);
29
30 var execution = mechanism.buy(0, 100);
31
32 assertEquals(100, execution.filledQuantity());
33 assertEquals(new BigDecimal("62.01"), execution.cost());
34 assertArrayEquals(
35 new BigDecimal[] {new BigDecimal("0.73"), new BigDecimal("0.27")}, mechanism.prices());
36 }
37}
diff --git a/service/src/test/java/market/guess/service/mechanism/OrderBookTradingMechanismTest.java b/service/src/test/java/market/guess/service/mechanism/OrderBookTradingMechanismTest.java
new file mode 100644
index 0000000..b4b2da3
--- /dev/null
+++ b/service/src/test/java/market/guess/service/mechanism/OrderBookTradingMechanismTest.java
@@ -0,0 +1,51 @@
1package market.guess.service.mechanism;
2
3import static org.junit.Assert.assertEquals;
4
5import java.math.BigDecimal;
6import market.guess.service.mechanism.OrderBookTradingMechanism.Side;
7import org.junit.Test;
8
9public class OrderBookTradingMechanismTest {
10
11 @Test
12 public void limitBuyConsumesRestingAsksInFifoOrderAndLeavesRemainder() {
13 var mechanism = new OrderBookTradingMechanism(false, 100, 1, 2);
14 var price = new BigDecimal("0.60");
15
16 mechanism.placeOrder(0, Side.SELL, 20, price);
17 mechanism.placeOrder(0, Side.SELL, 40, price);
18
19 var execution = mechanism.placeOrder(0, Side.BUY, 50, price);
20
21 assertEquals(50, execution.filledQuantity());
22 assertEquals(new BigDecimal("30.00"), execution.cost());
23
24 var followUp = mechanism.buy(0, 100);
25 assertEquals(10, followUp.filledQuantity());
26 }
27
28 @Test
29 public void marketBuySweepsMultiplePriceLevelsAndPartiallyFillsWhenBookRunsOut() {
30 var mechanism = new OrderBookTradingMechanism(false, 100, 1, 2);
31 mechanism.placeOrder(0, Side.SELL, 10, new BigDecimal("0.50"));
32 mechanism.placeOrder(0, Side.SELL, 10, new BigDecimal("0.70"));
33
34 var execution = mechanism.buy(0, 15);
35
36 assertEquals(15, execution.filledQuantity());
37 assertEquals(new BigDecimal("8.50"), execution.cost());
38
39 var exhausted = mechanism.buy(0, 100);
40 assertEquals(5, exhausted.filledQuantity());
41 }
42
43 @Test
44 public void pricesReflectMidpointOfBestBidAndAsk() {
45 var mechanism = new OrderBookTradingMechanism(false, 100, 1, 2);
46 mechanism.placeOrder(0, Side.BUY, 10, new BigDecimal("0.40"));
47 mechanism.placeOrder(0, Side.SELL, 10, new BigDecimal("0.60"));
48
49 assertEquals(new BigDecimal("0.50"), mechanism.prices()[0]);
50 }
51}