jasmine/src/base.js

214 lines
5.2 KiB
JavaScript
Raw Normal View History

/*
* Jasmine internal classes & objects
*/
/** @namespace */
var jasmine = {};
/** @deprecated use jasmine (lowercase because it's a package name) instead */
var Jasmine = jasmine;
jasmine.unimplementedMethod_ = function() {
throw new Error("unimplemented method");
};
jasmine.bindOriginal_ = function(base, name) {
var original = base[name];
return function() {
return original.apply(base, arguments);
};
};
jasmine.setTimeout = jasmine.bindOriginal_(window, 'setTimeout');
jasmine.clearTimeout = jasmine.bindOriginal_(window, 'clearTimeout');
jasmine.setInterval = jasmine.bindOriginal_(window, 'setInterval');
jasmine.clearInterval = jasmine.bindOriginal_(window, 'clearInterval');
jasmine.MessageResult = function(text) {
this.type = 'MessageResult';
this.text = text;
this.trace = new Error(); // todo: test better
};
jasmine.ExpectationResult = function(passed, message, details) {
this.type = 'ExpectationResult';
this.passed = passed;
this.message = message;
this.details = details;
this.trace = new Error(message); // todo: test better
};
jasmine.getEnv = function() {
return jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
};
jasmine.isArray_ = function(value) {
return value &&
typeof value === 'object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));
};
jasmine.pp = function(value) {
var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
stringPrettyPrinter.format(value);
return stringPrettyPrinter.string;
};
jasmine.isDomNode = function(obj) {
return obj['nodeType'] > 0;
};
jasmine.any = function(clazz) {
return new jasmine.Matchers.Any(clazz);
};
jasmine.createSpy = function(name) {
var spyObj = function() {
spyObj.wasCalled = true;
spyObj.callCount++;
var args = jasmine.util.argsToArray(arguments);
spyObj.mostRecentCall = {
object: this,
args: args
};
spyObj.argsForCall.push(args);
return spyObj.plan.apply(this, arguments);
};
spyObj.identity = name || 'unknown';
spyObj.isSpy = true;
spyObj.plan = function() {
};
spyObj.andCallThrough = function() {
spyObj.plan = spyObj.originalValue;
return spyObj;
};
spyObj.andReturn = function(value) {
spyObj.plan = function() {
return value;
};
return spyObj;
};
spyObj.andThrow = function(exceptionMsg) {
spyObj.plan = function() {
throw exceptionMsg;
};
return spyObj;
};
spyObj.andCallFake = function(fakeFunc) {
spyObj.plan = fakeFunc;
return spyObj;
};
spyObj.reset = function() {
spyObj.wasCalled = false;
spyObj.callCount = 0;
spyObj.argsForCall = [];
spyObj.mostRecentCall = {};
};
spyObj.reset();
return spyObj;
};
jasmine.createSpyObj = function(baseName, methodNames) {
var obj = {};
for (var i = 0; i < methodNames.length; i++) {
obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
}
return obj;
};
jasmine.log = function(message) {
jasmine.getEnv().currentSpec.getResults().log(message);
};
var spyOn = function(obj, methodName) {
return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
};
var it = function(desc, func) {
return jasmine.getEnv().it(desc, func);
};
//this mirrors the spec syntax so you can define a spec description that will not run.
var xit = function(desc, func) {
return jasmine.getEnv().xit(desc, func);
};
var expect = function(actual) {
return jasmine.getEnv().currentSpec.expect(actual);
};
var runs = function(func) {
jasmine.getEnv().currentSpec.runs(func);
};
var waits = function(timeout) {
jasmine.getEnv().currentSpec.waits(timeout);
};
var waitsFor = function(timeout, latchFunction, message) {
jasmine.getEnv().currentSpec.waitsFor(timeout, latchFunction, message);
};
var beforeEach = function(beforeEachFunction) {
jasmine.getEnv().beforeEach(beforeEachFunction);
};
var afterEach = function(afterEachFunction) {
jasmine.getEnv().afterEach(afterEachFunction);
};
var describe = function(description, specDefinitions) {
return jasmine.getEnv().describe(description, specDefinitions);
};
var xdescribe = function(description, specDefinitions) {
return jasmine.getEnv().xdescribe(description, specDefinitions);
};
jasmine.XmlHttpRequest = XMLHttpRequest;
// Provide the XMLHttpRequest class for IE 5.x-6.x:
if (typeof XMLHttpRequest == "undefined") jasmine.XmlHttpRequest = function() {
try {
return new ActiveXObject("Msxml2.XMLHTTP.6.0");
} catch(e) {
}
try {
return new ActiveXObject("Msxml2.XMLHTTP.3.0");
} catch(e) {
}
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
}
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
}
throw new Error("This browser does not support XMLHttpRequest.");
};
jasmine.include = function(url, opt_global) {
if (opt_global) {
document.write('<script type="text/javascript" src="' + url + '"></' + 'script>');
} else {
var xhr;
try {
xhr = new jasmine.XmlHttpRequest();
xhr.open("GET", url, false);
xhr.send(null);
} catch(e) {
throw new Error("couldn't fetch " + url + ": " + e);
}
return eval(xhr.responseText);
}
};