1
2
3
4
5 package par
6
7 import (
8 "sync/atomic"
9 "testing"
10 "time"
11 )
12
13 func TestWork(t *testing.T) {
14 var w Work
15
16 const N = 10000
17 n := int32(0)
18 w.Add(N)
19 w.Do(100, func(x any) {
20 atomic.AddInt32(&n, 1)
21 i := x.(int)
22 if i >= 2 {
23 w.Add(i - 1)
24 w.Add(i - 2)
25 }
26 w.Add(i >> 1)
27 w.Add((i >> 1) ^ 1)
28 })
29 if n != N+1 {
30 t.Fatalf("ran %d items, expected %d", n, N+1)
31 }
32 }
33
34 func TestWorkParallel(t *testing.T) {
35 for tries := 0; tries < 10; tries++ {
36 var w Work
37 const N = 100
38 for i := 0; i < N; i++ {
39 w.Add(i)
40 }
41 start := time.Now()
42 var n int32
43 w.Do(N, func(x any) {
44 time.Sleep(1 * time.Millisecond)
45 atomic.AddInt32(&n, +1)
46 })
47 if n != N {
48 t.Fatalf("par.Work.Do did not do all the work")
49 }
50 if time.Since(start) < N/2*time.Millisecond {
51 return
52 }
53 }
54 t.Fatalf("par.Work.Do does not seem to be parallel")
55 }
56
57 func TestCache(t *testing.T) {
58 var cache Cache
59
60 n := 1
61 v := cache.Do(1, func() any { n++; return n })
62 if v != 2 {
63 t.Fatalf("cache.Do(1) did not run f")
64 }
65 v = cache.Do(1, func() any { n++; return n })
66 if v != 2 {
67 t.Fatalf("cache.Do(1) ran f again!")
68 }
69 v = cache.Do(2, func() any { n++; return n })
70 if v != 3 {
71 t.Fatalf("cache.Do(2) did not run f")
72 }
73 v = cache.Do(1, func() any { n++; return n })
74 if v != 2 {
75 t.Fatalf("cache.Do(1) did not returned saved value from original cache.Do(1)")
76 }
77 }
78
View as plain text