@@ -445,3 +445,61 @@ def test_shift_times_with_None_as_t_start():
445445 assert recording .segments [0 ].t_start is None
446446 recording .shift_times (shift = 1.0 ) # Shift by one seconds should not generate an error
447447 assert recording .get_start_time () == 1.0
448+
449+
450+ class TestSortingTimeNoRecording :
451+ """Tests for time methods on BaseSorting without a registered recording."""
452+
453+ def test_get_start_time_default (self ):
454+ sorting = generate_sorting (num_units = 5 , durations = [10 ])
455+ assert sorting .get_start_time (segment_index = 0 ) == 0.0
456+
457+ def test_get_end_time_is_last_spike (self ):
458+ sorting = generate_sorting (num_units = 5 , durations = [10 ])
459+ last_frame = sorting .get_last_spike_frame (segment_index = 0 )
460+ expected_time = last_frame / sorting .get_sampling_frequency ()
461+ assert sorting .get_end_time (segment_index = 0 ) == expected_time
462+
463+ def test_get_start_time_with_t_start (self ):
464+ sorting = generate_sorting (num_units = 5 , durations = [10 ])
465+ sorting .segments [0 ]._t_start = 100.0
466+ assert sorting .get_start_time (segment_index = 0 ) == 100.0
467+
468+
469+ class TestSortingTimeWithRecording :
470+ """
471+ Tests for time methods on BaseSorting with a registered recording.
472+ The key invariant: the recording is the source of truth for timestamps.
473+ """
474+
475+ def test_get_start_end_time (self ):
476+ recording = generate_recording (num_channels = 4 , durations = [10 ])
477+ sorting = generate_sorting (num_units = 5 , durations = [10 ])
478+ sorting .register_recording (recording )
479+
480+ assert sorting .get_start_time (segment_index = 0 ) == recording .get_start_time (segment_index = 0 )
481+ assert sorting .get_end_time (segment_index = 0 ) == recording .get_end_time (segment_index = 0 )
482+
483+ def test_register_recording_copies_start_times (self ):
484+ """Registering a recording copies its start times into the sorting segments."""
485+ sorting = generate_sorting (num_units = 5 , durations = [10 ])
486+ sorting .segments [0 ]._t_start = 100.0
487+
488+ recording = generate_recording (num_channels = 4 , durations = [10 ])
489+ recording .shift_times (shift = 50.0 )
490+ sorting .register_recording (recording )
491+
492+ # _t_start now mirrors the recording's start time, preserving it across
493+ # save/load cycles even when the recording is not attached.
494+ assert sorting .segments [0 ]._t_start == recording .get_start_time (segment_index = 0 )
495+ assert sorting .get_start_time (segment_index = 0 ) == 50.0
496+
497+ def test_with_recording_shifted_start (self ):
498+ """Recording with a non-zero t_start is reflected in the sorting."""
499+ recording = generate_recording (num_channels = 4 , durations = [10 ])
500+ recording .shift_times (shift = 50.0 )
501+
502+ sorting = generate_sorting (num_units = 5 , durations = [10 ])
503+ sorting .register_recording (recording )
504+
505+ assert sorting .get_start_time (segment_index = 0 ) == 50.0
0 commit comments