code: @Override public void filter(Filter filter) throws NoTestsRemainException {
      List<Runner> filteredChildren = ParentRunnerSpy.getFilteredChildren(this);
      // Iterate over a clone so that we can safely mutate the original.
      for (Runner child : new ArrayList<>(filteredChildren)) {
        try {
          filter.apply(child);
        } catch (NoTestsRemainException e) {
          filteredChildren.remove(child);
        }
      }
      if (filteredChildren.isEmpty()) {
        throw new NoTestsRemainException();
      }
    }
docs: /*
  ParentRunner's default filter implementation generates a hierarchy of test descriptions,
  applies the filter to those descriptions, and removes any test nodes whose descriptions were
  all filtered out.
  <p>
  This would be problematic for us since we generate non-standard test descriptions which include
  parameter information. This implementation lets each {@link BurstRunner} child filter itself
  via {@link BurstRunner#filter(Filter)}.