001    package org.junit.runner.manipulation;
002    
003    import java.util.Comparator;
004    
005    import org.junit.runner.Description;
006    
007    /**
008     * A <code>Sorter</code> orders tests. In general you will not need
009     * to use a <code>Sorter</code> directly. Instead, use {@link org.junit.runner.Request#sortWith(Comparator)}.
010     *
011     * @since 4.0
012     */
013    public class Sorter implements Comparator<Description> {
014        /**
015         * NULL is a <code>Sorter</code> that leaves elements in an undefined order
016         */
017        public static final Sorter NULL = new Sorter(new Comparator<Description>() {
018            public int compare(Description o1, Description o2) {
019                return 0;
020            }
021        });
022    
023        private final Comparator<Description> comparator;
024    
025        /**
026         * Creates a <code>Sorter</code> that uses <code>comparator</code>
027         * to sort tests
028         *
029         * @param comparator the {@link Comparator} to use when sorting tests
030         */
031        public Sorter(Comparator<Description> comparator) {
032            this.comparator = comparator;
033        }
034    
035        /**
036         * Sorts the test in <code>runner</code> using <code>comparator</code>
037         */
038        public void apply(Object object) {
039            if (object instanceof Sortable) {
040                Sortable sortable = (Sortable) object;
041                sortable.sort(this);
042            }
043        }
044    
045        public int compare(Description o1, Description o2) {
046            return comparator.compare(o1, o2);
047        }
048    }