| "use strict"; |
| |
| var every = require("./prototypes/array").every; |
| |
| /** |
| * @private |
| */ |
| function hasCallsLeft(callMap, spy) { |
| if (callMap[spy.id] === undefined) { |
| callMap[spy.id] = 0; |
| } |
| |
| return callMap[spy.id] < spy.callCount; |
| } |
| |
| /** |
| * @private |
| */ |
| function checkAdjacentCalls(callMap, spy, index, spies) { |
| var calledBeforeNext = true; |
| |
| if (index !== spies.length - 1) { |
| calledBeforeNext = spy.calledBefore(spies[index + 1]); |
| } |
| |
| if (hasCallsLeft(callMap, spy) && calledBeforeNext) { |
| callMap[spy.id] += 1; |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** |
| * A Sinon proxy object (fake, spy, stub) |
| * @typedef {object} SinonProxy |
| * @property {Function} calledBefore - A method that determines if this proxy was called before another one |
| * @property {string} id - Some id |
| * @property {number} callCount - Number of times this proxy has been called |
| */ |
| |
| /** |
| * Returns true when the spies have been called in the order they were supplied in |
| * @param {SinonProxy[] | SinonProxy} spies An array of proxies, or several proxies as arguments |
| * @returns {boolean} true when spies are called in order, false otherwise |
| */ |
| function calledInOrder(spies) { |
| var callMap = {}; |
| // eslint-disable-next-line no-underscore-dangle |
| var _spies = arguments.length > 1 ? arguments : spies; |
| |
| return every(_spies, checkAdjacentCalls.bind(null, callMap)); |
| } |
| |
| module.exports = calledInOrder; |