mmgen-wallet/test/modtest_d/misc.py

194 lines
7.1 KiB
Python
Executable file

#!/usr/bin/env python3
"""
test.modtest_d.misc: miscellaneous unit tests for the MMGen suite
"""
import re, time
from collections import namedtuple
from mmgen.color import yellow, blue, brown
from ..include.common import vmsg
class unit_tests:
def format_elapsed_hr(self, name, ut, desc='function util.format_elapsed_hr()'):
from mmgen.util2 import format_elapsed_hr
vectors = (
# t now rel_now show_secs out
(1, 1, False, False, '0 minutes'),
(1, 1, True, False, 'just now'),
(0, -2, True, False, 'just now'),
(0, -62, True, False, '1 minute in the future'),
(0, -62, False, False, '1 minute (negative elapsed)'),
(0, 7, False, False, '0 minutes'),
(0, 7, True, False, 'just now'),
(0, 60, True, False, '1 minute ago'),
(0, 67, True, False, '1 minute ago'),
(0, 7200, True, False, '2 hours ago'),
(0, 3600 + 180 + 1, True, False, '1 hour 3 minutes ago'),
(0, 3600*27 + 180 + 7, True, False, '1 day 3 hours 3 minutes ago'),
(0, 3600*24*367 + 180 + 7, True, False, '367 days 3 minutes ago'),
(1, 1, False, True, '0 seconds'),
(1, 1, True, True, 'just now'),
(0, -2, True, True, '2 seconds in the future'),
(0, -62, True, True, '1 minute 2 seconds in the future'),
(0, -62, False, True, '1 minute 2 seconds (negative elapsed)'),
(0, 7, False, True, '7 seconds'),
(0, 7, True, True, '7 seconds ago'),
(0, 60, False, True, '1 minute'),
(0, 67, False, True, '1 minute 7 seconds'),
(0, 7200, False, True, '2 hours'),
(0, 3600 + 180 + 1, False, True, '1 hour 3 minutes 1 second'),
(0, 3600*27 + 180 + 7, False, True, '1 day 3 hours 3 minutes 7 seconds'),
(0, 3600*24*367 + 180 + 7, True, True, '367 days 3 minutes 7 seconds ago'),
)
fs = ' {:7} {:9} {:<8} {}'
vmsg(brown(' vectors:'))
vmsg(fs.format('REL_NOW', 'SHOW_SECS', 'ELAPSED', 'OUTPUT'))
for (t, now, rel_now, show_secs, out_chk) in vectors:
out = format_elapsed_hr(t, now=now, rel_now=rel_now, show_secs=show_secs)
assert out == out_chk, f'{out} != {out_chk}'
vmsg(fs.format(repr(rel_now), repr(show_secs), now-t, out))
vmsg(brown(' real time:'))
start = time.time() - 3600 - 127
ret = format_elapsed_hr(start) # test old default behavior
vmsg(f' {3600 - 127:<8} {ret}')
ret = format_elapsed_hr(start, show_secs=True)
vmsg(f' {3600 - 127:<8} {ret}')
return True
def xmrwallet_uarg_info(self, name, ut, desc='dict xmrwallet.xmrwallet_uarg_info'): # WIP
from mmgen.xmrwallet import uarg_info
vs = namedtuple('vector_data', ['text', 'groups'])
fs = '{:16} {}'
vmsg(blue(' ' + fs.format('ID', 'ANNOT')))
for k, v in uarg_info.items():
vmsg(' ' + fs.format(k, v[0]))
vectors = {
'sweep_spec': (
vs('1:2', "('1', '2', None, None)"),
vs('1:2,3', "('1', '2', '3', None)"),
vs('1:2,3:4', "('1', '2', '3', '4')"),
),
}
vmsg('')
for k, v in uarg_info.items():
vmsg(f' {k}')
if k in vectors:
vmsg(f' pat: {v.pat}')
vmsg( ' vectors:')
for vec in vectors[k]:
m = re.match(v.pat, vec.text)
vmsg(f' {vec.text:10} ==> {m.groups()}')
assert str(m.groups()) == vec.groups
else:
vmsg(yellow(' TBD'))
return True
def pyversion(self, name, ut, desc='class pyversion.PythonVersion'):
from mmgen.pyversion import PythonVersion, python_version
ver = {}
fs = '{:<7} {:<9} {:<5} {}'
vmsg('\n' + fs.format('Version', 'PyVersion', 'Major', 'Minor'))
for k in ('current', '3.3', '3.12', '4.3', '7.0'):
obj = python_version if k == 'current' else PythonVersion(k)
major, minor = [int(s) for s in obj.split('.')]
assert obj.major == major and obj.minor == minor
vmsg(fs.format(k.upper(), obj, major, minor))
ver[k] = obj
vmsg('\nPerforming comparison tests:')
assert ver['3.3'] == '3.3'
assert ver['current'] < ver['7.0']
assert ver['3.3'] < ver['4.3']
assert ver['3.12'] < ver['7.0']
assert ver['3.3'] < ver['3.12']
assert ver['current'] < '7.0'
assert ver['3.3'] < '4.3'
assert ver['3.12'] < '7.0'
assert ver['3.3'] < '3.12' # ensure we’re comparing numerically, not stringwise
assert ver['current'] <= ver['current']
assert ver['3.3'] <= '4.3'
assert ver['3.12'] <= '7.0'
assert ver['3.3'] <= '3.12'
assert ver['current'] == ver['current']
assert ver['3.3'] == ver['3.3']
assert ver['3.3'] != ver['3.12']
assert ver['3.3'] != ver['4.3']
assert ver['3.3'] == '3.3'
assert ver['3.3'] != '3.12'
assert ver['3.3'] != '4.3'
assert ver['current'] > '3.6'
assert ver['7.0'] > ver['current']
assert ver['4.3'] > '3.3'
assert ver['3.12'] > '3.3'
assert ver['current'] >= ver['current']
assert ver['7.0'] >= ver['current']
assert ver['4.3'] >= '3.3'
assert ver['3.12'] >= '3.12'
assert ver['3.12'] >= '3.3'
assert '3.0' < ver['3.12'] < '3.13'
assert '3.9' < ver['3.12'] # ensure we’re reverse comparing numerically, not stringwise
assert '3.3' < ver['4.3'] <= '4.3'
assert '4.3' <= ver['4.3'] <= '4.3'
assert '4.3' == ver['4.3'] == '4.3'
return True
def exp_int(self, name, ut, desc='ExpInt() class'):
from mmgen.util2 import ExpInt
for num, trunc, chk, out in (
('0e0', 0, 0, '0'),
('0e1', 0, 0, '0'),
('3e0', 3, 3, '3'),
('3e1', 30, 30, '30'),
('3e2', 300, 300, '300'),
('3e3', 3000, 3000, '3e3'),
(3000, 3000, 3000, '3e3'),
(1, 1, 1, '1'),
('123e0', 123, 123, '123'),
(123, 123, 123, '123'),
(12345, 12340, 12345, '12345'),
(123456, 123400, 123456, '123456'),
(1234567, 1234000, 1234000, '1234e3'),
(123456789, 123400000, 123400000, '1234e5'),
(998877665544332211, 998800000000000000, 998800000000000000, '9988e14'),
):
e = ExpInt(num, prec=4)
enc = e.enc
assert enc == out, f'{enc} != {out}'
assert e.trunc == trunc, f'{e.trunc} != {trunc}'
vmsg('')
vmsg(f'num {num}')
vmsg(f'enc {enc}')
dec = ExpInt(enc, prec=4)
vmsg(f'enc -> dec {dec}')
vmsg(f'chk {chk}')
assert dec == chk, f'{dec} != {chk}'
dec_enc = dec.enc
vmsg(f'dec -> enc {dec_enc}')
vmsg(f'out {out}')
assert dec_enc == out, f'{dec_enc} != {out}'
return True