@@ -2023,7 +2023,7 @@ test "timestamp now() function" {
20232023
20242024 read_buffer = fixedBufferStream (& arr );
20252025 p = pack .init (& write_buffer , & read_buffer );
2026-
2026+
20272027 const decoded = try p .read (allocator );
20282028 defer decoded .free (allocator );
20292029
@@ -2044,6 +2044,64 @@ test "timestamp now() function" {
20442044 try expect (float2 >= float1 );
20452045}
20462046
2047+ // Test timestamp fromNanos() function
2048+ test "timestamp fromNanos() conversion" {
2049+ var arr : [0xfffff ]u8 = std .mem .zeroes ([0xfffff ]u8 );
2050+ var write_buffer = fixedBufferStream (& arr );
2051+ var read_buffer = fixedBufferStream (& arr );
2052+ var p = pack .init (& write_buffer , & read_buffer );
2053+
2054+ // Test with current time
2055+ const current_nanos = std .time .nanoTimestamp ();
2056+ const ts = msgpack .Timestamp .fromNanos (current_nanos );
2057+
2058+ // Verify seconds is reasonable (after 2020-01-01 and before 2100-01-01)
2059+ const year_2020 : i64 = 1577836800 ;
2060+ const year_2100 : i64 = 4102444800 ;
2061+ try expect (ts .seconds > year_2020 );
2062+ try expect (ts .seconds < year_2100 );
2063+
2064+ // Verify nanoseconds is in valid range
2065+ try expect (ts .nanoseconds >= 0 );
2066+ try expect (ts .nanoseconds <= 999_999_999 );
2067+
2068+ // Test with known values
2069+ const test_nanos : i128 = 1704067200_123456789 ; // 2024-01-01 00:00:00.123456789 UTC
2070+ const test_ts = msgpack .Timestamp .fromNanos (test_nanos );
2071+ try expect (test_ts .seconds == 1704067200 );
2072+ try expect (test_ts .nanoseconds == 123456789 );
2073+
2074+ // Test with negative timestamp (before Unix epoch)
2075+ const negative_nanos : i128 = -1000000_500000000 ; // -1000000 seconds + 0.5 seconds
2076+ const negative_ts = msgpack .Timestamp .fromNanos (negative_nanos );
2077+ try expect (negative_ts .seconds == -1000001 );
2078+ try expect (negative_ts .nanoseconds == 500000000 );
2079+
2080+ // Test Payload.timestampFromNanos() convenience method
2081+ const payload = msgpack .Payload .timestampFromNanos (current_nanos );
2082+ try expect (payload == .timestamp );
2083+ try expect (payload .timestamp .seconds == ts .seconds );
2084+ try expect (payload .timestamp .nanoseconds == ts .nanoseconds );
2085+
2086+ // Test serialization and deserialization
2087+ try p .write (payload );
2088+
2089+ read_buffer = fixedBufferStream (& arr );
2090+ p = pack .init (& write_buffer , & read_buffer );
2091+
2092+ const decoded = try p .read (allocator );
2093+ defer decoded .free (allocator );
2094+
2095+ try expect (decoded == .timestamp );
2096+ try expect (decoded .timestamp .seconds == ts .seconds );
2097+ try expect (decoded .timestamp .nanoseconds == ts .nanoseconds );
2098+
2099+ // Test that the toFloat() method works correctly
2100+ const float_original = ts .toFloat ();
2101+ const float_decoded = decoded .timestamp .toFloat ();
2102+ try expect (@abs (float_original - float_decoded ) < 0.000000001 );
2103+ }
2104+
20472105// ============================================================================
20482106// Additional tests from test_additional.zig
20492107// ============================================================================
0 commit comments