// Copyright 2017 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

import "sync"

// The line numbering of this file is important for TestTBHelper.

func notHelper(t *T, msg string) {
	t.Error(msg)
}

func helper(t *T, msg string) {
	t.Helper()
	t.Error(msg)
}

func notHelperCallingHelper(t *T, msg string) {
	helper(t, msg)
}

func helperCallingHelper(t *T, msg string) {
	t.Helper()
	helper(t, msg)
}

func testHelper(t *T) {
	// Check combinations of directly and indirectly
	// calling helper functions.
	notHelper(t, "0")
	helper(t, "1")
	notHelperCallingHelper(t, "2")
	helperCallingHelper(t, "3")

	// Check a function literal closing over t that uses Helper.
	fn := func(msg string) {
		t.Helper()
		t.Error(msg)
	}
	fn("4")

	t.Run("sub", func(t *T) {
		helper(t, "5")
		notHelperCallingHelper(t, "6")
		// Check that calling Helper from inside a subtest entry function
		// works as if it were in an ordinary function call.
		t.Helper()
		t.Error("7")
	})

	// Check that calling Helper from inside a top-level test function
	// has no effect.
	t.Helper()
	t.Error("8")

	// Check that right caller is reported for func passed to Cleanup when
	// multiple cleanup functions have been registered.
	t.Cleanup(func() {
		t.Helper()
		t.Error("10")
	})
	t.Cleanup(func() {
		t.Helper()
		t.Error("9")
	})
}

func parallelTestHelper(t *T) {
	var wg sync.WaitGroup
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func() {
			notHelperCallingHelper(t, "parallel")
			wg.Done()
		}()
	}
	wg.Wait()
}
