#!/usr/bin/env bash
# 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.

set -e

goos=$(go env GOOS)

defer_panic_recover="
	defer
	defer2
"

effective_go="
	eff_bytesize
	eff_qr
	eff_sequence
	eff_unused2
"

error_handling="
	error
	error2
	error3
	error4
"

law_of_reflection="
	interface
	interface2
"

c_go_cgo="
	cgo1
	cgo2
	cgo3
	cgo4
"
# cgo1 and cgo2 don't run on freebsd, srandom has a different signature
if [ "$goos" == "freebsd" ]; then
	c_go_cgo="cgo3 cgo4"
fi
# cgo1 and cgo2 don't run on netbsd, srandom has a different signature
# cgo3 and cgo4 don't run on netbsd, since cgo cannot handle stdout correctly
if [ "$goos" == "netbsd" ]; then
	c_go_cgo=""
fi
# cgo3 and cgo4 don't run on openbsd, since cgo cannot handle stdout correctly
if [ "$goos" == "openbsd" ]; then
	c_go_cgo="cgo1 cgo2"
fi
if [ "$CGO_ENABLED" != 1 ]; then
	c_go_cgo=""
fi

timeout="
	timeout1
	timeout2
"

gobs="
	gobs1
	gobs2
"

json="
	json1
	json2
	json3
	json4
	json5
"

image_package="
	image_package1
	image_package2
	image_package3
	image_package4
	image_package5
	image_package6
"

all=$(echo $defer_panic_recover $effective_go $error_handling $law_of_reflection $c_go_cgo $timeout $gobs $json $image_package slices go1)

for i in $all; do
	go build $i.go
done

# Write to temporary file to avoid mingw bash bug.
TMPFILE="${TMPDIR:-/tmp}/gotest3.$USER"

testit () {
	./$1 >"$TMPFILE" 2>&1 || true
	x=$(echo $(cat "$TMPFILE")) # extra echo canonicalizes
	if ! echo "$x" | grep "$2" > /dev/null
	then
		echo $1 failed: '"'$x'"' is not '"'$2'"'
	fi
}


testit defer '^0 3210 2$'
testit defer2 '^Calling g. Printing in g 0 Printing in g 1 Printing in g 2 Printing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 Recovered in f 4 Returned normally from f.$'

testit eff_bytesize '^1.00YB 9.09TB$'
testit eff_sequence '^\[-1 2 6 16 44\]$'

testit go1 '^Christmas is a holiday: true Sleeping for 0.123s.*go1.go already exists$'

testit interface2 "^type: float64$"

testit json1 "^$"
testit json2 "the reciprocal of i is"
testit json3 "Age is int 6"
testit json4 "^$"

testit image_package1 "^X is 2 Y is 1$"
testit image_package2 "^3 4 false$"
testit image_package3 "^3 4 true$"
testit image_package4 "^image.Point{X:2, Y:1}$"
testit image_package5 "^{255 0 0 255}$"
testit image_package6 "^8 4 true$"

rm -f $all "$TMPFILE"
