/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.core.internal.ats;
import java.util.Calendar;
import java.util.Date;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.eclipsetrader.core.ats.BarFactoryEvent;
import org.eclipsetrader.core.ats.IBarFactoryListener;
import org.eclipsetrader.core.feed.FeedIdentifier;
import org.eclipsetrader.core.feed.IPricingListener;
import org.eclipsetrader.core.feed.PricingEnvironment;
import org.eclipsetrader.core.feed.PricingEvent;
import org.eclipsetrader.core.feed.TimeSpan;
import org.eclipsetrader.core.feed.Trade;
import org.eclipsetrader.core.instruments.Security;
public class BarFactoryTest extends TestCase {
Security security;
PricingEnvironment pricingEnvironment;
BarFactory factory;
Calendar currentTime;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
security = new Security("Test", new FeedIdentifier("TST", null));
factory = new BarFactory();
pricingEnvironment = new PricingEnvironment();
pricingEnvironment.addPricingListener(new IPricingListener() {
@Override
public void pricingUpdate(PricingEvent event) {
factory.pricingUpdate(event);
}
});
currentTime = Calendar.getInstance();
currentTime.set(Calendar.MILLISECOND, 0);
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
factory.dispose();
}
public void testSetInitialValues() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
assertEquals(1.0, data.open);
assertEquals(1.0, data.high);
assertEquals(1.0, data.low);
assertEquals(1.0, data.close);
assertEquals(new Long(100), data.volume);
}
public void testSetHighestValue() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
pricingEnvironment.setTrade(security, new Trade(new Date(System.currentTimeMillis()), 1.1, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
assertEquals(1.1, data.high);
assertEquals(1.0, data.low);
}
public void testSetLowestValue() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 0.9, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
assertEquals(1.0, data.high);
assertEquals(0.9, data.low);
}
public void testSetCloseToLatestTrade() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.1, 100L, 1000L));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 0.9, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
assertEquals(0.9, data.close);
}
public void testSetOpenToFirstTrade() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.1, 100L, 1000L));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 0.9, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
assertEquals(1.0, data.open);
}
public void testTradesGeneratesBarOpen() throws Exception {
IBarFactoryListener listener = EasyMock.createMock(IBarFactoryListener.class);
listener.barOpen(EasyMock.isA(BarFactoryEvent.class));
EasyMock.replay(listener);
factory.add(security, TimeSpan.minutes(1));
factory.addBarFactoryListener(listener);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
EasyMock.verify(listener);
}
public void testTradesGeneratesBarClose() throws Exception {
IBarFactoryListener listener = EasyMock.createNiceMock(IBarFactoryListener.class);
listener.barClose(EasyMock.isA(BarFactoryEvent.class));
EasyMock.replay(listener);
factory.add(security, TimeSpan.minutes(1));
factory.addBarFactoryListener(listener);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
currentTime.add(Calendar.SECOND, 30);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.1, 100L, 1000L));
currentTime.add(Calendar.SECOND, 29);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 0.9, 100L, 1000L));
currentTime.add(Calendar.SECOND, 1);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
EasyMock.verify(listener);
}
public void testDontGenerateBarOnAggregatedTrades() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
IBarFactoryListener listener = EasyMock.createMock(IBarFactoryListener.class);
EasyMock.replay(listener);
factory.addBarFactoryListener(listener);
currentTime.add(Calendar.SECOND, 30);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.1, 100L, 1000L));
currentTime.add(Calendar.SECOND, 29);
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 0.9, 100L, 1000L));
EasyMock.verify(listener);
}
public void testSetBarCloseTime() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(currentTime.getTime(), 1.0, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
currentTime.add(Calendar.SECOND, 60);
assertEquals(currentTime.getTime(), data.dateClose);
}
public void testIgnoreTradeWithNullDate() throws Exception {
factory.add(security, TimeSpan.minutes(1));
pricingEnvironment.setTrade(security, new Trade(null, 1.0, 100L, 1000L));
BarFactory.Data data = factory.map.get(security).iterator().next();
assertNull(data.open);
assertNull(data.high);
assertNull(data.low);
assertNull(data.close);
assertNull(data.volume);
}
}