/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.position;
import static com.opengamma.util.db.DbDateUtils.MAX_SQL_TIMESTAMP;
import static com.opengamma.util.db.DbDateUtils.toSqlDate;
import static com.opengamma.util.db.DbDateUtils.toSqlTimestamp;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import java.math.BigDecimal;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcOperations;
import org.testng.annotations.Test;
import org.threeten.bp.Clock;
import org.threeten.bp.Instant;
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.OffsetTime;
import org.threeten.bp.ZoneOffset;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.position.ManageablePosition;
import com.opengamma.master.position.ManageableTrade;
import com.opengamma.master.position.PositionDocument;
import com.opengamma.util.test.AbstractDbTest;
import com.opengamma.util.test.TestGroup;
/**
* Base tests for DbPositionMasterWorker via DbPositionMaster.
*/
@Test(groups = TestGroup.UNIT_DB)
public abstract class AbstractDbPositionMasterWorkerTest extends AbstractDbTest {
private static final Logger s_logger = LoggerFactory.getLogger(AbstractDbPositionMasterWorkerTest.class);
protected DbPositionMaster _posMaster;
protected Instant _version1Instant;
protected Instant _version2Instant;
protected int _totalPortfolios;
protected int _totalPositions;
protected OffsetDateTime _now;
public AbstractDbPositionMasterWorkerTest(final String databaseType, final String databaseVersion, final boolean readOnly) {
super(databaseType, databaseVersion);
s_logger.info("running testcases for {}", databaseType);
}
//-------------------------------------------------------------------------
@Override
protected void doSetUp() {
init();
}
@Override
protected void doTearDown() {
_posMaster = null;
}
@Override
protected void doTearDownClass() {
_posMaster = null;
}
//-------------------------------------------------------------------------
private void init() {
_posMaster = new DbPositionMaster(getDbConnector());
_now = OffsetDateTime.now();
_posMaster.setClock(Clock.fixed(_now.toInstant(), ZoneOffset.UTC));
_version1Instant = _now.toInstant().minusSeconds(100);
_version2Instant = _now.toInstant().minusSeconds(50);
s_logger.debug("test data now: {}", _version1Instant);
s_logger.debug("test data later: {}", _version2Instant);
final JdbcOperations template = _posMaster.getDbConnector().getJdbcOperations();
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
100, 100, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, "A", "100", BigDecimal.valueOf(100.987));
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
120, 120, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, "A", "120", BigDecimal.valueOf(120.987));
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
121, 121, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, "A", "121", BigDecimal.valueOf(121.987));
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
122, 122, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, "A", "122", BigDecimal.valueOf(122.987));
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
123, 123, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, "A", "123", BigDecimal.valueOf(123.987));
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
221, 221, toSqlTimestamp(_version1Instant), toSqlTimestamp(_version2Instant), toSqlTimestamp(_version1Instant), MAX_SQL_TIMESTAMP, "A", "221", BigDecimal.valueOf(221.987));
template.update("INSERT INTO pos_position VALUES (?,?,?,?,?, ?,?,?,?)",
222, 221, toSqlTimestamp(_version2Instant), MAX_SQL_TIMESTAMP, toSqlTimestamp(_version2Instant), MAX_SQL_TIMESTAMP, "A", "222", BigDecimal.valueOf(222.987));
_totalPositions = 6;
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
500, "TICKER", "S100");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
501, "TICKER", "T130");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
502, "TICKER", "MSFT");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
503, "NASDAQ", "Micro");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
504, "TICKER", "ORCL");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
505, "TICKER", "ORCL134");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
506, "NASDAQ", "ORCL135");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
507, "TICKER", "IBMC");
template.update("INSERT INTO pos_idkey VALUES (?,?,?)",
508, "OID", "DbSec~1234");
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 100, 500);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 120, 501);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 121, 502);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 121, 503);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 122, 504);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 123, 505);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 123, 506);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 221, 507);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 222, 507);
template.update("INSERT INTO pos_position2idkey VALUES (?,?)", 222, 508);
OffsetTime tradeTime = _now.toOffsetTime().minusSeconds(400);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
400, 400, 120, 120, BigDecimal.valueOf(120.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C100", "B", "400");
tradeTime = _now.toOffsetTime().minusSeconds(401);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
401, 401, 121, 121, BigDecimal.valueOf(121.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C101", "B", "401");
tradeTime = _now.toOffsetTime().minusSeconds(402);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
402, 402, 122, 122, BigDecimal.valueOf(100.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "JMP", "B", "402");
tradeTime = _now.toOffsetTime().minusSeconds(403);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
403, 403, 122, 122, BigDecimal.valueOf(22.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "CISC", "B", "403");
tradeTime = _now.toOffsetTime().minusSeconds(404);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
404, 404, 123, 123, BigDecimal.valueOf(100.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C104", "B", "404");
tradeTime = _now.toOffsetTime().minusSeconds(405);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
405, 405, 123, 123, BigDecimal.valueOf(200.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C105", "B", "405");
tradeTime = _now.toOffsetTime().minusSeconds(406);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
406, 406, 123, 123, BigDecimal.valueOf(300.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C106", "B", "406");
tradeTime = _now.toOffsetTime().minusSeconds(407);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
407, 407, 221, 221, BigDecimal.valueOf(221.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C221", "B", "407");
tradeTime = _now.toOffsetTime().minusSeconds(408);
template.update("INSERT INTO pos_trade (id, oid, position_id, position_oid, quantity, trade_date, trade_time, zone_offset, cparty_scheme, cparty_value, provider_scheme, provider_value) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)",
408, 407, 222, 221, BigDecimal.valueOf(222.987), toSqlDate(_now.toLocalDate()), toSqlTimestamp(tradeTime.toLocalTime()), tradeTime.getOffset().getTotalSeconds(), "CPARTY", "C222", "B", "408");
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 400, 501);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 401, 502);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 401, 503);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 402, 504);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 403, 504);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 404, 505);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 404, 506);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 405, 505);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 405, 506);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 406, 505);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 406, 506);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 407, 507);
template.update("INSERT INTO pos_trade2idkey VALUES (?,?)", 408, 507);
}
//-------------------------------------------------------------------------
protected void assert100(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "100", "0");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version1Instant, test.getVersionFromInstant());
assertEquals(null, test.getVersionToInstant());
assertEquals(_version1Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "100"), position.getProviderId());
assertEquals(BigDecimal.valueOf(100.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(1, secKey.size());
assertEquals(true, secKey.getExternalIds().contains(ExternalId.of("TICKER", "S100")));
assertEquals(null, position.getSecurityLink().getObjectId());
final List<ManageableTrade> trades = position.getTrades();
assertNotNull(trades);
assertTrue(trades.isEmpty());
}
protected void assert120(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "120", "0");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version1Instant, test.getVersionFromInstant());
assertEquals(null, test.getVersionToInstant());
assertEquals(_version1Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "120"), position.getProviderId());
assertEquals(BigDecimal.valueOf(120.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(1, secKey.size());
assertEquals(true, secKey.getExternalIds().contains(ExternalId.of("TICKER", "T130")));
assertEquals(null, position.getSecurityLink().getObjectId());
final List<ManageableTrade> trades = position.getTrades();
assertEquals(1, trades.size());
final ManageableTrade trade = trades.get(0);
assertNotNull(trade);
assertEquals(UniqueId.of("DbPos", "400", "0"), trade.getUniqueId());
assertEquals(ExternalId.of("B", "400"), trade.getProviderId());
assertEquals(ExternalId.of("CPARTY", "C100"), trade.getCounterpartyExternalId());
assertEquals(BigDecimal.valueOf(120.987), trade.getQuantity());
assertEquals(_now.toLocalDate(), trade.getTradeDate());
assertEquals(_now.toOffsetTime().minusSeconds(400), trade.getTradeTime());
assertEquals(true, trade.getSecurityLink().getExternalIds().contains(ExternalId.of("TICKER", "T130")));
}
protected void assert121(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "121", "0");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version1Instant, test.getVersionFromInstant());
assertEquals(null, test.getVersionToInstant());
assertEquals(_version1Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "121"), position.getProviderId());
assertEquals(BigDecimal.valueOf(121.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(2, secKey.size());
assertEquals(true, secKey.getExternalIds().contains(ExternalId.of("TICKER", "MSFT")));
assertEquals(true, secKey.getExternalIds().contains(ExternalId.of("NASDAQ", "Micro")));
assertEquals(null, position.getSecurityLink().getObjectId());
final List<ManageableTrade> trades = position.getTrades();
assertEquals(1, trades.size());
final ManageableTrade trade = trades.get(0);
assertNotNull(trade);
assertEquals(UniqueId.of("DbPos", "401", "0"), trade.getUniqueId());
assertEquals(ExternalId.of("B", "401"), trade.getProviderId());
assertEquals(ExternalId.of("CPARTY", "C101"), trade.getCounterpartyExternalId());
assertEquals(BigDecimal.valueOf(121.987), trade.getQuantity());
assertEquals(_now.toLocalDate(), trade.getTradeDate());
assertEquals(_now.toOffsetTime().minusSeconds(401), trade.getTradeTime());
}
protected void assert122(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "122", "0");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version1Instant, test.getVersionFromInstant());
assertEquals(null, test.getVersionToInstant());
assertEquals(_version1Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "122"), position.getProviderId());
assertEquals(BigDecimal.valueOf(122.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(1, secKey.size());
assertEquals(ExternalId.of("TICKER", "ORCL"), secKey.getExternalIds().iterator().next());
assertEquals(null, position.getSecurityLink().getObjectId());
assertEquals(2, position.getTrades().size());
}
protected void assert123(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "123", "0");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version1Instant, test.getVersionFromInstant());
assertEquals(null, test.getVersionToInstant());
assertEquals(_version1Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "123"), position.getProviderId());
assertEquals(BigDecimal.valueOf(123.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(2, secKey.size());
assertTrue(secKey.getExternalIds().contains(ExternalId.of("NASDAQ", "ORCL135")));
assertTrue(secKey.getExternalIds().contains(ExternalId.of("TICKER", "ORCL134")));
assertEquals(null, position.getSecurityLink().getObjectId());
final List<ManageableTrade> trades = position.getTrades();
assertEquals(3, trades.size());
ManageableTrade trade = new ManageableTrade(BigDecimal.valueOf(100.987), secKey, _now.toLocalDate(), _now.toOffsetTime().minusSeconds(404), ExternalId.of("CPARTY", "C104"));
trade.setUniqueId(UniqueId.of("DbPos", "404", "0"));
trade.setProviderId(ExternalId.of("B", "404"));
trade.setParentPositionId(uniqueId);
assertTrue(trades.contains(trade));
trade = new ManageableTrade(BigDecimal.valueOf(200.987), secKey, _now.toLocalDate(), _now.toOffsetTime().minusSeconds(405), ExternalId.of("CPARTY", "C105"));
trade.setUniqueId(UniqueId.of("DbPos", "405", "0"));
trade.setProviderId(ExternalId.of("B", "405"));
trade.setParentPositionId(uniqueId);
assertTrue(trades.contains(trade));
trade = new ManageableTrade(BigDecimal.valueOf(300.987), secKey, _now.toLocalDate(), _now.toOffsetTime().minusSeconds(406),ExternalId.of("CPARTY", "C106"));
trade.setUniqueId(UniqueId.of("DbPos", "406", "0"));
trade.setProviderId(ExternalId.of("B", "406"));
trade.setParentPositionId(uniqueId);
assertTrue(trades.contains(trade));
}
protected void assert221(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "221", "0");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version1Instant, test.getVersionFromInstant());
assertEquals(_version2Instant, test.getVersionToInstant());
assertEquals(_version1Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "221"), position.getProviderId());
assertEquals(BigDecimal.valueOf(221.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(1, secKey.size());
assertEquals(ExternalId.of("TICKER", "IBMC"), secKey.getExternalIds().iterator().next());
assertEquals(null, position.getSecurityLink().getObjectId());
final List<ManageableTrade> trades = position.getTrades();
assertEquals(1, trades.size());
final ManageableTrade expected = new ManageableTrade(BigDecimal.valueOf(221.987), secKey, _now.toLocalDate(), _now.toOffsetTime().minusSeconds(407), ExternalId.of("CPARTY", "C221"));
expected.setUniqueId(UniqueId.of("DbPos", "407", "0"));
expected.setProviderId(ExternalId.of("B", "407"));
expected.setParentPositionId(uniqueId);
assertTrue(trades.contains(expected));
}
protected void assert222(final PositionDocument test) {
final UniqueId uniqueId = UniqueId.of("DbPos", "221", "1");
assertNotNull(test);
assertEquals(uniqueId, test.getUniqueId());
assertEquals(_version2Instant, test.getVersionFromInstant());
assertEquals(null, test.getVersionToInstant());
assertEquals(_version2Instant, test.getCorrectionFromInstant());
assertEquals(null, test.getCorrectionToInstant());
final ManageablePosition position = test.getPosition();
assertNotNull(position);
assertEquals(uniqueId, position.getUniqueId());
assertEquals(ExternalId.of("A", "222"), position.getProviderId());
assertEquals(BigDecimal.valueOf(222.987), position.getQuantity());
final ExternalIdBundle secKey = position.getSecurityLink().getExternalId();
assertEquals(1, secKey.size());
assertEquals(ExternalId.of("TICKER", "IBMC"), secKey.getExternalIds().iterator().next());
assertEquals(ObjectId.of("DbSec", "1234"), position.getSecurityLink().getObjectId());
final List<ManageableTrade> trades = position.getTrades();
assertEquals(1, trades.size());
final ManageableTrade expected = new ManageableTrade(BigDecimal.valueOf(222.987), secKey, _now.toLocalDate(), _now.toOffsetTime().minusSeconds(408), ExternalId.of("CPARTY", "C222"));
expected.setUniqueId(UniqueId.of("DbPos", "407", "1"));
expected.setProviderId(ExternalId.of("B", "408"));
expected.setParentPositionId(uniqueId);
assertTrue(trades.contains(expected));
}
}