SPB Git

spb/wp40_uqo

Public MIT
2.9 KB · 49 lines cpp
1#include <catch2/catch_test_macros.hpp>2#include <catch2/matchers/catch_matchers_floating_point.hpp>3#include "raid/core/types.hpp"4#include "raid/core/error.hpp"5#include "raid/core/hash.hpp"6#include "raid/core/rng.hpp"7#include "raid/core/log.hpp"8#include "raid/core/thread_pool.hpp"9#include <atomic>10using namespace raid;1112TEST_CASE("Date round trips and weekdays", "[core]") {13  Date d = Date::from_ymd(2024, 3, 11); auto y = d.ymd();14  CHECK(y.year == 2024); CHECK(y.month == 3); CHECK(y.day == 11); CHECK(d.weekday() == 1);  // Monday15  CHECK(Date::from_ymd(1970, 1, 1).days == 0); CHECK(Date::from_ymd(1970, 1, 1).weekday() == 4);16  CHECK(date_from_iso("2000-02-29").iso() == "2000-02-29"); CHECK(Date::from_ymd(2026, 11, 2).weekday() == 1);17}18TEST_CASE("Timestamp ISO parsing", "[core]") {19  CHECK(timestamp_from_iso("2024-03-08T09:00:00Z").us == 1709888400000000LL);20  CHECK(timestamp_from_iso("2024-03-08T04:00:00-05:00").us == 1709888400000000LL);21  CHECK(timestamp_from_iso("2024-03-08T09:00:00.250000+00:00").us == 1709888400250000LL);22  CHECK(timestamp_iso(Timestamp(1709888400000000LL)) == "2024-03-08T09:00:00.000000Z");23  CHECK_THROWS_AS(timestamp_from_iso("2024-13-01"), RaidError);24}25TEST_CASE("SHA-256 known answers", "[core]") {26  CHECK(Sha256::of("") == "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");27  CHECK(Sha256::of("abc") == "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");28  std::string big(1000, 'a'); Sha256 h; for (int i = 0; i < 1000; ++i) h.update(big);29  CHECK(h.hex() == "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");30}31TEST_CASE("RNG determinism and moments", "[core]") {32  Rng a(42, 1), b(42, 1), c(42, 2);33  CHECK(a.next_u64() == b.next_u64()); CHECK(a.next_u64() != c.next_u64());34  Rng r(7, 0); double s = 0, s2 = 0; const int n = 200000; for (int i = 0; i < n; ++i) { double z = r.normal(); s += z; s2 += z * z; }35  CHECK_THAT(s / n, Catch::Matchers::WithinAbs(0.0, 0.01)); CHECK_THAT(s2 / n, Catch::Matchers::WithinAbs(1.0, 0.02));36  double st = 0; for (int i = 0; i < n; ++i) { double z = r.student_t(5.0); st += z * z; } CHECK_THAT(st / n, Catch::Matchers::WithinAbs(5.0 / 3.0, 0.05));37}38TEST_CASE("Log redaction hides keys", "[core]") {39  CHECK(log::redact("Authorization: Bearer fd_abc123.SECRET") == "Authorization: Bearer <redacted>");40  CHECK(log::redact("url?userid=XYZ&x=1") == "url?userid=<redacted>&x=1");41  CHECK(log::redact("key fd_abc.def inside") == "key <redacted> inside");42}43TEST_CASE("Thread pool parallel_for covers the range once and propagates exceptions", "[core]") {44  ThreadPool p(4); std::atomic<long> acc{0};45  p.parallel_for(100000, [&](usize b, usize e) { long s = 0; for (usize i = b; i < e; ++i) s += static_cast<long>(i); acc += s; });46  CHECK(acc.load() == 4999950000L);47  CHECK_THROWS_AS(p.parallel_for(10, [](usize, usize) { throw RaidError(ErrorCode::numerical, "boom"); }), RaidError);48}49
Files · d628c807b304dba507dfb8130278ae5bb0f92411
Menu

Theme