@@ -1868,5 +1868,237 @@ test "GcResult default initialization" {
18681868 try std .testing .expectEqual (@as (usize , 0 ), result .kept );
18691869}
18701870
1871+ // ═══════════════════════════════════════════════════════════════════════════════
1872+ // CellHealthData tests
1873+ // ═══════════════════════════════════════════════════════════════════════════════
1874+
1875+ test "CellHealthData fields" {
1876+ const cell_data = CellHealthData {
1877+ .cell_id = "test-cell-123" ,
1878+ .cell_name = "trinity.b2t" ,
1879+ .health_score = 85 ,
1880+ .health_delta = 5 ,
1881+ .bio_system = "dna" ,
1882+ .trigger = "scan" ,
1883+ .files_total = 100 ,
1884+ .files_generated = 80 ,
1885+ .files_manual = 20 ,
1886+ .tests_passing = true ,
1887+ };
1888+ try std .testing .expectEqualStrings ("test-cell-123" , cell_data .cell_id );
1889+ try std .testing .expectEqual (@as (u8 , 85 ), cell_data .health_score );
1890+ try std .testing .expectEqual (@as (i8 , 5 ), cell_data .health_delta );
1891+ try std .testing .expect (cell_data .tests_passing );
1892+ }
1893+
1894+ test "CellHealthData negative delta" {
1895+ const cell_data = CellHealthData {
1896+ .cell_id = "cell-2" ,
1897+ .cell_name = "api" ,
1898+ .health_score = 70 ,
1899+ .health_delta = -10 ,
1900+ .bio_system = "brain" ,
1901+ .trigger = "fix" ,
1902+ .files_total = 50 ,
1903+ .files_generated = 40 ,
1904+ .files_manual = 10 ,
1905+ .tests_passing = false ,
1906+ };
1907+ try std .testing .expectEqual (@as (i8 , -10 ), cell_data .health_delta );
1908+ try std .testing .expect (! cell_data .tests_passing );
1909+ }
1910+
1911+ test "CellHealthData all bio systems" {
1912+ const systems = [_ ][]const u8 { "dna" , "brain" , "immune" , "regen" , "body" };
1913+ inline for (systems ) | system | {
1914+ const cell_data = CellHealthData {
1915+ .cell_id = "test" ,
1916+ .cell_name = "test" ,
1917+ .health_score = 50 ,
1918+ .health_delta = 0 ,
1919+ .bio_system = system ,
1920+ .trigger = "manual" ,
1921+ .files_total = 1 ,
1922+ .files_generated = 0 ,
1923+ .files_manual = 1 ,
1924+ .tests_passing = true ,
1925+ };
1926+ try std .testing .expectEqualStrings (system , cell_data .bio_system );
1927+ }
1928+ }
1929+
1930+ // ═══════════════════════════════════════════════════════════════════════════════
1931+ // ParsedCellHealth tests
1932+ // ═══════════════════════════════════════════════════════════════════════════════
1933+
1934+ test "ParsedCellHealth fields" {
1935+ const parsed = ParsedCellHealth {
1936+ .cell_id = "cell-1" ,
1937+ .cell_name = "trinity.b2t" ,
1938+ .health_score = 90 ,
1939+ .health_delta = 10 ,
1940+ .bio_system = "dna" ,
1941+ .trigger = "scan" ,
1942+ .files_total = 200 ,
1943+ .files_generated = 150 ,
1944+ .files_manual = 50 ,
1945+ .tests_passing = true ,
1946+ .ts = 1234567890 ,
1947+ };
1948+ try std .testing .expectEqual (@as (u8 , 90 ), parsed .health_score );
1949+ try std .testing .expectEqual (@as (i8 , 10 ), parsed .health_delta );
1950+ try std .testing .expectEqual (@as (u32 , 200 ), parsed .files_total );
1951+ }
1952+
1953+ // ═══════════════════════════════════════════════════════════════════════════════
1954+ // Write functions tests
1955+ // ═══════════════════════════════════════════════════════════════════════════════
1956+
1957+ test "writeHeartbeat creates record" {
1958+ var rec = MemoryRecord {};
1959+ const ts : u64 = 1234567890 ;
1960+ generateId (& rec .id_buf , & rec .id_len , ts , "test-agent" );
1961+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "test-agent" );
1962+ rec .kind = .heartbeat ;
1963+ rec .ts = ts ;
1964+
1965+ try std .testing .expectEqual (MemoryKind .heartbeat , rec .kind );
1966+ try std .testing .expectEqual (@as (u64 , 1234567890 ), rec .ts );
1967+ }
1968+
1969+ test "writeLearning creates record" {
1970+ var rec = MemoryRecord {};
1971+ rec .kind = .learning ;
1972+ copyToFixed (256 , & rec .summary_buf , & rec .summary_len , "Learned something new" );
1973+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "mu" );
1974+
1975+ try std .testing .expectEqual (MemoryKind .learning , rec .kind );
1976+ try std .testing .expectEqualStrings ("Learned something new" , rec .summary ());
1977+ }
1978+
1979+ test "writeEpisode creates record" {
1980+ var rec = MemoryRecord {};
1981+ rec .kind = .episode ;
1982+ copyToFixed (256 , & rec .summary_buf , & rec .summary_len , "Fixed a critical bug" );
1983+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "ralph" );
1984+
1985+ try std .testing .expectEqual (MemoryKind .episode , rec .kind );
1986+ }
1987+
1988+ test "writeError creates record" {
1989+ var rec = MemoryRecord {};
1990+ rec .kind = .@"error" ;
1991+ copyToFixed (256 , & rec .summary_buf , & rec .summary_len , "Build failed" );
1992+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "oracle" );
1993+
1994+ try std .testing .expectEqual (MemoryKind .@"error" , rec .kind );
1995+ }
1996+
1997+ test "writeObservation creates record" {
1998+ var rec = MemoryRecord {};
1999+ rec .kind = .observation ;
2000+ copyToFixed (256 , & rec .summary_buf , & rec .summary_len , "Noticed a pattern" );
2001+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "scholar" );
2002+
2003+ try std .testing .expectEqual (MemoryKind .observation , rec .kind );
2004+ }
2005+
2006+ test "writeRule creates record" {
2007+ var rec = MemoryRecord {};
2008+ rec .kind = .rule ;
2009+ copyToFixed (256 , & rec .summary_buf , & rec .summary_len , "Always format before commit" );
2010+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "linter" );
2011+
2012+ try std .testing .expectEqual (MemoryKind .rule , rec .kind );
2013+ }
2014+
2015+ test "writeCellHealth creates record" {
2016+ var rec = MemoryRecord {};
2017+ rec .kind = .cellhealth ;
2018+ copyToFixed (256 , & rec .summary_buf , & rec .summary_len , "trinity.b2t health: 85 (dna) 100 files" );
2019+ copyToFixed (32 , & rec .agent_buf , & rec .agent_len , "cytoplasm" );
2020+
2021+ try std .testing .expectEqual (MemoryKind .cellhealth , rec .kind );
2022+ }
2023+
2024+ // ═══════════════════════════════════════════════════════════════════════════════
2025+ // ReadOptions combined filters
2026+ // ═══════════════════════════════════════════════════════════════════════════════
2027+
2028+ test "ReadOptions with agent and kind filter" {
2029+ const opts = ReadOptions {
2030+ .agent = "mu" ,
2031+ .kind = .learning ,
2032+ };
2033+ try std .testing .expectEqualStrings ("mu" , opts .agent .? );
2034+ try std .testing .expectEqual (MemoryKind .learning , opts .kind .? );
2035+ }
2036+
2037+ test "ReadOptions with since_ts" {
2038+ const opts = ReadOptions {
2039+ .since_ts = 1234567890 ,
2040+ };
2041+ try std .testing .expectEqual (@as (u64 , 1234567890 ), opts .since_ts );
2042+ }
2043+
2044+ test "ReadOptions all fields" {
2045+ const opts = ReadOptions {
2046+ .agent = "ralph" ,
2047+ .kind = .episode ,
2048+ .limit = 100 ,
2049+ .since_ts = 9999999999 ,
2050+ };
2051+ try std .testing .expectEqualStrings ("ralph" , opts .agent .? );
2052+ try std .testing .expectEqual (MemoryKind .episode , opts .kind .? );
2053+ try std .testing .expectEqual (@as (u32 , 100 ), opts .limit );
2054+ try std .testing .expectEqual (@as (u64 , 9999999999 ), opts .since_ts );
2055+ }
2056+
2057+ // ═══════════════════════════════════════════════════════════════════════════════
2058+ // Tag tests
2059+ // ═══════════════════════════════════════════════════════════════════════════════
2060+
2061+ test "MemoryRecord tag operations" {
2062+ var rec = MemoryRecord {};
2063+ copyToFixed (32 , & rec .tags [0 ], & rec .tag_lens [0 ], "build" );
2064+ copyToFixed (32 , & rec .tags [1 ], & rec .tag_lens [1 ], "fix" );
2065+ rec .tag_count = 2 ;
2066+
2067+ try std .testing .expectEqual (@as (u8 , 2 ), rec .tag_count );
2068+ try std .testing .expectEqualStrings ("build" , rec .getTag (0 ));
2069+ try std .testing .expectEqualStrings ("fix" , rec .getTag (1 ));
2070+ }
2071+
2072+ test "MemoryRecord with bio tag" {
2073+ var rec = MemoryRecord {};
2074+ copyToFixed (32 , & rec .tags [0 ], & rec .tag_lens [0 ], "bio:dna" );
2075+ rec .tag_count = 1 ;
2076+
2077+ try std .testing .expectEqualStrings ("bio:dna" , rec .getTag (0 ));
2078+ }
2079+
2080+ // ═══════════════════════════════════════════════════════════════════════════════
2081+ // GcResult with values
2082+ // ═══════════════════════════════════════════════════════════════════════════════
2083+
2084+ test "GcResult with values" {
2085+ const result = GcResult {
2086+ .scanned = 1000 ,
2087+ .removed = 100 ,
2088+ .kept = 900 ,
2089+ };
2090+ try std .testing .expectEqual (@as (usize , 1000 ), result .scanned );
2091+ try std .testing .expectEqual (@as (usize , 100 ), result .removed );
2092+ try std .testing .expectEqual (@as (usize , 900 ), result .kept );
2093+ }
2094+
2095+ test "GcResult all zero except scanned" {
2096+ const result = GcResult {
2097+ .scanned = 500 ,
2098+ };
2099+ try std .testing .expectEqual (@as (usize , 500 ), result .scanned );
2100+ try std .testing .expectEqual (@as (usize , 0 ), result .removed );
2101+ }
2102+
18712103// CellType and HealthStatus are not yet defined in hippocampus module
18722104// These tests will be added when the types are implemented
0 commit comments