@@ -864,3 +864,151 @@ def test_idle_skip_long(
864864 safe_eyes_core .stop ()
865865
866866 assert context ["state" ] == model .State .STOPPED
867+
868+ def test_idle_skip_long_before_long (
869+ self ,
870+ sequential_threading : SequentialThreadingFixture ,
871+ time_machine : TimeMachineFixture ,
872+ ):
873+ """Test idling for longer than long break time, right before the next long
874+ break.
875+
876+ FIXME: this test is broken, it should not work this way. Instead of just
877+ skipping the long break, it skips all the short breaks too.
878+ """
879+ context : dict [str , typing .Any ] = {
880+ "session" : {},
881+ }
882+ short_break_duration = 15 # seconds
883+ short_break_interval = 15 # minutes
884+ pre_break_warning_time = 10 # seconds
885+ long_break_duration = 60 # seconds
886+ long_break_interval = 75 # minutes
887+ config = model .Config (
888+ user_config = {
889+ "short_breaks" : [
890+ {"name" : "break 1" },
891+ {"name" : "break 2" },
892+ {"name" : "break 3" },
893+ {"name" : "break 4" },
894+ ],
895+ "long_breaks" : [
896+ {"name" : "long break 1" },
897+ {"name" : "long break 2" },
898+ {"name" : "long break 3" },
899+ ],
900+ "short_break_interval" : short_break_interval ,
901+ "long_break_interval" : long_break_interval ,
902+ "long_break_duration" : long_break_duration ,
903+ "short_break_duration" : short_break_duration ,
904+ "pre_break_warning_time" : pre_break_warning_time ,
905+ "random_order" : False ,
906+ "postpone_duration" : 5 ,
907+ },
908+ system_config = {},
909+ )
910+
911+ self .assert_datetime ("2024-08-25T13:00:00" )
912+
913+ safe_eyes_core = core .SafeEyesCore (context )
914+
915+ sequential_threading_handle = sequential_threading (safe_eyes_core )
916+
917+ safe_eyes_core .initialize (config )
918+
919+ self .run_next_break (
920+ sequential_threading_handle ,
921+ time_machine ,
922+ safe_eyes_core ,
923+ context ,
924+ short_break_duration ,
925+ "translated!: break 1" ,
926+ initial = True ,
927+ )
928+
929+ # Time passed: 15min 25s
930+ # 15min short_break_interval, 10 seconds pre_break_warning_time,
931+ # 15 seconds short_break_duration
932+ self .assert_datetime ("2024-08-25T13:15:25" )
933+
934+ self .run_next_break (
935+ sequential_threading_handle ,
936+ time_machine ,
937+ safe_eyes_core ,
938+ context ,
939+ short_break_duration ,
940+ "translated!: break 2" ,
941+ )
942+
943+ self .assert_datetime ("2024-08-25T13:30:50" )
944+
945+ self .run_next_break (
946+ sequential_threading_handle ,
947+ time_machine ,
948+ safe_eyes_core ,
949+ context ,
950+ short_break_duration ,
951+ "translated!: break 3" ,
952+ )
953+
954+ self .assert_datetime ("2024-08-25T13:46:15" )
955+
956+ self .run_next_break (
957+ sequential_threading_handle ,
958+ time_machine ,
959+ safe_eyes_core ,
960+ context ,
961+ short_break_duration ,
962+ "translated!: break 4" ,
963+ )
964+
965+ self .assert_datetime ("2024-08-25T14:01:40" )
966+
967+ # idle, simulate behaviour of smartpause plugin
968+ idle_seconds = 65
969+ idle_period = datetime .timedelta (seconds = idle_seconds )
970+
971+ safe_eyes_core .stop (is_resting = True )
972+
973+ assert context ["state" ] == model .State .RESTING
974+
975+ time_machine .shift (delta = idle_period )
976+
977+ assert safe_eyes_core .scheduled_next_break_time is not None
978+ next_break = safe_eyes_core .scheduled_next_break_time + idle_period
979+
980+ safe_eyes_core .start (next_break_time = next_break .timestamp ())
981+
982+ self .assert_datetime ("2024-08-25T14:02:45" )
983+
984+ self .run_next_break_from_waiting_state (
985+ sequential_threading_handle ,
986+ safe_eyes_core ,
987+ context ,
988+ long_break_duration ,
989+ "translated!: long break 1" ,
990+ )
991+
992+ # Time passed: 16min 10s
993+ # 15min short_break_interval (from previous, as long_break_interval must be
994+ # multiple)
995+ # 10 seconds pre_break_warning_time, 1 minute long_break_duration
996+ self .assert_datetime ("2024-08-25T15:18:55" )
997+
998+ self .run_next_break (
999+ sequential_threading_handle ,
1000+ time_machine ,
1001+ safe_eyes_core ,
1002+ context ,
1003+ short_break_duration ,
1004+ "translated!: break 1" ,
1005+ )
1006+
1007+ # Time passed: 15min 25s
1008+ # 15min short_break_interval, 10 seconds pre_break_warning_time,
1009+ # 15 seconds short_break_duration
1010+ self .assert_datetime ("2024-08-25T15:34:20" )
1011+
1012+ safe_eyes_core .stop ()
1013+
1014+ assert context ["state" ] == model .State .STOPPED
0 commit comments