Browse Source

util2.format_elapsed_hr(): add `rel_now`, `show_secs` params; add test

The MMGen Project 1 month ago
parent
commit
d6dba0d7f1
2 changed files with 75 additions and 12 deletions
  1. 22 10
      mmgen/util2.py
  2. 53 2
      test/unit_tests_d/ut_misc.py

+ 22 - 10
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 = []

+ 53 - 2
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'])