public void TestCase1() { //trade instrument Instrument digicoin = new Instrument() { Name = "DIGICOIN", LotSize = 10, MinLot = 1 }; //clients Account a = new Account("Client A"); Account b = new Account("Client B"); Account c = new Account("Client C"); //brokers BrokerRoute broker1 = new BrokerRoute(new FixedCommissionCalculator(5), 10); broker1.LastQuote = new Quote(1.49); BrokerRoute broker2 = new BrokerRoute(new AmountBasedCommissionCalculator(new decimal[] { 3, 3, 3, 3, 2.5M, 2.5M, 2.5M, 2.5M, 2, 2 }), 10); broker2.LastQuote = new Quote(1.52); //samrt route AKA 'aggregator' SmartRoute smart = new SmartRoute(broker1, broker2); smart.MaxLot = 10; //trade server Server server = new Server(); server.Route = smart; DealTicket ticket; //1 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = a, Amount = 1, Side = Operation.Buy }); Assert.AreEqual(15.645M, ticket.Gross); //2 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 4, Side = Operation.Buy }); Assert.AreEqual(62.58M, ticket.Gross); //3 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = a, Amount = 5, Side = Operation.Buy }); Assert.AreEqual(77.9M, ticket.Gross); //4 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 10, Side = Operation.Buy }); Assert.AreEqual(155.04M, ticket.Gross); //5 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 8, Side = Operation.Sell }); Assert.AreEqual(124.64M, ticket.Gross); //6 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = c, Amount = 7, Side = Operation.Sell }); Assert.AreEqual(109.06M, ticket.Gross); //7 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = a, Amount = 13, Side = Operation.Buy }); Assert.AreEqual(201.975M, ticket.Gross); //8 ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 6, Side = Operation.Sell }); Assert.AreEqual(93.48M, ticket.Gross); //9 Assert.AreEqual(296.156M, Math.Round(server.GetTotalAmount(a, digicoin), 3)); Assert.AreEqual(0M, Math.Round(server.GetTotalAmount(b, digicoin), 3)); Assert.AreEqual(-109.06M, Math.Round(server.GetTotalAmount(c, digicoin), 3)); //10 Assert.AreEqual(80M, server.GetTransactedAmount(broker1, digicoin)); Assert.AreEqual(460M, server.GetTransactedAmount(broker2, digicoin)); }