125 lines
4.3 KiB
Python
125 lines
4.3 KiB
Python
import os
|
|
import sys
|
|
|
|
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
|
|
sys.path.append(root)
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from ccxt.test.exchange.base import test_shared_methods # noqa E402
|
|
|
|
async def test_features(exchange, skipped_properties):
|
|
market_types = ['spot', 'swap', 'future', 'option']
|
|
sub_types = ['linear', 'inverse']
|
|
features = exchange.features
|
|
keys = list(features.keys())
|
|
for i in range(0, len(keys)):
|
|
test_shared_methods.assert_in_array(exchange, skipped_properties, 'features', keys, i, market_types)
|
|
market_type = keys[i]
|
|
value = features[market_type]
|
|
# assert (value !== undefined, 'exchange.features["' + marketType + '"] is undefined, that key should be either absent or have a value');
|
|
if value is None:
|
|
continue
|
|
if market_type == 'spot':
|
|
test_features_inner(exchange, skipped_properties, value)
|
|
else:
|
|
sub_keys = list(value.keys())
|
|
for j in range(0, len(sub_keys)):
|
|
sub_key = sub_keys[j]
|
|
test_shared_methods.assert_in_array(exchange, skipped_properties, 'features', sub_keys, j, sub_types)
|
|
sub_value = value[sub_key]
|
|
# sometimes it might not be available for exchange, eg. future>inverse)
|
|
if sub_value is not None:
|
|
test_features_inner(exchange, skipped_properties, sub_value)
|
|
return True
|
|
|
|
|
|
def test_features_inner(exchange, skipped_properties, feature_obj):
|
|
format = {
|
|
'sandbox': False,
|
|
'createOrder': {
|
|
'marginMode': False,
|
|
'triggerPrice': False,
|
|
'triggerPriceType': {
|
|
'mark': False,
|
|
'last': False,
|
|
'index': False,
|
|
},
|
|
'stopLossPrice': False,
|
|
'takeProfitPrice': False,
|
|
'attachedStopLossTakeProfit': {
|
|
'triggerPriceType': {
|
|
'last': False,
|
|
'mark': False,
|
|
'index': False,
|
|
},
|
|
'price': False,
|
|
},
|
|
'timeInForce': {
|
|
'GTC': False,
|
|
'IOC': False,
|
|
'FOK': False,
|
|
'PO': False,
|
|
'GTD': False,
|
|
},
|
|
'hedged': False,
|
|
'trailing': False,
|
|
},
|
|
'createOrders': {
|
|
'max': 5,
|
|
},
|
|
'fetchMyTrades': {
|
|
'marginMode': False,
|
|
'daysBack': 0,
|
|
'limit': 0,
|
|
'untilDays': 0,
|
|
'symbolRequired': False,
|
|
},
|
|
'fetchOrder': {
|
|
'marginMode': False,
|
|
'trigger': False,
|
|
'trailing': False,
|
|
'symbolRequired': False,
|
|
},
|
|
'fetchOpenOrders': {
|
|
'marginMode': False,
|
|
'limit': 0,
|
|
'trigger': False,
|
|
'trailing': False,
|
|
'symbolRequired': False,
|
|
},
|
|
'fetchOrders': {
|
|
'marginMode': False,
|
|
'limit': 0,
|
|
'daysBack': 0,
|
|
'untilDays': 0,
|
|
'trigger': False,
|
|
'trailing': False,
|
|
'symbolRequired': False,
|
|
},
|
|
'fetchClosedOrders': {
|
|
'marginMode': False,
|
|
'limit': 0,
|
|
'daysBack': 0,
|
|
'daysBackCanceled': 0,
|
|
'untilDays': 0,
|
|
'trigger': False,
|
|
'trailing': False,
|
|
'symbolRequired': False,
|
|
},
|
|
'fetchOHLCV': {
|
|
'limit': 0,
|
|
},
|
|
}
|
|
feature_keys = list(feature_obj.keys())
|
|
all_methods = list(exchange.has.keys())
|
|
for i in range(0, len(feature_keys)):
|
|
test_shared_methods.assert_in_array(exchange, skipped_properties, 'features', feature_keys, i, all_methods)
|
|
test_shared_methods.assert_structure(exchange, skipped_properties, 'features', feature_obj, format, None, True) # deep structure check
|