public void Ask_PartialExecutes_AginstUser1Bid_ButAskSharesIsGreaterThanBidShares() { // Arrange. var existingBidOrder = new Order { Id = 100, Shares = 100, Subscription = new Subscription { Owned = 0, UserId = _userId1 } }; var existingLimit = Limits.First(); existingLimit.BidHead = existingBidOrder; existingBidOrder.ParentLimit = existingLimit; Limits.Add(existingLimit); Orders.Add(existingBidOrder.Id, existingBidOrder); Subscriptions.Add(existingBidOrder.Subscription.UserId, existingBidOrder.Subscription); var existingSellerSubscription = new Subscription { Owned = 500, UserId = _userId2 }; Subscriptions.Add(existingSellerSubscription.UserId, existingSellerSubscription); // Act. Ask(_userId2, 1, 200); // Assert. var existingBidOrder2 = new Order { Id = 100, Shares = 0, Subscription = new Subscription { Owned = 100, UserId = _userId1 } }; var existingLimit2 = new Limit { Price = 1 * ScaleFactor, BidHead = existingBidOrder2 }; existingBidOrder2.ParentLimit = existingLimit2; var existingSellerSubscription2 = new Subscription { Owned = 400, UserId = _userId2 }; var remainingSellersOrder = new Order { Id = 1, ParentLimit = existingLimit2, Shares = 100, Subscription = existingSellerSubscription2 }; existingLimit2.AskHead = remainingSellersOrder; Assert.AreEqual(1, Limits.Count); Assert.AreEqual(2, Orders.Count); Assert.AreEqual(2, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { existingLimit2 }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { existingBidOrder2, remainingSellersOrder }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { existingBidOrder2.Subscription, existingSellerSubscription2 }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }
public void Ask_Adds1Order_OnExistingLimit_With1Order() { // Arrange. var existingOrder = new Order { Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId2 } }; var existingLimit = Limits.First(); existingLimit.AskHead = existingOrder; existingOrder.ParentLimit = existingLimit; Limits.Add(existingLimit); Orders.Add(existingOrder.Id, existingOrder); Subscriptions.Add(existingOrder.Subscription.UserId, existingOrder.Subscription); Subscriptions.Add(_userId1, new Subscription { Owned = 5, UserId = _userId1 }); // Act. Ask(_userId1, 1, 5); // Assert. var existingOrder2 = new Order { Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId2 } }; var existingLimit2 = new Limit { Price = 1 * ScaleFactor }; existingOrder2.ParentLimit = existingLimit2; var order = new Order { Id = 1, Next = existingOrder2, Shares = 5, Subscription = new Subscription { Owned = 5, UserId = _userId1 } }; existingLimit2.AskHead = order; existingOrder2.Prev = order; order.ParentLimit = existingLimit2; Assert.AreEqual(1, Limits.Count); Assert.AreEqual(2, Orders.Count); Assert.AreEqual(2, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { existingLimit2 }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { existingOrder2, order }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { existingOrder2.Subscription, order.Subscription }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }
public void Bid_Adds1Order_OnExistingLimit_With1OrderFromTheSameUser() { // Arrange. var existingAskOrder = new Order { Id = 100, Shares = 5, Subscription = new Subscription { Owned = 5, UserId = _userId1 } }; var existingLimit = Limits.First(); existingLimit.AskHead = existingAskOrder; existingAskOrder.ParentLimit = existingLimit; Orders.Add(existingAskOrder.Id, existingAskOrder); Subscriptions.Add(existingAskOrder.Subscription.UserId, existingAskOrder.Subscription); // Act. Bid(_userId1, 1, 5); // Assert. var existingAskOrderClone = new Order { Id = 100, Shares = 5, Subscription = new Subscription { Owned = 5, UserId = _userId1 } }; var order = new Order { Id = 1, Shares = 5, Subscription = new Subscription { Owned = 5, UserId = _userId1 } }; var limit = new Limit { BidHead = order, Price = 1 * ScaleFactor }; order.ParentLimit = limit; existingAskOrderClone.ParentLimit = limit; limit.AskHead = existingAskOrderClone; Assert.AreEqual(1, Limits.Count); Assert.AreEqual(2, Orders.Count); Assert.AreEqual(1, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { limit }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { existingAskOrderClone, order }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { order.Subscription }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }
/// <summary> /// Дает координату на линии по проехавшему от начала перегона пути /// </summary> /// <param name="space"></param> /// <returns></returns> /// <exception cref="ArgumentNullException">Thrown when the arguments are <see langword="null"/></exception> /// <exception cref="ArgumentOutOfRangeException">Condition.</exception> /// <exception cref="InvalidOperationException">Исходная последовательность пуста.</exception> public override Double GetLimit(Double space) { var limit = Limits.FirstOrDefault(item => item.Space >= space); if (limit == null) { throw new ArgumentOutOfRangeException(nameof(space)); } var tmpPiketage = limit.Value; var direction = Limits.First() < Limits.Last(); var deltaSpace = space - limit.Space; return(direction ? tmpPiketage + deltaSpace / 100 : tmpPiketage - deltaSpace / 100); }
public void Bid_PartialExecutes_AginstUser1Ask_ButBidSharesIsLessThanAskShares() { // Arrange. var existingAskOrder = new Order { Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId1 } }; var existingLimit = Limits.First(); existingLimit.AskHead = existingAskOrder; existingAskOrder.ParentLimit = existingLimit; Limits.Add(existingLimit); Orders.Add(existingAskOrder.Id, existingAskOrder); Subscriptions.Add(existingAskOrder.Subscription.UserId, existingAskOrder.Subscription); // Act. Bid(_userId2, 1, 40); // Assert. var existingAskOrder2 = new Order { Shares = 60, Subscription = new Subscription { Owned = 60, UserId = _userId1 } }; var existingLimit2 = new Limit { Price = 1 * ScaleFactor, AskHead = existingAskOrder2 }; existingAskOrder2.ParentLimit = existingLimit2; var newBiddersSubscription = new Subscription { Owned = 40, UserId = _userId2 }; Assert.AreEqual(1, Limits.Count); Assert.AreEqual(1, Orders.Count); Assert.AreEqual(2, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { existingLimit2 }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { existingAskOrder2 }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { existingAskOrder2.Subscription, newBiddersSubscription }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }
public void Ask_Adds1Limit_With1Order_When1LimitExists_ButPriceLessThanExistingLimit() { // Arrange. Limits.First().Price = 2 * ScaleFactor; Subscriptions.Add(_userId1, new Subscription { Owned = 5, UserId = _userId1 }); // Act. Ask(_userId1, 1, 5); // Assert. var order = new Order { Id = 1, Shares = 5, Subscription = new Subscription { Owned = 5, UserId = _userId1 } }; var limit = new Limit { AskHead = order, Price = 1 * ScaleFactor }; order.ParentLimit = limit; Assert.AreEqual(2, Limits.Count); Assert.AreEqual(1, Orders.Count); Assert.AreEqual(1, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { limit, new Limit { Price = 2 * ScaleFactor } }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { order }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { order.Subscription }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }
public void Bid_PartialExecutes_3Limits3Bids1OnEachLimit() { // Arrange. var existingAskOrder = new Order { Id = 100, Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId1 } }; var existingAskOrder2 = new Order { Id = 200, Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId2 } }; var existingAskOrder3 = new Order { Id = 300, Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId3 } }; var existingLimit = Limits.First(); var limit2 = new Limit { Price = 2 * ScaleFactor }; var limit3 = new Limit { Price = 3 * ScaleFactor }; existingLimit.AskHead = existingAskOrder; limit2.AskHead = existingAskOrder2; limit3.AskHead = existingAskOrder3; existingAskOrder.ParentLimit = existingLimit; existingAskOrder2.ParentLimit = limit2; existingAskOrder3.ParentLimit = limit3; Limits.Add(limit2); Limits.Add(limit3); Orders.Add(existingAskOrder.Id, existingAskOrder); Orders.Add(existingAskOrder2.Id, existingAskOrder2); Orders.Add(existingAskOrder3.Id, existingAskOrder3); Subscriptions.Add(existingAskOrder.Subscription.UserId, existingAskOrder.Subscription); Subscriptions.Add(existingAskOrder2.Subscription.UserId, existingAskOrder2.Subscription); Subscriptions.Add(existingAskOrder3.Subscription.UserId, existingAskOrder3.Subscription); // Act. Bid(_userId4, 3, 400); // Assert. var existingAskOrderClone = new Order { Id = 100, Shares = 0, Subscription = new Subscription { Owned = 0, UserId = _userId1 } }; var existingAskOrder2Clone = new Order { Id = 200, Shares = 0, Subscription = new Subscription { Owned = 0, UserId = _userId2 } }; var existingAskOrder3Clone = new Order { Id = 300, Shares = 0, Subscription = new Subscription { Owned = 0, UserId = _userId3 } }; var newAskOrder = new Order { Id = 1, Shares = 100, Subscription = new Subscription { Owned = 300, UserId = _userId4 } }; var existingLimitClone = new Limit { Price = 1 * ScaleFactor, AskHead = existingAskOrderClone }; var existingLimit2Clone = new Limit { Price = 2 * ScaleFactor, AskHead = existingAskOrder2Clone }; var existingLimit3Clone = new Limit { Price = 3 * ScaleFactor, BidHead = newAskOrder, AskHead = existingAskOrder3Clone }; existingAskOrderClone.ParentLimit = existingLimitClone; existingAskOrder2Clone.ParentLimit = existingLimit2Clone; existingAskOrder3Clone.ParentLimit = existingLimit3Clone; newAskOrder.ParentLimit = existingLimitClone; Assert.AreEqual(3, Limits.Count); Assert.AreEqual(4, Orders.Count); Assert.AreEqual(4, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { existingLimitClone, existingLimit2Clone, existingLimit3Clone }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { existingAskOrderClone, existingAskOrder2Clone, existingAskOrder3Clone, newAskOrder }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { existingAskOrderClone.Subscription, existingAskOrder2Clone.Subscription, existingAskOrder3Clone.Subscription, newAskOrder.Subscription }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }
public void Bid_FullyExecutes_1Limit3Asks() { // Arrange. var existingAskOrder = new Order { Id = 100, Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId1 } }; var existingAskOrder2 = new Order { Id = 200, Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId2 } }; var existingAskOrder3 = new Order { Id = 300, Shares = 100, Subscription = new Subscription { Owned = 100, UserId = _userId3 } }; existingAskOrder.Next = existingAskOrder2; existingAskOrder2.Prev = existingAskOrder; existingAskOrder2.Next = existingAskOrder3; existingAskOrder3.Prev = existingAskOrder2; var existingLimit = Limits.First(); existingLimit.AskHead = existingAskOrder; existingAskOrder.ParentLimit = existingLimit; existingAskOrder2.ParentLimit = existingLimit; existingAskOrder3.ParentLimit = existingLimit; Orders.Add(existingAskOrder.Id, existingAskOrder); Orders.Add(existingAskOrder2.Id, existingAskOrder2); Orders.Add(existingAskOrder3.Id, existingAskOrder3); Subscriptions.Add(existingAskOrder.Subscription.UserId, existingAskOrder.Subscription); Subscriptions.Add(existingAskOrder2.Subscription.UserId, existingAskOrder2.Subscription); Subscriptions.Add(existingAskOrder3.Subscription.UserId, existingAskOrder3.Subscription); // Act. Bid(_userId4, 1, 300); // Assert. var existingAskOrderClone = new Order { Id = 100, Shares = 0, Subscription = new Subscription { Owned = 0, UserId = _userId1 } }; var existingAskOrder2Clone = new Order { Id = 200, Shares = 0, Subscription = new Subscription { Owned = 0, UserId = _userId2 } }; var existingAskOrder3Clone = new Order { Id = 300, Shares = 0, Subscription = new Subscription { Owned = 0, UserId = _userId3 } }; existingAskOrderClone.Next = existingAskOrder2Clone; existingAskOrder2Clone.Prev = existingAskOrder; existingAskOrder2Clone.Next = existingAskOrder3Clone; existingAskOrder3Clone.Prev = existingAskOrder2Clone; var existingLimitClone = new Limit { Price = 1 * ScaleFactor, AskHead = existingAskOrderClone }; existingAskOrderClone.ParentLimit = existingLimitClone; existingAskOrder2Clone.ParentLimit = existingLimitClone; existingAskOrder3Clone.ParentLimit = existingLimitClone; var newBidderSubscription = new Subscription { Owned = 300, UserId = _userId4 }; Assert.AreEqual(1, Limits.Count); Assert.AreEqual(3, Orders.Count); Assert.AreEqual(4, Subscriptions.Count); CollectionAssert.AreEqual(new Limit[] { existingLimitClone }, Limits, _limitTestComparer); CollectionAssert.AreEqual(new Order[] { existingAskOrderClone, existingAskOrder2Clone, existingAskOrder3Clone }, (ICollection)Orders.Values, _orderTestComparer); CollectionAssert.AreEqual(new Subscription[] { existingAskOrderClone.Subscription, existingAskOrder2Clone.Subscription, existingAskOrder3Clone.Subscription, newBidderSubscription }, (ICollection)Subscriptions.Values, _subscriptionTestComparer); }