Files
wehub-resource-sync ead81af521
Deploy to GitHub Pages / deploy (push) Failing after 0s
CI / go (push) Has been cancelled
CI / build (darwin, macos-14) (push) Has been cancelled
CI / build (windows, windows-2025) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

99 lines
3.1 KiB
Go

package model
import (
"testing"
"time"
)
func TestParseJumpTarget(t *testing.T) {
tests := []struct {
name string
in string
want time.Duration
wantErr bool
}{
// Expected success cases.
{name: "seconds only", in: "10", want: 10 * time.Second},
{name: "missing minutes accepted", in: ":49", want: 49 * time.Second},
{name: "minutes seconds", in: "58:05", want: 58*time.Minute + 5*time.Second},
{name: "minutes one-digit seconds", in: "58:6", want: 58*time.Minute + 6*time.Second},
{name: "minutes trailing colon", in: "58:", want: 58 * time.Minute},
{name: "spaces trimmed", in: " 12:3 ", want: 12*time.Minute + 3*time.Second},
{name: "hours minutes seconds", in: "1:02:03", want: time.Hour + 2*time.Minute + 3*time.Second},
{name: "hours one-digit parts", in: "2:3:4", want: 2*time.Hour + 3*time.Minute + 4*time.Second},
{name: "hours missing minutes accepted", in: "1::03", want: time.Hour + 3*time.Second},
{name: "hours trailing colon accepted", in: "1:02:", want: time.Hour + 2*time.Minute},
// Expected failure cases.
{name: "empty", in: "", wantErr: true},
{name: "not number", in: "abc", wantErr: true},
{name: "bad minutes", in: "x:05", wantErr: true},
{name: "bad seconds", in: "10:x", wantErr: true},
{name: "hours bad minutes", in: "1:60:00", wantErr: true},
{name: "hours bad seconds", in: "1:00:60", wantErr: true},
{name: "hours non-numeric", in: "x:02:03", wantErr: true},
{name: "hours minutes too many digits", in: "1:123:03", wantErr: true},
{name: "seconds too large", in: "10:60", wantErr: true},
{name: "high minute high second", in: "99:99", wantErr: true},
{name: "too many colons", in: "1:2:3:4", wantErr: true},
{name: "too many second digits", in: "10:123", wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := parseJumpTarget(tt.in)
if tt.wantErr {
if err == nil {
t.Fatalf("expected error, got nil")
}
return
}
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if got != tt.want {
t.Fatalf("got %v want %v", got, tt.want)
}
})
}
}
func TestFormatJumpClock(t *testing.T) {
tests := []struct {
in time.Duration
want string
}{
{in: 0, want: "00:00"},
{in: 10 * time.Second, want: "00:10"},
{in: 58*time.Minute + 5*time.Second, want: "58:05"},
{in: 1 * time.Hour, want: "60:00"},
{in: 75*time.Minute + 48*time.Second, want: "75:48"},
}
for _, tt := range tests {
if got := formatJumpClock(tt.in); got != tt.want {
t.Fatalf("formatJumpClock(%v) = %q want %q", tt.in, got, tt.want)
}
}
}
func TestFormatJumpPlaceholder(t *testing.T) {
tests := []struct {
in time.Duration
want string
}{
{in: -1 * time.Second, want: "00:00"},
{in: 0, want: "00:00"},
{in: 59 * time.Second, want: "00:00"},
{in: 1 * time.Minute, want: "00:00"},
{in: 59*time.Minute + 59*time.Second, want: "00:00"},
{in: 1 * time.Hour, want: "00:00"},
}
for _, tt := range tests {
if got := formatJumpPlaceholder(tt.in); got != tt.want {
t.Fatalf("formatJumpPlaceholder(%v) = %q want %q", tt.in, got, tt.want)
}
}
}