// Type definitions for nodeunit
// Project: https://github.com/caolan/nodeunit
// Definitions by: Jeff Goddard <https://github.com/jedigo>

// Imported from: https://github.com/soywiz/typescript-node-definitions/nodeunit.d.ts

declare module 'nodeunit' {
	export interface ITestCase {
			(testCase: {[property: string]: ITestBody | ITestGroup | void}) : void;
		}
    export var testCase : ITestCase;

	export interface Test {
		done: ICallbackFunction;
		expect(num: number): void;

		//assersions from node assert module
		fail(actual: any, expected: any, message: string, operator: string): void;
		assert(value: any, message: string): void;
		ok(value: any, message?: string): void;
		equal(actual: any, expected: any, message?: string): void;
		notEqual(actual: any, expected: any, message?: string): void;
		deepEqual(actual: any, expected: any, message?: string): void;
		notDeepEqual(actual: any, expected: any, message?: string): void;
		strictEqual(actual: any, expected: any, message?: string): void;
		notStrictEqual(actual: any, expected: any, message?: string): void;
		throws(block: any, error?: any, message?: string): void;
		doesNotThrow(block: any, error?: any, message?: string): void;
		ifError(value: any): void;

		//assertion wrappers
		equals(actual: any, expected: any, message?: string): void;
		same(actual: any, expected: any, message?: string): void;
	}

	// Test Group Usage:
	//  var testGroup: nodeunit.ITestGroup = {
	//      setUp: (callback) => {
	// 	      callback();
	//      },
	//      tearDown: (callback) => {
	// 	       callback();
	//      },
	//      test1: (test: nodeunit.Test) => {
	//          test.done();
	//      }
	//    }
	//    exports.testgroup = testGroup;

	export interface ITestBody {
		(callback: Test): void;
	}

	export interface ITestGroup {
		/** The setUp function is run before each test */
		setUp?: (callback: ICallbackFunction) => void;
		/** The tearDown function is run after each test calls test.done() */
		tearDown?: (callback: ICallbackFunction) => void;
		[property: string] : ITestGroup | ITestBody | ((callback: ICallbackFunction) => void);
	}

	export interface ICallbackFunction {
		(err?: any): void;
	}
}