1package fileio23import (4 "cmp"5 "math/rand/v2"6 "os"7 "slices"8 "testing"9)1011// TestNumberSort sorts numbers held and spilled, against sorting them12// in memory, ties in the order they were added, and leaves no files.13func TestNumberSort(t *testing.T) {14 defer func(n int) { sortRunBytes = n }(sortRunBytes)15 for _, run := range []int{1 << 20, 4096} {16 sortRunBytes = run17 dir := t.TempDir()18 r := rand.New(rand.NewPCG(1, uint64(run)))19 s := NewNumberSort(dir)20 var want []numRec21 for i := range 5000 {22 v := float64(r.IntN(700)) - 350.523 want = append(want, numRec{v, int64(i)})24 if err := s.Add(v, int64(i)); err != nil {25 t.Fatal(err)26 }27 }28 slices.SortStableFunc(want, func(a, b numRec) int { return cmp.Compare(a.v, b.v) })29 got, err := s.Sorted()30 if err != nil {31 t.Fatal(err)32 }33 if got.Len() != len(want) {34 t.Errorf("run %d: %d numbers, want %d", run, got.Len(), len(want))35 }36 for i, w := range want {37 v, pos, ok := got.Next()38 if !ok || v != w.v || pos != w.pos {39 t.Fatalf("run %d: #%d is %v at %d (%v), want %v at %d", run, i, v, pos, ok, w.v, w.pos)40 }41 }42 if _, _, ok := got.Next(); ok || got.Err() != nil {43 t.Errorf("run %d: more past the end, or %v", run, got.Err())44 }45 got.Close()46 if left, _ := os.ReadDir(dir); len(left) != 0 {47 t.Errorf("run %d: %d files left", run, len(left))48 }49 }50}