package org.marketcetera.core.position.impl;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.marketcetera.core.position.impl.OrderingComparison.comparesEqualTo;
import java.math.BigDecimal;
import org.junit.Test;
import org.marketcetera.core.position.MockTrade;
import org.marketcetera.core.position.PositionMetrics;
import org.marketcetera.core.position.Trade;
/* $License$ */
/**
* Tests {@link BasicCalculator}. Other {@link PositionMetricsCalculator}
* implementations are tested by comparing to BasicCalculator.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: BasicCalculatorTest.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.5.0
*/
public class BasicCalculatorTest {
@Test
public void test() {
BasicCalculator pnl = new BasicCalculator(BigDecimal.ZERO,
BigDecimal.ZERO);
assertPNL(pnl.trade(createTrade("100", "21")), "100", null, null, "0",
null, null);
assertPNL(pnl.tick("21"), "100", "0", "0", "0", "0", "0");
assertPNL(pnl.trade(createTrade("-50", "21.08")), "50", "0", "4", "4",
"0", "4");
assertPNL(pnl.tick("21.08"), "50", "0", "8", "4", "4", "8");
assertPNL(pnl.trade(createTrade("100", "21.12")), "150", "0", "4", "4",
"0", "4");
assertPNL(pnl.tick("21.12"), "150", "0", "10", "4", "6", "10");
assertPNL(pnl.trade(createTrade("-100", "21.20")), "50", "0", "18",
"18", "0", "18");
assertPNL(pnl.tick("21.20"), "50", "0", "22", "18", "4", "22");
}
@Test
public void shortTest() {
BasicCalculator pnl = new BasicCalculator(BigDecimal.ZERO,
BigDecimal.ZERO);
assertPNL(pnl.trade(createTrade("-100", "21")), "-100", null, null,
"0", null, null);
assertPNL(pnl.tick("22"), "-100", "0", "-100", "0", "-100", "-100");
}
@Test
public void shortTest2() {
BasicCalculator pnl = new BasicCalculator(BigDecimal.ZERO,
BigDecimal.ZERO);
assertPNL(pnl.tick("22"), "0", "0", "0", "0", "0", "0");
assertPNL(pnl.trade(createTrade("-100", "21")), "-100", "0", "-100",
"0", "-100", "-100");
}
@Test
public void shortTest3() {
BasicCalculator pnl = new BasicCalculator(BigDecimal.ZERO,
BigDecimal.ZERO);
assertPNL(pnl.tick("22"), "0", "0", "0", "0", "0", "0");
assertPNL(pnl.trade(createTrade("-100", "21")), "-100", "0", "-100",
"0", "-100", "-100");
assertPNL(pnl.trade(createTrade("100", "20")), "0", "0", "100", "100",
"0", "100");
}
@Test
public void incomingPosition() {
BasicCalculator pnl = new BasicCalculator(new BigDecimal("10"),
new BigDecimal("15"));
assertPNL(pnl.tick("16"), "10", "10", "0", "0", "10", "10");
assertPNL(pnl.trade(createTrade("10", "16")), "20", "10", "0", "0",
"10", "10");
assertPNL(pnl.tick("17"), "20", "20", "10", "0", "30", "30");
assertPNL(pnl.trade(createTrade("-15", "17")), "5", "20", "10", "25",
"5", "30");
}
private Trade<?> createTrade(String quantity, String price) {
return MockTrade.createEquityTrade("ABC", "asdf", "Yoram", quantity,
price);
}
private void assertPNL(PositionMetrics pnl, String position,
String positional, String trading, String realized,
String unrealized, String total) {
assertBigDecimal(position, pnl.getPosition());
assertBigDecimal(positional, pnl.getPositionPL());
assertBigDecimal(trading, pnl.getTradingPL());
assertBigDecimal(realized, pnl.getRealizedPL());
assertBigDecimal(unrealized, pnl.getUnrealizedPL());
assertBigDecimal(total, pnl.getTotalPL());
}
private void assertBigDecimal(String expected, BigDecimal actual) {
if (expected == null)
assertNull(actual);
else
assertThat(actual, comparesEqualTo(new BigDecimal(expected)));
}
}