package service import ( "testing" "time" ) func TestIsInSleepWindow(t *testing.T) { t.Parallel() // wake=07:30, sleep=23:30 => sleep: [23:30, 07:30) wake := 7*60 + 30 sleep := 23*60 + 30 if !isInSleepWindow(0, wake, sleep) { t.Fatalf("expected 00:00 to be in sleep window") } if isInSleepWindow(8*60, wake, sleep) { t.Fatalf("expected 08:00 to be awake") } if !isInSleepWindow(23*60+45, wake, sleep) { t.Fatalf("expected 23:45 to be in sleep window") } // wake=18:00, sleep=02:00 => sleep: [02:00, 18:00) wake = 18 * 60 sleep = 2 * 60 if isInSleepWindow(1*60, wake, sleep) { t.Fatalf("expected 01:00 to be awake (awake window crosses midnight)") } if !isInSleepWindow(10*60, wake, sleep) { t.Fatalf("expected 10:00 to be in sleep window") } } func TestAdjustToWakeIfInSleep(t *testing.T) { t.Parallel() loc := time.Local // wake=07:30, sleep=23:30 wake := "07:30" sleep := "23:30" // 02:00 should adjust to same-day 07:30 in := time.Date(2026, 1, 2, 2, 0, 0, 0, loc) out, adjusted, err := adjustToWakeIfInSleep(in, wake, sleep) if err != nil { t.Fatalf("adjustToWakeIfInSleep: %v", err) } if !adjusted { t.Fatalf("expected adjustment") } if out.Hour() != 7 || out.Minute() != 30 { t.Fatalf("expected 07:30, got %02d:%02d", out.Hour(), out.Minute()) } // 10:00 should not adjust in = time.Date(2026, 1, 2, 10, 0, 0, 0, loc) out, adjusted, err = adjustToWakeIfInSleep(in, wake, sleep) if err != nil { t.Fatalf("adjustToWakeIfInSleep: %v", err) } if adjusted { t.Fatalf("expected no adjustment") } if !out.Equal(in) { t.Fatalf("expected unchanged time") } // 23:45 should adjust to next-day 07:30 in = time.Date(2026, 1, 2, 23, 45, 0, 0, loc) out, adjusted, err = adjustToWakeIfInSleep(in, wake, sleep) if err != nil { t.Fatalf("adjustToWakeIfInSleep: %v", err) } if !adjusted { t.Fatalf("expected adjustment") } if out.Day() != 3 || out.Hour() != 7 || out.Minute() != 30 { t.Fatalf("expected next day 07:30, got %s", out.Format(time.RFC3339)) } }