///
///
///
///
type variantCallback = (variant : Variant) => void;
type HarnessFn = (harness : Harness) => void;
class Harness implements IHarness {
public name : string;
public groupNames : Array;
public templateUrl : string;
public template : string;
public context : Function;
public defaultMocks : MockSetDescriptor;
private variants : Array;
private activeVariant : Variant;
private rootModuleName : string;
protected static harnessList : Array = [Harness.getDefaultHarness()];
constructor(name : string, fn : HarnessFn) {
if (!(this instanceof Harness)) {
var harness = new Harness(name, fn);
fn(harness);
Harness.harnessList.push(harness);
return harness;
} else {
this.name = name;
this.variants = new Array();
this.variants.push(Variant.Empty);
this.groupNames = new Array();
this.groupNames.push('All');
this.template = null;
this.templateUrl = null;
this.context = function () {};
this.defaultMocks = {};
}
}
public getTemplate() : string {
var variant = this.getActiveVariant();
if (!variant || !variant.template) {
return this.template;
}
return variant.template;
}
public getTemplateUrl() : string {
var variant = this.getActiveVariant();
if (!variant || !variant.templateUrl) {
return this.templateUrl;
}
return variant.templateUrl;
}
public getContext() : Function {
var variant = this.getActiveVariant();
if (!variant || !variant.context) {
return this.context;
}
return variant.context;
}
public setContext(ctx : Function) : void {
this.context = ctx;
}
public setTemplateUrl(templateUrl : string) : void {
this.templateUrl = templateUrl;
}
public setTemplate(template : string) : void {
this.template = template;
}
public setDefaultMocks(defaultMocks : MockSetDescriptor) : void {
this.defaultMocks = defaultMocks;
}
public getDefaultMocks() : MockSetDescriptor {
var variant = this.activeVariant;
if(!variant) {
return this.defaultMocks;
}
if(variant.defaultMocks) {
return Harness.mergeMocks(variant.defaultMocks, variant.additionalMocks);
}
if(variant.additionalMocks) {
return Harness.mergeMocks(this.defaultMocks, variant.additionalMocks);
}
return this.defaultMocks;
}
public getRootModuleName() : string {
return this.rootModuleName || 'Application';
}
public addVariant(name : string, fn : variantCallback) {
var variant = new Variant(name);
fn(variant);
this.variants.push(variant);
}
public activateVariant(name : string) {
this.activeVariant = this.getVariantByName(name);
}
public addToGroup(groupName : string) : void {
this.groupNames.push(groupName);
}
public getVariantByName(variantName : string) : Variant {
for (var i = 0; i < this.variants.length; i++) {
if (this.variants[i].name === variantName) {
return this.variants[i];
}
}
return null;
}
public hasVariant(variantName : string) : boolean {
return this.getVariantByName(variantName) !== null;
}
public static getEmptyVariantName() : string {
return Variant.Empty.name;
}
public getVariantNames() : Array {
return this.variants.map(function (variant : Variant) {
return variant.name;
});
}
public getActiveVariant() : Variant {
return this.activeVariant;
}
public static getHarnessByName(harnessName : string) : Harness {
return Harness.harnessList.filter(function (harness) {
return harness.name == harnessName;
})[0];
}
public static load(activeMocks : MockSetDescriptor) : void {
throw new Error("Override this in a subclass");
}
public static unload() : void {
Harness.load({});
}
public static getDefaultHarness() : Harness {
return new Harness('-- None --', function (harness : Harness) {});
}
public static getAllInGroup(groupName : string) : Array {
return Harness.harnessList.filter(function (harness : Harness) {
return harness.groupNames.indexOf(groupName) !== -1;
});
}
public static getGroupNames() : Array {
var names : string[] = [];
for (var i = 0; i < Harness.harnessList.length; i++) {
for (var j = 0; j < Harness.harnessList[i].groupNames.length; j++) {
var name = Harness.harnessList[i].groupNames[j];
if (names.indexOf(name) === -1) names.push(name);
}
}
names.sort();
names.splice(names.indexOf('All'), 1);
names.unshift('All');
return names;
}
public static mergeMocks(dest : MockSetDescriptor, src : MockSetDescriptor) : MockSetDescriptor {
if(!src) src = {};
var keys = Object.keys(dest).concat(Object.keys(src));
var retn : MockSetDescriptor = {};
for(var i = 0; i < keys.length; i++) {
retn[keys[i]] = dest[keys[i]];
if(src[keys[i]]) {
retn[keys[i]] = src[keys[i]];
}
}
return retn;
}
}
(function () {
window['Harness'] = Harness;
if (window['jasmine'] || window['mocha']) {
var fn = function (itFn : Function) {
return function (testName : string, impl : Function) {
//inspect the arguments of the impl function,
//if it declares any parameters, treat it as async
var str = impl.toString();
var argStart = str.indexOf('(') + 1;
var argEnd = str.indexOf(')');
var argStr = str.substring(argStart, argEnd).trim();
var isAsync = argStr !== '';
if (isAsync) {
return itFn(testName, function (done : () => void) {
impl.apply(this, arguments);
Harness.unload();
});
} else {
return itFn(testName, function () {
impl.apply(this, arguments);
Harness.unload();
});
}
}
};
window['it'] = fn(window['it']);
window['xit'] = fn(window['xit']);
window['fit'] = fn(window['fit']);
}
})();