import { AnswersQuestions } from '@serenity-js/core'; import { formatted } from '@serenity-js/core/lib/io'; import { Expectation } from '../Expectation'; import { ExpectationMet, ExpectationNotMet, Outcome } from '../outcomes'; export function containItemsWhereEachItem(expectation: Expectation): Expectation { return new ContainItemsWhereEachItemMeetsExpectation(expectation); } /** * @package */ class ContainItemsWhereEachItemMeetsExpectation extends Expectation { constructor(private readonly expectation: Expectation) { super(); } answeredBy(actor: AnswersQuestions): (actual: Actual[]) => Promise> { return (actual: Actual[]) => actual.length === 0 ? Promise.resolve(new ExpectationNotMet(this.toString(), null, actual)) : Promise.all(actual.map(item => this.expectation.answeredBy(actor)(item))) .then(results => results.every(result => result instanceof ExpectationMet) ? new ExpectationMet(this.toString(), results[0].expected, actual) : new ExpectationNotMet(this.toString(), results[0].expected, actual), ); } toString(): string { return formatted `contain items where each item does ${ this.expectation }`; } }