mmgen-wallet/test/cmdtest_d/include/input.py

84 lines
2.1 KiB
Python
Executable file

#!/usr/bin/env python3
#
# MMGen Wallet, a terminal-based cryptocurrency wallet
# Copyright (C)2013-2026 The MMGen Project <mmgen@tuta.io>
#
# Project source code repository: https://github.com/mmgen/mmgen-wallet
# Licensed according to the terms of GPL Version 3. See LICENSE for details.
"""
test.cmdtest_d.include.input: Shared input routines for the cmdtest.py test suite
"""
import time
from ...include.common import getrand
from .common import randbool
def mnemonic_entry(t, mne, mn):
p_ok, _ = mne.word_prompt
for wnum, word in enumerate(mn, 1):
t.expect(p_ok.format(wnum), word + ' ')
def stealth_mnemonic_entry(t, mne, mn, entry_mode, pad_entry=False):
def pad_mnemonic(mn, ss_len):
def get_pad_chars(n):
ret = ''
for _ in range(n):
m = int.from_bytes(getrand(1), 'big') % 32
ret += r'123579!@#$%^&*()_+-=[]{}"?/,.<>|'[m]
return ret
ret = []
for w in mn:
if entry_mode == 'short':
w = w[:ss_len]
if len(w) < ss_len:
npc = 3
w = w[0] + get_pad_chars(npc) + w[1:]
if pad_entry:
w += '%' * (1 + mne.em.pad_max - npc)
else:
w += '\n'
else:
w = get_pad_chars(1) + w[0] + get_pad_chars(1) + w[1:]
elif len(w) > (3, 5)[ss_len==12]:
w = w + '\n'
else:
w = (
get_pad_chars(2 if randbool() and entry_mode != 'short' else 0)
+ w[0] + get_pad_chars(2) + w[1:]
+ get_pad_chars(9))
w = w[:ss_len+1]
ret.append(w)
return ret
match entry_mode:
case 'fixed':
mn = ['bkr'] + mn[:5] + ['nfb'] + mn[5:]
ssl = mne.uniq_ss_len
def gen_mn():
for w in mn:
if len(w) >= ssl:
yield w[:ssl]
else:
yield w[0] + 'z\b' + '#' * (ssl-len(w)) + w[1:]
mn = list(gen_mn())
case 'full' | 'short':
mn = ['fzr'] + mn[:5] + ['grd', 'grdbxm'] + mn[5:]
mn = pad_mnemonic(mn, mne.em.ss_len)
mn[10] = '@#$%*##' + mn[10]
wnum = 1
p_ok, p_err = mne.word_prompt
for w in mn:
ret = t.expect((p_ok.format(wnum), p_err.format(wnum-1)))
if ret == 0:
wnum += 1
for char in w:
t.send(char)
time.sleep(0.005)
def user_dieroll_entry(t, data):
for s in data:
t.expect(r'Enter die roll #.+: ', s, regex=True)
time.sleep(0.005)