from toolbox import format_time, format_time_ns from typing import Any def Assert(name: str, expected: Any, result: Any): """Test if a given result is equal of the expected one and log result Args: name (str): name of the unit test expected (Any): expected result of the function call result (Any): result of the function """ if expected != result: print(f"For test name {name} Expected '{expected}' but got '{result}' instead") assert False def format_time_test() -> None: """Test suite for the format_time output See https://en.wikipedia.org/wiki/Unit_of_time for details """ Assert('format_time null', '0s', format_time(0)) Assert('format_time second', '1s', format_time(1)) Assert('format_time decasecond', '10s', format_time(10)) Assert('format_time minute', '1m', format_time(60)) Assert('format_time milliday', '1m 26s', format_time(86)) # missing 0.4s due to precision Assert('format_time hectosecond', '1m 40s', format_time(100)) Assert('format_time kilosecond', '16m 40s', format_time(int(1e3))) Assert('format_time hour', '1h', format_time(3600)) Assert('format_time day', '1j', format_time(86400)) Assert('format_time week/sennight', '1w', format_time(604800)) Assert('format_time megasecond', '1w 4j 13h 46m 40s', format_time(int(1e6))) Assert('format_time fortnight', '2w', format_time(1209600)) Assert('format_time lunar month (draconitic)', '3w 6j 5h 5m 35s', format_time(2351135)) # missing 0.8 due to precision Assert('format_time lunar month (tropical)', '3w 6j 7h 43m 4s', format_time(2360584)) # missing 0.7 due to precision Assert('format_time lunar month (sidereal)', '3w 6j 7h 43m 11s', format_time(2360591)) # missing 0.6 to precision Assert('format_time lunar month (anomalistic)', '3w 6j 13h 18m 33s', format_time(2380713)) # missing 0.2 due to precision Assert('format_time lunar month (synodic)', '4w 1j 12h 44m 2s', format_time(2551442)) # missing 0.9 due to precision Assert('format_time month', '1M', format_time(2678400)) Assert('format_time quarantine', '1M 1w 2j', format_time(int(3456e3))) Assert('format_time semester', '4M 2j', format_time(10886400)) Assert('format_time lunar year', '11M 1w 6j 8h 52m 48s', format_time(30617568)) Assert('format_time year', '1y', format_time(int(31536e3))) Assert('format_time tropical year', '1y 5h 48m 45s', format_time(31556925)) # missing 0.216 due to precision Assert('format_time gregorian year', '1y 5h 49m 12s', format_time(31556952)) Assert('format_time sidereal year', '1y 6h 9m 9s', format_time(31558149)) # missing 0.7635456 due to precision Assert('format_time leap year', '1y 1j', format_time(31622400)) Assert('format_time olympiad', '4y', format_time(int(126144e3))) Assert('format_time lusturm', '5y', format_time(int(15768e4))) Assert('format_time decade', '10y', format_time(int(31536e4))) Assert('format_time indiction', '15y', format_time(int(47304e4))) Assert('format_time score', '20y', format_time(int(63072e4))) Assert('format_time gigasecond', '31y 8M 1w 4j 1h 46m 40s', format_time(int(1e9))) Assert('format_time jubilee', '50y', format_time(int(15768e5))) Assert('format_time century', '1c', format_time(int(31536e5))) Assert('format_time millennium', '10c', format_time(int(31536e6))) Assert('format_time age', '257c 72y', format_time(int(812745792e3))) Assert('format_time terasecond', '3170c 97y 10M 3w 4j 17h 46m 40s', format_time(int(1e13))) Assert('format_time megaannum', '10000c', format_time(int(31536e9))) Assert('format_time petasecond', '317097c 91y 11M 2w 4j 1h 46m 40s', format_time(int(1e15))) Assert('format_time galactic year', '2300000c', format_time(int(725328e10))) Assert('format_time eon', '10000000c', format_time(int(31536e12))) Assert('format_time kalpa', '43200000c', format_time(int(13623552e10))) Assert('format_time exasecond', '317097919c 83y 9M 1h 46m 40s', format_time(int(1e18))) # Cannot use number bigger than currently supported ISO Python # Assert('format_time zettasecond', '', format_time(1e21)) # Assert('format_time yottasecond', '', format_time(1e24)) # Assert('format_time ronnasecond', '', format_time(1e27)) # Assert('format_time quettasecond', '', format_time(1e30)) # uint64_t_MAX == 2**64 == 18446744073709551615 == -1 Assert('format_time max', '5849424173c 55y 3w 5j 7h 16s', format_time(int(2**64 - 1))) def format_time_ns_test() -> None: """Test suite for the format_time_ns output See https://en.wikipedia.org/wiki/Unit_of_time for details """ Assert('format_time_ns null', '0ns', format_time_ns(0)) Assert('format_time_ns nanosecond', '1ns', format_time_ns(1)) Assert('format_time_ns shake', '10ns', format_time_ns(10)) Assert('format_time_ns microsecond', '1µs', format_time_ns(int(1e3))) Assert('format_time_ns millisecond', '1ms', format_time_ns(int(1e6))) Assert('format_time_ns centisecond', '10ms', format_time_ns(int(1e7))) Assert('format_time_ns decisecond', '100ms', format_time_ns(int(1e8))) Assert('format_time_ns second', '1s', format_time_ns(int(1e9))) Assert('format_time_ns decasecond', '10s', format_time_ns(int(1e10))) Assert('format_time_ns minute', '1m', format_time_ns(int(6e10))) Assert('format_time_ns milliday', '1m 26s 400ms', format_time_ns(int(864e8))) Assert('format_time_ns hectosecond', '1m 40s', format_time_ns(int(1e11))) Assert('format_time_ns kilosecond', '16m 40s', format_time_ns(int(1e12))) Assert('format_time_ns hour', '1h', format_time_ns(int(36e11))) Assert('format_time_ns day', '1j', format_time_ns(int(864e11))) Assert('format_time_ns week/sennight', '1w', format_time_ns(int(6048e11))) Assert('format_time_ns megasecond', '1w 4j 13h 46m 40s', format_time_ns(int(1e15))) Assert('format_time_ns fortnight', '2w', format_time_ns(int(12096e11))) Assert('format_time_ns lunar month (draconitic)', '3w 6j 5h 5m 35s 800ms', format_time_ns(int(23511358e8))) Assert('format_time_ns lunar month (tropical)', '3w 6j 7h 43m 4s 700ms', format_time_ns(int(23605847e8))) Assert('format_time_ns lunar month (sidereal)', '3w 6j 7h 43m 11s 600ms', format_time_ns(int(23605916e8))) Assert('format_time_ns lunar month (anomalistic)', '3w 6j 13h 18m 33s 200ms', format_time_ns(int(23807132e8))) Assert('format_time_ns lunar month (synodic)', '4w 1j 12h 44m 2s 900ms', format_time_ns(int(25514429e8))) Assert('format_time_ns month', '1M', format_time_ns(int(26784e11))) Assert('format_time_ns quarantine', '1M 1w 2j', format_time_ns(int(3456e12))) Assert('format_time_ns semester', '4M 2j', format_time_ns(int(108864e11))) Assert('format_time_ns lunar year', '11M 1w 6j 8h 52m 48s', format_time_ns(int(30617568e9))) Assert('format_time_ns year', '1y', format_time_ns(int(31536e12))) Assert('format_time_ns tropical year', '1y 5h 48m 45s 216ms', format_time_ns(int(31556925216e6))) Assert('format_time_ns gregorian year', '1y 5h 49m 12s', format_time_ns(int(31556952e9))) Assert('format_time_ns sidereal year', '1y 6h 9m 9s 763ms 545µs 600ns', format_time_ns(int(315581497635456e2))) Assert('format_time_ns leap year', '1y 1j', format_time_ns(int(316224e11))) Assert('format_time_ns olympiad', '4y', format_time_ns(int(126144e12))) Assert('format_time_ns lusturm', '5y', format_time_ns(int(15768e13))) Assert('format_time_ns decade', '10y', format_time_ns(int(31536e13))) Assert('format_time_ns indiction', '15y', format_time_ns(int(47304e13))) Assert('format_time_ns score', '20y', format_time_ns(int(63072e13))) Assert('format_time_ns gigasecond', '31y 8M 1w 4j 1h 46m 40s', format_time_ns(int(1e18))) Assert('format_time_ns jubilee', '50y', format_time_ns(int(15768e14))) Assert('format_time_ns century', '1c', format_time_ns(int(31536e14))) # Python int too large to convert to C long # Assert('format_time_ns millennium', '10c', format_time_ns(int(31536e15))) # Assert('format_time_ns age', '257c 72y', format_time_ns(int(812745792e12))) # Assert('format_time_ns terasecond', '3170c 97y 10M 3w 4j 17h 46m 40s', format_time_ns(int(1e22))) # Assert('format_time_ns megaannum', '10000c', format_time_ns(int(31536e18))) # Cannot use number bigger than currently supported ISO Python # Assert('format_time_ns petasecond', '317097c 91y 11M 2w 4j 1h 46m 40s', format_time_ns(int(1e24))) # Assert('format_time_ns galactic year', '2300000c', format_time_ns(int(725328e19))) # Assert('format_time_ns eon', '10000000c', format_time_ns(int(31536e21))) # Assert('format_time_ns kalpa', '43200000c', format_time_ns(int(13623552e19))) # Assert('format_time_ns exasecond', '317097919c 83y 9M 1h 46m 40s', format_time_ns(int(1e27))) # Assert('format_time_ns zettasecond', '', format_time_ns(int(1e30))) # Assert('format_time_ns yottasecond', '', format_time_ns(int(1e33))) # Assert('format_time_ns ronnasecond', '', format_time_ns(int(1e36))) # Assert('format_time_ns quettasecond', '', format_time_ns(int(1e39))) # uint64_t_MAX == 2**64 == 18446744073709551615 == -1 Assert('format_time_ns max', '5c 84y 11M 2j 23h 34m 33s 709ms 551µs 615ns', format_time_ns(2**64 - 1))