package day import ( "strings" "testing" ) func sp(s string) *string { return &s } func TestResolveLogExplicitActivity(t *testing.T) { blocks := map[int]string{28: "old"} asg, over, err := ResolveLog([]int{28, 29}, sp("new"), blocks, nil, 30) if err != nil { t.Fatal(err) } if len(asg) != 2 || *asg[28] != "new" || *asg[29] != "new" { t.Fatalf("assignments %v", asg) } if len(over) != 1 || over[0].Index != 28 || *over[0].FromID != "old" || *over[0].ToID != "new" { t.Fatalf("overwrites %v", over) } } func TestResolveLogSameActivityNoOverwrite(t *testing.T) { blocks := map[int]string{28: "same"} _, over, err := ResolveLog([]int{28}, sp("same"), blocks, nil, 30) if err != nil { t.Fatal(err) } if len(over) != 0 { t.Fatalf("re-logging same activity should not count as overwrite: %v", over) } } func TestResolveLogPlanFill(t *testing.T) { plan := map[int]string{29: "planned-a", 30: "planned-b"} asg, over, err := ResolveLog([]int{29, 30}, nil, map[int]string{}, plan, 30) if err != nil { t.Fatal(err) } if *asg[29] != "planned-a" || *asg[30] != "planned-b" { t.Fatalf("assignments %v", asg) } if len(over) != 0 { t.Fatalf("overwrites %v", over) } } func TestResolveLogPlanFillMissingPlanAllOrNothing(t *testing.T) { plan := map[int]string{29: "planned-a"} _, _, err := ResolveLog([]int{29, 30, 31}, nil, map[int]string{}, plan, 30) if err == nil { t.Fatal("want error for slots without plan") } msg := err.Error() if !strings.Contains(msg, "15:00") || !strings.Contains(msg, "15:30") { t.Fatalf("error should list offending slots (blockSize 30): %q", msg) } } func TestResolveClear(t *testing.T) { blocks := map[int]string{28: "a"} asg, cleared := ResolveClear([]int{28, 29}, blocks) if len(asg) != 1 || asg[28] != nil { t.Fatalf("assignments %v", asg) } if len(cleared) != 1 || cleared[0].Index != 28 || *cleared[0].FromID != "a" || cleared[0].ToID != nil { t.Fatalf("cleared %v", cleared) } }