def test_LOB_cancel_ask(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)
        LOB.update('insert', 'sell', 500, 'strategy', LOB.askBook.nearPrice)
        LOB.update('insert', 'sell', 500, 'ZIagent', LOB.askBook.nearPrice)

        # [['ZIagent', 1000], ['strategy', 500], ['ZIagent', 500]]
        LOB.update('cancel', 'sell', 100, 'strategy', LOB.askBook.nearPrice)
        assert LOB.askBook.Book_public[0].qty == 1900
        assert LOB.askBook.Book_private[0][1].qty == 400
        assert LOB.askBook.Book_private[0][0].qty == 1000
        assert LOB.askBook.Book_private[0][2].qty == 500

        # LOB.askBook.Book_public
        # deque([prc_qty(price=10.5, qty=1900),
        #        prc_qty(price=10.6, qty=1000),
        #        prc_qty(price=10.7, qty=1000),
        #        prc_qty(price=10.8, qty=1000),
        #        prc_qty(price=10.9, qty=1000)])

        # LOB.askBook.Book_private
        # deque([[ID_qty(ID='ZIagent', qty=1000),ID_qty(ID='strategy', qty=400),ID_qty(ID='ZIagent', qty=500)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)]])

        LOB.update('cancel', 'sell', 700, 'ZIagent', LOB.askBook.nearPrice)
        assert LOB.askBook.Book_public[0].qty == 1200
        assert LOB.askBook.Book_private[0][1].qty == 400
        assert LOB.askBook.Book_private[0][0].qty == 800
        assert len(LOB.askBook.Book_private[0]) == 2
    def test_LOB_cross_market_sell(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        bid_former = LOB.bidBook.nearPrice
        LOB.update('cross', 'sell', 1000)
        assert LOB.bidBook.nearPrice == round(bid_former - 1 * tick, 4)
        assert LOB.bidBook.Book_public[-1].qty == 0
        assert LOB.bidBook.Book_public[-1].price == LOB.bidBook.nearPrice - (
            orderLevel - 1) * tick
    def test_LOB_cross_market_buy(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        ask_former = LOB.askBook.nearPrice
        LOB.update('cross', 'buy', 1000)
        assert LOB.askBook.nearPrice == round(ask_former + 1 * tick, 4)
        assert LOB.askBook.Book_public[-1].qty == 0
        assert LOB.askBook.Book_public[-1].price == LOB.askBook.nearPrice + (
            orderLevel - 1) * tick
    def test_LOB_insert_new_bid1(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        ##
        LOB.update('insert', 'buy', 500, 'ZIagent',
                   LOB.bidBook.nearPrice + 1 * tick)
        assert LOB.bidBook.Book_public[0].qty == 500
        assert len(LOB.bidBook.Book_private[0]) == 1
        assert LOB.bidBook.Book_private[0][-1].ID == 'ZIagent'
        assert LOB.bidBook.Book_private[0][-1].qty == 500

        ##
        LOB.update('insert', 'buy', 500, 'strategy', LOB.bidBook.nearPrice)
        assert LOB.bidBook.Book_public[0].qty == 1000
        assert len(LOB.bidBook.Book_private[0]) == 2
        assert LOB.bidBook.Book_private[0][-1].ID == 'strategy'
        assert LOB.bidBook.Book_private[0][-1].qty == 500

        ##
        LOB.update('insert', 'buy', 500, 'ZIagent', LOB.bidBook.nearPrice)
        assert LOB.bidBook.Book_public[0].qty == 1500
        assert len(LOB.bidBook.Book_private[0]) == 3
        assert LOB.bidBook.Book_private[0][-1].ID == 'ZIagent'
        assert LOB.bidBook.Book_private[0][-1].qty == 500
    def test_LOB_insert_at_ask2(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        ##
        LOB.update('insert', 'sell', 500, 'ZIagent',
                   LOB.askBook.nearPrice + 1 * tick)
        assert LOB.askBook.Book_public[1].qty == 1500
        assert len(LOB.askBook.Book_private[1]) == 1
        assert LOB.askBook.Book_private[1][-1].ID == 'ZIagent'
        assert LOB.askBook.Book_private[1][-1].qty == 1500

        ##
        LOB.update('insert', 'sell', 500, 'strategy',
                   LOB.askBook.nearPrice + 1 * tick)
        assert LOB.askBook.Book_public[1].qty == 2000
        assert len(LOB.askBook.Book_private[1]) == 2
        assert LOB.askBook.Book_private[1][-1].ID == 'strategy'
        assert LOB.askBook.Book_private[1][-1].qty == 500

        ##
        LOB.update('insert', 'sell', 500, 'ZIagent',
                   LOB.askBook.nearPrice + 1 * tick)
        assert LOB.askBook.Book_public[1].qty == 2500
        assert len(LOB.askBook.Book_private[1]) == 3
        assert LOB.askBook.Book_private[1][-1].ID == 'ZIagent'
        assert LOB.askBook.Book_private[1][-1].qty == 500
    def test_LOB_insert_beyond_ask(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        ##
        LOB.update('insert', 'sell', 500, 'ZIagent',
                   LOB.askBook.nearPrice + (orderLevel + 1) * tick)

        assert LOB.askBook.Book_public[-1].price == round(
            LOB.askBook.nearPrice + (orderLevel + 1) * tick, 4)
        assert LOB.askBook.Book_public[-1].qty == 500
        assert len(LOB.askBook.Book_private[-1]) == 1
        assert LOB.askBook.Book_private[-1][-1].ID == 'ZIagent'
        assert LOB.askBook.Book_private[-1][-1].qty == 500
        assert len(LOB.askBook.Book_private[-2]) == 0
        assert LOB.askBook.Book_private[-2] == []
    def test_LOB_insert_new_ask1_leq2tick(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        ##
        LOB.update('insert', 'sell', 500, 'ZIagent',
                   LOB.askBook.nearPrice - 2 * tick)
        assert LOB.askBook.Book_public[0].price == LOB.askBook.nearPrice
        assert LOB.askBook.Book_public[0].qty == 500
        assert len(LOB.askBook.Book_private[0]) == 1
        assert LOB.askBook.Book_private[0][-1].ID == 'ZIagent'
        assert LOB.askBook.Book_private[0][-1].qty == 500

        assert LOB.askBook.Book_public[1].price == round(
            LOB.askBook.nearPrice + 1 * tick, 4)
        assert LOB.askBook.Book_public[1].qty == 0
        assert LOB.askBook.Book_private[1] == []
    def test_LOB_cross_market_sell_bid2eq0(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        LOB.update('insert', 'buy', 500, 'strategy',
                   LOB.bidBook.nearPrice + 2 * tick)
        # LOB.bidBook.Book_public
        # deque([prc_qty(price=9.7, qty=500),
        #        prc_qty(price=9.6, qty=0),
        #        prc_qty(price=9.5, qty=1000),
        #        prc_qty(price=9.4, qty=1000),
        #        prc_qty(price=9.3, qty=1000),
        #        prc_qty(price=9.2, qty=1000),
        #        prc_qty(price=9.1, qty=1000)])

        # LOB.bidBook.Book_private
        # deque([[ID_qty(ID='strategy', qty=500)],
        #        [],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)]])

        bid_former = LOB.bidBook.nearPrice
        LOB.update('cross', 'sell', 500)
        assert LOB.bidBook.nearPrice == round(bid_former - 2 * tick, 4)
    def test_LOB_cross_market_buy_ask2eq0(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)
        LOB.update('insert', 'sell', 500, 'strategy',
                   LOB.askBook.nearPrice - 2 * tick)

        # LOB.askBook.Book_public
        # deque([prc_qty(price=10.3, qty=500),
        #        prc_qty(price=10.4, qty=0),
        #        prc_qty(price=10.5, qty=1000),
        #        prc_qty(price=10.6, qty=1000),
        #        prc_qty(price=10.7, qty=1000),
        #        prc_qty(price=10.8, qty=1000),
        #        prc_qty(price=10.9, qty=1000)])

        # LOB.askBook.Book_private
        # deque([[ID_qty(ID='strategy', qty=500)],
        #        [],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)],
        #        [ID_qty(ID='ZIagent', qty=1000)]])

        ask_former = LOB.askBook.nearPrice
        LOB.update('cross', 'buy', 500)
        assert LOB.askBook.nearPrice == round(ask_former + 2 * tick, 4)
    def test_LOB_cancel_ask_0(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)

        ##
        former_ask = LOB.askBook.nearPrice
        LOB.update('cancel', 'sell', 1000, 'ZIagent',
                   LOB.askBook.nearPrice + tick)
        LOB.update('cancel', 'sell', 1000, 'ZIagent', LOB.askBook.nearPrice)

        assert LOB.askBook.nearPrice == former_ask + 2 * tick
        assert LOB.askBook.Book_public[-1].qty == 0
        assert LOB.askBook.Book_public[-2].qty == 0
        assert LOB.askBook.Book_private[-1] == []
        assert LOB.askBook.Book_private[-2] == []
    def test_LOB_insert_ask_at_empty(self):

        LOB = LimitOrderBook(ask, bid, tick, orderLevel)
        LOB.update('insert', 'sell', 500, 'ZIagent',
                   LOB.askBook.nearPrice - 2 * tick)

        ##
        LOB.update('insert', 'sell', 500, 'ZIagent',
                   LOB.askBook.nearPrice + 1 * tick)

        assert LOB.askBook.Book_public[1].price == round(
            LOB.askBook.nearPrice + 1 * tick, 4)
        assert LOB.askBook.Book_public[1].qty == 500
        assert len(LOB.askBook.Book_private[1]) == 1
        assert LOB.askBook.Book_private[1][-1].ID == 'ZIagent'
        assert LOB.askBook.Book_private[1][-1].qty == 500
from LOB import AskBook, BidBook, LimitOrderBook
import pytest

ask = 10.5
bid = 9.5
tick = 0.1
orderLevel = 5

LOB = LimitOrderBook(ask, bid, tick, orderLevel)


class TestClass:
    '''Test: Insert orders'''

    # Insert limit buy orders
    def test_LOB_insert_at_bid1(self):
        ##
        LOB.update('insert', 'buy', 500, 'ZIagent', LOB.bidBook.bid)
        assert LOB.bidBook.bidBook_public[0][1] == 1500
        assert LOB.bidBook.bidBook_private[0] == [['ZIagent', 1500]]

        ##
        LOB.update('insert', 'buy', 500, 'strategy', LOB.bidBook.bid)
        assert LOB.bidBook.bidBook_public[0][1] == 2000
        assert LOB.bidBook.bidBook_private[0] == [['ZIagent', 1500],
                                                  ['strategy', 500]]

        ##
        LOB.update('insert', 'buy', 500, 'ZIagent', LOB.bidBook.bid)
        assert LOB.bidBook.bidBook_public[0][1] == 2500
        assert LOB.bidBook.bidBook_private[0] == [['ZIagent', 1500],