1 package org.apache.maven.surefire.common.junit48;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.junit.runner.Description;
23 import org.junit.runner.manipulation.Filter;
24
25 import java.util.Collection;
26
27 final class CombinedCategoryFilter
28 extends Filter
29 {
30 private final Collection<Filter> includedFilters;
31
32 private final Collection<Filter> excludedFilters;
33
34 CombinedCategoryFilter( Collection<Filter> includedFilters, Collection<Filter> excludedFilters )
35 {
36 this.includedFilters = includedFilters;
37 this.excludedFilters = excludedFilters;
38 }
39
40 @Override
41 public boolean shouldRun( Description description )
42 {
43 return ( includedFilters.isEmpty() || anyFilterMatchesDescription( includedFilters, description ) )
44 && ( excludedFilters.isEmpty() || allFiltersMatchDescription( excludedFilters, description ) );
45 }
46
47 private boolean anyFilterMatchesDescription( Collection<Filter> filters, Description description )
48 {
49 for ( Filter f : filters )
50 {
51 if ( f.shouldRun( description ) )
52 {
53 return true;
54 }
55 }
56 return false;
57 }
58
59 private boolean allFiltersMatchDescription( Collection<Filter> filters, Description description )
60 {
61 for ( Filter f : filters )
62 {
63 if ( !f.shouldRun( description ) )
64 {
65 return false;
66 }
67 }
68 return true;
69 }
70
71 @Override
72 public String describe()
73 {
74 StringBuilder sb = new StringBuilder();
75 if ( !includedFilters.isEmpty() )
76 {
77 sb.append( "(" );
78 sb.append( joinFilters( includedFilters, " OR " ) );
79 sb.append( ")" );
80 if ( !excludedFilters.isEmpty() )
81 {
82 sb.append( " AND " );
83 }
84 }
85
86 if ( !excludedFilters.isEmpty() )
87 {
88 sb.append( "NOT (" );
89 sb.append( joinFilters( includedFilters, " OR " ) );
90 sb.append( ")" );
91 }
92
93 return sb.toString();
94 }
95
96 private String joinFilters( Collection<Filter> filters, String sep )
97 {
98 boolean isFirst = true;
99 StringBuilder sb = new StringBuilder();
100 for ( Filter f : filters )
101 {
102 if ( !isFirst )
103 {
104 sb.append( sep );
105 }
106 sb.append( f.describe() );
107 isFirst = false;
108 }
109 return sb.toString();
110 }
111 }