package main import ( "os" "testing" "tangled.org/evan.jarrett.net/aoc2025/internal" ) const testInput = `11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124` func TestPart1(t *testing.T) { d := &DayTwo{} if err := d.ParseInput(testInput); err != nil { t.Fatalf("ParseInput failed: %v", err) } got, err := d.Part1() if err != nil { t.Fatalf("Part1 failed: %v", err) } want := 1227775554 if got != want { t.Errorf("Part1() = %d, want %d", got, want) } } func TestPart2(t *testing.T) { d := &DayTwo{} if err := d.ParseInput(testInput); err != nil { t.Fatalf("ParseInput failed: %v", err) } got, err := d.Part2() if err != nil { t.Fatalf("Part2 failed: %v", err) } want := 4174379265 if got != want { t.Errorf("Part2() = %d, want %d", got, want) } } // getRealInput loads the real puzzle input, caching it to a file to avoid // repeated network calls during benchmarks. func getRealInput(b *testing.B) string { b.Helper() const cacheFile = "testdata/input.txt" // Try to read from cache first if data, err := os.ReadFile(cacheFile); err == nil { return string(data) } // Fetch from AOC and cache it input, err := internal.GetInput(2) if err != nil { b.Skipf("Could not fetch real input: %v", err) } // Cache for future runs _ = os.MkdirAll("testdata", 0755) _ = os.WriteFile(cacheFile, []byte(input), 0644) return input } func BenchmarkPart1(b *testing.B) { input := getRealInput(b) d := &DayTwo{} if err := d.ParseInput(input); err != nil { b.Fatalf("ParseInput failed: %v", err) } b.ResetTimer() for i := 0; i < b.N; i++ { d.Part1() } } func BenchmarkPart2(b *testing.B) { input := getRealInput(b) d := &DayTwo{} if err := d.ParseInput(input); err != nil { b.Fatalf("ParseInput failed: %v", err) } b.ResetTimer() for i := 0; i < b.N; i++ { d.Part2() } }