rpd
Version:
RPD is a minimal framework for building Node-Based User Interfaces, powered by Reactive Programming
127 lines (123 loc) • 5.79 kB
JavaScript
;(function(global) {
var RpdMatchers = {
toHaveBeenOrderlyCalledWith: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
var result = { pass: false };
var actual_count = actual.calls.count();
if (expected.length > actual_count) {
result.message = 'Expected spy ' + actual.and.identity() +
' to have been called at least ' + expected.length + ' times,' +
' but it was called only ' + actual.calls.count() + ' times';
return result;
}
var expected_clone = [].concat(expected);
for (var i = 0, ei = 0; i < actual_count; i++) {
if (util.equals(actual.calls.argsFor(i), expected[ei], customEqualityTesters)) {
expected_clone.pop(); ei++;
}
}
if (expected_clone.length > 0) {
result.message = 'Expected spy ' + actual.and.identity() +
' to have been called with ' + expected_clone.pop() + ', but it was not.';
return result;
}
result.pass = true;
return result;
}
}
},
toHaveBeenCalledOnce: function(util, customEqualityTesters) {
return {
compare: function(actual) {
var result = { pass: false };
var actual_count = actual.calls.count();
if (1 !== actual_count) {
result.message = 'Expected spy ' + actual.and.identity() +
' to have been called once,' +
((actual_count === 0) ? ' but it was never called'
: ' but it was called ' + actual.calls.count() + ' times');
return result;
}
result.pass = true;
return result;
}
}
},
toHaveBeenCalledTwice: function(util, customEqualityTesters) {
return {
compare: function(actual) {
var result = { pass: false };
var actual_count = actual.calls.count();
if (2 !== actual_count) {
result.message = 'Expected spy ' + actual.and.identity() +
' to have been called once,' +
((actual_count === 0) ? ' but it was never called'
: ' but it was called ' + actual.calls.count() + ' times');
return result;
}
result.pass = true;
return result;
}
}
},
toHaveBeenCalledTimes: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
var result = { pass: false };
var actual_count = actual.calls.count();
if (expected !== actual_count) {
result.message = 'Expected spy ' + actual.and.identity() +
' to have been called ' + expected + ' times,' +
((actual_count === 0) ? ' but it was never called'
: ' but it was called ' + actual.calls.count() + ' times');
return result;
}
result.pass = true;
return result;
}
}
},
toReportError: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
var result = { };
var gotError;
Rpd.events.onError(function(firedError) {
//console.log('got error', firedError);
gotError = firedError;
});
actual();
result.pass = gotError && util.equals(gotError.type, expected, customEqualityTesters);
result.message = 'Expected error ' + (expected || 'Unknown') + (result.pass ? ' not' : '') +
' to be fired, but ' + (gotError ? gotError.type : 'nothing') + ' was catched';
return result;
}
}
},
toReportAnyError: function(util, customEqualityTesters) {
return {
compare: function(actual) {
var result = { };
var gotError;
Rpd.events.onError(function(firedError) {
gotError = firedError;
});
actual();
result.pass = gotError;
result.message = 'Expected' + (result.pass ? ' no' : '') + ' error to be fired, but at least one'
+ (gotError ? (' of type ' + gotError.type) : '') + ' was' + (gotError ? '' : ' not');
return result;
}
}
}
};
if (typeof define === 'function' && define.amd) {
define([], function() { return Rpd; });
global.RpdMatchers = RpdMatchers;
} else if (typeof module === "object" && typeof exports === "object") {
module.exports = RpdMatchers;
} else {
global.RpdMatchers = RpdMatchers;
}
})(this);