From d6dba0d7f1e54fe6f3b914744673e5513191bd71 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 15 Apr 2024 09:48:15 +0000 Subject: [PATCH] util2.format_elapsed_hr(): add `rel_now`, `show_secs` params; add test --- mmgen/util2.py | 32 ++++++++++++++------- test/unit_tests_d/ut_misc.py | 55 ++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/mmgen/util2.py b/mmgen/util2.py index fa38bd42..66edadbd 100755 --- a/mmgen/util2.py +++ b/mmgen/util2.py @@ -132,18 +132,30 @@ def format_elapsed_days_hr(t,now=None,cached={}): cached[e] = f'{days} day{suf(days)} ' + ('ago' if e > 0 else 'in the future') return cached[e] -def format_elapsed_hr(t,now=None,cached={}): +def format_elapsed_hr(t, now=None, cached={}, rel_now=True, show_secs=False): e = int((now or time.time()) - t) - if not e in cached: + key = f'{e}:{rel_now}:{show_secs}' + if not key in cached: + def add_suffix(): + return ( + ((' ago' if rel_now else '') if e > 0 else + (' in the future' if rel_now else ' (negative elapsed)')) + if (abs_e if show_secs else abs_e // 60) else + ('just now' if rel_now else ('0 ' + ('seconds' if show_secs else 'minutes'))) + ) abs_e = abs(e) - cached[e] = ' '.join( - f'{n} {desc}{suf(n)}' for desc,n in ( - ('day', abs_e // 86400), - ('hour', abs_e // 3600 % 24), - ('minute', abs_e // 60 % 60), - ) if n - ) + (' ago' if e > 0 else ' in the future') if abs_e // 60 else 'just now' - return cached[e] + data = ( + ('day', abs_e // 86400), + ('hour', abs_e // 3600 % 24), + ('minute', abs_e // 60 % 60), + ('second', abs_e % 60), + ) if show_secs else ( + ('day', abs_e // 86400), + ('hour', abs_e // 3600 % 24), + ('minute', abs_e // 60 % 60), + ) + cached[key] = ' '.join(f'{n} {desc}{suf(n)}' for desc, n in data if n) + add_suffix() + return cached[key] def pretty_format(s,width=80,pfx=''): out = [] diff --git a/test/unit_tests_d/ut_misc.py b/test/unit_tests_d/ut_misc.py index fceeddd0..e8ff30bc 100755 --- a/test/unit_tests_d/ut_misc.py +++ b/test/unit_tests_d/ut_misc.py @@ -4,14 +4,65 @@ test.unit_tests_d.ut_misc: miscellaneous unit tests for the MMGen suite """ -import re +import re, time from collections import namedtuple -from mmgen.color import yellow, blue +from mmgen.color import yellow, blue, brown from ..include.common import vmsg class unit_tests: + def format_elapsed_hr(self, name, ut): + 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, 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): # WIP from mmgen.xmrwallet import xmrwallet_uarg_info as uarg_info vs = namedtuple('vector_data', ['text', 'groups'])