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 }