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

package testing

import (
	"fmt";
	"flag";
)

var chatty bool;
func init() {
	flag.Bool("chatty", false, &chatty, "chatty");
}

// Insert tabs after newlines - but not the last one
func Tabify(s string) string {
	for i := 0; i < len(s) - 1; i++ {	// -1 because if last char is newline, don't bother
		if s[i] == '\n' {
			return s[0:i+1] + "\t" + Tabify(s[i+1:len(s)]);
		}
	}
	return s
}

export type T struct {
	errors	string;
	failed	bool;
	ch	*chan *T;
}

func (t *T) Fail() {
	t.failed = true
}

func (t *T) FailNow() {
	t.Fail();
	t.ch <- t;
	sys.goexit();
}

func (t *T) Log(args ...) {
	t.errors += "\t" + Tabify(fmt.sprintln(args));
}

func (t *T) Logf(format string, args ...) {
	t.errors += Tabify(fmt.sprintf("\t" + format, args));
	l := len(t.errors);
	if l > 0 && t.errors[l-1] != '\n' {
		t.errors += "\n"
	}
}

func (t *T) Error(args ...) {
	t.Log(args);
	t.Fail();
}

func (t *T) Errorf(format string, args ...) {
	t.Logf(format, args);
	t.Fail();
}

func (t *T) Fatal(args ...) {
	t.Log(args);
	t.FailNow();
}

func (t *T) Fatalf(format string, args ...) {
	t.Logf(format, args);
	t.FailNow();
}

export type Test struct {
	name string;
	f *(*T);
}

func TRunner(t *T, test *Test) {
	test.f(t);
	t.ch <- t;
}

export func Main(tests []Test) {
	flag.Parse();
	ok := true;
	if len(tests) == 0 {
		println("testing: warning: no tests to run");
	}
	for i := 0; i < len(tests); i++ {
		if chatty {
			println("=== RUN ", tests[i].name);
		}
		t := new(T);
		t.ch = new(chan *T);
		go TRunner(t, &tests[i]);
		<-t.ch;
		if t.failed {
			println("--- FAIL:", tests[i].name);
			print(t.errors);
			ok = false;
		} else if chatty {
			println("--- PASS:", tests[i].name);
			print(t.errors);
		}
	}
	if !ok {
		println("FAIL");
		sys.exit(1);
	}
	println("PASS");
}
