001 package org.junit.runner.manipulation;
002
003 import java.util.Collection;
004 import java.util.Collections;
005 import java.util.HashSet;
006 import java.util.List;
007 import java.util.Set;
008
009 import org.junit.runner.Description;
010
011 /**
012 * Orders tests.
013 *
014 * @since 4.13
015 */
016 public final class Orderer {
017 private final Ordering ordering;
018
019 Orderer(Ordering delegate) {
020 this.ordering = delegate;
021 }
022
023 /**
024 * Orders the descriptions.
025 *
026 * @return descriptions in order
027 */
028 public List<Description> order(Collection<Description> descriptions)
029 throws InvalidOrderingException {
030 List<Description> inOrder = ordering.orderItems(
031 Collections.unmodifiableCollection(descriptions));
032 if (!ordering.validateOrderingIsCorrect()) {
033 return inOrder;
034 }
035
036 Set<Description> uniqueDescriptions = new HashSet<Description>(descriptions);
037 if (!uniqueDescriptions.containsAll(inOrder)) {
038 throw new InvalidOrderingException("Ordering added items");
039 }
040 Set<Description> resultAsSet = new HashSet<Description>(inOrder);
041 if (resultAsSet.size() != inOrder.size()) {
042 throw new InvalidOrderingException("Ordering duplicated items");
043 } else if (!resultAsSet.containsAll(uniqueDescriptions)) {
044 throw new InvalidOrderingException("Ordering removed items");
045 }
046
047 return inOrder;
048 }
049
050 /**
051 * Order the tests in <code>target</code>.
052 *
053 * @throws InvalidOrderingException if ordering does something invalid (like remove or add
054 * children)
055 */
056 public void apply(Object target) throws InvalidOrderingException {
057 if (target instanceof Orderable) {
058 Orderable orderable = (Orderable) target;
059 orderable.order(this);
060 }
061 }
062 }