/*
* 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.ats.engines;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.eclipsetrader.core.ats.ITradingSystemContext;
import org.eclipsetrader.core.ats.ScriptStrategy;
import org.eclipsetrader.core.feed.FeedIdentifier;
import org.eclipsetrader.core.feed.PricingEnvironment;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.core.instruments.Security;
import org.eclipsetrader.core.internal.ats.TradingSystem;
import org.eclipsetrader.core.trading.IPosition;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.UniqueTag;
public class JavaScriptEngineTest extends TestCase {
Security instrument1;
Security instrument2;
ScriptStrategy strategy;
Context cx;
PricingEnvironment pricingEnvironment;
AccountMock account;
BrokerMock broker;
ITradingSystemContext context;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
strategy = new ScriptStrategy("Sample Strategy");
strategy.setText("");
strategy.setInstruments(new ISecurity[] {
instrument1 = new Security("Apple", new FeedIdentifier("AAPL", null)),
instrument2 = new Security("Microsoft", new FeedIdentifier("MSFT", null))
});
pricingEnvironment = new PricingEnvironment();
account = new AccountMock();
broker = new BrokerMock();
context = EasyMock.createNiceMock(ITradingSystemContext.class);
EasyMock.expect(context.getPricingEnvironment()).andStubReturn(pricingEnvironment);
EasyMock.expect(context.getBroker()).andStubReturn(broker);
EasyMock.expect(context.getAccount()).andStubReturn(account);
EasyMock.replay(context);
cx = Context.enter();
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
Context.exit();
}
public void testContextInheritsSettings() throws Exception {
JavaScriptEngine runner = new JavaScriptEngine(new TradingSystem(strategy), context);
runner.start();
assertTrue(runner.get(BaseOrderFunction.PROPERTY_ACCOUNT) != UniqueTag.NOT_FOUND);
assertTrue(runner.get(BaseOrderFunction.PROPERTY_BROKER) != UniqueTag.NOT_FOUND);
JavaScriptEngineInstrument context = runner.getContextFor(instrument1);
assertTrue(context.get(BaseOrderFunction.PROPERTY_ACCOUNT) != UniqueTag.NOT_FOUND);
assertTrue(context.get(BaseOrderFunction.PROPERTY_BROKER) != UniqueTag.NOT_FOUND);
}
public void testSetInstrumentsMap() throws Exception {
JavaScriptEngine runner = new JavaScriptEngine(new TradingSystem(strategy), context);
runner.start();
Object result = runner.get("instruments");
assertNotSame(UniqueTag.NOT_FOUND, result);
result = cx.evaluateString(runner.getScope(), "instruments['MSFT'].name;", strategy.getName(), 1, null);
assertEquals("Microsoft", result);
}
public void testContextInheritsInstrumentsMap() throws Exception {
JavaScriptEngine runner = new JavaScriptEngine(new TradingSystem(strategy), context);
runner.start();
JavaScriptEngineInstrument context = runner.getContextFor(instrument1);
Object result = context.get("instruments");
assertNotSame(UniqueTag.NOT_FOUND, result);
result = cx.evaluateString(context.getScope(), "instruments['MSFT'].name;", strategy.getName(), 1, null);
assertEquals("Microsoft", result);
}
public void testSetPositionsMap() throws Exception {
account.setPositions(new IPosition[] {
new PositionMock(instrument2, 1000L, 25.75)
});
JavaScriptEngine runner = new JavaScriptEngine(new TradingSystem(strategy), context);
runner.start();
JavaScriptEngineInstrument context = runner.getContextFor(instrument1);
Object result = context.get("positions");
assertNotSame(UniqueTag.NOT_FOUND, result);
result = cx.evaluateString(context.getScope(), "positions['MSFT'].quantity;", strategy.getName(), 1, null);
assertEquals(1000L, result);
}
public void testUpdatePositionsMap() throws Exception {
account.setPositions(new IPosition[] {
new PositionMock(instrument2, 1000L, 25.75)
});
JavaScriptEngine runner = new JavaScriptEngine(new TradingSystem(strategy), context);
runner.start();
JavaScriptEngineInstrument context = runner.getContextFor(instrument1);
account.setPositions(new IPosition[] {
new PositionMock(instrument2, 2000L, 25.75)
});
runner.updatePositionsMap();
Object result = context.get("positions");
assertNotSame(UniqueTag.NOT_FOUND, result);
result = cx.evaluateString(context.getScope(), "positions['MSFT'].quantity;", strategy.getName(), 1, null);
assertEquals(2000L, result);
}
}