cpp : more robust code and added more documentation

This commit is contained in:
saundersp
2024-04-27 21:08:33 +02:00
parent 45f0f6ab8e
commit c7d21e1014
10 changed files with 355 additions and 319 deletions

View File

@ -3,7 +3,7 @@
#include <assert.h>
template<typename T>
void Assert(const char* name, const T& expected, const T& result) noexcept {
void Assert(const char* const name, const T& expected, const T& result) noexcept {
if(expected != result){
std::cerr << "For test named " << name << " Expected '" << expected << "' but got '" << result << "' instead\n";
assert(false);
@ -11,17 +11,17 @@ void Assert(const char* name, const T& expected, const T& result) noexcept {
}
void format_byte_size_test(void) noexcept {
Assert("format_byte_size null", std::string("0B"), format_byte_size(static_cast<uint64_t>(0)));
Assert("format_byte_size byte", std::string("1B"), format_byte_size(static_cast<uint64_t>(1)));
Assert("format_byte_size kilobyte", std::string("1KB"), format_byte_size(static_cast<uint64_t>(1)<<10));
Assert("format_byte_size megabyte", std::string("1MB"), format_byte_size(static_cast<uint64_t>(1)<<20));
Assert("format_byte_size gigabyte", std::string("1GB"), format_byte_size(static_cast<uint64_t>(1)<<30));
Assert("format_byte_size terabyte", std::string("1TB"), format_byte_size(static_cast<uint64_t>(1)<<40));
Assert("format_byte_size petabyte", std::string("1PB"), format_byte_size(static_cast<uint64_t>(1)<<50));
Assert("format_byte_size exabyte", std::string("1EB"), format_byte_size(static_cast<uint64_t>(1)<<60));
Assert("format_byte_size null", std::string("0B"), format_byte_size(static_cast<uint64_t>(0)));
Assert("format_byte_size byte", std::string("1B"), format_byte_size(static_cast<uint64_t>(1)));
Assert("format_byte_size kilobyte", std::string("1KB"), format_byte_size(static_cast<uint64_t>(1)<<10));
Assert("format_byte_size megabyte", std::string("1MB"), format_byte_size(static_cast<uint64_t>(1)<<20));
Assert("format_byte_size gigabyte", std::string("1GB"), format_byte_size(static_cast<uint64_t>(1)<<30));
Assert("format_byte_size terabyte", std::string("1TB"), format_byte_size(static_cast<uint64_t>(1)<<40));
Assert("format_byte_size petabyte", std::string("1PB"), format_byte_size(static_cast<uint64_t>(1)<<50));
Assert("format_byte_size exabyte", std::string("1EB"), format_byte_size(static_cast<uint64_t>(1)<<60));
// Unsupported due to number of byte bigger than currently supported by ISO c++
//Assert("format_byte_size zettabyte", std::string("1ZB"), format_byte_size(static_cast<uint64_t>(1)<<70));
//Assert("format_byte_size yottabyte", std::string("1YB"), format_byte_size(static_cast<uint64_t>(1)<<80));
//Assert("format_byte_size zettabyte", std::string("1ZB"), format_byte_size(static_cast<uint64_t>(1)<<70));
//Assert("format_byte_size yottabyte", std::string("1YB"), format_byte_size(static_cast<uint64_t>(1)<<80));
// uint64_t_MAX == 2**64 == 18446744073709551615I64u == -1
Assert("format_byte_size max", std::string("15EB 1023PB 1023TB 1023GB 1023MB 1023KB 1023B"), format_byte_size(static_cast<uint64_t>(-1)));
}
@ -82,62 +82,62 @@ void format_time_test(void) noexcept {
void format_time_ns_test(void) noexcept {
// https://en.wikipedia.org/wiki/Unit_of_time
Assert("format_time_ns null", std::string("0ns"), format_time_ns(static_cast<uint64_t>(0)));
Assert("format_time_ns nanosecond", std::string("1ns"), format_time_ns(static_cast<uint64_t>(1)));
Assert("format_time_ns shake", std::string("10ns"), format_time_ns(static_cast<uint64_t>(10)));
Assert("format_time_ns microsecond", std::string("1µs"), format_time_ns(static_cast<uint64_t>(1e3)));
Assert("format_time_ns millisecond", std::string("1ms"), format_time_ns(static_cast<uint64_t>(1e6)));
Assert("format_time_ns centisecond", std::string("10ms"), format_time_ns(static_cast<uint64_t>(1e7)));
Assert("format_time_ns decisecond", std::string("100ms"), format_time_ns(static_cast<uint64_t>(1e8)));
Assert("format_time_ns second", std::string("1s"), format_time_ns(static_cast<uint64_t>(1e9)));
Assert("format_time_ns decasecond", std::string("10s"), format_time_ns(static_cast<uint64_t>(1e10)));
Assert("format_time_ns minute", std::string("1m"), format_time_ns(static_cast<uint64_t>(6e10)));
Assert("format_time_ns milliday", std::string("1m 26s 400ms"), format_time_ns(static_cast<uint64_t>(864e8)));
Assert("format_time_ns hectosecond", std::string("1m 40s"), format_time_ns(static_cast<uint64_t>(1e11)));
Assert("format_time_ns kilosecond", std::string("16m 40s"), format_time_ns(static_cast<uint64_t>(1e12)));
Assert("format_time_ns hour", std::string("1h"), format_time_ns(static_cast<uint64_t>(36e11)));
Assert("format_time_ns day", std::string("1j"), format_time_ns(static_cast<uint64_t>(864e11)));
Assert("format_time_ns week/sennight", std::string("1w"), format_time_ns(static_cast<uint64_t>(6048e11)));
Assert("format_time_ns megasecond", std::string("1w 4j 13h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e15)));
Assert("format_time_ns fortnight", std::string("2w"), format_time_ns(static_cast<uint64_t>(12096e11)));
Assert("format_time_ns lunar month (draconitic)", std::string("3w 6j 5h 5m 35s 800ms"), format_time_ns(static_cast<uint64_t>(23511358e8)));
Assert("format_time_ns lunar month (tropical)", std::string("3w 6j 7h 43m 4s 700ms"), format_time_ns(static_cast<uint64_t>(23605847e8)));
Assert("format_time_ns lunar month (sidereal)", std::string("3w 6j 7h 43m 11s 600ms"), format_time_ns(static_cast<uint64_t>(23605916e8)));
Assert("format_time_ns lunar month (anomalistic)", std::string("3w 6j 13h 18m 33s 200ms"), format_time_ns(static_cast<uint64_t>(23807132e8)));
Assert("format_time_ns lunar month (synodic)", std::string("4w 1j 12h 44m 2s 900ms"), format_time_ns(static_cast<uint64_t>(25514429e8)));
Assert("format_time_ns month", std::string("1M"), format_time_ns(static_cast<uint64_t>(26784e11)));
Assert("format_time_ns quarantine", std::string("1M 1w 2j"), format_time_ns(static_cast<uint64_t>(3456e12)));
Assert("format_time_ns semester", std::string("4M 2j"), format_time_ns(static_cast<uint64_t>(108864e11)));
Assert("format_time_ns lunar year", std::string("11M 1w 6j 8h 52m 48s"), format_time_ns(static_cast<uint64_t>(30617568e9)));
Assert("format_time_ns year", std::string("1y"), format_time_ns(static_cast<uint64_t>(31536e12)));
Assert("format_time_ns tropical year", std::string("1y 5h 48m 45s 216ms"), format_time_ns(static_cast<uint64_t>(31556925216e6)));
Assert("format_time_ns gregorian year", std::string("1y 5h 49m 12s"), format_time_ns(static_cast<uint64_t>(31556952e9)));
Assert("format_time_ns sidereal year", std::string("1y 6h 9m 9s 763ms 545µs 600ns"), format_time_ns(static_cast<uint64_t>(315581497635456e2)));
Assert("format_time_ns leap year", std::string("1y 1j"), format_time_ns(static_cast<uint64_t>(316224e11)));
Assert("format_time_ns olympiad", std::string("4y"), format_time_ns(static_cast<uint64_t>(126144e12)));
Assert("format_time_ns lusturm", std::string("5y"), format_time_ns(static_cast<uint64_t>(15768e13)));
Assert("format_time_ns decade", std::string("10y"), format_time_ns(static_cast<uint64_t>(31536e13)));
Assert("format_time_ns indiction", std::string("15y"), format_time_ns(static_cast<uint64_t>(47304e13)));
Assert("format_time_ns score", std::string("20y"), format_time_ns(static_cast<uint64_t>(63072e13)));
Assert("format_time_ns gigasecond", std::string("31y 8M 1w 4j 1h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e18)));
Assert("format_time_ns jubilee", std::string("50y"), format_time_ns(static_cast<uint64_t>(15768e14)));
Assert("format_time_ns century", std::string("1c"), format_time_ns(static_cast<uint64_t>(31536e14)));
Assert("format_time_ns null", std::string("0ns"), format_time_ns(static_cast<uint64_t>(0)));
Assert("format_time_ns nanosecond", std::string("1ns"), format_time_ns(static_cast<uint64_t>(1)));
Assert("format_time_ns shake", std::string("10ns"), format_time_ns(static_cast<uint64_t>(10)));
Assert("format_time_ns microsecond", std::string("1us"), format_time_ns(static_cast<uint64_t>(1e3)));
Assert("format_time_ns millisecond", std::string("1ms"), format_time_ns(static_cast<uint64_t>(1e6)));
Assert("format_time_ns centisecond", std::string("10ms"), format_time_ns(static_cast<uint64_t>(1e7)));
Assert("format_time_ns decisecond", std::string("100ms"), format_time_ns(static_cast<uint64_t>(1e8)));
Assert("format_time_ns second", std::string("1s"), format_time_ns(static_cast<uint64_t>(1e9)));
Assert("format_time_ns decasecond", std::string("10s"), format_time_ns(static_cast<uint64_t>(1e10)));
Assert("format_time_ns minute", std::string("1m"), format_time_ns(static_cast<uint64_t>(6e10)));
Assert("format_time_ns milliday", std::string("1m 26s 400ms"), format_time_ns(static_cast<uint64_t>(864e8)));
Assert("format_time_ns hectosecond", std::string("1m 40s"), format_time_ns(static_cast<uint64_t>(1e11)));
Assert("format_time_ns kilosecond", std::string("16m 40s"), format_time_ns(static_cast<uint64_t>(1e12)));
Assert("format_time_ns hour", std::string("1h"), format_time_ns(static_cast<uint64_t>(36e11)));
Assert("format_time_ns day", std::string("1j"), format_time_ns(static_cast<uint64_t>(864e11)));
Assert("format_time_ns week/sennight", std::string("1w"), format_time_ns(static_cast<uint64_t>(6048e11)));
Assert("format_time_ns megasecond", std::string("1w 4j 13h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e15)));
Assert("format_time_ns fortnight", std::string("2w"), format_time_ns(static_cast<uint64_t>(12096e11)));
Assert("format_time_ns lunar month (draconitic)", std::string("3w 6j 5h 5m 35s 800ms"), format_time_ns(static_cast<uint64_t>(23511358e8)));
Assert("format_time_ns lunar month (tropical)", std::string("3w 6j 7h 43m 4s 700ms"), format_time_ns(static_cast<uint64_t>(23605847e8)));
Assert("format_time_ns lunar month (sidereal)", std::string("3w 6j 7h 43m 11s 600ms"), format_time_ns(static_cast<uint64_t>(23605916e8)));
Assert("format_time_ns lunar month (anomalistic)", std::string("3w 6j 13h 18m 33s 200ms"), format_time_ns(static_cast<uint64_t>(23807132e8)));
Assert("format_time_ns lunar month (synodic)", std::string("4w 1j 12h 44m 2s 900ms"), format_time_ns(static_cast<uint64_t>(25514429e8)));
Assert("format_time_ns month", std::string("1M"), format_time_ns(static_cast<uint64_t>(26784e11)));
Assert("format_time_ns quarantine", std::string("1M 1w 2j"), format_time_ns(static_cast<uint64_t>(3456e12)));
Assert("format_time_ns semester", std::string("4M 2j"), format_time_ns(static_cast<uint64_t>(108864e11)));
Assert("format_time_ns lunar year", std::string("11M 1w 6j 8h 52m 48s"), format_time_ns(static_cast<uint64_t>(30617568e9)));
Assert("format_time_ns year", std::string("1y"), format_time_ns(static_cast<uint64_t>(31536e12)));
Assert("format_time_ns tropical year", std::string("1y 5h 48m 45s 216ms"), format_time_ns(static_cast<uint64_t>(31556925216e6)));
Assert("format_time_ns gregorian year", std::string("1y 5h 49m 12s"), format_time_ns(static_cast<uint64_t>(31556952e9)));
Assert("format_time_ns sidereal year", std::string("1y 6h 9m 9s 763ms 545us 600ns"), format_time_ns(static_cast<uint64_t>(315581497635456e2)));
Assert("format_time_ns leap year", std::string("1y 1j"), format_time_ns(static_cast<uint64_t>(316224e11)));
Assert("format_time_ns olympiad", std::string("4y"), format_time_ns(static_cast<uint64_t>(126144e12)));
Assert("format_time_ns lusturm", std::string("5y"), format_time_ns(static_cast<uint64_t>(15768e13)));
Assert("format_time_ns decade", std::string("10y"), format_time_ns(static_cast<uint64_t>(31536e13)));
Assert("format_time_ns indiction", std::string("15y"), format_time_ns(static_cast<uint64_t>(47304e13)));
Assert("format_time_ns score", std::string("20y"), format_time_ns(static_cast<uint64_t>(63072e13)));
Assert("format_time_ns gigasecond", std::string("31y 8M 1w 4j 1h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e18)));
Assert("format_time_ns jubilee", std::string("50y"), format_time_ns(static_cast<uint64_t>(15768e14)));
Assert("format_time_ns century", std::string("1c"), format_time_ns(static_cast<uint64_t>(31536e14)));
// Cannot use number bigger than currently supported ISO C++
//Assert("format_time_ns millennium", std::string("10c"), format_time_ns(static_cast<uint64_t>(31536e15)));
//Assert("format_time_ns age", std::string("257c 72y"), format_time_ns(static_cast<uint64_t>(812745792e12)));
//Assert("format_time_ns terasecond", std::string("3170c 97y 10M 3w 4j 17h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e22)));
//Assert("format_time_ns megaannum", std::string("10000c"), format_time_ns(static_cast<uint64_t>(31536e18)));
//Assert("format_time_ns petasecond", std::string("317097c 91y 11M 2w 4j 1h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e24)));
//Assert("format_time_ns galactic year", std::string("2300000c"), format_time_ns(static_cast<uint64_t>(725328e19)));
//Assert("format_time_ns eon", std::string("10000000c"), format_time_ns(static_cast<uint64_t>(31536e21)));
//Assert("format_time_ns kalpa", std::string("43200000c"), format_time_ns(static_cast<uint64_t>(13623552e19)));
//Assert("format_time_ns exasecond", std::string("317097919c 83y 9M 1h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e27)));
//Assert("format_time_ns zettasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e30)));
//Assert("format_time_ns yottasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e33)));
//Assert("format_time_ns ronnasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e36)));
//Assert("format_time_ns quettasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e39)));
//Assert("format_time_ns millennium", std::string("10c"), format_time_ns(static_cast<uint64_t>(31536e15)));
//Assert("format_time_ns age", std::string("257c 72y"), format_time_ns(static_cast<uint64_t>(812745792e12)));
//Assert("format_time_ns terasecond", std::string("3170c 97y 10M 3w 4j 17h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e22)));
//Assert("format_time_ns megaannum", std::string("10000c"), format_time_ns(static_cast<uint64_t>(31536e18)));
//Assert("format_time_ns petasecond", std::string("317097c 91y 11M 2w 4j 1h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e24)));
//Assert("format_time_ns galactic year", std::string("2300000c"), format_time_ns(static_cast<uint64_t>(725328e19)));
//Assert("format_time_ns eon", std::string("10000000c"), format_time_ns(static_cast<uint64_t>(31536e21)));
//Assert("format_time_ns kalpa", std::string("43200000c"), format_time_ns(static_cast<uint64_t>(13623552e19)));
//Assert("format_time_ns exasecond", std::string("317097919c 83y 9M 1h 46m 40s"), format_time_ns(static_cast<uint64_t>(1e27)));
//Assert("format_time_ns zettasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e30)));
//Assert("format_time_ns yottasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e33)));
//Assert("format_time_ns ronnasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e36)));
//Assert("format_time_ns quettasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e39)));
// uint64_t_MAX == 2**64 == 18446744073709551615I64u == -1
Assert("format_time_ns max", std::string("5c 84y 11M 2j 23h 34m 33s 709ms 551µs 615ns"), format_time_ns(static_cast<uint64_t>(-1)));
Assert("format_time_ns max", std::string("5c 84y 11M 2j 23h 34m 33s 709ms 551us 615ns"), format_time_ns(static_cast<uint64_t>(-1)));
}
void thousand_sep_test(void) noexcept {
@ -182,4 +182,3 @@ void thousand_sep_test(void) noexcept {
// uint64_t_MAX == 2**64 == 18446744073709551615I64u == -1
Assert("thousand_sep max", std::string("18,446,744,073,709,551,615"), thousand_sep(static_cast<uint64_t>(-1)));
}