You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.8 KiB
135 lines
5.8 KiB
#! /usr/bin/env python |
|
'''support functions for jmclient tests.''' |
|
|
|
import pytest |
|
from jmclient import (select, select_gradual, select_greedy, select_greediest, |
|
choose_orders, choose_sweep_orders, weighted_order_choose) |
|
from jmclient.support import (calc_cj_fee, rand_exp_array, rand_pow_array, |
|
rand_norm_array, rand_weighted_choice, |
|
cheapest_order_choose) |
|
from taker_test_data import t_orderbook |
|
import copy |
|
|
|
def test_utxo_selection(): |
|
"""Check that all the utxo selection algorithms work with a random |
|
variety of wallet contents. |
|
""" |
|
unspent = [{'utxo':'a', 'value': 10000000}, |
|
{'utxo':'b', 'value': 20000000}, |
|
{'utxo':'c', 'value': 50000000}, |
|
{'utxo':'d', 'value': 50000000}] |
|
for selector in [select, select_gradual, select_greedy, select_greediest]: |
|
for amt in [9999999, 10000000, 110000000, 19999999, 20000000, |
|
49999999, 50000000, 99999999, 100000000]: |
|
selector(unspent, amt) |
|
for amt in [1300000010, 2000000000]: |
|
with pytest.raises(Exception) as e_info: |
|
x = selector(unspent, amt) |
|
print(x) |
|
assert e_info.match("Not enough funds") |
|
|
|
def test_random_funcs(): |
|
x1 = rand_norm_array(5, 2, 10) |
|
assert len(x1) == 10 |
|
for x in x1: |
|
assert x > -7 #6 sigma! |
|
x2 = rand_exp_array(100, 10) |
|
assert len(x2) == 10 |
|
for x in x2: |
|
assert x > 0 |
|
x3 = rand_pow_array(100, 10) |
|
assert len(x3) == 10 |
|
for x in x3: |
|
assert x > 0 |
|
assert x < 1 |
|
x4 = rand_weighted_choice(5, [0.2, 0.1, 0.3, 0.15, 0.25]) |
|
assert x4 in range(5) |
|
#test weighted choice fails with invalid inputs |
|
with pytest.raises(ValueError) as e_info: |
|
x = rand_weighted_choice(5, [0.2, 0.1, 0.3, 0.15, 0.26]) |
|
assert e_info.match("Sum of probabilities") |
|
with pytest.raises(ValueError) as e_info: |
|
x = rand_weighted_choice(5, [0.25, 0.25, 0.25, 0.25]) |
|
assert e_info.match("Need: 5 probabilities.") |
|
|
|
def test_calc_cjfee(): |
|
assert calc_cj_fee("swabsoffer", 3000, 200000000) == 3000 |
|
assert calc_cj_fee("swreloffer", "0.01", 100000000) == 1000000 |
|
with pytest.raises(RuntimeError) as e_info: |
|
calc_cj_fee("dummyoffer", 2, 3) |
|
|
|
def test_choose_orders(): |
|
orderbook = copy.deepcopy(t_orderbook) |
|
#test not enough liquidity |
|
orders_fees = choose_orders(orderbook, 10000000, 7, weighted_order_choose) |
|
assert orders_fees == (None, 0) |
|
orders_fees = choose_orders(orderbook, 10000000, 3, weighted_order_choose) |
|
#need variable fee sizes |
|
for i, o in enumerate(orderbook): |
|
o['cjfee'] = str(float(o['cjfee']) + 0.0001*i) |
|
#test phi not zero |
|
orders_fees = choose_orders(orderbook, 10000000, 3, weighted_order_choose) |
|
assert len(orders_fees[0]) == 3 |
|
#test M < orderbook size for weighted |
|
orders_fees = choose_orders(orderbook, 10000000, 1, weighted_order_choose) |
|
assert len(orders_fees[0]) == 1 |
|
#test the hated 'cheapest' |
|
orders_fees = choose_orders(orderbook, 100000000, 3, cheapest_order_choose) |
|
assert len(orders_fees[0]) == 3 |
|
#test sweep |
|
result, cjamount, total_fee = choose_sweep_orders(orderbook, 50000000, |
|
30000, |
|
3, |
|
weighted_order_choose, |
|
None) |
|
assert cjamount >= 49800000 |
|
assert cjamount <= 50000000 |
|
assert total_fee >= 30000 |
|
assert total_fee <= 100000 |
|
assert len(result) == 3 |
|
#test not enough liquidity |
|
result, cjamount, total_fee = choose_sweep_orders(orderbook, 50000000, |
|
30000, 7, |
|
weighted_order_choose, |
|
None) |
|
assert result == None |
|
assert cjamount == 0 |
|
assert total_fee == 0 |
|
|
|
#here we doctor the orderbook; (a) include an absfee |
|
#(b) add an unrecognized ordertype (does not raise, ignores) |
|
#(c) put an order with wrong minsize |
|
orderbook.append({u'counterparty': u'fake', |
|
u'ordertype': u'swabsoffer', u'oid': 0, |
|
u'minsize': 7500000, u'txfee': 1000, |
|
u'maxsize': 599972700, u'cjfee': 9000}) |
|
result, cjamount, total_fee = choose_sweep_orders(orderbook, 50000000, |
|
30000, 7, |
|
cheapest_order_choose, |
|
None) |
|
assert total_fee > 0 |
|
#(b) |
|
orderbook.append({u'counterparty': u'fake2', |
|
u'ordertype': u'dummyoffer', u'oid': 0, |
|
u'minsize': 7500000, u'txfee': 1000, |
|
u'maxsize': 599972700, u'cjfee': 9000}) |
|
result, cjamount, total_fee = choose_sweep_orders(orderbook, |
|
50000000, |
|
30000, |
|
8, |
|
weighted_order_choose, |
|
None) |
|
#(c) |
|
#remove bad offer |
|
orderbook = orderbook[:-1] |
|
for i in range(7): |
|
orderbook[i]['minsize'] = 49999999 |
|
result, cjamount, total_fee = choose_sweep_orders(orderbook, |
|
50000000, |
|
30000, |
|
4, |
|
weighted_order_choose, |
|
None) |
|
assert result == None |
|
assert cjamount == 0 |
|
assert total_fee == 0 |