emitsInOrder function

StreamMatcher emitsInOrder (Iterable matchers)

Returns a StreamMatcher that matches the stream if each matcher in matchers matches, one after another.

If any matcher fails to match, this fails and consumes no events.

Implementation

StreamMatcher emitsInOrder(Iterable matchers) {
  var streamMatchers = matchers.map(emits).toList();
  if (streamMatchers.length == 1) return streamMatchers.first;

  var description = "do the following in order:\n" +
      bullet(streamMatchers.map((matcher) => matcher.description));

  return StreamMatcher((queue) async {
    for (var i = 0; i < streamMatchers.length; i++) {
      var matcher = streamMatchers[i];
      var result = await matcher.matchQueue(queue);
      if (result == null) continue;

      var newResult = "didn't ${matcher.description}";
      if (result.isNotEmpty) {
        newResult += newResult.contains("\n") ? "\n" : " ";
        newResult += "because it $result";
      }
      return newResult;
    }
    return null;
  }, description);
}