2021-07-27 13:49:27 -07:00
|
|
|
import typing
|
|
|
|
|
|
|
|
from solana.publickey import PublicKey
|
|
|
|
|
|
|
|
from .context import mango
|
|
|
|
from .fakes import fake_account_info, fake_seeded_public_key
|
|
|
|
|
|
|
|
from decimal import Decimal
|
|
|
|
|
|
|
|
|
|
|
|
def test_constructor():
|
|
|
|
address = fake_seeded_public_key("perp event queue address")
|
|
|
|
account_info: mango.AccountInfo = fake_account_info(address)
|
|
|
|
meta_data: mango.Metadata = mango.Metadata(mango.layouts.DATA_TYPE.EventQueue, mango.Version.V1, True)
|
|
|
|
head: Decimal = Decimal(0)
|
|
|
|
count: Decimal = Decimal(0)
|
|
|
|
sequence_number: Decimal = Decimal(0)
|
2021-08-01 09:47:45 -07:00
|
|
|
unprocessed_events: typing.Sequence[typing.Optional[mango.PerpEvent]] = []
|
|
|
|
processed_events: typing.Sequence[typing.Optional[mango.PerpEvent]] = []
|
2021-07-27 13:49:27 -07:00
|
|
|
|
2021-08-01 09:47:45 -07:00
|
|
|
actual = mango.PerpEventQueue(account_info, mango.Version.V1, meta_data, head, count,
|
|
|
|
sequence_number, unprocessed_events, processed_events)
|
2021-07-27 13:49:27 -07:00
|
|
|
assert actual is not None
|
|
|
|
assert actual.logger is not None
|
|
|
|
assert actual.account_info == account_info
|
|
|
|
assert actual.meta_data == meta_data
|
|
|
|
assert actual.address == address
|
|
|
|
assert actual.head == head
|
|
|
|
assert actual.count == count
|
|
|
|
assert actual.sequence_number == sequence_number
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.unprocessed_events == unprocessed_events
|
|
|
|
assert actual.processed_events == processed_events
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
|
2021-08-01 09:47:45 -07:00
|
|
|
def _fake_pev(head: Decimal, count: Decimal, sequence_number: Decimal, unprocessed: typing.Sequence[mango.PerpEvent], processed: typing.Sequence[mango.PerpEvent]) -> mango.PerpEventQueue:
|
2021-07-27 13:49:27 -07:00
|
|
|
address = fake_seeded_public_key("perp event queue address")
|
|
|
|
account_info: mango.AccountInfo = fake_account_info(address)
|
|
|
|
meta_data: mango.Metadata = mango.Metadata(mango.layouts.DATA_TYPE.EventQueue, mango.Version.V1, True)
|
2021-08-01 09:47:45 -07:00
|
|
|
return mango.PerpEventQueue(account_info, mango.Version.V1, meta_data, head, count, sequence_number, unprocessed, processed)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
|
|
|
|
class TstPE(mango.PerpEvent):
|
2021-08-01 09:47:45 -07:00
|
|
|
def __init__(self, event_type: int = 25, original_index: Decimal = Decimal(0)):
|
|
|
|
super().__init__(event_type, original_index)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
@property
|
|
|
|
def accounts_to_crank(self) -> typing.Sequence[PublicKey]:
|
|
|
|
return []
|
|
|
|
|
2021-08-01 10:03:46 -07:00
|
|
|
def __str__(self) -> str:
|
2021-07-27 13:49:27 -07:00
|
|
|
return f"« TstPE [{self.event_type}] »"
|
|
|
|
|
|
|
|
|
|
|
|
def test_unseen_with_no_changes():
|
2021-08-01 09:47:45 -07:00
|
|
|
initial = _fake_pev(Decimal(5), Decimal(2), Decimal(7), [], [TstPE(), TstPE(), TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
actual: mango.UnseenPerpEventChangesTracker = mango.UnseenPerpEventChangesTracker(initial)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(7)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
2021-08-01 09:47:45 -07:00
|
|
|
updated = _fake_pev(Decimal(5), Decimal(2), Decimal(7), [], [TstPE(), TstPE(), TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
unseen = actual.unseen(updated)
|
|
|
|
assert len(unseen) == 0
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(7)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
|
|
|
|
def test_unseen_with_one_unprocessed_change():
|
2021-08-01 09:47:45 -07:00
|
|
|
initial = _fake_pev(Decimal(1), Decimal(0), Decimal(1), [TstPE()], [TstPE(), TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
actual: mango.UnseenPerpEventChangesTracker = mango.UnseenPerpEventChangesTracker(initial)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(1)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
marker = TstPE(50)
|
2021-08-01 09:47:45 -07:00
|
|
|
updated = _fake_pev(Decimal(2), Decimal(1), Decimal(2), [marker], [TstPE(), TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
unseen = actual.unseen(updated)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(2)
|
2021-07-27 13:49:27 -07:00
|
|
|
assert len(unseen) == 1
|
|
|
|
assert unseen[0] == marker
|
|
|
|
|
|
|
|
|
|
|
|
def test_unseen_with_two_unprocessed_changes():
|
2021-08-01 09:47:45 -07:00
|
|
|
initial = _fake_pev(Decimal(1), Decimal(0), Decimal(1), [], [TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
actual: mango.UnseenPerpEventChangesTracker = mango.UnseenPerpEventChangesTracker(initial)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(1)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
marker1 = TstPE(50)
|
|
|
|
marker2 = TstPE(51)
|
2021-08-01 09:47:45 -07:00
|
|
|
updated = _fake_pev(Decimal(3), Decimal(2), Decimal(3), [marker1, marker2], [TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
unseen = actual.unseen(updated)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(3)
|
2021-07-27 13:49:27 -07:00
|
|
|
assert len(unseen) == 2
|
|
|
|
assert unseen[0] == marker1
|
|
|
|
assert unseen[1] == marker2
|
|
|
|
|
|
|
|
|
|
|
|
def test_unseen_with_two_processed_changes():
|
|
|
|
# This should be identical to the previous test - it shouldn't matter to 'seen' tracking whether an event
|
|
|
|
# is processed or not.
|
2021-08-01 09:47:45 -07:00
|
|
|
initial = _fake_pev(Decimal(1), Decimal(0), Decimal(1), [], [TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
actual: mango.UnseenPerpEventChangesTracker = mango.UnseenPerpEventChangesTracker(initial)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(1)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
marker1 = TstPE(50)
|
|
|
|
marker2 = TstPE(51)
|
2021-08-01 09:47:45 -07:00
|
|
|
updated = _fake_pev(Decimal(3), Decimal(0), Decimal(3), [marker1, marker2], [TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
unseen = actual.unseen(updated)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(3)
|
2021-07-27 13:49:27 -07:00
|
|
|
assert len(unseen) == 2
|
|
|
|
assert unseen[0] == marker1
|
|
|
|
assert unseen[1] == marker2
|
|
|
|
|
|
|
|
|
|
|
|
def test_unseen_with_two_unprocessed_changes_wrapping_around():
|
|
|
|
# This is tricky because the change overlaps the end of the array-as-ringbuffer. A change is added
|
|
|
|
# to the next slot (which is the last slot in the array) and then another is added to the next slot
|
|
|
|
# (which is the first slot in the array). Seen tracking shouldn't care - it should just return the
|
|
|
|
# unseen events in the proper order.
|
2021-08-01 09:47:45 -07:00
|
|
|
initial = _fake_pev(Decimal(4), Decimal(0), Decimal(7), [], [TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
actual: mango.UnseenPerpEventChangesTracker = mango.UnseenPerpEventChangesTracker(initial)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(7)
|
2021-07-27 13:49:27 -07:00
|
|
|
|
|
|
|
marker1 = TstPE(50)
|
|
|
|
marker2 = TstPE(51)
|
2021-08-01 09:47:45 -07:00
|
|
|
updated = _fake_pev(Decimal(1), Decimal(2), Decimal(9), [marker1, marker2], [TstPE(), TstPE(), TstPE()])
|
2021-07-27 13:49:27 -07:00
|
|
|
unseen = actual.unseen(updated)
|
2021-08-01 09:47:45 -07:00
|
|
|
assert actual.last_sequence_number == Decimal(9)
|
2021-07-27 13:49:27 -07:00
|
|
|
assert len(unseen) == 2
|
|
|
|
assert unseen[0] == marker1
|
|
|
|
assert unseen[1] == marker2
|