View Javadoc

1   package org.apache.maven.surefire.util;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.ArrayList;
23  import java.util.Arrays;
24  import java.util.Collections;
25  import java.util.HashSet;
26  import java.util.Iterator;
27  import java.util.List;
28  import java.util.Set;
29  import org.apache.maven.surefire.testset.TestSetFailedException;
30  
31  /**
32   * Contains all the tests that have been found according to specified include/exclude
33   * specification for a given surefire run.
34   *
35   * @author Kristian Rosenvold (junit core adaption)
36   */
37  public class TestsToRun implements Iterable<Class>
38  {
39      private final List<Class> locatedClasses;
40  
41      /**
42       * Constructor
43       *
44       * @param locatedClasses A list of java.lang.Class objects representing tests to run
45       */
46      public TestsToRun( List<Class> locatedClasses )
47      {
48          this.locatedClasses = Collections.unmodifiableList( locatedClasses );
49          Set<Class> testSets = new HashSet<Class>();
50  
51          for ( Class testClass : locatedClasses )
52          {
53              if ( testSets.contains( testClass ) )
54              {
55                  throw new RuntimeException( "Duplicate test set '" + testClass.getName() + "'" );
56              }
57              testSets.add( testClass );
58          }
59      }
60  
61      public static TestsToRun fromClass( Class clazz )
62          throws TestSetFailedException
63      {
64          return new TestsToRun( Arrays.<Class>asList( clazz ) );
65      }
66  
67      /**
68       * Returns an iterator over the located java.lang.Class objects
69       *
70       * @return an unmodifiable iterator
71       */
72      public Iterator<Class> iterator()
73      {
74          return locatedClasses.iterator();
75      }
76  
77      public String toString()
78      {
79          StringBuilder sb = new StringBuilder();
80          sb.append( "TestsToRun: [" );
81          Iterator it = iterator();
82          while ( it.hasNext() )
83          {
84              Class clazz = (Class) it.next();
85              sb.append( " " ).append( clazz.getName() );
86          }
87  
88          sb.append( ']' );
89          return sb.toString();
90      }
91  
92      public boolean containsAtLeast( int atLeast )
93      {
94          return containsAtLeast( iterator(), atLeast );
95      }
96  
97      private boolean containsAtLeast( Iterator it, int atLeast )
98      {
99          for ( int i = 0; i < atLeast; i++ )
100         {
101             if ( !it.hasNext() )
102             {
103                 return false;
104             }
105 
106             it.next();
107         }
108 
109         return true;
110     }
111 
112     public boolean containsExactly( int items )
113     {
114         Iterator it = iterator();
115         return containsAtLeast( it, items ) && !it.hasNext();
116     }
117 
118     /**
119      * @return {@code true}, if the classes may be read eagerly. {@code false},
120      *         if the classes must only be read lazy.
121      */
122     public boolean allowEagerReading()
123     {
124         return true;
125     }
126 
127     public Class[] getLocatedClasses()
128     {
129         if ( !allowEagerReading() )
130         {
131             throw new IllegalStateException( "Cannot eagerly read" );
132         }
133         List<Class> result = new ArrayList<Class>();
134         Iterator<Class> it = iterator();
135         while ( it.hasNext() )
136         {
137             result.add( it.next() );
138         }
139         return result.toArray( new Class[result.size()] );
140     }
141 }