lib/subject/eachSubject.js

/** @module certainty */
var ProxyBase = require('./proxy');
var subjectFactory = require('./factoryBase');

/** A subject which executes its assertions on each element of an iterable.
    @param {Subject} The subject responsible for creating this.
    @param {Array} elements List of elements to test.
    @param {string} elementName What noun to use when referring to elements ('item', 'child', etc.)
    @param {bool} opt_noIndex If true, don't include the element index in the failure message.
    @constructor
    @extends ProxyBase
  */
function EachSubject(subject, elements, elementName, opt_noIndex) {
  ProxyBase.call(this);
  this.elementSubjects = [];
  for (var i = 0; i < elements.length; ++i) {
    var es = subjectFactory.newSubject(subject.failureStrategy, elements[i]);
    es.named(elementName + (opt_noIndex ? '' : (' ' + i)) + ' of ' + subject.describe());
    es.failureMessage = subject.failureMessage;
    this.elementSubjects.push(es);
  }
}
EachSubject.prototype = Object.create(ProxyBase.prototype);
EachSubject.prototype.constructor = ProxyBase;

/** Called for a proxied method; invokes the method once for every element in the list. */
EachSubject.prototype.invoke = function(methodName, args) {
  for (var i = 0; i < this.elementSubjects.length; ++i) {
    var subject = this.elementSubjects[i];
    this.elementSubjects[i] = this.getMethod(subject, methodName).apply(subject, args);
  }
  return this;
};

module.exports = EachSubject;