github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/go/par/work_test.go (about)

     1  // Copyright 2018 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     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[int]
    15  
    16  	const N = 10000
    17  	n := int32(0)
    18  	w.Add(N)
    19  	w.Do(100, func(i int) {
    20  		atomic.AddInt32(&n, 1)
    21  		if i >= 2 {
    22  			w.Add(i - 1)
    23  			w.Add(i - 2)
    24  		}
    25  		w.Add(i >> 1)
    26  		w.Add((i >> 1) ^ 1)
    27  	})
    28  	if n != N+1 {
    29  		t.Fatalf("ran %d items, expected %d", n, N+1)
    30  	}
    31  }
    32  
    33  func TestWorkParallel(t *testing.T) {
    34  	for tries := 0; tries < 10; tries++ {
    35  		var w Work[int]
    36  		const N = 100
    37  		for i := 0; i < N; i++ {
    38  			w.Add(i)
    39  		}
    40  		start := time.Now()
    41  		var n int32
    42  		w.Do(N, func(x int) {
    43  			time.Sleep(1 * time.Millisecond)
    44  			atomic.AddInt32(&n, +1)
    45  		})
    46  		if n != N {
    47  			t.Fatalf("par.Work.Do did not do all the work")
    48  		}
    49  		if time.Since(start) < N/2*time.Millisecond {
    50  			return
    51  		}
    52  	}
    53  	t.Fatalf("par.Work.Do does not seem to be parallel")
    54  }
    55  
    56  func TestCache(t *testing.T) {
    57  	var cache Cache[int, int]
    58  
    59  	n := 1
    60  	v := cache.Do(1, func() int { n++; return n })
    61  	if v != 2 {
    62  		t.Fatalf("cache.Do(1) did not run f")
    63  	}
    64  	v = cache.Do(1, func() int { n++; return n })
    65  	if v != 2 {
    66  		t.Fatalf("cache.Do(1) ran f again!")
    67  	}
    68  	v = cache.Do(2, func() int { n++; return n })
    69  	if v != 3 {
    70  		t.Fatalf("cache.Do(2) did not run f")
    71  	}
    72  	v = cache.Do(1, func() int { n++; return n })
    73  	if v != 2 {
    74  		t.Fatalf("cache.Do(1) did not returned saved value from original cache.Do(1)")
    75  	}
    76  }