// Copyright 2009 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.

/*

Gotest is an automated testing tool for Go packages.

Normally a Go package is compiled without its test files.  Gotest is a
tool that recompiles the package whose source is in the current
directory, along with any files whose names match the pattern
"[^.]*_test.go".  Functions in the test source named TestXXX (where
XXX is any alphanumeric string not starting with a lower case letter)
will be run when the binary is executed.  Gotest requires that the
package have a standard package Makefile, one that includes
go/src/Make.pkg.

The test functions are run in the order they appear in the source.
They should have the signature,

	func TestXXX(t *testing.T) { ... }

Benchmark functions can be written as well; they will be run only when
the -test.bench flag is provided.  Benchmarks should have the
signature,

	func BenchmarkXXX(b *testing.B) { ... }

Example functions may also be written. They are similar to test functions but,
instead of using *testing.T to report success or failure, their output to
os.Stdout and os.Stderr is compared against their doc comment.

	// The output of this example function.
	func ExampleXXX() {
		fmt.Println("The output of this example function.")
	}

Multiple example functions may be provided for a given name XXX if they are
discriminated by a distinct suffix starting with "_", such as ExampleXXX_2.
Example functions without doc comments are compiled but not executed.

See the documentation of the testing package for more information.

By default, gotest needs no arguments.  It compiles all the .go files
in the directory, including tests, and runs the tests.  If file names
are given (with flag -file=test.go, one per extra test source file),
only those test files are added to the package.  (The non-test files
are always compiled.)

The package is built in a special subdirectory so it does not
interfere with the non-test installation.

Usage:
	gotest [-file a.go -file b.go ...] [-c] [-x] [args for test binary]

The flags specific to gotest are:
	-c         Compile the test binary but do not run it.
	-file a.go Use only the tests in the source file a.go.
	           Multiple -file flags may be provided.
	-x         Print each subcommand gotest executes.

Everything else on the command line is passed to the test binary.

The resulting test binary, called (for amd64) 6.out, has several flags.

Usage:
	6.out [-test.v] [-test.run pattern] [-test.bench pattern] \
		[-test.cpuprofile=cpu.out] \
		[-test.memprofile=mem.out] [-test.memprofilerate=1] \
		[-test.parallel=$GOMAXPROCS] \
		[-test.timeout=10] [-test.short] \
		[-test.benchtime=3] [-test.cpu=1,2,3,4]

The -test.v flag causes the tests to be logged as they run.  The
-test.run flag causes only those tests whose names match the regular
expression pattern to be run.  By default all tests are run silently.

If all specified tests pass, 6.out prints the word PASS and exits with
a 0 exit code.  If any tests fail, it prints error details, the word
FAIL, and exits with a non-zero code.  The -test.bench flag is
analogous to the -test.run flag, but applies to benchmarks.  No
benchmarks run by default.

The -test.cpuprofile flag causes the testing software to write a CPU
profile to the specified file before exiting.

The -test.memprofile flag causes the testing software to write a
memory profile to the specified file when all tests are complete.  The
-test.memprofilerate flag enables more precise (and expensive)
profiles by setting runtime.MemProfileRate; run
	godoc runtime MemProfileRate
for details.  The defaults are no memory profile and the standard
setting of MemProfileRate.  The memory profile records a sampling of
the memory in use at the end of the test.  To profile all memory
allocations, use -test.memprofilerate=1 to sample every byte and set
the environment variable GOGC=off to disable the garbage collector,
provided the test can run in the available memory without garbage
collection.

Use -test.run or -test.bench to limit profiling to a particular test
or benchmark.

The -test.parallel flag allows parallel execution of Test functions
that call test.Parallel.  The value of the flag is the maximum
number of tests to run simultaneously; by default, it is set to the
value of GOMAXPROCS.

The -test.short flag tells long-running tests to shorten their run
time.  It is off by default but set by all.bash so installations of
the Go tree can do a sanity check but not spend time running
exhaustive tests.

The -test.timeout flag sets a timeout for the test in seconds.  If the
test runs for longer than that, it will panic, dumping a stack trace
of all existing goroutines.

The -test.benchtime flag specifies the number of seconds to run each benchmark.
The default is one second.

The -test.cpu flag specifies a list of GOMAXPROCS values for which
the tests or benchmarks are executed.  The default is the current
value of GOMAXPROCS.

For convenience, each of these -test.X flags of the test binary is
also available as the flag -X in gotest itself.  Flags not listed here
are unaffected.  For instance, the command
	gotest -x -v -cpuprofile=prof.out -dir=testdata -update -file x_test.go
will compile the test binary using x_test.go and then run it as
	6.out -test.v -test.cpuprofile=prof.out -dir=testdata -update

*/
package documentation
