function assert(b) {
	if (!b) {
		throw new Error("Failed Assertion");
  }
}

function TestSuite() {
	this.tests = Array();
	this.catcherrors = false;
}

TestSuite.prototype.add = function(testfunc) {
  this.tests.push(testfunc);
}

if (is_nav) {
	Error.prototype.errinfo = function() {
		// Mozilla
		return 'At <' + this.fileName + ':' + this.lineNumber + '>, stack:\n' + this.stack;
	}
}

function RemoteError(name, msg) {
	Error.call(this);
	this.name = name;
	this.msg = msg;
}
RemoteError.prototype = new Error();
RemoteError.prototype.errinfo = function() {
	return this.msg;
}

TestSuite.prototype.run = function(outelem) {
	var failed = 0;
	var succeeded = 0;
	outelem.innerHTML = 'Testing...';
	for (var i in this.tests) {
		if (this.catcherrors) {
			try {
				this.tests[i]();
				succeeded += 1;
			}
			catch (e) {
				failed += 1;
				var msg = '<p class="testfailed">Test '+i+' failed: ' + e;
				if (e instanceof Error)
					msg += '<br/>' + e.errinfo();
				msg += '</p>';
				outelem.innerHTML += msg;
			}
		}
		else {
			this.tests[i]();
			succeeded += 1;
		}
	}
	if (failed) {
		outelem.innerHTML += '<p>FAILED: '+failed+' Test(s) failed, '+succeeded+' Test(s) succeeded.</p>';
	}
	else {
		outelem.innerHTML += '<p>OK: All '+succeeded+' Tests succeeded</p>';
	}
}

var testSuite = new TestSuite();


