diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 191a536..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-_*
-*.swp
-*.[568]
-[568].out
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 545cf2d..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Gocheck - A rich testing framework for Go
- 
-Copyright (c) 2010-2013 Gustavo Niemeyer <gustavo@niemeyer.net>
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met: 
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer. 
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
deleted file mode 100644
index e5e3608..0000000
--- a/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Documentation
-=============
-
-Please see the project page at http://labix.org/gocheck
diff --git a/TODO b/TODO
deleted file mode 100644
index 3349827..0000000
--- a/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-- Assert(slice, Contains, item)
-- Parallel test support
diff --git a/benchmark.go b/benchmark.go
deleted file mode 100644
index ee1cfe6..0000000
--- a/benchmark.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// 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 check
-
-import (
-	"fmt"
-	"time"
-)
-
-// testingB is a type passed to Benchmark functions to manage benchmark
-// timing and to specify the number of iterations to run.
-type timer struct {
-	start     time.Time // Time test or benchmark started
-	duration  time.Duration
-	N         int
-	bytes     int64
-	timerOn   bool
-	benchTime time.Duration
-}
-
-// StartTimer starts timing a test. This function is called automatically
-// before a benchmark starts, but it can also used to resume timing after
-// a call to StopTimer.
-func (c *C) StartTimer() {
-	if !c.timerOn {
-		c.start = time.Now()
-		c.timerOn = true
-	}
-}
-
-// StopTimer stops timing a test. This can be used to pause the timer
-// while performing complex initialization that you don't
-// want to measure.
-func (c *C) StopTimer() {
-	if c.timerOn {
-		c.duration += time.Now().Sub(c.start)
-		c.timerOn = false
-	}
-}
-
-// ResetTimer sets the elapsed benchmark time to zero.
-// It does not affect whether the timer is running.
-func (c *C) ResetTimer() {
-	if c.timerOn {
-		c.start = time.Now()
-	}
-	c.duration = 0
-}
-
-// SetBytes informs the number of bytes that the benchmark processes
-// on each iteration. If this is called in a benchmark it will also
-// report MB/s.
-func (c *C) SetBytes(n int64) {
-	c.bytes = n
-}
-
-func (c *C) nsPerOp() int64 {
-	if c.N <= 0 {
-		return 0
-	}
-	return c.duration.Nanoseconds() / int64(c.N)
-}
-
-func (c *C) mbPerSec() float64 {
-	if c.bytes <= 0 || c.duration <= 0 || c.N <= 0 {
-		return 0
-	}
-	return (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds()
-}
-
-func (c *C) timerString() string {
-	if c.N <= 0 {
-		return fmt.Sprintf("%3.3fs", float64(c.duration.Nanoseconds())/1e9)
-	}
-	mbs := c.mbPerSec()
-	mb := ""
-	if mbs != 0 {
-		mb = fmt.Sprintf("\t%7.2f MB/s", mbs)
-	}
-	nsop := c.nsPerOp()
-	ns := fmt.Sprintf("%10d ns/op", nsop)
-	if c.N > 0 && nsop < 100 {
-		// The format specifiers here make sure that
-		// the ones digits line up for all three possible formats.
-		if nsop < 10 {
-			ns = fmt.Sprintf("%13.2f ns/op", float64(c.duration.Nanoseconds())/float64(c.N))
-		} else {
-			ns = fmt.Sprintf("%12.1f ns/op", float64(c.duration.Nanoseconds())/float64(c.N))
-		}
-	}
-	return fmt.Sprintf("%8d\t%s%s", c.N, ns, mb)
-}
-
-func min(x, y int) int {
-	if x > y {
-		return y
-	}
-	return x
-}
-
-func max(x, y int) int {
-	if x < y {
-		return y
-	}
-	return x
-}
-
-// roundDown10 rounds a number down to the nearest power of 10.
-func roundDown10(n int) int {
-	var tens = 0
-	// tens = floor(log_10(n))
-	for n > 10 {
-		n = n / 10
-		tens++
-	}
-	// result = 10^tens
-	result := 1
-	for i := 0; i < tens; i++ {
-		result *= 10
-	}
-	return result
-}
-
-// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
-func roundUp(n int) int {
-	base := roundDown10(n)
-	if n < (2 * base) {
-		return 2 * base
-	}
-	if n < (5 * base) {
-		return 5 * base
-	}
-	return 10 * base
-}
diff --git a/benchmark_test.go b/benchmark_test.go
deleted file mode 100644
index b7f7b44..0000000
--- a/benchmark_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// These tests verify the test running logic.
-
-package check_test
-
-import (
-	. "gopkg.in/check.v1"
-	"time"
-)
-
-var benchmarkS = Suite(&BenchmarkS{})
-
-type BenchmarkS struct{}
-
-func (s *BenchmarkS) TestCountSuite(c *C) {
-	suitesRun += 1
-}
-
-func (s *BenchmarkS) TestBasicTestTiming(c *C) {
-	helper := FixtureHelper{sleepOn: "Test1", sleep: 1000000 * time.Nanosecond}
-	output := String{}
-	runConf := RunConf{Output: &output, Verbose: true}
-	Run(&helper, &runConf)
-
-	expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t0\\.001s\n" +
-		"PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t0\\.000s\n"
-	c.Assert(output.value, Matches, expected)
-}
-
-func (s *BenchmarkS) TestStreamTestTiming(c *C) {
-	helper := FixtureHelper{sleepOn: "SetUpSuite", sleep: 1000000 * time.Nanosecond}
-	output := String{}
-	runConf := RunConf{Output: &output, Stream: true}
-	Run(&helper, &runConf)
-
-	expected := "(?s).*\nPASS: check_test\\.go:[0-9]+: FixtureHelper\\.SetUpSuite\t *0\\.001s\n.*"
-	c.Assert(output.value, Matches, expected)
-}
-
-func (s *BenchmarkS) TestBenchmark(c *C) {
-	helper := FixtureHelper{sleep: 100000}
-	output := String{}
-	runConf := RunConf{
-		Output:        &output,
-		Benchmark:     true,
-		BenchmarkTime: 10000000,
-		Filter:        "Benchmark1",
-	}
-	Run(&helper, &runConf)
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Benchmark1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "SetUpTest")
-	c.Check(helper.calls[5], Equals, "Benchmark1")
-	c.Check(helper.calls[6], Equals, "TearDownTest")
-	// ... and more.
-
-	expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark1\t *100\t *[12][0-9]{5} ns/op\n"
-	c.Assert(output.value, Matches, expected)
-}
-
-func (s *BenchmarkS) TestBenchmarkBytes(c *C) {
-	helper := FixtureHelper{sleep: 100000}
-	output := String{}
-	runConf := RunConf{
-		Output:        &output,
-		Benchmark:     true,
-		BenchmarkTime: 10000000,
-		Filter:        "Benchmark2",
-	}
-	Run(&helper, &runConf)
-
-	expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark2\t *100\t *[12][0-9]{5} ns/op\t *[4-9]\\.[0-9]{2} MB/s\n"
-	c.Assert(output.value, Matches, expected)
-}
diff --git a/bootstrap_test.go b/bootstrap_test.go
deleted file mode 100644
index e55f327..0000000
--- a/bootstrap_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// These initial tests are for bootstrapping.  They verify that we can
-// basically use the testing infrastructure itself to check if the test
-// system is working.
-//
-// These tests use will break down the test runner badly in case of
-// errors because if they simply fail, we can't be sure the developer
-// will ever see anything (because failing means the failing system
-// somehow isn't working! :-)
-//
-// Do not assume *any* internal functionality works as expected besides
-// what's actually tested here.
-
-package check_test
-
-import (
-	"fmt"
-	"gopkg.in/check.v1"
-	"strings"
-)
-
-type BootstrapS struct{}
-
-var boostrapS = check.Suite(&BootstrapS{})
-
-func (s *BootstrapS) TestCountSuite(c *check.C) {
-	suitesRun += 1
-}
-
-func (s *BootstrapS) TestFailedAndFail(c *check.C) {
-	if c.Failed() {
-		critical("c.Failed() must be false first!")
-	}
-	c.Fail()
-	if !c.Failed() {
-		critical("c.Fail() didn't put the test in a failed state!")
-	}
-	c.Succeed()
-}
-
-func (s *BootstrapS) TestFailedAndSucceed(c *check.C) {
-	c.Fail()
-	c.Succeed()
-	if c.Failed() {
-		critical("c.Succeed() didn't put the test back in a non-failed state")
-	}
-}
-
-func (s *BootstrapS) TestLogAndGetTestLog(c *check.C) {
-	c.Log("Hello there!")
-	log := c.GetTestLog()
-	if log != "Hello there!\n" {
-		critical(fmt.Sprintf("Log() or GetTestLog() is not working! Got: %#v", log))
-	}
-}
-
-func (s *BootstrapS) TestLogfAndGetTestLog(c *check.C) {
-	c.Logf("Hello %v", "there!")
-	log := c.GetTestLog()
-	if log != "Hello there!\n" {
-		critical(fmt.Sprintf("Logf() or GetTestLog() is not working! Got: %#v", log))
-	}
-}
-
-func (s *BootstrapS) TestRunShowsErrors(c *check.C) {
-	output := String{}
-	check.Run(&FailHelper{}, &check.RunConf{Output: &output})
-	if strings.Index(output.value, "Expected failure!") == -1 {
-		critical(fmt.Sprintf("RunWithWriter() output did not contain the "+
-			"expected failure! Got: %#v",
-			output.value))
-	}
-}
-
-func (s *BootstrapS) TestRunDoesntShowSuccesses(c *check.C) {
-	output := String{}
-	check.Run(&SuccessHelper{}, &check.RunConf{Output: &output})
-	if strings.Index(output.value, "Expected success!") != -1 {
-		critical(fmt.Sprintf("RunWithWriter() output contained a successful "+
-			"test! Got: %#v",
-			output.value))
-	}
-}
diff --git a/check.go b/check.go
deleted file mode 100644
index 5239f6a..0000000
--- a/check.go
+++ /dev/null
@@ -1,929 +0,0 @@
-package check
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"math/rand"
-	"os"
-	"path"
-	"path/filepath"
-	"reflect"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-)
-
-// -----------------------------------------------------------------------
-// Internal type which deals with suite method calling.
-
-const (
-	fixtureKd = iota
-	testKd
-)
-
-type funcKind int
-
-const (
-	succeededSt = iota
-	failedSt
-	skippedSt
-	panickedSt
-	fixturePanickedSt
-	missedSt
-)
-
-type funcStatus int
-
-// A method value can't reach its own Method structure.
-type methodType struct {
-	reflect.Value
-	Info reflect.Method
-}
-
-func newMethod(receiver reflect.Value, i int) *methodType {
-	return &methodType{receiver.Method(i), receiver.Type().Method(i)}
-}
-
-func (method *methodType) PC() uintptr {
-	return method.Info.Func.Pointer()
-}
-
-func (method *methodType) suiteName() string {
-	t := method.Info.Type.In(0)
-	if t.Kind() == reflect.Ptr {
-		t = t.Elem()
-	}
-	return t.Name()
-}
-
-func (method *methodType) String() string {
-	return method.suiteName() + "." + method.Info.Name
-}
-
-func (method *methodType) matches(re *regexp.Regexp) bool {
-	return (re.MatchString(method.Info.Name) ||
-		re.MatchString(method.suiteName()) ||
-		re.MatchString(method.String()))
-}
-
-type C struct {
-	method    *methodType
-	kind      funcKind
-	status    funcStatus
-	logb      *logger
-	logw      io.Writer
-	done      chan *C
-	reason    string
-	mustFail  bool
-	tempDir   *tempDir
-	startTime time.Time
-	timer
-}
-
-func (c *C) stopNow() {
-	runtime.Goexit()
-}
-
-// logger is a concurrency safe byte.Buffer
-type logger struct {
-	sync.Mutex
-	writer bytes.Buffer
-}
-
-func (l *logger) Write(buf []byte) (int, error) {
-	l.Lock()
-	defer l.Unlock()
-	return l.writer.Write(buf)
-}
-
-func (l *logger) WriteTo(w io.Writer) (int64, error) {
-	l.Lock()
-	defer l.Unlock()
-	return l.writer.WriteTo(w)
-}
-
-func (l *logger) String() string {
-	l.Lock()
-	defer l.Unlock()
-	return l.writer.String()
-}
-
-// -----------------------------------------------------------------------
-// Handling of temporary files and directories.
-
-type tempDir struct {
-	sync.Mutex
-	path    string
-	counter int
-}
-
-func (td *tempDir) newPath() string {
-	td.Lock()
-	defer td.Unlock()
-	if td.path == "" {
-		var err error
-		for i := 0; i != 100; i++ {
-			path := fmt.Sprintf("%s/check-%d", os.TempDir(), rand.Int())
-			if err = os.Mkdir(path, 0700); err == nil {
-				td.path = path
-				break
-			}
-		}
-		if td.path == "" {
-			panic("Couldn't create temporary directory: " + err.Error())
-		}
-	}
-	result := path.Join(td.path, strconv.Itoa(td.counter))
-	td.counter += 1
-	return result
-}
-
-func (td *tempDir) removeAll() {
-	td.Lock()
-	defer td.Unlock()
-	if td.path != "" {
-		err := os.RemoveAll(td.path)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error())
-		}
-	}
-}
-
-// Create a new temporary directory which is automatically removed after
-// the suite finishes running.
-func (c *C) MkDir() string {
-	path := c.tempDir.newPath()
-	if err := os.Mkdir(path, 0700); err != nil {
-		panic(fmt.Sprintf("Couldn't create temporary directory %s: %s", path, err.Error()))
-	}
-	return path
-}
-
-// -----------------------------------------------------------------------
-// Low-level logging functions.
-
-func (c *C) log(args ...interface{}) {
-	c.writeLog([]byte(fmt.Sprint(args...) + "\n"))
-}
-
-func (c *C) logf(format string, args ...interface{}) {
-	c.writeLog([]byte(fmt.Sprintf(format+"\n", args...)))
-}
-
-func (c *C) logNewLine() {
-	c.writeLog([]byte{'\n'})
-}
-
-func (c *C) writeLog(buf []byte) {
-	c.logb.Write(buf)
-	if c.logw != nil {
-		c.logw.Write(buf)
-	}
-}
-
-func hasStringOrError(x interface{}) (ok bool) {
-	_, ok = x.(fmt.Stringer)
-	if ok {
-		return
-	}
-	_, ok = x.(error)
-	return
-}
-
-func (c *C) logValue(label string, value interface{}) {
-	if label == "" {
-		if hasStringOrError(value) {
-			c.logf("... %#v (%q)", value, value)
-		} else {
-			c.logf("... %#v", value)
-		}
-	} else if value == nil {
-		c.logf("... %s = nil", label)
-	} else {
-		if hasStringOrError(value) {
-			fv := fmt.Sprintf("%#v", value)
-			qv := fmt.Sprintf("%q", value)
-			if fv != qv {
-				c.logf("... %s %s = %s (%s)", label, reflect.TypeOf(value), fv, qv)
-				return
-			}
-		}
-		if s, ok := value.(string); ok && isMultiLine(s) {
-			c.logf(`... %s %s = "" +`, label, reflect.TypeOf(value))
-			c.logMultiLine(s)
-		} else {
-			c.logf("... %s %s = %#v", label, reflect.TypeOf(value), value)
-		}
-	}
-}
-
-func (c *C) logMultiLine(s string) {
-	b := make([]byte, 0, len(s)*2)
-	i := 0
-	n := len(s)
-	for i < n {
-		j := i + 1
-		for j < n && s[j-1] != '\n' {
-			j++
-		}
-		b = append(b, "...     "...)
-		b = strconv.AppendQuote(b, s[i:j])
-		if j < n {
-			b = append(b, " +"...)
-		}
-		b = append(b, '\n')
-		i = j
-	}
-	c.writeLog(b)
-}
-
-func isMultiLine(s string) bool {
-	for i := 0; i+1 < len(s); i++ {
-		if s[i] == '\n' {
-			return true
-		}
-	}
-	return false
-}
-
-func (c *C) logString(issue string) {
-	c.log("... ", issue)
-}
-
-func (c *C) logCaller(skip int) {
-	// This is a bit heavier than it ought to be.
-	skip += 1 // Our own frame.
-	pc, callerFile, callerLine, ok := runtime.Caller(skip)
-	if !ok {
-		return
-	}
-	var testFile string
-	var testLine int
-	testFunc := runtime.FuncForPC(c.method.PC())
-	if runtime.FuncForPC(pc) != testFunc {
-		for {
-			skip += 1
-			if pc, file, line, ok := runtime.Caller(skip); ok {
-				// Note that the test line may be different on
-				// distinct calls for the same test.  Showing
-				// the "internal" line is helpful when debugging.
-				if runtime.FuncForPC(pc) == testFunc {
-					testFile, testLine = file, line
-					break
-				}
-			} else {
-				break
-			}
-		}
-	}
-	if testFile != "" && (testFile != callerFile || testLine != callerLine) {
-		c.logCode(testFile, testLine)
-	}
-	c.logCode(callerFile, callerLine)
-}
-
-func (c *C) logCode(path string, line int) {
-	c.logf("%s:%d:", nicePath(path), line)
-	code, err := printLine(path, line)
-	if code == "" {
-		code = "..." // XXX Open the file and take the raw line.
-		if err != nil {
-			code += err.Error()
-		}
-	}
-	c.log(indent(code, "    "))
-}
-
-var valueGo = filepath.Join("reflect", "value.go")
-var asmGo = filepath.Join("runtime", "asm_")
-
-func (c *C) logPanic(skip int, value interface{}) {
-	skip += 1 // Our own frame.
-	initialSkip := skip
-	for {
-		if pc, file, line, ok := runtime.Caller(skip); ok {
-			if skip == initialSkip {
-				c.logf("... Panic: %s (PC=0x%X)\n", value, pc)
-			}
-			name := niceFuncName(pc)
-			path := nicePath(file)
-			if name == "Value.call" && strings.HasSuffix(path, valueGo) {
-				break
-			}
-			if name == "call16" && strings.Contains(path, asmGo) {
-				break
-			}
-			c.logf("%s:%d\n  in %s", nicePath(file), line, name)
-		} else {
-			break
-		}
-		skip += 1
-	}
-}
-
-func (c *C) logSoftPanic(issue string) {
-	c.log("... Panic: ", issue)
-}
-
-func (c *C) logArgPanic(method *methodType, expectedType string) {
-	c.logf("... Panic: %s argument should be %s",
-		niceFuncName(method.PC()), expectedType)
-}
-
-// -----------------------------------------------------------------------
-// Some simple formatting helpers.
-
-var initWD, initWDErr = os.Getwd()
-
-func init() {
-	if initWDErr == nil {
-		initWD = strings.Replace(initWD, "\\", "/", -1) + "/"
-	}
-}
-
-func nicePath(path string) string {
-	if initWDErr == nil {
-		if strings.HasPrefix(path, initWD) {
-			return path[len(initWD):]
-		}
-	}
-	return path
-}
-
-func niceFuncPath(pc uintptr) string {
-	function := runtime.FuncForPC(pc)
-	if function != nil {
-		filename, line := function.FileLine(pc)
-		return fmt.Sprintf("%s:%d", nicePath(filename), line)
-	}
-	return "<unknown path>"
-}
-
-func niceFuncName(pc uintptr) string {
-	function := runtime.FuncForPC(pc)
-	if function != nil {
-		name := path.Base(function.Name())
-		if i := strings.Index(name, "."); i > 0 {
-			name = name[i+1:]
-		}
-		if strings.HasPrefix(name, "(*") {
-			if i := strings.Index(name, ")"); i > 0 {
-				name = name[2:i] + name[i+1:]
-			}
-		}
-		if i := strings.LastIndex(name, ".*"); i != -1 {
-			name = name[:i] + "." + name[i+2:]
-		}
-		if i := strings.LastIndex(name, "·"); i != -1 {
-			name = name[:i] + "." + name[i+2:]
-		}
-		return name
-	}
-	return "<unknown function>"
-}
-
-// -----------------------------------------------------------------------
-// Result tracker to aggregate call results.
-
-type Result struct {
-	Succeeded        int
-	Failed           int
-	Skipped          int
-	Panicked         int
-	FixturePanicked  int
-	ExpectedFailures int
-	Missed           int    // Not even tried to run, related to a panic in the fixture.
-	RunError         error  // Houston, we've got a problem.
-	WorkDir          string // If KeepWorkDir is true
-}
-
-type resultTracker struct {
-	result          Result
-	_lastWasProblem bool
-	_waiting        int
-	_missed         int
-	_expectChan     chan *C
-	_doneChan       chan *C
-	_stopChan       chan bool
-}
-
-func newResultTracker() *resultTracker {
-	return &resultTracker{_expectChan: make(chan *C), // Synchronous
-		_doneChan: make(chan *C, 32), // Asynchronous
-		_stopChan: make(chan bool)}   // Synchronous
-}
-
-func (tracker *resultTracker) start() {
-	go tracker._loopRoutine()
-}
-
-func (tracker *resultTracker) waitAndStop() {
-	<-tracker._stopChan
-}
-
-func (tracker *resultTracker) expectCall(c *C) {
-	tracker._expectChan <- c
-}
-
-func (tracker *resultTracker) callDone(c *C) {
-	tracker._doneChan <- c
-}
-
-func (tracker *resultTracker) _loopRoutine() {
-	for {
-		var c *C
-		if tracker._waiting > 0 {
-			// Calls still running. Can't stop.
-			select {
-			// XXX Reindent this (not now to make diff clear)
-			case c = <-tracker._expectChan:
-				tracker._waiting += 1
-			case c = <-tracker._doneChan:
-				tracker._waiting -= 1
-				switch c.status {
-				case succeededSt:
-					if c.kind == testKd {
-						if c.mustFail {
-							tracker.result.ExpectedFailures++
-						} else {
-							tracker.result.Succeeded++
-						}
-					}
-				case failedSt:
-					tracker.result.Failed++
-				case panickedSt:
-					if c.kind == fixtureKd {
-						tracker.result.FixturePanicked++
-					} else {
-						tracker.result.Panicked++
-					}
-				case fixturePanickedSt:
-					// Track it as missed, since the panic
-					// was on the fixture, not on the test.
-					tracker.result.Missed++
-				case missedSt:
-					tracker.result.Missed++
-				case skippedSt:
-					if c.kind == testKd {
-						tracker.result.Skipped++
-					}
-				}
-			}
-		} else {
-			// No calls.  Can stop, but no done calls here.
-			select {
-			case tracker._stopChan <- true:
-				return
-			case c = <-tracker._expectChan:
-				tracker._waiting += 1
-			case c = <-tracker._doneChan:
-				panic("Tracker got an unexpected done call.")
-			}
-		}
-	}
-}
-
-// -----------------------------------------------------------------------
-// The underlying suite runner.
-
-type suiteRunner struct {
-	suite                     interface{}
-	setUpSuite, tearDownSuite *methodType
-	setUpTest, tearDownTest   *methodType
-	tests                     []*methodType
-	tracker                   *resultTracker
-	tempDir                   *tempDir
-	keepDir                   bool
-	output                    *outputWriter
-	reportedProblemLast       bool
-	benchTime                 time.Duration
-}
-
-type RunConf struct {
-	Output        io.Writer
-	Stream        bool
-	Verbose       bool
-	Filter        string
-	Benchmark     bool
-	BenchmarkTime time.Duration // Defaults to 1 second
-	KeepWorkDir   bool
-}
-
-// Create a new suiteRunner able to run all methods in the given suite.
-func newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner {
-	var conf RunConf
-	if runConf != nil {
-		conf = *runConf
-	}
-	if conf.Output == nil {
-		conf.Output = os.Stdout
-	}
-	if conf.Benchmark {
-		conf.Verbose = true
-	}
-
-	suiteType := reflect.TypeOf(suite)
-	suiteNumMethods := suiteType.NumMethod()
-	suiteValue := reflect.ValueOf(suite)
-
-	runner := &suiteRunner{
-		suite:     suite,
-		output:    newOutputWriter(conf.Output, conf.Stream, conf.Verbose),
-		tracker:   newResultTracker(),
-		benchTime: conf.BenchmarkTime,
-		tempDir:   &tempDir{},
-		keepDir:   conf.KeepWorkDir,
-		tests:     make([]*methodType, 0, suiteNumMethods),
-	}
-	if runner.benchTime == 0 {
-		runner.benchTime = 1 * time.Second
-	}
-
-	var filterRegexp *regexp.Regexp
-	if conf.Filter != "" {
-		if regexp, err := regexp.Compile(conf.Filter); err != nil {
-			msg := "Bad filter expression: " + err.Error()
-			runner.tracker.result.RunError = errors.New(msg)
-			return runner
-		} else {
-			filterRegexp = regexp
-		}
-	}
-
-	for i := 0; i != suiteNumMethods; i++ {
-		method := newMethod(suiteValue, i)
-		switch method.Info.Name {
-		case "SetUpSuite":
-			runner.setUpSuite = method
-		case "TearDownSuite":
-			runner.tearDownSuite = method
-		case "SetUpTest":
-			runner.setUpTest = method
-		case "TearDownTest":
-			runner.tearDownTest = method
-		default:
-			prefix := "Test"
-			if conf.Benchmark {
-				prefix = "Benchmark"
-			}
-			if !strings.HasPrefix(method.Info.Name, prefix) {
-				continue
-			}
-			if filterRegexp == nil || method.matches(filterRegexp) {
-				runner.tests = append(runner.tests, method)
-			}
-		}
-	}
-	return runner
-}
-
-// Run all methods in the given suite.
-func (runner *suiteRunner) run() *Result {
-	if runner.tracker.result.RunError == nil && len(runner.tests) > 0 {
-		runner.tracker.start()
-		if runner.checkFixtureArgs() {
-			c := runner.runFixture(runner.setUpSuite, nil)
-			if c == nil || c.status == succeededSt {
-				for i := 0; i != len(runner.tests); i++ {
-					c := runner.runTest(runner.tests[i])
-					if c.status == fixturePanickedSt {
-						runner.skipTests(missedSt, runner.tests[i+1:])
-						break
-					}
-				}
-			} else if c != nil && c.status == skippedSt {
-				runner.skipTests(skippedSt, runner.tests)
-			} else {
-				runner.skipTests(missedSt, runner.tests)
-			}
-			runner.runFixture(runner.tearDownSuite, nil)
-		} else {
-			runner.skipTests(missedSt, runner.tests)
-		}
-		runner.tracker.waitAndStop()
-		if runner.keepDir {
-			runner.tracker.result.WorkDir = runner.tempDir.path
-		} else {
-			runner.tempDir.removeAll()
-		}
-	}
-	return &runner.tracker.result
-}
-
-// Create a call object with the given suite method, and fork a
-// goroutine with the provided dispatcher for running it.
-func (runner *suiteRunner) forkCall(method *methodType, kind funcKind, logb *logger, dispatcher func(c *C)) *C {
-	var logw io.Writer
-	if runner.output.Stream {
-		logw = runner.output
-	}
-	if logb == nil {
-		logb = new(logger)
-	}
-	c := &C{
-		method:    method,
-		kind:      kind,
-		logb:      logb,
-		logw:      logw,
-		tempDir:   runner.tempDir,
-		done:      make(chan *C, 1),
-		timer:     timer{benchTime: runner.benchTime},
-		startTime: time.Now(),
-	}
-	runner.tracker.expectCall(c)
-	go (func() {
-		runner.reportCallStarted(c)
-		defer runner.callDone(c)
-		dispatcher(c)
-	})()
-	return c
-}
-
-// Same as forkCall(), but wait for call to finish before returning.
-func (runner *suiteRunner) runFunc(method *methodType, kind funcKind, logb *logger, dispatcher func(c *C)) *C {
-	c := runner.forkCall(method, kind, logb, dispatcher)
-	<-c.done
-	return c
-}
-
-// Handle a finished call.  If there were any panics, update the call status
-// accordingly.  Then, mark the call as done and report to the tracker.
-func (runner *suiteRunner) callDone(c *C) {
-	value := recover()
-	if value != nil {
-		switch v := value.(type) {
-		case *fixturePanic:
-			if v.status == skippedSt {
-				c.status = skippedSt
-			} else {
-				c.logSoftPanic("Fixture has panicked (see related PANIC)")
-				c.status = fixturePanickedSt
-			}
-		default:
-			c.logPanic(1, value)
-			c.status = panickedSt
-		}
-	}
-	if c.mustFail {
-		switch c.status {
-		case failedSt:
-			c.status = succeededSt
-		case succeededSt:
-			c.status = failedSt
-			c.logString("Error: Test succeeded, but was expected to fail")
-			c.logString("Reason: " + c.reason)
-		}
-	}
-
-	runner.reportCallDone(c)
-	c.done <- c
-}
-
-// Runs a fixture call synchronously.  The fixture will still be run in a
-// goroutine like all suite methods, but this method will not return
-// while the fixture goroutine is not done, because the fixture must be
-// run in a desired order.
-func (runner *suiteRunner) runFixture(method *methodType, logb *logger) *C {
-	if method != nil {
-		c := runner.runFunc(method, fixtureKd, logb, func(c *C) {
-			c.ResetTimer()
-			c.StartTimer()
-			defer c.StopTimer()
-			c.method.Call([]reflect.Value{reflect.ValueOf(c)})
-		})
-		return c
-	}
-	return nil
-}
-
-// Run the fixture method with runFixture(), but panic with a fixturePanic{}
-// in case the fixture method panics.  This makes it easier to track the
-// fixture panic together with other call panics within forkTest().
-func (runner *suiteRunner) runFixtureWithPanic(method *methodType, logb *logger, skipped *bool) *C {
-	if skipped != nil && *skipped {
-		return nil
-	}
-	c := runner.runFixture(method, logb)
-	if c != nil && c.status != succeededSt {
-		if skipped != nil {
-			*skipped = c.status == skippedSt
-		}
-		panic(&fixturePanic{c.status, method})
-	}
-	return c
-}
-
-type fixturePanic struct {
-	status funcStatus
-	method *methodType
-}
-
-// Run the suite test method, together with the test-specific fixture,
-// asynchronously.
-func (runner *suiteRunner) forkTest(method *methodType) *C {
-	return runner.forkCall(method, testKd, nil, func(c *C) {
-		var skipped bool
-		defer runner.runFixtureWithPanic(runner.tearDownTest, nil, &skipped)
-		defer c.StopTimer()
-		benchN := 1
-		for {
-			runner.runFixtureWithPanic(runner.setUpTest, c.logb, &skipped)
-			mt := c.method.Type()
-			if mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) {
-				// Rather than a plain panic, provide a more helpful message when
-				// the argument type is incorrect.
-				c.status = panickedSt
-				c.logArgPanic(c.method, "*check.C")
-				return
-			}
-			if strings.HasPrefix(c.method.Info.Name, "Test") {
-				c.ResetTimer()
-				c.StartTimer()
-				c.method.Call([]reflect.Value{reflect.ValueOf(c)})
-				return
-			}
-			if !strings.HasPrefix(c.method.Info.Name, "Benchmark") {
-				panic("unexpected method prefix: " + c.method.Info.Name)
-			}
-
-			runtime.GC()
-			c.N = benchN
-			c.ResetTimer()
-			c.StartTimer()
-			c.method.Call([]reflect.Value{reflect.ValueOf(c)})
-			c.StopTimer()
-			if c.status != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 {
-				return
-			}
-			perOpN := int(1e9)
-			if c.nsPerOp() != 0 {
-				perOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp())
-			}
-
-			// Logic taken from the stock testing package:
-			// - Run more iterations than we think we'll need for a second (1.5x).
-			// - Don't grow too fast in case we had timing errors previously.
-			// - Be sure to run at least one more than last time.
-			benchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1)
-			benchN = roundUp(benchN)
-
-			skipped = true // Don't run the deferred one if this panics.
-			runner.runFixtureWithPanic(runner.tearDownTest, nil, nil)
-			skipped = false
-		}
-	})
-}
-
-// Same as forkTest(), but wait for the test to finish before returning.
-func (runner *suiteRunner) runTest(method *methodType) *C {
-	c := runner.forkTest(method)
-	<-c.done
-	return c
-}
-
-// Helper to mark tests as skipped or missed.  A bit heavy for what
-// it does, but it enables homogeneous handling of tracking, including
-// nice verbose output.
-func (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) {
-	for _, method := range methods {
-		runner.runFunc(method, testKd, nil, func(c *C) {
-			c.status = status
-		})
-	}
-}
-
-// Verify if the fixture arguments are *check.C.  In case of errors,
-// log the error as a panic in the fixture method call, and return false.
-func (runner *suiteRunner) checkFixtureArgs() bool {
-	succeeded := true
-	argType := reflect.TypeOf(&C{})
-	for _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} {
-		if method != nil {
-			mt := method.Type()
-			if mt.NumIn() != 1 || mt.In(0) != argType {
-				succeeded = false
-				runner.runFunc(method, fixtureKd, nil, func(c *C) {
-					c.logArgPanic(method, "*check.C")
-					c.status = panickedSt
-				})
-			}
-		}
-	}
-	return succeeded
-}
-
-func (runner *suiteRunner) reportCallStarted(c *C) {
-	runner.output.WriteCallStarted("START", c)
-}
-
-func (runner *suiteRunner) reportCallDone(c *C) {
-	runner.tracker.callDone(c)
-	switch c.status {
-	case succeededSt:
-		if c.mustFail {
-			runner.output.WriteCallSuccess("FAIL EXPECTED", c)
-		} else {
-			runner.output.WriteCallSuccess("PASS", c)
-		}
-	case skippedSt:
-		runner.output.WriteCallSuccess("SKIP", c)
-	case failedSt:
-		runner.output.WriteCallProblem("FAIL", c)
-	case panickedSt:
-		runner.output.WriteCallProblem("PANIC", c)
-	case fixturePanickedSt:
-		// That's a testKd call reporting that its fixture
-		// has panicked. The fixture call which caused the
-		// panic itself was tracked above. We'll report to
-		// aid debugging.
-		runner.output.WriteCallProblem("PANIC", c)
-	case missedSt:
-		runner.output.WriteCallSuccess("MISS", c)
-	}
-}
-
-// -----------------------------------------------------------------------
-// Output writer manages atomic output writing according to settings.
-
-type outputWriter struct {
-	m                    sync.Mutex
-	writer               io.Writer
-	wroteCallProblemLast bool
-	Stream               bool
-	Verbose              bool
-}
-
-func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter {
-	return &outputWriter{writer: writer, Stream: stream, Verbose: verbose}
-}
-
-func (ow *outputWriter) Write(content []byte) (n int, err error) {
-	ow.m.Lock()
-	n, err = ow.writer.Write(content)
-	ow.m.Unlock()
-	return
-}
-
-func (ow *outputWriter) WriteCallStarted(label string, c *C) {
-	if ow.Stream {
-		header := renderCallHeader(label, c, "", "\n")
-		ow.m.Lock()
-		ow.writer.Write([]byte(header))
-		ow.m.Unlock()
-	}
-}
-
-func (ow *outputWriter) WriteCallProblem(label string, c *C) {
-	var prefix string
-	if !ow.Stream {
-		prefix = "\n-----------------------------------" +
-			"-----------------------------------\n"
-	}
-	header := renderCallHeader(label, c, prefix, "\n\n")
-	ow.m.Lock()
-	ow.wroteCallProblemLast = true
-	ow.writer.Write([]byte(header))
-	if !ow.Stream {
-		c.logb.WriteTo(ow.writer)
-	}
-	ow.m.Unlock()
-}
-
-func (ow *outputWriter) WriteCallSuccess(label string, c *C) {
-	if ow.Stream || (ow.Verbose && c.kind == testKd) {
-		// TODO Use a buffer here.
-		var suffix string
-		if c.reason != "" {
-			suffix = " (" + c.reason + ")"
-		}
-		if c.status == succeededSt {
-			suffix += "\t" + c.timerString()
-		}
-		suffix += "\n"
-		if ow.Stream {
-			suffix += "\n"
-		}
-		header := renderCallHeader(label, c, "", suffix)
-		ow.m.Lock()
-		// Resist temptation of using line as prefix above due to race.
-		if !ow.Stream && ow.wroteCallProblemLast {
-			header = "\n-----------------------------------" +
-				"-----------------------------------\n" +
-				header
-		}
-		ow.wroteCallProblemLast = false
-		ow.writer.Write([]byte(header))
-		ow.m.Unlock()
-	}
-}
-
-func renderCallHeader(label string, c *C, prefix, suffix string) string {
-	pc := c.method.PC()
-	return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc),
-		niceFuncName(pc), suffix)
-}
diff --git a/check_test.go b/check_test.go
deleted file mode 100644
index 19c0c5b..0000000
--- a/check_test.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// This file contains just a few generic helpers which are used by the
-// other test files.
-
-package check_test
-
-import (
-	"flag"
-	"fmt"
-	"gopkg.in/check.v1"
-	"os"
-	"regexp"
-	"runtime"
-	"testing"
-	"time"
-)
-
-// We count the number of suites run at least to get a vague hint that the
-// test suite is behaving as it should.  Otherwise a bug introduced at the
-// very core of the system could go unperceived.
-const suitesRunExpected = 8
-
-var suitesRun int = 0
-
-func Test(t *testing.T) {
-	check.TestingT(t)
-	if suitesRun != suitesRunExpected && flag.Lookup("check.f").Value.String() == "" {
-		critical(fmt.Sprintf("Expected %d suites to run rather than %d",
-			suitesRunExpected, suitesRun))
-	}
-}
-
-// -----------------------------------------------------------------------
-// Helper functions.
-
-// Break down badly.  This is used in test cases which can't yet assume
-// that the fundamental bits are working.
-func critical(error string) {
-	fmt.Fprintln(os.Stderr, "CRITICAL: "+error)
-	os.Exit(1)
-}
-
-// Return the file line where it's called.
-func getMyLine() int {
-	if _, _, line, ok := runtime.Caller(1); ok {
-		return line
-	}
-	return -1
-}
-
-// -----------------------------------------------------------------------
-// Helper type implementing a basic io.Writer for testing output.
-
-// Type implementing the io.Writer interface for analyzing output.
-type String struct {
-	value string
-}
-
-// The only function required by the io.Writer interface.  Will append
-// written data to the String.value string.
-func (s *String) Write(p []byte) (n int, err error) {
-	s.value += string(p)
-	return len(p), nil
-}
-
-// Trivial wrapper to test errors happening on a different file
-// than the test itself.
-func checkEqualWrapper(c *check.C, obtained, expected interface{}) (result bool, line int) {
-	return c.Check(obtained, check.Equals, expected), getMyLine()
-}
-
-// -----------------------------------------------------------------------
-// Helper suite for testing basic fail behavior.
-
-type FailHelper struct {
-	testLine int
-}
-
-func (s *FailHelper) TestLogAndFail(c *check.C) {
-	s.testLine = getMyLine() - 1
-	c.Log("Expected failure!")
-	c.Fail()
-}
-
-// -----------------------------------------------------------------------
-// Helper suite for testing basic success behavior.
-
-type SuccessHelper struct{}
-
-func (s *SuccessHelper) TestLogAndSucceed(c *check.C) {
-	c.Log("Expected success!")
-}
-
-// -----------------------------------------------------------------------
-// Helper suite for testing ordering and behavior of fixture.
-
-type FixtureHelper struct {
-	calls   []string
-	panicOn string
-	skip    bool
-	skipOnN int
-	sleepOn string
-	sleep   time.Duration
-	bytes   int64
-}
-
-func (s *FixtureHelper) trace(name string, c *check.C) {
-	s.calls = append(s.calls, name)
-	if name == s.panicOn {
-		panic(name)
-	}
-	if s.sleep > 0 && s.sleepOn == name {
-		time.Sleep(s.sleep)
-	}
-	if s.skip && s.skipOnN == len(s.calls)-1 {
-		c.Skip("skipOnN == n")
-	}
-}
-
-func (s *FixtureHelper) SetUpSuite(c *check.C) {
-	s.trace("SetUpSuite", c)
-}
-
-func (s *FixtureHelper) TearDownSuite(c *check.C) {
-	s.trace("TearDownSuite", c)
-}
-
-func (s *FixtureHelper) SetUpTest(c *check.C) {
-	s.trace("SetUpTest", c)
-}
-
-func (s *FixtureHelper) TearDownTest(c *check.C) {
-	s.trace("TearDownTest", c)
-}
-
-func (s *FixtureHelper) Test1(c *check.C) {
-	s.trace("Test1", c)
-}
-
-func (s *FixtureHelper) Test2(c *check.C) {
-	s.trace("Test2", c)
-}
-
-func (s *FixtureHelper) Benchmark1(c *check.C) {
-	s.trace("Benchmark1", c)
-	for i := 0; i < c.N; i++ {
-		time.Sleep(s.sleep)
-	}
-}
-
-func (s *FixtureHelper) Benchmark2(c *check.C) {
-	s.trace("Benchmark2", c)
-	c.SetBytes(1024)
-	for i := 0; i < c.N; i++ {
-		time.Sleep(s.sleep)
-	}
-}
-
-// -----------------------------------------------------------------------
-// Helper which checks the state of the test and ensures that it matches
-// the given expectations.  Depends on c.Errorf() working, so shouldn't
-// be used to test this one function.
-
-type expectedState struct {
-	name   string
-	result interface{}
-	failed bool
-	log    string
-}
-
-// Verify the state of the test.  Note that since this also verifies if
-// the test is supposed to be in a failed state, no other checks should
-// be done in addition to what is being tested.
-func checkState(c *check.C, result interface{}, expected *expectedState) {
-	failed := c.Failed()
-	c.Succeed()
-	log := c.GetTestLog()
-	matched, matchError := regexp.MatchString("^"+expected.log+"$", log)
-	if matchError != nil {
-		c.Errorf("Error in matching expression used in testing %s",
-			expected.name)
-	} else if !matched {
-		c.Errorf("%s logged:\n----------\n%s----------\n\nExpected:\n----------\n%s\n----------",
-			expected.name, log, expected.log)
-	}
-	if result != expected.result {
-		c.Errorf("%s returned %#v rather than %#v",
-			expected.name, result, expected.result)
-	}
-	if failed != expected.failed {
-		if failed {
-			c.Errorf("%s has failed when it shouldn't", expected.name)
-		} else {
-			c.Errorf("%s has not failed when it should", expected.name)
-		}
-	}
-}
diff --git a/checkers.go b/checkers.go
deleted file mode 100644
index bac3387..0000000
--- a/checkers.go
+++ /dev/null
@@ -1,458 +0,0 @@
-package check
-
-import (
-	"fmt"
-	"reflect"
-	"regexp"
-)
-
-// -----------------------------------------------------------------------
-// CommentInterface and Commentf helper, to attach extra information to checks.
-
-type comment struct {
-	format string
-	args   []interface{}
-}
-
-// Commentf returns an infomational value to use with Assert or Check calls.
-// If the checker test fails, the provided arguments will be passed to
-// fmt.Sprintf, and will be presented next to the logged failure.
-//
-// For example:
-//
-//     c.Assert(v, Equals, 42, Commentf("Iteration #%d failed.", i))
-//
-// Note that if the comment is constant, a better option is to
-// simply use a normal comment right above or next to the line, as
-// it will also get printed with any errors:
-//
-//     c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123)
-//
-func Commentf(format string, args ...interface{}) CommentInterface {
-	return &comment{format, args}
-}
-
-// CommentInterface must be implemented by types that attach extra
-// information to failed checks. See the Commentf function for details.
-type CommentInterface interface {
-	CheckCommentString() string
-}
-
-func (c *comment) CheckCommentString() string {
-	return fmt.Sprintf(c.format, c.args...)
-}
-
-// -----------------------------------------------------------------------
-// The Checker interface.
-
-// The Checker interface must be provided by checkers used with
-// the Assert and Check verification methods.
-type Checker interface {
-	Info() *CheckerInfo
-	Check(params []interface{}, names []string) (result bool, error string)
-}
-
-// See the Checker interface.
-type CheckerInfo struct {
-	Name   string
-	Params []string
-}
-
-func (info *CheckerInfo) Info() *CheckerInfo {
-	return info
-}
-
-// -----------------------------------------------------------------------
-// Not checker logic inverter.
-
-// The Not checker inverts the logic of the provided checker.  The
-// resulting checker will succeed where the original one failed, and
-// vice-versa.
-//
-// For example:
-//
-//     c.Assert(a, Not(Equals), b)
-//
-func Not(checker Checker) Checker {
-	return &notChecker{checker}
-}
-
-type notChecker struct {
-	sub Checker
-}
-
-func (checker *notChecker) Info() *CheckerInfo {
-	info := *checker.sub.Info()
-	info.Name = "Not(" + info.Name + ")"
-	return &info
-}
-
-func (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	result, error = checker.sub.Check(params, names)
-	result = !result
-	return
-}
-
-// -----------------------------------------------------------------------
-// IsNil checker.
-
-type isNilChecker struct {
-	*CheckerInfo
-}
-
-// The IsNil checker tests whether the obtained value is nil.
-//
-// For example:
-//
-//    c.Assert(err, IsNil)
-//
-var IsNil Checker = &isNilChecker{
-	&CheckerInfo{Name: "IsNil", Params: []string{"value"}},
-}
-
-func (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	return isNil(params[0]), ""
-}
-
-func isNil(obtained interface{}) (result bool) {
-	if obtained == nil {
-		result = true
-	} else {
-		switch v := reflect.ValueOf(obtained); v.Kind() {
-		case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
-			return v.IsNil()
-		}
-	}
-	return
-}
-
-// -----------------------------------------------------------------------
-// NotNil checker. Alias for Not(IsNil), since it's so common.
-
-type notNilChecker struct {
-	*CheckerInfo
-}
-
-// The NotNil checker verifies that the obtained value is not nil.
-//
-// For example:
-//
-//     c.Assert(iface, NotNil)
-//
-// This is an alias for Not(IsNil), made available since it's a
-// fairly common check.
-//
-var NotNil Checker = &notNilChecker{
-	&CheckerInfo{Name: "NotNil", Params: []string{"value"}},
-}
-
-func (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	return !isNil(params[0]), ""
-}
-
-// -----------------------------------------------------------------------
-// Equals checker.
-
-type equalsChecker struct {
-	*CheckerInfo
-}
-
-// The Equals checker verifies that the obtained value is equal to
-// the expected value, according to usual Go semantics for ==.
-//
-// For example:
-//
-//     c.Assert(value, Equals, 42)
-//
-var Equals Checker = &equalsChecker{
-	&CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}},
-}
-
-func (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	defer func() {
-		if v := recover(); v != nil {
-			result = false
-			error = fmt.Sprint(v)
-		}
-	}()
-	return params[0] == params[1], ""
-}
-
-// -----------------------------------------------------------------------
-// DeepEquals checker.
-
-type deepEqualsChecker struct {
-	*CheckerInfo
-}
-
-// The DeepEquals checker verifies that the obtained value is deep-equal to
-// the expected value.  The check will work correctly even when facing
-// slices, interfaces, and values of different types (which always fail
-// the test).
-//
-// For example:
-//
-//     c.Assert(value, DeepEquals, 42)
-//     c.Assert(array, DeepEquals, []string{"hi", "there"})
-//
-var DeepEquals Checker = &deepEqualsChecker{
-	&CheckerInfo{Name: "DeepEquals", Params: []string{"obtained", "expected"}},
-}
-
-func (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	return reflect.DeepEqual(params[0], params[1]), ""
-}
-
-// -----------------------------------------------------------------------
-// HasLen checker.
-
-type hasLenChecker struct {
-	*CheckerInfo
-}
-
-// The HasLen checker verifies that the obtained value has the
-// provided length. In many cases this is superior to using Equals
-// in conjuction with the len function because in case the check
-// fails the value itself will be printed, instead of its length,
-// providing more details for figuring the problem.
-//
-// For example:
-//
-//     c.Assert(list, HasLen, 5)
-//
-var HasLen Checker = &hasLenChecker{
-	&CheckerInfo{Name: "HasLen", Params: []string{"obtained", "n"}},
-}
-
-func (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	n, ok := params[1].(int)
-	if !ok {
-		return false, "n must be an int"
-	}
-	value := reflect.ValueOf(params[0])
-	switch value.Kind() {
-	case reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String:
-	default:
-		return false, "obtained value type has no length"
-	}
-	return value.Len() == n, ""
-}
-
-// -----------------------------------------------------------------------
-// ErrorMatches checker.
-
-type errorMatchesChecker struct {
-	*CheckerInfo
-}
-
-// The ErrorMatches checker verifies that the error value
-// is non nil and matches the regular expression provided.
-//
-// For example:
-//
-//     c.Assert(err, ErrorMatches, "perm.*denied")
-//
-var ErrorMatches Checker = errorMatchesChecker{
-	&CheckerInfo{Name: "ErrorMatches", Params: []string{"value", "regex"}},
-}
-
-func (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) {
-	if params[0] == nil {
-		return false, "Error value is nil"
-	}
-	err, ok := params[0].(error)
-	if !ok {
-		return false, "Value is not an error"
-	}
-	params[0] = err.Error()
-	names[0] = "error"
-	return matches(params[0], params[1])
-}
-
-// -----------------------------------------------------------------------
-// Matches checker.
-
-type matchesChecker struct {
-	*CheckerInfo
-}
-
-// The Matches checker verifies that the string provided as the obtained
-// value (or the string resulting from obtained.String()) matches the
-// regular expression provided.
-//
-// For example:
-//
-//     c.Assert(err, Matches, "perm.*denied")
-//
-var Matches Checker = &matchesChecker{
-	&CheckerInfo{Name: "Matches", Params: []string{"value", "regex"}},
-}
-
-func (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	return matches(params[0], params[1])
-}
-
-func matches(value, regex interface{}) (result bool, error string) {
-	reStr, ok := regex.(string)
-	if !ok {
-		return false, "Regex must be a string"
-	}
-	valueStr, valueIsStr := value.(string)
-	if !valueIsStr {
-		if valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr {
-			valueStr, valueIsStr = valueWithStr.String(), true
-		}
-	}
-	if valueIsStr {
-		matches, err := regexp.MatchString("^"+reStr+"$", valueStr)
-		if err != nil {
-			return false, "Can't compile regex: " + err.Error()
-		}
-		return matches, ""
-	}
-	return false, "Obtained value is not a string and has no .String()"
-}
-
-// -----------------------------------------------------------------------
-// Panics checker.
-
-type panicsChecker struct {
-	*CheckerInfo
-}
-
-// The Panics checker verifies that calling the provided zero-argument
-// function will cause a panic which is deep-equal to the provided value.
-//
-// For example:
-//
-//     c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{"BOOM"}).
-//
-//
-var Panics Checker = &panicsChecker{
-	&CheckerInfo{Name: "Panics", Params: []string{"function", "expected"}},
-}
-
-func (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	f := reflect.ValueOf(params[0])
-	if f.Kind() != reflect.Func || f.Type().NumIn() != 0 {
-		return false, "Function must take zero arguments"
-	}
-	defer func() {
-		// If the function has not panicked, then don't do the check.
-		if error != "" {
-			return
-		}
-		params[0] = recover()
-		names[0] = "panic"
-		result = reflect.DeepEqual(params[0], params[1])
-	}()
-	f.Call(nil)
-	return false, "Function has not panicked"
-}
-
-type panicMatchesChecker struct {
-	*CheckerInfo
-}
-
-// The PanicMatches checker verifies that calling the provided zero-argument
-// function will cause a panic with an error value matching
-// the regular expression provided.
-//
-// For example:
-//
-//     c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`).
-//
-//
-var PanicMatches Checker = &panicMatchesChecker{
-	&CheckerInfo{Name: "PanicMatches", Params: []string{"function", "expected"}},
-}
-
-func (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) {
-	f := reflect.ValueOf(params[0])
-	if f.Kind() != reflect.Func || f.Type().NumIn() != 0 {
-		return false, "Function must take zero arguments"
-	}
-	defer func() {
-		// If the function has not panicked, then don't do the check.
-		if errmsg != "" {
-			return
-		}
-		obtained := recover()
-		names[0] = "panic"
-		if e, ok := obtained.(error); ok {
-			params[0] = e.Error()
-		} else if _, ok := obtained.(string); ok {
-			params[0] = obtained
-		} else {
-			errmsg = "Panic value is not a string or an error"
-			return
-		}
-		result, errmsg = matches(params[0], params[1])
-	}()
-	f.Call(nil)
-	return false, "Function has not panicked"
-}
-
-// -----------------------------------------------------------------------
-// FitsTypeOf checker.
-
-type fitsTypeChecker struct {
-	*CheckerInfo
-}
-
-// The FitsTypeOf checker verifies that the obtained value is
-// assignable to a variable with the same type as the provided
-// sample value.
-//
-// For example:
-//
-//     c.Assert(value, FitsTypeOf, int64(0))
-//     c.Assert(value, FitsTypeOf, os.Error(nil))
-//
-var FitsTypeOf Checker = &fitsTypeChecker{
-	&CheckerInfo{Name: "FitsTypeOf", Params: []string{"obtained", "sample"}},
-}
-
-func (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	obtained := reflect.ValueOf(params[0])
-	sample := reflect.ValueOf(params[1])
-	if !obtained.IsValid() {
-		return false, ""
-	}
-	if !sample.IsValid() {
-		return false, "Invalid sample value"
-	}
-	return obtained.Type().AssignableTo(sample.Type()), ""
-}
-
-// -----------------------------------------------------------------------
-// Implements checker.
-
-type implementsChecker struct {
-	*CheckerInfo
-}
-
-// The Implements checker verifies that the obtained value
-// implements the interface specified via a pointer to an interface
-// variable.
-//
-// For example:
-//
-//     var e os.Error
-//     c.Assert(err, Implements, &e)
-//
-var Implements Checker = &implementsChecker{
-	&CheckerInfo{Name: "Implements", Params: []string{"obtained", "ifaceptr"}},
-}
-
-func (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) {
-	obtained := reflect.ValueOf(params[0])
-	ifaceptr := reflect.ValueOf(params[1])
-	if !obtained.IsValid() {
-		return false, ""
-	}
-	if !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface {
-		return false, "ifaceptr should be a pointer to an interface variable"
-	}
-	return obtained.Type().Implements(ifaceptr.Elem().Type()), ""
-}
diff --git a/checkers_test.go b/checkers_test.go
deleted file mode 100644
index 5c69747..0000000
--- a/checkers_test.go
+++ /dev/null
@@ -1,272 +0,0 @@
-package check_test
-
-import (
-	"errors"
-	"gopkg.in/check.v1"
-	"reflect"
-	"runtime"
-)
-
-type CheckersS struct{}
-
-var _ = check.Suite(&CheckersS{})
-
-func testInfo(c *check.C, checker check.Checker, name string, paramNames []string) {
-	info := checker.Info()
-	if info.Name != name {
-		c.Fatalf("Got name %s, expected %s", info.Name, name)
-	}
-	if !reflect.DeepEqual(info.Params, paramNames) {
-		c.Fatalf("Got param names %#v, expected %#v", info.Params, paramNames)
-	}
-}
-
-func testCheck(c *check.C, checker check.Checker, result bool, error string, params ...interface{}) ([]interface{}, []string) {
-	info := checker.Info()
-	if len(params) != len(info.Params) {
-		c.Fatalf("unexpected param count in test; expected %d got %d", len(info.Params), len(params))
-	}
-	names := append([]string{}, info.Params...)
-	result_, error_ := checker.Check(params, names)
-	if result_ != result || error_ != error {
-		c.Fatalf("%s.Check(%#v) returned (%#v, %#v) rather than (%#v, %#v)",
-			info.Name, params, result_, error_, result, error)
-	}
-	return params, names
-}
-
-func (s *CheckersS) TestComment(c *check.C) {
-	bug := check.Commentf("a %d bc", 42)
-	comment := bug.CheckCommentString()
-	if comment != "a 42 bc" {
-		c.Fatalf("Commentf returned %#v", comment)
-	}
-}
-
-func (s *CheckersS) TestIsNil(c *check.C) {
-	testInfo(c, check.IsNil, "IsNil", []string{"value"})
-
-	testCheck(c, check.IsNil, true, "", nil)
-	testCheck(c, check.IsNil, false, "", "a")
-
-	testCheck(c, check.IsNil, true, "", (chan int)(nil))
-	testCheck(c, check.IsNil, false, "", make(chan int))
-	testCheck(c, check.IsNil, true, "", (error)(nil))
-	testCheck(c, check.IsNil, false, "", errors.New(""))
-	testCheck(c, check.IsNil, true, "", ([]int)(nil))
-	testCheck(c, check.IsNil, false, "", make([]int, 1))
-	testCheck(c, check.IsNil, false, "", int(0))
-}
-
-func (s *CheckersS) TestNotNil(c *check.C) {
-	testInfo(c, check.NotNil, "NotNil", []string{"value"})
-
-	testCheck(c, check.NotNil, false, "", nil)
-	testCheck(c, check.NotNil, true, "", "a")
-
-	testCheck(c, check.NotNil, false, "", (chan int)(nil))
-	testCheck(c, check.NotNil, true, "", make(chan int))
-	testCheck(c, check.NotNil, false, "", (error)(nil))
-	testCheck(c, check.NotNil, true, "", errors.New(""))
-	testCheck(c, check.NotNil, false, "", ([]int)(nil))
-	testCheck(c, check.NotNil, true, "", make([]int, 1))
-}
-
-func (s *CheckersS) TestNot(c *check.C) {
-	testInfo(c, check.Not(check.IsNil), "Not(IsNil)", []string{"value"})
-
-	testCheck(c, check.Not(check.IsNil), false, "", nil)
-	testCheck(c, check.Not(check.IsNil), true, "", "a")
-}
-
-type simpleStruct struct {
-	i int
-}
-
-func (s *CheckersS) TestEquals(c *check.C) {
-	testInfo(c, check.Equals, "Equals", []string{"obtained", "expected"})
-
-	// The simplest.
-	testCheck(c, check.Equals, true, "", 42, 42)
-	testCheck(c, check.Equals, false, "", 42, 43)
-
-	// Different native types.
-	testCheck(c, check.Equals, false, "", int32(42), int64(42))
-
-	// With nil.
-	testCheck(c, check.Equals, false, "", 42, nil)
-
-	// Slices
-	testCheck(c, check.Equals, false, "runtime error: comparing uncomparable type []uint8", []byte{1, 2}, []byte{1, 2})
-
-	// Struct values
-	testCheck(c, check.Equals, true, "", simpleStruct{1}, simpleStruct{1})
-	testCheck(c, check.Equals, false, "", simpleStruct{1}, simpleStruct{2})
-
-	// Struct pointers
-	testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{1})
-	testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{2})
-}
-
-func (s *CheckersS) TestDeepEquals(c *check.C) {
-	testInfo(c, check.DeepEquals, "DeepEquals", []string{"obtained", "expected"})
-
-	// The simplest.
-	testCheck(c, check.DeepEquals, true, "", 42, 42)
-	testCheck(c, check.DeepEquals, false, "", 42, 43)
-
-	// Different native types.
-	testCheck(c, check.DeepEquals, false, "", int32(42), int64(42))
-
-	// With nil.
-	testCheck(c, check.DeepEquals, false, "", 42, nil)
-
-	// Slices
-	testCheck(c, check.DeepEquals, true, "", []byte{1, 2}, []byte{1, 2})
-	testCheck(c, check.DeepEquals, false, "", []byte{1, 2}, []byte{1, 3})
-
-	// Struct values
-	testCheck(c, check.DeepEquals, true, "", simpleStruct{1}, simpleStruct{1})
-	testCheck(c, check.DeepEquals, false, "", simpleStruct{1}, simpleStruct{2})
-
-	// Struct pointers
-	testCheck(c, check.DeepEquals, true, "", &simpleStruct{1}, &simpleStruct{1})
-	testCheck(c, check.DeepEquals, false, "", &simpleStruct{1}, &simpleStruct{2})
-}
-
-func (s *CheckersS) TestHasLen(c *check.C) {
-	testInfo(c, check.HasLen, "HasLen", []string{"obtained", "n"})
-
-	testCheck(c, check.HasLen, true, "", "abcd", 4)
-	testCheck(c, check.HasLen, true, "", []int{1, 2}, 2)
-	testCheck(c, check.HasLen, false, "", []int{1, 2}, 3)
-
-	testCheck(c, check.HasLen, false, "n must be an int", []int{1, 2}, "2")
-	testCheck(c, check.HasLen, false, "obtained value type has no length", nil, 2)
-}
-
-func (s *CheckersS) TestErrorMatches(c *check.C) {
-	testInfo(c, check.ErrorMatches, "ErrorMatches", []string{"value", "regex"})
-
-	testCheck(c, check.ErrorMatches, false, "Error value is nil", nil, "some error")
-	testCheck(c, check.ErrorMatches, false, "Value is not an error", 1, "some error")
-	testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "some error")
-	testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "so.*or")
-
-	// Verify params mutation
-	params, names := testCheck(c, check.ErrorMatches, false, "", errors.New("some error"), "other error")
-	c.Assert(params[0], check.Equals, "some error")
-	c.Assert(names[0], check.Equals, "error")
-}
-
-func (s *CheckersS) TestMatches(c *check.C) {
-	testInfo(c, check.Matches, "Matches", []string{"value", "regex"})
-
-	// Simple matching
-	testCheck(c, check.Matches, true, "", "abc", "abc")
-	testCheck(c, check.Matches, true, "", "abc", "a.c")
-
-	// Must match fully
-	testCheck(c, check.Matches, false, "", "abc", "ab")
-	testCheck(c, check.Matches, false, "", "abc", "bc")
-
-	// String()-enabled values accepted
-	testCheck(c, check.Matches, true, "", reflect.ValueOf("abc"), "a.c")
-	testCheck(c, check.Matches, false, "", reflect.ValueOf("abc"), "a.d")
-
-	// Some error conditions.
-	testCheck(c, check.Matches, false, "Obtained value is not a string and has no .String()", 1, "a.c")
-	testCheck(c, check.Matches, false, "Can't compile regex: error parsing regexp: missing closing ]: `[c$`", "abc", "a[c")
-}
-
-func (s *CheckersS) TestPanics(c *check.C) {
-	testInfo(c, check.Panics, "Panics", []string{"function", "expected"})
-
-	// Some errors.
-	testCheck(c, check.Panics, false, "Function has not panicked", func() bool { return false }, "BOOM")
-	testCheck(c, check.Panics, false, "Function must take zero arguments", 1, "BOOM")
-
-	// Plain strings.
-	testCheck(c, check.Panics, true, "", func() { panic("BOOM") }, "BOOM")
-	testCheck(c, check.Panics, false, "", func() { panic("KABOOM") }, "BOOM")
-	testCheck(c, check.Panics, true, "", func() bool { panic("BOOM") }, "BOOM")
-
-	// Error values.
-	testCheck(c, check.Panics, true, "", func() { panic(errors.New("BOOM")) }, errors.New("BOOM"))
-	testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM"))
-
-	type deep struct{ i int }
-	// Deep value
-	testCheck(c, check.Panics, true, "", func() { panic(&deep{99}) }, &deep{99})
-
-	// Verify params/names mutation
-	params, names := testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM"))
-	c.Assert(params[0], check.ErrorMatches, "KABOOM")
-	c.Assert(names[0], check.Equals, "panic")
-
-	// Verify a nil panic
-	testCheck(c, check.Panics, true, "", func() { panic(nil) }, nil)
-	testCheck(c, check.Panics, false, "", func() { panic(nil) }, "NOPE")
-}
-
-func (s *CheckersS) TestPanicMatches(c *check.C) {
-	testInfo(c, check.PanicMatches, "PanicMatches", []string{"function", "expected"})
-
-	// Error matching.
-	testCheck(c, check.PanicMatches, true, "", func() { panic(errors.New("BOOM")) }, "BO.M")
-	testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BO.M")
-
-	// Some errors.
-	testCheck(c, check.PanicMatches, false, "Function has not panicked", func() bool { return false }, "BOOM")
-	testCheck(c, check.PanicMatches, false, "Function must take zero arguments", 1, "BOOM")
-
-	// Plain strings.
-	testCheck(c, check.PanicMatches, true, "", func() { panic("BOOM") }, "BO.M")
-	testCheck(c, check.PanicMatches, false, "", func() { panic("KABOOM") }, "BOOM")
-	testCheck(c, check.PanicMatches, true, "", func() bool { panic("BOOM") }, "BO.M")
-
-	// Verify params/names mutation
-	params, names := testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BOOM")
-	c.Assert(params[0], check.Equals, "KABOOM")
-	c.Assert(names[0], check.Equals, "panic")
-
-	// Verify a nil panic
-	testCheck(c, check.PanicMatches, false, "Panic value is not a string or an error", func() { panic(nil) }, "")
-}
-
-func (s *CheckersS) TestFitsTypeOf(c *check.C) {
-	testInfo(c, check.FitsTypeOf, "FitsTypeOf", []string{"obtained", "sample"})
-
-	// Basic types
-	testCheck(c, check.FitsTypeOf, true, "", 1, 0)
-	testCheck(c, check.FitsTypeOf, false, "", 1, int64(0))
-
-	// Aliases
-	testCheck(c, check.FitsTypeOf, false, "", 1, errors.New(""))
-	testCheck(c, check.FitsTypeOf, false, "", "error", errors.New(""))
-	testCheck(c, check.FitsTypeOf, true, "", errors.New("error"), errors.New(""))
-
-	// Structures
-	testCheck(c, check.FitsTypeOf, false, "", 1, simpleStruct{})
-	testCheck(c, check.FitsTypeOf, false, "", simpleStruct{42}, &simpleStruct{})
-	testCheck(c, check.FitsTypeOf, true, "", simpleStruct{42}, simpleStruct{})
-	testCheck(c, check.FitsTypeOf, true, "", &simpleStruct{42}, &simpleStruct{})
-
-	// Some bad values
-	testCheck(c, check.FitsTypeOf, false, "Invalid sample value", 1, interface{}(nil))
-	testCheck(c, check.FitsTypeOf, false, "", interface{}(nil), 0)
-}
-
-func (s *CheckersS) TestImplements(c *check.C) {
-	testInfo(c, check.Implements, "Implements", []string{"obtained", "ifaceptr"})
-
-	var e error
-	var re runtime.Error
-	testCheck(c, check.Implements, true, "", errors.New(""), &e)
-	testCheck(c, check.Implements, false, "", errors.New(""), &re)
-
-	// Some bad values
-	testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, errors.New(""))
-	testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, interface{}(nil))
-	testCheck(c, check.Implements, false, "", interface{}(nil), &e)
-}
diff --git a/error.go b/error.go
new file mode 100644
index 0000000..5af653f
--- /dev/null
+++ b/error.go
@@ -0,0 +1,5 @@
+package error
+
+func error() {
+	`ERROR: the correct import path is gopkg.in/check.v1 ... `
+}
diff --git a/export_test.go b/export_test.go
deleted file mode 100644
index 0e6cfe0..0000000
--- a/export_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package check
-
-func PrintLine(filename string, line int) (string, error) {
-	return printLine(filename, line)
-}
-
-func Indent(s, with string) string {
-	return indent(s, with)
-}
diff --git a/fixture_test.go b/fixture_test.go
deleted file mode 100644
index 07cf83f..0000000
--- a/fixture_test.go
+++ /dev/null
@@ -1,479 +0,0 @@
-// Tests for the behavior of the test fixture system.
-
-package check_test
-
-import (
-	. "gopkg.in/check.v1"
-)
-
-// -----------------------------------------------------------------------
-// Fixture test suite.
-
-type FixtureS struct{}
-
-var fixtureS = Suite(&FixtureS{})
-
-func (s *FixtureS) TestCountSuite(c *C) {
-	suitesRun += 1
-}
-
-// -----------------------------------------------------------------------
-// Basic fixture ordering verification.
-
-func (s *FixtureS) TestOrder(c *C) {
-	helper := FixtureHelper{}
-	Run(&helper, nil)
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "SetUpTest")
-	c.Check(helper.calls[5], Equals, "Test2")
-	c.Check(helper.calls[6], Equals, "TearDownTest")
-	c.Check(helper.calls[7], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 8)
-}
-
-// -----------------------------------------------------------------------
-// Check the behavior when panics occur within tests and fixtures.
-
-func (s *FixtureS) TestPanicOnTest(c *C) {
-	helper := FixtureHelper{panicOn: "Test1"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "SetUpTest")
-	c.Check(helper.calls[5], Equals, "Test2")
-	c.Check(helper.calls[6], Equals, "TearDownTest")
-	c.Check(helper.calls[7], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 8)
-
-	expected := "^\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: FixtureHelper.Test1\n\n" +
-		"\\.\\.\\. Panic: Test1 \\(PC=[xA-F0-9]+\\)\n\n" +
-		".+:[0-9]+\n" +
-		"  in panic\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.trace\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.Test1\n$"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnSetUpTest(c *C) {
-	helper := FixtureHelper{panicOn: "SetUpTest"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "TearDownTest")
-	c.Check(helper.calls[3], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 4)
-
-	expected := "^\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: " +
-		"FixtureHelper\\.SetUpTest\n\n" +
-		"\\.\\.\\. Panic: SetUpTest \\(PC=[xA-F0-9]+\\)\n\n" +
-		".+:[0-9]+\n" +
-		"  in panic\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.trace\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.SetUpTest\n" +
-		"\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: " +
-		"FixtureHelper\\.Test1\n\n" +
-		"\\.\\.\\. Panic: Fixture has panicked " +
-		"\\(see related PANIC\\)\n$"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnTearDownTest(c *C) {
-	helper := FixtureHelper{panicOn: "TearDownTest"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 5)
-
-	expected := "^\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: " +
-		"FixtureHelper.TearDownTest\n\n" +
-		"\\.\\.\\. Panic: TearDownTest \\(PC=[xA-F0-9]+\\)\n\n" +
-		".+:[0-9]+\n" +
-		"  in panic\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.trace\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.TearDownTest\n" +
-		"\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: " +
-		"FixtureHelper\\.Test1\n\n" +
-		"\\.\\.\\. Panic: Fixture has panicked " +
-		"\\(see related PANIC\\)\n$"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnSetUpSuite(c *C) {
-	helper := FixtureHelper{panicOn: "SetUpSuite"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 2)
-
-	expected := "^\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: " +
-		"FixtureHelper.SetUpSuite\n\n" +
-		"\\.\\.\\. Panic: SetUpSuite \\(PC=[xA-F0-9]+\\)\n\n" +
-		".+:[0-9]+\n" +
-		"  in panic\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.trace\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.SetUpSuite\n$"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnTearDownSuite(c *C) {
-	helper := FixtureHelper{panicOn: "TearDownSuite"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "SetUpTest")
-	c.Check(helper.calls[5], Equals, "Test2")
-	c.Check(helper.calls[6], Equals, "TearDownTest")
-	c.Check(helper.calls[7], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 8)
-
-	expected := "^\n-+\n" +
-		"PANIC: check_test\\.go:[0-9]+: " +
-		"FixtureHelper.TearDownSuite\n\n" +
-		"\\.\\.\\. Panic: TearDownSuite \\(PC=[xA-F0-9]+\\)\n\n" +
-		".+:[0-9]+\n" +
-		"  in panic\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.trace\n" +
-		".*check_test.go:[0-9]+\n" +
-		"  in FixtureHelper.TearDownSuite\n$"
-
-	c.Check(output.value, Matches, expected)
-}
-
-// -----------------------------------------------------------------------
-// A wrong argument on a test or fixture will produce a nice error.
-
-func (s *FixtureS) TestPanicOnWrongTestArg(c *C) {
-	helper := WrongTestArgHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "TearDownTest")
-	c.Check(helper.calls[3], Equals, "SetUpTest")
-	c.Check(helper.calls[4], Equals, "Test2")
-	c.Check(helper.calls[5], Equals, "TearDownTest")
-	c.Check(helper.calls[6], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 7)
-
-	expected := "^\n-+\n" +
-		"PANIC: fixture_test\\.go:[0-9]+: " +
-		"WrongTestArgHelper\\.Test1\n\n" +
-		"\\.\\.\\. Panic: WrongTestArgHelper\\.Test1 argument " +
-		"should be \\*check\\.C\n"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnWrongSetUpTestArg(c *C) {
-	helper := WrongSetUpTestArgHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(len(helper.calls), Equals, 0)
-
-	expected :=
-		"^\n-+\n" +
-			"PANIC: fixture_test\\.go:[0-9]+: " +
-			"WrongSetUpTestArgHelper\\.SetUpTest\n\n" +
-			"\\.\\.\\. Panic: WrongSetUpTestArgHelper\\.SetUpTest argument " +
-			"should be \\*check\\.C\n"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnWrongSetUpSuiteArg(c *C) {
-	helper := WrongSetUpSuiteArgHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(len(helper.calls), Equals, 0)
-
-	expected :=
-		"^\n-+\n" +
-			"PANIC: fixture_test\\.go:[0-9]+: " +
-			"WrongSetUpSuiteArgHelper\\.SetUpSuite\n\n" +
-			"\\.\\.\\. Panic: WrongSetUpSuiteArgHelper\\.SetUpSuite argument " +
-			"should be \\*check\\.C\n"
-
-	c.Check(output.value, Matches, expected)
-}
-
-// -----------------------------------------------------------------------
-// Nice errors also when tests or fixture have wrong arg count.
-
-func (s *FixtureS) TestPanicOnWrongTestArgCount(c *C) {
-	helper := WrongTestArgCountHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "TearDownTest")
-	c.Check(helper.calls[3], Equals, "SetUpTest")
-	c.Check(helper.calls[4], Equals, "Test2")
-	c.Check(helper.calls[5], Equals, "TearDownTest")
-	c.Check(helper.calls[6], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 7)
-
-	expected := "^\n-+\n" +
-		"PANIC: fixture_test\\.go:[0-9]+: " +
-		"WrongTestArgCountHelper\\.Test1\n\n" +
-		"\\.\\.\\. Panic: WrongTestArgCountHelper\\.Test1 argument " +
-		"should be \\*check\\.C\n"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnWrongSetUpTestArgCount(c *C) {
-	helper := WrongSetUpTestArgCountHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(len(helper.calls), Equals, 0)
-
-	expected :=
-		"^\n-+\n" +
-			"PANIC: fixture_test\\.go:[0-9]+: " +
-			"WrongSetUpTestArgCountHelper\\.SetUpTest\n\n" +
-			"\\.\\.\\. Panic: WrongSetUpTestArgCountHelper\\.SetUpTest argument " +
-			"should be \\*check\\.C\n"
-
-	c.Check(output.value, Matches, expected)
-}
-
-func (s *FixtureS) TestPanicOnWrongSetUpSuiteArgCount(c *C) {
-	helper := WrongSetUpSuiteArgCountHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(len(helper.calls), Equals, 0)
-
-	expected :=
-		"^\n-+\n" +
-			"PANIC: fixture_test\\.go:[0-9]+: " +
-			"WrongSetUpSuiteArgCountHelper\\.SetUpSuite\n\n" +
-			"\\.\\.\\. Panic: WrongSetUpSuiteArgCountHelper" +
-			"\\.SetUpSuite argument should be \\*check\\.C\n"
-
-	c.Check(output.value, Matches, expected)
-}
-
-// -----------------------------------------------------------------------
-// Helper test suites with wrong function arguments.
-
-type WrongTestArgHelper struct {
-	FixtureHelper
-}
-
-func (s *WrongTestArgHelper) Test1(t int) {
-}
-
-type WrongSetUpTestArgHelper struct {
-	FixtureHelper
-}
-
-func (s *WrongSetUpTestArgHelper) SetUpTest(t int) {
-}
-
-type WrongSetUpSuiteArgHelper struct {
-	FixtureHelper
-}
-
-func (s *WrongSetUpSuiteArgHelper) SetUpSuite(t int) {
-}
-
-type WrongTestArgCountHelper struct {
-	FixtureHelper
-}
-
-func (s *WrongTestArgCountHelper) Test1(c *C, i int) {
-}
-
-type WrongSetUpTestArgCountHelper struct {
-	FixtureHelper
-}
-
-func (s *WrongSetUpTestArgCountHelper) SetUpTest(c *C, i int) {
-}
-
-type WrongSetUpSuiteArgCountHelper struct {
-	FixtureHelper
-}
-
-func (s *WrongSetUpSuiteArgCountHelper) SetUpSuite(c *C, i int) {
-}
-
-// -----------------------------------------------------------------------
-// Ensure fixture doesn't run without tests.
-
-type NoTestsHelper struct {
-	hasRun bool
-}
-
-func (s *NoTestsHelper) SetUpSuite(c *C) {
-	s.hasRun = true
-}
-
-func (s *NoTestsHelper) TearDownSuite(c *C) {
-	s.hasRun = true
-}
-
-func (s *FixtureS) TestFixtureDoesntRunWithoutTests(c *C) {
-	helper := NoTestsHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Check(helper.hasRun, Equals, false)
-}
-
-// -----------------------------------------------------------------------
-// Verify that checks and assertions work correctly inside the fixture.
-
-type FixtureCheckHelper struct {
-	fail      string
-	completed bool
-}
-
-func (s *FixtureCheckHelper) SetUpSuite(c *C) {
-	switch s.fail {
-	case "SetUpSuiteAssert":
-		c.Assert(false, Equals, true)
-	case "SetUpSuiteCheck":
-		c.Check(false, Equals, true)
-	}
-	s.completed = true
-}
-
-func (s *FixtureCheckHelper) SetUpTest(c *C) {
-	switch s.fail {
-	case "SetUpTestAssert":
-		c.Assert(false, Equals, true)
-	case "SetUpTestCheck":
-		c.Check(false, Equals, true)
-	}
-	s.completed = true
-}
-
-func (s *FixtureCheckHelper) Test(c *C) {
-	// Do nothing.
-}
-
-func (s *FixtureS) TestSetUpSuiteCheck(c *C) {
-	helper := FixtureCheckHelper{fail: "SetUpSuiteCheck"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Assert(output.value, Matches,
-		"\n---+\n"+
-			"FAIL: fixture_test\\.go:[0-9]+: "+
-			"FixtureCheckHelper\\.SetUpSuite\n\n"+
-			"fixture_test\\.go:[0-9]+:\n"+
-			"    c\\.Check\\(false, Equals, true\\)\n"+
-			"\\.+ obtained bool = false\n"+
-			"\\.+ expected bool = true\n\n")
-	c.Assert(helper.completed, Equals, true)
-}
-
-func (s *FixtureS) TestSetUpSuiteAssert(c *C) {
-	helper := FixtureCheckHelper{fail: "SetUpSuiteAssert"}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Assert(output.value, Matches,
-		"\n---+\n"+
-			"FAIL: fixture_test\\.go:[0-9]+: "+
-			"FixtureCheckHelper\\.SetUpSuite\n\n"+
-			"fixture_test\\.go:[0-9]+:\n"+
-			"    c\\.Assert\\(false, Equals, true\\)\n"+
-			"\\.+ obtained bool = false\n"+
-			"\\.+ expected bool = true\n\n")
-	c.Assert(helper.completed, Equals, false)
-}
-
-// -----------------------------------------------------------------------
-// Verify that logging within SetUpTest() persists within the test log itself.
-
-type FixtureLogHelper struct {
-	c *C
-}
-
-func (s *FixtureLogHelper) SetUpTest(c *C) {
-	s.c = c
-	c.Log("1")
-}
-
-func (s *FixtureLogHelper) Test(c *C) {
-	c.Log("2")
-	s.c.Log("3")
-	c.Log("4")
-	c.Fail()
-}
-
-func (s *FixtureLogHelper) TearDownTest(c *C) {
-	s.c.Log("5")
-}
-
-func (s *FixtureS) TestFixtureLogging(c *C) {
-	helper := FixtureLogHelper{}
-	output := String{}
-	Run(&helper, &RunConf{Output: &output})
-	c.Assert(output.value, Matches,
-		"\n---+\n"+
-			"FAIL: fixture_test\\.go:[0-9]+: "+
-			"FixtureLogHelper\\.Test\n\n"+
-			"1\n2\n3\n4\n5\n")
-}
-
-// -----------------------------------------------------------------------
-// Skip() within fixture methods.
-
-func (s *FixtureS) TestSkipSuite(c *C) {
-	helper := FixtureHelper{skip: true, skipOnN: 0}
-	output := String{}
-	result := Run(&helper, &RunConf{Output: &output})
-	c.Assert(output.value, Equals, "")
-	c.Assert(helper.calls[0], Equals, "SetUpSuite")
-	c.Assert(helper.calls[1], Equals, "TearDownSuite")
-	c.Assert(len(helper.calls), Equals, 2)
-	c.Assert(result.Skipped, Equals, 2)
-}
-
-func (s *FixtureS) TestSkipTest(c *C) {
-	helper := FixtureHelper{skip: true, skipOnN: 1}
-	output := String{}
-	result := Run(&helper, &RunConf{Output: &output})
-	c.Assert(helper.calls[0], Equals, "SetUpSuite")
-	c.Assert(helper.calls[1], Equals, "SetUpTest")
-	c.Assert(helper.calls[2], Equals, "SetUpTest")
-	c.Assert(helper.calls[3], Equals, "Test2")
-	c.Assert(helper.calls[4], Equals, "TearDownTest")
-	c.Assert(helper.calls[5], Equals, "TearDownSuite")
-	c.Assert(len(helper.calls), Equals, 6)
-	c.Assert(result.Skipped, Equals, 1)
-}
diff --git a/foundation_test.go b/foundation_test.go
deleted file mode 100644
index 8ecf791..0000000
--- a/foundation_test.go
+++ /dev/null
@@ -1,335 +0,0 @@
-// These tests check that the foundations of gocheck are working properly.
-// They already assume that fundamental failing is working already, though,
-// since this was tested in bootstrap_test.go. Even then, some care may
-// still have to be taken when using external functions, since they should
-// of course not rely on functionality tested here.
-
-package check_test
-
-import (
-	"fmt"
-	"gopkg.in/check.v1"
-	"log"
-	"os"
-	"regexp"
-	"strings"
-)
-
-// -----------------------------------------------------------------------
-// Foundation test suite.
-
-type FoundationS struct{}
-
-var foundationS = check.Suite(&FoundationS{})
-
-func (s *FoundationS) TestCountSuite(c *check.C) {
-	suitesRun += 1
-}
-
-func (s *FoundationS) TestErrorf(c *check.C) {
-	// Do not use checkState() here.  It depends on Errorf() working.
-	expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+
-		"    c.Errorf(\"Error %%v!\", \"message\")\n"+
-		"... Error: Error message!\n\n",
-		getMyLine()+1)
-	c.Errorf("Error %v!", "message")
-	failed := c.Failed()
-	c.Succeed()
-	if log := c.GetTestLog(); log != expectedLog {
-		c.Logf("Errorf() logged %#v rather than %#v", log, expectedLog)
-		c.Fail()
-	}
-	if !failed {
-		c.Logf("Errorf() didn't put the test in a failed state")
-		c.Fail()
-	}
-}
-
-func (s *FoundationS) TestError(c *check.C) {
-	expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+
-		"    c\\.Error\\(\"Error \", \"message!\"\\)\n"+
-		"\\.\\.\\. Error: Error message!\n\n",
-		getMyLine()+1)
-	c.Error("Error ", "message!")
-	checkState(c, nil,
-		&expectedState{
-			name:   "Error(`Error `, `message!`)",
-			failed: true,
-			log:    expectedLog,
-		})
-}
-
-func (s *FoundationS) TestFailNow(c *check.C) {
-	defer (func() {
-		if !c.Failed() {
-			c.Error("FailNow() didn't fail the test")
-		} else {
-			c.Succeed()
-			if c.GetTestLog() != "" {
-				c.Error("Something got logged:\n" + c.GetTestLog())
-			}
-		}
-	})()
-
-	c.FailNow()
-	c.Log("FailNow() didn't stop the test")
-}
-
-func (s *FoundationS) TestSucceedNow(c *check.C) {
-	defer (func() {
-		if c.Failed() {
-			c.Error("SucceedNow() didn't succeed the test")
-		}
-		if c.GetTestLog() != "" {
-			c.Error("Something got logged:\n" + c.GetTestLog())
-		}
-	})()
-
-	c.Fail()
-	c.SucceedNow()
-	c.Log("SucceedNow() didn't stop the test")
-}
-
-func (s *FoundationS) TestFailureHeader(c *check.C) {
-	output := String{}
-	failHelper := FailHelper{}
-	check.Run(&failHelper, &check.RunConf{Output: &output})
-	header := fmt.Sprintf(""+
-		"\n-----------------------------------"+
-		"-----------------------------------\n"+
-		"FAIL: check_test.go:%d: FailHelper.TestLogAndFail\n",
-		failHelper.testLine)
-	if strings.Index(output.value, header) == -1 {
-		c.Errorf(""+
-			"Failure didn't print a proper header.\n"+
-			"... Got:\n%s... Expected something with:\n%s",
-			output.value, header)
-	}
-}
-
-func (s *FoundationS) TestFatal(c *check.C) {
-	var line int
-	defer (func() {
-		if !c.Failed() {
-			c.Error("Fatal() didn't fail the test")
-		} else {
-			c.Succeed()
-			expected := fmt.Sprintf("foundation_test.go:%d:\n"+
-				"    c.Fatal(\"Die \", \"now!\")\n"+
-				"... Error: Die now!\n\n",
-				line)
-			if c.GetTestLog() != expected {
-				c.Error("Incorrect log:", c.GetTestLog())
-			}
-		}
-	})()
-
-	line = getMyLine() + 1
-	c.Fatal("Die ", "now!")
-	c.Log("Fatal() didn't stop the test")
-}
-
-func (s *FoundationS) TestFatalf(c *check.C) {
-	var line int
-	defer (func() {
-		if !c.Failed() {
-			c.Error("Fatalf() didn't fail the test")
-		} else {
-			c.Succeed()
-			expected := fmt.Sprintf("foundation_test.go:%d:\n"+
-				"    c.Fatalf(\"Die %%s!\", \"now\")\n"+
-				"... Error: Die now!\n\n",
-				line)
-			if c.GetTestLog() != expected {
-				c.Error("Incorrect log:", c.GetTestLog())
-			}
-		}
-	})()
-
-	line = getMyLine() + 1
-	c.Fatalf("Die %s!", "now")
-	c.Log("Fatalf() didn't stop the test")
-}
-
-func (s *FoundationS) TestCallerLoggingInsideTest(c *check.C) {
-	log := fmt.Sprintf(""+
-		"foundation_test.go:%d:\n"+
-		"    result := c.Check\\(10, check.Equals, 20\\)\n"+
-		"\\.\\.\\. obtained int = 10\n"+
-		"\\.\\.\\. expected int = 20\n\n",
-		getMyLine()+1)
-	result := c.Check(10, check.Equals, 20)
-	checkState(c, result,
-		&expectedState{
-			name:   "Check(10, Equals, 20)",
-			result: false,
-			failed: true,
-			log:    log,
-		})
-}
-
-func (s *FoundationS) TestCallerLoggingInDifferentFile(c *check.C) {
-	result, line := checkEqualWrapper(c, 10, 20)
-	testLine := getMyLine() - 1
-	log := fmt.Sprintf(""+
-		"foundation_test.go:%d:\n"+
-		"    result, line := checkEqualWrapper\\(c, 10, 20\\)\n"+
-		"check_test.go:%d:\n"+
-		"    return c.Check\\(obtained, check.Equals, expected\\), getMyLine\\(\\)\n"+
-		"\\.\\.\\. obtained int = 10\n"+
-		"\\.\\.\\. expected int = 20\n\n",
-		testLine, line)
-	checkState(c, result,
-		&expectedState{
-			name:   "Check(10, Equals, 20)",
-			result: false,
-			failed: true,
-			log:    log,
-		})
-}
-
-// -----------------------------------------------------------------------
-// ExpectFailure() inverts the logic of failure.
-
-type ExpectFailureSucceedHelper struct{}
-
-func (s *ExpectFailureSucceedHelper) TestSucceed(c *check.C) {
-	c.ExpectFailure("It booms!")
-	c.Error("Boom!")
-}
-
-type ExpectFailureFailHelper struct{}
-
-func (s *ExpectFailureFailHelper) TestFail(c *check.C) {
-	c.ExpectFailure("Bug #XYZ")
-}
-
-func (s *FoundationS) TestExpectFailureFail(c *check.C) {
-	helper := ExpectFailureFailHelper{}
-	output := String{}
-	result := check.Run(&helper, &check.RunConf{Output: &output})
-
-	expected := "" +
-		"^\n-+\n" +
-		"FAIL: foundation_test\\.go:[0-9]+:" +
-		" ExpectFailureFailHelper\\.TestFail\n\n" +
-		"\\.\\.\\. Error: Test succeeded, but was expected to fail\n" +
-		"\\.\\.\\. Reason: Bug #XYZ\n$"
-
-	matched, err := regexp.MatchString(expected, output.value)
-	if err != nil {
-		c.Error("Bad expression: ", expected)
-	} else if !matched {
-		c.Error("ExpectFailure() didn't log properly:\n", output.value)
-	}
-
-	c.Assert(result.ExpectedFailures, check.Equals, 0)
-}
-
-func (s *FoundationS) TestExpectFailureSucceed(c *check.C) {
-	helper := ExpectFailureSucceedHelper{}
-	output := String{}
-	result := check.Run(&helper, &check.RunConf{Output: &output})
-
-	c.Assert(output.value, check.Equals, "")
-	c.Assert(result.ExpectedFailures, check.Equals, 1)
-}
-
-func (s *FoundationS) TestExpectFailureSucceedVerbose(c *check.C) {
-	helper := ExpectFailureSucceedHelper{}
-	output := String{}
-	result := check.Run(&helper, &check.RunConf{Output: &output, Verbose: true})
-
-	expected := "" +
-		"FAIL EXPECTED: foundation_test\\.go:[0-9]+:" +
-		" ExpectFailureSucceedHelper\\.TestSucceed \\(It booms!\\)\t *[.0-9]+s\n"
-
-	matched, err := regexp.MatchString(expected, output.value)
-	if err != nil {
-		c.Error("Bad expression: ", expected)
-	} else if !matched {
-		c.Error("ExpectFailure() didn't log properly:\n", output.value)
-	}
-
-	c.Assert(result.ExpectedFailures, check.Equals, 1)
-}
-
-// -----------------------------------------------------------------------
-// Skip() allows stopping a test without positive/negative results.
-
-type SkipTestHelper struct{}
-
-func (s *SkipTestHelper) TestFail(c *check.C) {
-	c.Skip("Wrong platform or whatever")
-	c.Error("Boom!")
-}
-
-func (s *FoundationS) TestSkip(c *check.C) {
-	helper := SkipTestHelper{}
-	output := String{}
-	check.Run(&helper, &check.RunConf{Output: &output})
-
-	if output.value != "" {
-		c.Error("Skip() logged something:\n", output.value)
-	}
-}
-
-func (s *FoundationS) TestSkipVerbose(c *check.C) {
-	helper := SkipTestHelper{}
-	output := String{}
-	check.Run(&helper, &check.RunConf{Output: &output, Verbose: true})
-
-	expected := "SKIP: foundation_test\\.go:[0-9]+: SkipTestHelper\\.TestFail" +
-		" \\(Wrong platform or whatever\\)"
-	matched, err := regexp.MatchString(expected, output.value)
-	if err != nil {
-		c.Error("Bad expression: ", expected)
-	} else if !matched {
-		c.Error("Skip() didn't log properly:\n", output.value)
-	}
-}
-
-// -----------------------------------------------------------------------
-// Check minimum *log.Logger interface provided by *check.C.
-
-type minLogger interface {
-	Output(calldepth int, s string) error
-}
-
-func (s *BootstrapS) TestMinLogger(c *check.C) {
-	var logger minLogger
-	logger = log.New(os.Stderr, "", 0)
-	logger = c
-	logger.Output(0, "Hello there")
-	expected := `\[LOG\] [0-9]+:[0-9][0-9]\.[0-9][0-9][0-9] +Hello there\n`
-	output := c.GetTestLog()
-	c.Assert(output, check.Matches, expected)
-}
-
-// -----------------------------------------------------------------------
-// Ensure that suites with embedded types are working fine, including the
-// the workaround for issue 906.
-
-type EmbeddedInternalS struct {
-	called bool
-}
-
-type EmbeddedS struct {
-	EmbeddedInternalS
-}
-
-var embeddedS = check.Suite(&EmbeddedS{})
-
-func (s *EmbeddedS) TestCountSuite(c *check.C) {
-	suitesRun += 1
-}
-
-func (s *EmbeddedInternalS) TestMethod(c *check.C) {
-	c.Error("TestMethod() of the embedded type was called!?")
-}
-
-func (s *EmbeddedS) TestMethod(c *check.C) {
-	// http://code.google.com/p/go/issues/detail?id=906
-	c.Check(s.called, check.Equals, false) // Go issue 906 is affecting the runner?
-	s.called = true
-}
diff --git a/helpers.go b/helpers.go
deleted file mode 100644
index 5576d47..0000000
--- a/helpers.go
+++ /dev/null
@@ -1,224 +0,0 @@
-package check
-
-import (
-	"fmt"
-	"strings"
-	"time"
-)
-
-// -----------------------------------------------------------------------
-// Basic succeeding/failing logic.
-
-// Return true if the currently running test has already failed.
-func (c *C) Failed() bool {
-	return c.status == failedSt
-}
-
-// Mark the currently running test as failed. Something ought to have been
-// previously logged so that the developer knows what went wrong. The higher
-// level helper functions will fail the test and do the logging properly.
-func (c *C) Fail() {
-	c.status = failedSt
-}
-
-// Mark the currently running test as failed, and stop running the test.
-// Something ought to have been previously logged so that the developer
-// knows what went wrong. The higher level helper functions will fail the
-// test and do the logging properly.
-func (c *C) FailNow() {
-	c.Fail()
-	c.stopNow()
-}
-
-// Mark the currently running test as succeeded, undoing any previous
-// failures.
-func (c *C) Succeed() {
-	c.status = succeededSt
-}
-
-// Mark the currently running test as succeeded, undoing any previous
-// failures, and stop running the test.
-func (c *C) SucceedNow() {
-	c.Succeed()
-	c.stopNow()
-}
-
-// Expect the currently running test to fail, for the given reason.  If the
-// test does not fail, an error will be reported to raise the attention to
-// this fact. The reason string is just a summary of why the given test is
-// supposed to fail.  This method is useful to temporarily disable tests
-// which cover well known problems until a better time to fix the problem
-// is found, without forgetting about the fact that a failure still exists.
-func (c *C) ExpectFailure(reason string) {
-	if reason == "" {
-		panic("Missing reason why the test is expected to fail")
-	}
-	c.mustFail = true
-	c.reason = reason
-}
-
-// Skip the running test, for the given reason.  If used within SetUpTest,
-// the individual test being set up will be skipped, and in SetUpSuite it
-// will cause the whole suite to be skipped.
-func (c *C) Skip(reason string) {
-	if reason == "" {
-		panic("Missing reason why the test is being skipped")
-	}
-	c.reason = reason
-	c.status = skippedSt
-	c.stopNow()
-}
-
-// -----------------------------------------------------------------------
-// Basic logging.
-
-// Return the current test error output.
-func (c *C) GetTestLog() string {
-	return c.logb.String()
-}
-
-// Log some information into the test error output.  The provided arguments
-// will be assembled together into a string using fmt.Sprint().
-func (c *C) Log(args ...interface{}) {
-	c.log(args...)
-}
-
-// Log some information into the test error output.  The provided arguments
-// will be assembled together into a string using fmt.Sprintf().
-func (c *C) Logf(format string, args ...interface{}) {
-	c.logf(format, args...)
-}
-
-// Output enables *C to be used as a logger in functions that require only
-// the minimum interface of *log.Logger.
-func (c *C) Output(calldepth int, s string) error {
-	d := time.Now().Sub(c.startTime)
-	msec := d / time.Millisecond
-	sec := d / time.Second
-	min := d / time.Minute
-
-	c.Logf("[LOG] %d:%02d.%03d %s", min, sec%60, msec%1000, s)
-	return nil
-}
-
-// Log an error into the test error output, and mark the test as failed.
-// The provided arguments will be assembled together into a string using
-// fmt.Sprint().
-func (c *C) Error(args ...interface{}) {
-	c.logCaller(1)
-	c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...)))
-	c.logNewLine()
-	c.Fail()
-}
-
-// Log an error into the test error output, and mark the test as failed.
-// The provided arguments will be assembled together into a string using
-// fmt.Sprintf().
-func (c *C) Errorf(format string, args ...interface{}) {
-	c.logCaller(1)
-	c.logString(fmt.Sprintf("Error: "+format, args...))
-	c.logNewLine()
-	c.Fail()
-}
-
-// Log an error into the test error output, mark the test as failed, and
-// stop the test execution. The provided arguments will be assembled
-// together into a string using fmt.Sprint().
-func (c *C) Fatal(args ...interface{}) {
-	c.logCaller(1)
-	c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...)))
-	c.logNewLine()
-	c.FailNow()
-}
-
-// Log an error into the test error output, mark the test as failed, and
-// stop the test execution. The provided arguments will be assembled
-// together into a string using fmt.Sprintf().
-func (c *C) Fatalf(format string, args ...interface{}) {
-	c.logCaller(1)
-	c.logString(fmt.Sprint("Error: ", fmt.Sprintf(format, args...)))
-	c.logNewLine()
-	c.FailNow()
-}
-
-// -----------------------------------------------------------------------
-// Generic checks and assertions based on checkers.
-
-// Verify if the first value matches with the expected value.  What
-// matching means is defined by the provided checker. In case they do not
-// match, an error will be logged, the test will be marked as failed, and
-// the test execution will continue.  Some checkers may not need the expected
-// argument (e.g. IsNil).  In either case, any extra arguments provided to
-// the function will be logged next to the reported problem when the
-// matching fails.  This is a handy way to provide problem-specific hints.
-func (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool {
-	return c.internalCheck("Check", obtained, checker, args...)
-}
-
-// Ensure that the first value matches with the expected value.  What
-// matching means is defined by the provided checker. In case they do not
-// match, an error will be logged, the test will be marked as failed, and
-// the test execution will stop.  Some checkers may not need the expected
-// argument (e.g. IsNil).  In either case, any extra arguments provided to
-// the function will be logged next to the reported problem when the
-// matching fails.  This is a handy way to provide problem-specific hints.
-func (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) {
-	if !c.internalCheck("Assert", obtained, checker, args...) {
-		c.stopNow()
-	}
-}
-
-func (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool {
-	if checker == nil {
-		c.logCaller(2)
-		c.logString(fmt.Sprintf("%s(obtained, nil!?, ...):", funcName))
-		c.logString("Oops.. you've provided a nil checker!")
-		c.logNewLine()
-		c.Fail()
-		return false
-	}
-
-	// If the last argument is a bug info, extract it out.
-	var comment CommentInterface
-	if len(args) > 0 {
-		if c, ok := args[len(args)-1].(CommentInterface); ok {
-			comment = c
-			args = args[:len(args)-1]
-		}
-	}
-
-	params := append([]interface{}{obtained}, args...)
-	info := checker.Info()
-
-	if len(params) != len(info.Params) {
-		names := append([]string{info.Params[0], info.Name}, info.Params[1:]...)
-		c.logCaller(2)
-		c.logString(fmt.Sprintf("%s(%s):", funcName, strings.Join(names, ", ")))
-		c.logString(fmt.Sprintf("Wrong number of parameters for %s: want %d, got %d", info.Name, len(names), len(params)+1))
-		c.logNewLine()
-		c.Fail()
-		return false
-	}
-
-	// Copy since it may be mutated by Check.
-	names := append([]string{}, info.Params...)
-
-	// Do the actual check.
-	result, error := checker.Check(params, names)
-	if !result || error != "" {
-		c.logCaller(2)
-		for i := 0; i != len(params); i++ {
-			c.logValue(names[i], params[i])
-		}
-		if comment != nil {
-			c.logString(comment.CheckCommentString())
-		}
-		if error != "" {
-			c.logString(error)
-		}
-		c.logNewLine()
-		c.Fail()
-		return false
-	}
-	return true
-}
diff --git a/helpers_test.go b/helpers_test.go
deleted file mode 100644
index 0c81d6d..0000000
--- a/helpers_test.go
+++ /dev/null
@@ -1,491 +0,0 @@
-// These tests verify the inner workings of the helper methods associated
-// with check.T.
-
-package check_test
-
-import (
-	"gopkg.in/check.v1"
-	"os"
-	"reflect"
-	"runtime"
-	"sync"
-)
-
-var helpersS = check.Suite(&HelpersS{})
-
-type HelpersS struct{}
-
-func (s *HelpersS) TestCountSuite(c *check.C) {
-	suitesRun += 1
-}
-
-// -----------------------------------------------------------------------
-// Fake checker and bug info to verify the behavior of Assert() and Check().
-
-type MyChecker struct {
-	info   *check.CheckerInfo
-	params []interface{}
-	names  []string
-	result bool
-	error  string
-}
-
-func (checker *MyChecker) Info() *check.CheckerInfo {
-	if checker.info == nil {
-		return &check.CheckerInfo{Name: "MyChecker", Params: []string{"myobtained", "myexpected"}}
-	}
-	return checker.info
-}
-
-func (checker *MyChecker) Check(params []interface{}, names []string) (bool, string) {
-	rparams := checker.params
-	rnames := checker.names
-	checker.params = append([]interface{}{}, params...)
-	checker.names = append([]string{}, names...)
-	if rparams != nil {
-		copy(params, rparams)
-	}
-	if rnames != nil {
-		copy(names, rnames)
-	}
-	return checker.result, checker.error
-}
-
-type myCommentType string
-
-func (c myCommentType) CheckCommentString() string {
-	return string(c)
-}
-
-func myComment(s string) myCommentType {
-	return myCommentType(s)
-}
-
-// -----------------------------------------------------------------------
-// Ensure a real checker actually works fine.
-
-func (s *HelpersS) TestCheckerInterface(c *check.C) {
-	testHelperSuccess(c, "Check(1, Equals, 1)", true, func() interface{} {
-		return c.Check(1, check.Equals, 1)
-	})
-}
-
-// -----------------------------------------------------------------------
-// Tests for Check(), mostly the same as for Assert() following these.
-
-func (s *HelpersS) TestCheckSucceedWithExpected(c *check.C) {
-	checker := &MyChecker{result: true}
-	testHelperSuccess(c, "Check(1, checker, 2)", true, func() interface{} {
-		return c.Check(1, checker, 2)
-	})
-	if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) {
-		c.Fatalf("Bad params for check: %#v", checker.params)
-	}
-}
-
-func (s *HelpersS) TestCheckSucceedWithoutExpected(c *check.C) {
-	checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}}
-	testHelperSuccess(c, "Check(1, checker)", true, func() interface{} {
-		return c.Check(1, checker)
-	})
-	if !reflect.DeepEqual(checker.params, []interface{}{1}) {
-		c.Fatalf("Bad params for check: %#v", checker.params)
-	}
-}
-
-func (s *HelpersS) TestCheckFailWithExpected(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker, 2\\)\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n\n"
-	testHelperFailure(c, "Check(1, checker, 2)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker, 2)
-		})
-}
-
-func (s *HelpersS) TestCheckFailWithExpectedAndComment(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n" +
-		"\\.+ Hello world!\n\n"
-	testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker, 2, myComment("Hello world!"))
-		})
-}
-
-func (s *HelpersS) TestCheckFailWithExpectedAndStaticComment(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    // Nice leading comment\\.\n" +
-		"    return c\\.Check\\(1, checker, 2\\) // Hello there\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n\n"
-	testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log,
-		func() interface{} {
-			// Nice leading comment.
-			return c.Check(1, checker, 2) // Hello there
-		})
-}
-
-func (s *HelpersS) TestCheckFailWithoutExpected(c *check.C) {
-	checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker\\)\n" +
-		"\\.+ myvalue int = 1\n\n"
-	testHelperFailure(c, "Check(1, checker)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker)
-		})
-}
-
-func (s *HelpersS) TestCheckFailWithoutExpectedAndMessage(c *check.C) {
-	checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" +
-		"\\.+ myvalue int = 1\n" +
-		"\\.+ Hello world!\n\n"
-	testHelperFailure(c, "Check(1, checker, msg)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker, myComment("Hello world!"))
-		})
-}
-
-func (s *HelpersS) TestCheckWithMissingExpected(c *check.C) {
-	checker := &MyChecker{result: true}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker\\)\n" +
-		"\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" +
-		"\\.+ Wrong number of parameters for MyChecker: " +
-		"want 3, got 2\n\n"
-	testHelperFailure(c, "Check(1, checker, !?)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker)
-		})
-}
-
-func (s *HelpersS) TestCheckWithTooManyExpected(c *check.C) {
-	checker := &MyChecker{result: true}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker, 2, 3\\)\n" +
-		"\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" +
-		"\\.+ Wrong number of parameters for MyChecker: " +
-		"want 3, got 4\n\n"
-	testHelperFailure(c, "Check(1, checker, 2, 3)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker, 2, 3)
-		})
-}
-
-func (s *HelpersS) TestCheckWithError(c *check.C) {
-	checker := &MyChecker{result: false, error: "Some not so cool data provided!"}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker, 2\\)\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n" +
-		"\\.+ Some not so cool data provided!\n\n"
-	testHelperFailure(c, "Check(1, checker, 2)", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker, 2)
-		})
-}
-
-func (s *HelpersS) TestCheckWithNilChecker(c *check.C) {
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, nil\\)\n" +
-		"\\.+ Check\\(obtained, nil!\\?, \\.\\.\\.\\):\n" +
-		"\\.+ Oops\\.\\. you've provided a nil checker!\n\n"
-	testHelperFailure(c, "Check(obtained, nil)", false, false, log,
-		func() interface{} {
-			return c.Check(1, nil)
-		})
-}
-
-func (s *HelpersS) TestCheckWithParamsAndNamesMutation(c *check.C) {
-	checker := &MyChecker{result: false, params: []interface{}{3, 4}, names: []string{"newobtained", "newexpected"}}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    return c\\.Check\\(1, checker, 2\\)\n" +
-		"\\.+ newobtained int = 3\n" +
-		"\\.+ newexpected int = 4\n\n"
-	testHelperFailure(c, "Check(1, checker, 2) with mutation", false, false, log,
-		func() interface{} {
-			return c.Check(1, checker, 2)
-		})
-}
-
-// -----------------------------------------------------------------------
-// Tests for Assert(), mostly the same as for Check() above.
-
-func (s *HelpersS) TestAssertSucceedWithExpected(c *check.C) {
-	checker := &MyChecker{result: true}
-	testHelperSuccess(c, "Assert(1, checker, 2)", nil, func() interface{} {
-		c.Assert(1, checker, 2)
-		return nil
-	})
-	if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) {
-		c.Fatalf("Bad params for check: %#v", checker.params)
-	}
-}
-
-func (s *HelpersS) TestAssertSucceedWithoutExpected(c *check.C) {
-	checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}}
-	testHelperSuccess(c, "Assert(1, checker)", nil, func() interface{} {
-		c.Assert(1, checker)
-		return nil
-	})
-	if !reflect.DeepEqual(checker.params, []interface{}{1}) {
-		c.Fatalf("Bad params for check: %#v", checker.params)
-	}
-}
-
-func (s *HelpersS) TestAssertFailWithExpected(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, checker, 2\\)\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n\n"
-	testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, checker, 2)
-			return nil
-		})
-}
-
-func (s *HelpersS) TestAssertFailWithExpectedAndMessage(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n" +
-		"\\.+ Hello world!\n\n"
-	testHelperFailure(c, "Assert(1, checker, 2, msg)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, checker, 2, myComment("Hello world!"))
-			return nil
-		})
-}
-
-func (s *HelpersS) TestAssertFailWithoutExpected(c *check.C) {
-	checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, checker\\)\n" +
-		"\\.+ myvalue int = 1\n\n"
-	testHelperFailure(c, "Assert(1, checker)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, checker)
-			return nil
-		})
-}
-
-func (s *HelpersS) TestAssertFailWithoutExpectedAndMessage(c *check.C) {
-	checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" +
-		"\\.+ myvalue int = 1\n" +
-		"\\.+ Hello world!\n\n"
-	testHelperFailure(c, "Assert(1, checker, msg)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, checker, myComment("Hello world!"))
-			return nil
-		})
-}
-
-func (s *HelpersS) TestAssertWithMissingExpected(c *check.C) {
-	checker := &MyChecker{result: true}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, checker\\)\n" +
-		"\\.+ Assert\\(myobtained, MyChecker, myexpected\\):\n" +
-		"\\.+ Wrong number of parameters for MyChecker: " +
-		"want 3, got 2\n\n"
-	testHelperFailure(c, "Assert(1, checker, !?)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, checker)
-			return nil
-		})
-}
-
-func (s *HelpersS) TestAssertWithError(c *check.C) {
-	checker := &MyChecker{result: false, error: "Some not so cool data provided!"}
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, checker, 2\\)\n" +
-		"\\.+ myobtained int = 1\n" +
-		"\\.+ myexpected int = 2\n" +
-		"\\.+ Some not so cool data provided!\n\n"
-	testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, checker, 2)
-			return nil
-		})
-}
-
-func (s *HelpersS) TestAssertWithNilChecker(c *check.C) {
-	log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" +
-		"    c\\.Assert\\(1, nil\\)\n" +
-		"\\.+ Assert\\(obtained, nil!\\?, \\.\\.\\.\\):\n" +
-		"\\.+ Oops\\.\\. you've provided a nil checker!\n\n"
-	testHelperFailure(c, "Assert(obtained, nil)", nil, true, log,
-		func() interface{} {
-			c.Assert(1, nil)
-			return nil
-		})
-}
-
-// -----------------------------------------------------------------------
-// Ensure that values logged work properly in some interesting cases.
-
-func (s *HelpersS) TestValueLoggingWithArrays(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" +
-		"    return c\\.Check\\(\\[\\]byte{1, 2}, checker, \\[\\]byte{1, 3}\\)\n" +
-		"\\.+ myobtained \\[\\]uint8 = \\[\\]byte{0x1, 0x2}\n" +
-		"\\.+ myexpected \\[\\]uint8 = \\[\\]byte{0x1, 0x3}\n\n"
-	testHelperFailure(c, "Check([]byte{1}, chk, []byte{3})", false, false, log,
-		func() interface{} {
-			return c.Check([]byte{1, 2}, checker, []byte{1, 3})
-		})
-}
-
-func (s *HelpersS) TestValueLoggingWithMultiLine(c *check.C) {
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" +
-		"    return c\\.Check\\(\"a\\\\nb\\\\n\", checker, \"a\\\\nb\\\\nc\"\\)\n" +
-		"\\.+ myobtained string = \"\" \\+\n" +
-		"\\.+     \"a\\\\n\" \\+\n" +
-		"\\.+     \"b\\\\n\"\n" +
-		"\\.+ myexpected string = \"\" \\+\n" +
-		"\\.+     \"a\\\\n\" \\+\n" +
-		"\\.+     \"b\\\\n\" \\+\n" +
-		"\\.+     \"c\"\n\n"
-	testHelperFailure(c, `Check("a\nb\n", chk, "a\nb\nc")`, false, false, log,
-		func() interface{} {
-			return c.Check("a\nb\n", checker, "a\nb\nc")
-		})
-}
-
-func (s *HelpersS) TestValueLoggingWithMultiLineException(c *check.C) {
-	// If the newline is at the end of the string, don't log as multi-line.
-	checker := &MyChecker{result: false}
-	log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" +
-		"    return c\\.Check\\(\"a b\\\\n\", checker, \"a\\\\nb\"\\)\n" +
-		"\\.+ myobtained string = \"a b\\\\n\"\n" +
-		"\\.+ myexpected string = \"\" \\+\n" +
-		"\\.+     \"a\\\\n\" \\+\n" +
-		"\\.+     \"b\"\n\n"
-	testHelperFailure(c, `Check("a b\n", chk, "a\nb")`, false, false, log,
-		func() interface{} {
-			return c.Check("a b\n", checker, "a\nb")
-		})
-}
-
-// -----------------------------------------------------------------------
-// MakeDir() tests.
-
-type MkDirHelper struct {
-	path1  string
-	path2  string
-	isDir1 bool
-	isDir2 bool
-	isDir3 bool
-	isDir4 bool
-}
-
-func (s *MkDirHelper) SetUpSuite(c *check.C) {
-	s.path1 = c.MkDir()
-	s.isDir1 = isDir(s.path1)
-}
-
-func (s *MkDirHelper) Test(c *check.C) {
-	s.path2 = c.MkDir()
-	s.isDir2 = isDir(s.path2)
-}
-
-func (s *MkDirHelper) TearDownSuite(c *check.C) {
-	s.isDir3 = isDir(s.path1)
-	s.isDir4 = isDir(s.path2)
-}
-
-func (s *HelpersS) TestMkDir(c *check.C) {
-	helper := MkDirHelper{}
-	output := String{}
-	check.Run(&helper, &check.RunConf{Output: &output})
-	c.Assert(output.value, check.Equals, "")
-	c.Check(helper.isDir1, check.Equals, true)
-	c.Check(helper.isDir2, check.Equals, true)
-	c.Check(helper.isDir3, check.Equals, true)
-	c.Check(helper.isDir4, check.Equals, true)
-	c.Check(helper.path1, check.Not(check.Equals),
-		helper.path2)
-	c.Check(isDir(helper.path1), check.Equals, false)
-	c.Check(isDir(helper.path2), check.Equals, false)
-}
-
-func isDir(path string) bool {
-	if stat, err := os.Stat(path); err == nil {
-		return stat.IsDir()
-	}
-	return false
-}
-
-// Concurrent logging should not corrupt the underling buffer.
-// Use go test -race to detect the race in this test.
-func (s *HelpersS) TestConcurrentLogging(c *check.C) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU()))
-	var start, stop sync.WaitGroup
-	start.Add(1)
-	for i, n := 0, runtime.NumCPU()*2; i < n; i++ {
-		stop.Add(1)
-		go func(i int) {
-			start.Wait()
-			for j := 0; j < 30; j++ {
-				c.Logf("Worker %d: line %d", i, j)
-			}
-			stop.Done()
-		}(i)
-	}
-	start.Done()
-	stop.Wait()
-}
-
-// -----------------------------------------------------------------------
-// A couple of helper functions to test helper functions. :-)
-
-func testHelperSuccess(c *check.C, name string, expectedResult interface{}, closure func() interface{}) {
-	var result interface{}
-	defer (func() {
-		if err := recover(); err != nil {
-			panic(err)
-		}
-		checkState(c, result,
-			&expectedState{
-				name:   name,
-				result: expectedResult,
-				failed: false,
-				log:    "",
-			})
-	})()
-	result = closure()
-}
-
-func testHelperFailure(c *check.C, name string, expectedResult interface{}, shouldStop bool, log string, closure func() interface{}) {
-	var result interface{}
-	defer (func() {
-		if err := recover(); err != nil {
-			panic(err)
-		}
-		checkState(c, result,
-			&expectedState{
-				name:   name,
-				result: expectedResult,
-				failed: true,
-				log:    log,
-			})
-	})()
-	result = closure()
-	if shouldStop {
-		c.Logf("%s didn't stop when it should", name)
-	}
-}
diff --git a/printer.go b/printer.go
deleted file mode 100644
index e0f7557..0000000
--- a/printer.go
+++ /dev/null
@@ -1,168 +0,0 @@
-package check
-
-import (
-	"bytes"
-	"go/ast"
-	"go/parser"
-	"go/printer"
-	"go/token"
-	"os"
-)
-
-func indent(s, with string) (r string) {
-	eol := true
-	for i := 0; i != len(s); i++ {
-		c := s[i]
-		switch {
-		case eol && c == '\n' || c == '\r':
-		case c == '\n' || c == '\r':
-			eol = true
-		case eol:
-			eol = false
-			s = s[:i] + with + s[i:]
-			i += len(with)
-		}
-	}
-	return s
-}
-
-func printLine(filename string, line int) (string, error) {
-	fset := token.NewFileSet()
-	file, err := os.Open(filename)
-	if err != nil {
-		return "", err
-	}
-	fnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments)
-	if err != nil {
-		return "", err
-	}
-	config := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4}
-	lp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config}
-	ast.Walk(lp, fnode)
-	result := lp.output.Bytes()
-	// Comments leave \n at the end.
-	n := len(result)
-	for n > 0 && result[n-1] == '\n' {
-		n--
-	}
-	return string(result[:n]), nil
-}
-
-type linePrinter struct {
-	config *printer.Config
-	fset   *token.FileSet
-	fnode  *ast.File
-	line   int
-	output bytes.Buffer
-	stmt   ast.Stmt
-}
-
-func (lp *linePrinter) emit() bool {
-	if lp.stmt != nil {
-		lp.trim(lp.stmt)
-		lp.printWithComments(lp.stmt)
-		lp.stmt = nil
-		return true
-	}
-	return false
-}
-
-func (lp *linePrinter) printWithComments(n ast.Node) {
-	nfirst := lp.fset.Position(n.Pos()).Line
-	nlast := lp.fset.Position(n.End()).Line
-	for _, g := range lp.fnode.Comments {
-		cfirst := lp.fset.Position(g.Pos()).Line
-		clast := lp.fset.Position(g.End()).Line
-		if clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column {
-			for _, c := range g.List {
-				lp.output.WriteString(c.Text)
-				lp.output.WriteByte('\n')
-			}
-		}
-		if cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash {
-			// The printer will not include the comment if it starts past
-			// the node itself. Trick it into printing by overlapping the
-			// slash with the end of the statement.
-			g.List[0].Slash = n.End() - 1
-		}
-	}
-	node := &printer.CommentedNode{n, lp.fnode.Comments}
-	lp.config.Fprint(&lp.output, lp.fset, node)
-}
-
-func (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) {
-	if n == nil {
-		if lp.output.Len() == 0 {
-			lp.emit()
-		}
-		return nil
-	}
-	first := lp.fset.Position(n.Pos()).Line
-	last := lp.fset.Position(n.End()).Line
-	if first <= lp.line && last >= lp.line {
-		// Print the innermost statement containing the line.
-		if stmt, ok := n.(ast.Stmt); ok {
-			if _, ok := n.(*ast.BlockStmt); !ok {
-				lp.stmt = stmt
-			}
-		}
-		if first == lp.line && lp.emit() {
-			return nil
-		}
-		return lp
-	}
-	return nil
-}
-
-func (lp *linePrinter) trim(n ast.Node) bool {
-	stmt, ok := n.(ast.Stmt)
-	if !ok {
-		return true
-	}
-	line := lp.fset.Position(n.Pos()).Line
-	if line != lp.line {
-		return false
-	}
-	switch stmt := stmt.(type) {
-	case *ast.IfStmt:
-		stmt.Body = lp.trimBlock(stmt.Body)
-	case *ast.SwitchStmt:
-		stmt.Body = lp.trimBlock(stmt.Body)
-	case *ast.TypeSwitchStmt:
-		stmt.Body = lp.trimBlock(stmt.Body)
-	case *ast.CaseClause:
-		stmt.Body = lp.trimList(stmt.Body)
-	case *ast.CommClause:
-		stmt.Body = lp.trimList(stmt.Body)
-	case *ast.BlockStmt:
-		stmt.List = lp.trimList(stmt.List)
-	}
-	return true
-}
-
-func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt {
-	if !lp.trim(stmt) {
-		return lp.emptyBlock(stmt)
-	}
-	stmt.Rbrace = stmt.Lbrace
-	return stmt
-}
-
-func (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt {
-	for i := 0; i != len(stmts); i++ {
-		if !lp.trim(stmts[i]) {
-			stmts[i] = lp.emptyStmt(stmts[i])
-			break
-		}
-	}
-	return stmts
-}
-
-func (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt {
-	return &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}}
-}
-
-func (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt {
-	p := n.Pos()
-	return &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p}
-}
diff --git a/printer_test.go b/printer_test.go
deleted file mode 100644
index 538b2d5..0000000
--- a/printer_test.go
+++ /dev/null
@@ -1,104 +0,0 @@
-package check_test
-
-import (
-    .   "gopkg.in/check.v1"
-)
-
-var _ = Suite(&PrinterS{})
-
-type PrinterS struct{}
-
-func (s *PrinterS) TestCountSuite(c *C) {
-    suitesRun += 1
-}
-
-var printTestFuncLine int
-
-func init() {
-    printTestFuncLine = getMyLine() + 3
-}
-
-func printTestFunc() {
-    println(1)           // Comment1
-    if 2 == 2 {          // Comment2
-        println(3)       // Comment3
-    }
-    switch 5 {
-    case 6: println(6)   // Comment6
-        println(7)
-    }
-    switch interface{}(9).(type) {// Comment9
-    case int: println(10)
-        println(11)
-    }
-    select {
-    case <-(chan bool)(nil): println(14)
-        println(15)
-    default: println(16)
-        println(17)
-    }
-    println(19,
-        20)
-    _ = func() { println(21)
-        println(22)
-    }
-    println(24, func() {
-        println(25)
-    })
-    // Leading comment
-    // with multiple lines.
-    println(29)  // Comment29
-}
-
-var printLineTests = []struct {
-    line   int
-    output string
-}{
-    {1, "println(1) // Comment1"},
-    {2, "if 2 == 2 { // Comment2\n    ...\n}"},
-    {3, "println(3) // Comment3"},
-    {5, "switch 5 {\n...\n}"},
-    {6, "case 6:\n    println(6) // Comment6\n    ..."},
-    {7, "println(7)"},
-    {9, "switch interface{}(9).(type) { // Comment9\n...\n}"},
-    {10, "case int:\n    println(10)\n    ..."},
-    {14, "case <-(chan bool)(nil):\n    println(14)\n    ..."},
-    {15, "println(15)"},
-    {16, "default:\n    println(16)\n    ..."},
-    {17, "println(17)"},
-    {19, "println(19,\n    20)"},
-    {20, "println(19,\n    20)"},
-    {21, "_ = func() {\n    println(21)\n    println(22)\n}"},
-    {22, "println(22)"},
-    {24, "println(24, func() {\n    println(25)\n})"},
-    {25, "println(25)"},
-    {26, "println(24, func() {\n    println(25)\n})"},
-    {29, "// Leading comment\n// with multiple lines.\nprintln(29) // Comment29"},
-}
-
-func (s *PrinterS) TestPrintLine(c *C) {
-    for _, test := range printLineTests {
-        output, err := PrintLine("printer_test.go", printTestFuncLine+test.line)
-        c.Assert(err, IsNil)
-        c.Assert(output, Equals, test.output)
-    }
-}
-
-var indentTests = []struct {
-    in, out string
-}{
-    {"", ""},
-    {"\n", "\n"},
-    {"a", ">>>a"},
-    {"a\n", ">>>a\n"},
-    {"a\nb", ">>>a\n>>>b"},
-    {" ", ">>> "},
-}
-
-func (s *PrinterS) TestIndent(c *C) {
-    for _, test := range indentTests {
-        out := Indent(test.in, ">>>")
-        c.Assert(out, Equals, test.out)
-    }
-
-}
diff --git a/run.go b/run.go
deleted file mode 100644
index 2dbd8c3..0000000
--- a/run.go
+++ /dev/null
@@ -1,173 +0,0 @@
-package check
-
-import (
-	"bufio"
-	"flag"
-	"fmt"
-	"os"
-	"testing"
-	"time"
-)
-
-// -----------------------------------------------------------------------
-// Test suite registry.
-
-var allSuites []interface{}
-
-// Register the given value as a test suite to be run.  Any methods starting
-// with the Test prefix in the given value will be considered as a test to
-// be run.
-func Suite(suite interface{}) interface{} {
-	allSuites = append(allSuites, suite)
-	return suite
-}
-
-// -----------------------------------------------------------------------
-// Public running interface.
-
-var (
-	oldFilterFlag  = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run")
-	oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode")
-	oldStreamFlag  = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)")
-	oldBenchFlag   = flag.Bool("gocheck.b", false, "Run benchmarks")
-	oldBenchTime   = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark")
-	oldListFlag    = flag.Bool("gocheck.list", false, "List the names of all tests that will be run")
-	oldWorkFlag    = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory") 
-
-	newFilterFlag  = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run")
-	newVerboseFlag = flag.Bool("check.v", false, "Verbose mode")
-	newStreamFlag  = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)")
-	newBenchFlag   = flag.Bool("check.b", false, "Run benchmarks")
-	newBenchTime   = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark")
-	newListFlag    = flag.Bool("check.list", false, "List the names of all tests that will be run")
-	newWorkFlag    = flag.Bool("check.work", false, "Display and do not remove the test working directory") 
-)
-
-// Run all test suites registered with the Suite() function, printing
-// results to stdout, and reporting any failures back to the 'testing'
-// module.
-func TestingT(testingT *testing.T) {
-	benchTime := *newBenchTime
-	if benchTime == 1*time.Second {
-		benchTime = *oldBenchTime
-	}
-	conf := &RunConf{
-		Filter:        *oldFilterFlag + *newFilterFlag,
-		Verbose:       *oldVerboseFlag || *newVerboseFlag,
-		Stream:        *oldStreamFlag || *newStreamFlag,
-		Benchmark:     *oldBenchFlag || *newBenchFlag,
-		BenchmarkTime: benchTime,
-		KeepWorkDir:   *oldWorkFlag || *newWorkFlag,
-	}
-	if *oldListFlag || *newListFlag {
-		w := bufio.NewWriter(os.Stdout)
-		for _, name := range ListAll(conf) {
-			fmt.Fprintln(w, name)
-		}
-		w.Flush()
-		return
-	}
-	result := RunAll(conf)
-	println(result.String())
-	if !result.Passed() {
-		testingT.Fail()
-	}
-}
-
-// RunAll runs all test suites registered with the Suite() function, using the
-// given run configuration.
-func RunAll(runConf *RunConf) *Result {
-	result := Result{}
-	for _, suite := range allSuites {
-		result.Add(Run(suite, runConf))
-	}
-	return &result
-}
-
-// Run runs the given test suite using the provided run configuration.
-func Run(suite interface{}, runConf *RunConf) *Result {
-	runner := newSuiteRunner(suite, runConf)
-	return runner.run()
-}
-
-// ListAll returns the names of all the test functions registered with the
-// Suite function that will be run with the provided run configuration.
-func ListAll(runConf *RunConf) []string {
-	var names []string
-	for _, suite := range allSuites {
-		names = append(names, List(suite, runConf)...)
-	}
-	return names
-}
-
-// List returns the names of the test functions in the given
-// suite that will be run with the provided run configuration.
-func List(suite interface{}, runConf *RunConf) []string {
-	var names []string
-	runner := newSuiteRunner(suite, runConf)
-	for _, t := range runner.tests {
-		names = append(names, t.String())
-	}
-	return names
-}
-
-// -----------------------------------------------------------------------
-// Result methods.
-
-func (r *Result) Add(other *Result) {
-	r.Succeeded += other.Succeeded
-	r.Skipped += other.Skipped
-	r.Failed += other.Failed
-	r.Panicked += other.Panicked
-	r.FixturePanicked += other.FixturePanicked
-	r.ExpectedFailures += other.ExpectedFailures
-	r.Missed += other.Missed
-	if r.WorkDir != "" && other.WorkDir != "" {
-		r.WorkDir += ":" + other.WorkDir
-	} else if other.WorkDir != "" {
-		r.WorkDir = other.WorkDir
-	}
-}
-
-func (r *Result) Passed() bool {
-	return (r.Failed == 0 && r.Panicked == 0 &&
-		r.FixturePanicked == 0 && r.Missed == 0 &&
-		r.RunError == nil)
-}
-
-func (r *Result) String() string {
-	if r.RunError != nil {
-		return "ERROR: " + r.RunError.Error()
-	}
-
-	var value string
-	if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 &&
-		r.Missed == 0 {
-		value = "OK: "
-	} else {
-		value = "OOPS: "
-	}
-	value += fmt.Sprintf("%d passed", r.Succeeded)
-	if r.Skipped != 0 {
-		value += fmt.Sprintf(", %d skipped", r.Skipped)
-	}
-	if r.ExpectedFailures != 0 {
-		value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures)
-	}
-	if r.Failed != 0 {
-		value += fmt.Sprintf(", %d FAILED", r.Failed)
-	}
-	if r.Panicked != 0 {
-		value += fmt.Sprintf(", %d PANICKED", r.Panicked)
-	}
-	if r.FixturePanicked != 0 {
-		value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked)
-	}
-	if r.Missed != 0 {
-		value += fmt.Sprintf(", %d MISSED", r.Missed)
-	}
-	if r.WorkDir != "" {
-		value += "\nWORK=" + r.WorkDir
-	}
-	return value
-}
diff --git a/run_test.go b/run_test.go
deleted file mode 100644
index f41fffc..0000000
--- a/run_test.go
+++ /dev/null
@@ -1,419 +0,0 @@
-// These tests verify the test running logic.
-
-package check_test
-
-import (
-	"errors"
-	. "gopkg.in/check.v1"
-	"os"
-	"sync"
-)
-
-var runnerS = Suite(&RunS{})
-
-type RunS struct{}
-
-func (s *RunS) TestCountSuite(c *C) {
-	suitesRun += 1
-}
-
-// -----------------------------------------------------------------------
-// Tests ensuring result counting works properly.
-
-func (s *RunS) TestSuccess(c *C) {
-	output := String{}
-	result := Run(&SuccessHelper{}, &RunConf{Output: &output})
-	c.Check(result.Succeeded, Equals, 1)
-	c.Check(result.Failed, Equals, 0)
-	c.Check(result.Skipped, Equals, 0)
-	c.Check(result.Panicked, Equals, 0)
-	c.Check(result.FixturePanicked, Equals, 0)
-	c.Check(result.Missed, Equals, 0)
-	c.Check(result.RunError, IsNil)
-}
-
-func (s *RunS) TestFailure(c *C) {
-	output := String{}
-	result := Run(&FailHelper{}, &RunConf{Output: &output})
-	c.Check(result.Succeeded, Equals, 0)
-	c.Check(result.Failed, Equals, 1)
-	c.Check(result.Skipped, Equals, 0)
-	c.Check(result.Panicked, Equals, 0)
-	c.Check(result.FixturePanicked, Equals, 0)
-	c.Check(result.Missed, Equals, 0)
-	c.Check(result.RunError, IsNil)
-}
-
-func (s *RunS) TestFixture(c *C) {
-	output := String{}
-	result := Run(&FixtureHelper{}, &RunConf{Output: &output})
-	c.Check(result.Succeeded, Equals, 2)
-	c.Check(result.Failed, Equals, 0)
-	c.Check(result.Skipped, Equals, 0)
-	c.Check(result.Panicked, Equals, 0)
-	c.Check(result.FixturePanicked, Equals, 0)
-	c.Check(result.Missed, Equals, 0)
-	c.Check(result.RunError, IsNil)
-}
-
-func (s *RunS) TestPanicOnTest(c *C) {
-	output := String{}
-	helper := &FixtureHelper{panicOn: "Test1"}
-	result := Run(helper, &RunConf{Output: &output})
-	c.Check(result.Succeeded, Equals, 1)
-	c.Check(result.Failed, Equals, 0)
-	c.Check(result.Skipped, Equals, 0)
-	c.Check(result.Panicked, Equals, 1)
-	c.Check(result.FixturePanicked, Equals, 0)
-	c.Check(result.Missed, Equals, 0)
-	c.Check(result.RunError, IsNil)
-}
-
-func (s *RunS) TestPanicOnSetUpTest(c *C) {
-	output := String{}
-	helper := &FixtureHelper{panicOn: "SetUpTest"}
-	result := Run(helper, &RunConf{Output: &output})
-	c.Check(result.Succeeded, Equals, 0)
-	c.Check(result.Failed, Equals, 0)
-	c.Check(result.Skipped, Equals, 0)
-	c.Check(result.Panicked, Equals, 0)
-	c.Check(result.FixturePanicked, Equals, 1)
-	c.Check(result.Missed, Equals, 2)
-	c.Check(result.RunError, IsNil)
-}
-
-func (s *RunS) TestPanicOnSetUpSuite(c *C) {
-	output := String{}
-	helper := &FixtureHelper{panicOn: "SetUpSuite"}
-	result := Run(helper, &RunConf{Output: &output})
-	c.Check(result.Succeeded, Equals, 0)
-	c.Check(result.Failed, Equals, 0)
-	c.Check(result.Skipped, Equals, 0)
-	c.Check(result.Panicked, Equals, 0)
-	c.Check(result.FixturePanicked, Equals, 1)
-	c.Check(result.Missed, Equals, 2)
-	c.Check(result.RunError, IsNil)
-}
-
-// -----------------------------------------------------------------------
-// Check result aggregation.
-
-func (s *RunS) TestAdd(c *C) {
-	result := &Result{
-		Succeeded:        1,
-		Skipped:          2,
-		Failed:           3,
-		Panicked:         4,
-		FixturePanicked:  5,
-		Missed:           6,
-		ExpectedFailures: 7,
-	}
-	result.Add(&Result{
-		Succeeded:        10,
-		Skipped:          20,
-		Failed:           30,
-		Panicked:         40,
-		FixturePanicked:  50,
-		Missed:           60,
-		ExpectedFailures: 70,
-	})
-	c.Check(result.Succeeded, Equals, 11)
-	c.Check(result.Skipped, Equals, 22)
-	c.Check(result.Failed, Equals, 33)
-	c.Check(result.Panicked, Equals, 44)
-	c.Check(result.FixturePanicked, Equals, 55)
-	c.Check(result.Missed, Equals, 66)
-	c.Check(result.ExpectedFailures, Equals, 77)
-	c.Check(result.RunError, IsNil)
-}
-
-// -----------------------------------------------------------------------
-// Check the Passed() method.
-
-func (s *RunS) TestPassed(c *C) {
-	c.Assert((&Result{}).Passed(), Equals, true)
-	c.Assert((&Result{Succeeded: 1}).Passed(), Equals, true)
-	c.Assert((&Result{Skipped: 1}).Passed(), Equals, true)
-	c.Assert((&Result{Failed: 1}).Passed(), Equals, false)
-	c.Assert((&Result{Panicked: 1}).Passed(), Equals, false)
-	c.Assert((&Result{FixturePanicked: 1}).Passed(), Equals, false)
-	c.Assert((&Result{Missed: 1}).Passed(), Equals, false)
-	c.Assert((&Result{RunError: errors.New("!")}).Passed(), Equals, false)
-}
-
-// -----------------------------------------------------------------------
-// Check that result printing is working correctly.
-
-func (s *RunS) TestPrintSuccess(c *C) {
-	result := &Result{Succeeded: 5}
-	c.Check(result.String(), Equals, "OK: 5 passed")
-}
-
-func (s *RunS) TestPrintFailure(c *C) {
-	result := &Result{Failed: 5}
-	c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FAILED")
-}
-
-func (s *RunS) TestPrintSkipped(c *C) {
-	result := &Result{Skipped: 5}
-	c.Check(result.String(), Equals, "OK: 0 passed, 5 skipped")
-}
-
-func (s *RunS) TestPrintExpectedFailures(c *C) {
-	result := &Result{ExpectedFailures: 5}
-	c.Check(result.String(), Equals, "OK: 0 passed, 5 expected failures")
-}
-
-func (s *RunS) TestPrintPanicked(c *C) {
-	result := &Result{Panicked: 5}
-	c.Check(result.String(), Equals, "OOPS: 0 passed, 5 PANICKED")
-}
-
-func (s *RunS) TestPrintFixturePanicked(c *C) {
-	result := &Result{FixturePanicked: 5}
-	c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FIXTURE-PANICKED")
-}
-
-func (s *RunS) TestPrintMissed(c *C) {
-	result := &Result{Missed: 5}
-	c.Check(result.String(), Equals, "OOPS: 0 passed, 5 MISSED")
-}
-
-func (s *RunS) TestPrintAll(c *C) {
-	result := &Result{Succeeded: 1, Skipped: 2, ExpectedFailures: 3,
-		Panicked: 4, FixturePanicked: 5, Missed: 6}
-	c.Check(result.String(), Equals,
-		"OOPS: 1 passed, 2 skipped, 3 expected failures, 4 PANICKED, "+
-			"5 FIXTURE-PANICKED, 6 MISSED")
-}
-
-func (s *RunS) TestPrintRunError(c *C) {
-	result := &Result{Succeeded: 1, Failed: 1,
-		RunError: errors.New("Kaboom!")}
-	c.Check(result.String(), Equals, "ERROR: Kaboom!")
-}
-
-// -----------------------------------------------------------------------
-// Verify that the method pattern flag works correctly.
-
-func (s *RunS) TestFilterTestName(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: "Test[91]"}
-	Run(&helper, &runConf)
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 5)
-}
-
-func (s *RunS) TestFilterTestNameWithAll(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: ".*"}
-	Run(&helper, &runConf)
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "SetUpTest")
-	c.Check(helper.calls[5], Equals, "Test2")
-	c.Check(helper.calls[6], Equals, "TearDownTest")
-	c.Check(helper.calls[7], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 8)
-}
-
-func (s *RunS) TestFilterSuiteName(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: "FixtureHelper"}
-	Run(&helper, &runConf)
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test1")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "SetUpTest")
-	c.Check(helper.calls[5], Equals, "Test2")
-	c.Check(helper.calls[6], Equals, "TearDownTest")
-	c.Check(helper.calls[7], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 8)
-}
-
-func (s *RunS) TestFilterSuiteNameAndTestName(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: "FixtureHelper\\.Test2"}
-	Run(&helper, &runConf)
-	c.Check(helper.calls[0], Equals, "SetUpSuite")
-	c.Check(helper.calls[1], Equals, "SetUpTest")
-	c.Check(helper.calls[2], Equals, "Test2")
-	c.Check(helper.calls[3], Equals, "TearDownTest")
-	c.Check(helper.calls[4], Equals, "TearDownSuite")
-	c.Check(len(helper.calls), Equals, 5)
-}
-
-func (s *RunS) TestFilterAllOut(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: "NotFound"}
-	Run(&helper, &runConf)
-	c.Check(len(helper.calls), Equals, 0)
-}
-
-func (s *RunS) TestRequirePartialMatch(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: "est"}
-	Run(&helper, &runConf)
-	c.Check(len(helper.calls), Equals, 8)
-}
-
-func (s *RunS) TestFilterError(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Filter: "]["}
-	result := Run(&helper, &runConf)
-	c.Check(result.String(), Equals,
-		"ERROR: Bad filter expression: error parsing regexp: missing closing ]: `[`")
-	c.Check(len(helper.calls), Equals, 0)
-}
-
-// -----------------------------------------------------------------------
-// Verify that List works correctly.
-
-func (s *RunS) TestListFiltered(c *C) {
-	names := List(&FixtureHelper{}, &RunConf{Filter: "1"})
-	c.Assert(names, DeepEquals, []string{
-		"FixtureHelper.Test1",
-	})
-}
-
-func (s *RunS) TestList(c *C) {
-	names := List(&FixtureHelper{}, &RunConf{})
-	c.Assert(names, DeepEquals, []string{
-		"FixtureHelper.Test1",
-		"FixtureHelper.Test2",
-	})
-}
-
-// -----------------------------------------------------------------------
-// Verify that verbose mode prints tests which pass as well.
-
-func (s *RunS) TestVerboseMode(c *C) {
-	helper := FixtureHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Verbose: true}
-	Run(&helper, &runConf)
-
-	expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t *[.0-9]+s\n" +
-		"PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n"
-
-	c.Assert(output.value, Matches, expected)
-}
-
-func (s *RunS) TestVerboseModeWithFailBeforePass(c *C) {
-	helper := FixtureHelper{panicOn: "Test1"}
-	output := String{}
-	runConf := RunConf{Output: &output, Verbose: true}
-	Run(&helper, &runConf)
-
-	expected := "(?s).*PANIC.*\n-+\n" + // Should have an extra line.
-		"PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n"
-
-	c.Assert(output.value, Matches, expected)
-}
-
-// -----------------------------------------------------------------------
-// Verify the stream output mode.  In this mode there's no output caching.
-
-type StreamHelper struct {
-	l2 sync.Mutex
-	l3 sync.Mutex
-}
-
-func (s *StreamHelper) SetUpSuite(c *C) {
-	c.Log("0")
-}
-
-func (s *StreamHelper) Test1(c *C) {
-	c.Log("1")
-	s.l2.Lock()
-	s.l3.Lock()
-	go func() {
-		s.l2.Lock() // Wait for "2".
-		c.Log("3")
-		s.l3.Unlock()
-	}()
-}
-
-func (s *StreamHelper) Test2(c *C) {
-	c.Log("2")
-	s.l2.Unlock()
-	s.l3.Lock() // Wait for "3".
-	c.Fail()
-	c.Log("4")
-}
-
-func (s *RunS) TestStreamMode(c *C) {
-	helper := &StreamHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Stream: true}
-	Run(helper, &runConf)
-
-	expected := "START: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\n0\n" +
-		"PASS: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\t *[.0-9]+s\n\n" +
-		"START: run_test\\.go:[0-9]+: StreamHelper\\.Test1\n1\n" +
-		"PASS: run_test\\.go:[0-9]+: StreamHelper\\.Test1\t *[.0-9]+s\n\n" +
-		"START: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n2\n3\n4\n" +
-		"FAIL: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n\n"
-
-	c.Assert(output.value, Matches, expected)
-}
-
-type StreamMissHelper struct{}
-
-func (s *StreamMissHelper) SetUpSuite(c *C) {
-	c.Log("0")
-	c.Fail()
-}
-
-func (s *StreamMissHelper) Test1(c *C) {
-	c.Log("1")
-}
-
-func (s *RunS) TestStreamModeWithMiss(c *C) {
-	helper := &StreamMissHelper{}
-	output := String{}
-	runConf := RunConf{Output: &output, Stream: true}
-	Run(helper, &runConf)
-
-	expected := "START: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n0\n" +
-		"FAIL: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n\n" +
-		"START: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n" +
-		"MISS: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n\n"
-
-	c.Assert(output.value, Matches, expected)
-}
-
-// -----------------------------------------------------------------------
-// Verify that that the keep work dir request indeed does so.
-
-type WorkDirSuite struct {}
-
-func (s *WorkDirSuite) Test(c *C) {
-	c.MkDir()
-}
-
-func (s *RunS) TestKeepWorkDir(c *C) {
-	output := String{}
-	runConf := RunConf{Output: &output, Verbose: true, KeepWorkDir: true}
-	result := Run(&WorkDirSuite{}, &runConf)
-
-	c.Assert(result.String(), Matches, ".*\nWORK=" + result.WorkDir)
-
-	stat, err := os.Stat(result.WorkDir)
-	c.Assert(err, IsNil)
-	c.Assert(stat.IsDir(), Equals, true)
-}
