aboutsummaryrefslogtreecommitdiff
path: root/src/testing/loop_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/testing/loop_test.go')
-rw-r--r--src/testing/loop_test.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/testing/loop_test.go b/src/testing/loop_test.go
new file mode 100644
index 0000000000..ae1a5e019b
--- /dev/null
+++ b/src/testing/loop_test.go
@@ -0,0 +1,51 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package testing
+
+func TestBenchmarkBLoop(t *T) {
+ var initialStart highPrecisionTime
+ var firstStart highPrecisionTime
+ var lastStart highPrecisionTime
+ runs := 0
+ iters := 0
+ finalBN := 0
+ bRet := Benchmark(func(b *B) {
+ initialStart = b.start
+ runs++
+ for b.Loop() {
+ if iters == 0 {
+ firstStart = b.start
+ }
+ lastStart = b.start
+ iters++
+ }
+ finalBN = b.N
+ })
+ // Verify that a b.Loop benchmark is invoked just once.
+ if runs != 1 {
+ t.Errorf("want runs == 1, got %d", runs)
+ }
+ // Verify that at least one iteration ran.
+ if iters == 0 {
+ t.Fatalf("no iterations ran")
+ }
+ // Verify that b.N, bRet.N, and the b.Loop() iteration count match.
+ if finalBN != iters || bRet.N != iters {
+ t.Errorf("benchmark iterations mismatch: %d loop iterations, final b.N=%d, bRet.N=%d", iters, finalBN, bRet.N)
+ }
+ // Make sure the benchmark ran for an appropriate amount of time.
+ if bRet.T < benchTime.d {
+ t.Fatalf("benchmark ran for %s, want >= %s", bRet.T, benchTime.d)
+ }
+ // Verify that the timer is reset on the first loop, and then left alone.
+ if firstStart == initialStart {
+ t.Errorf("b.Loop did not reset the timer")
+ }
+ if lastStart != firstStart {
+ t.Errorf("timer was reset during iteration")
+ }
+}
+
+// See also TestBenchmarkBLoop* in other files.