View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one   *
3    * or more contributor license agreements.  See the NOTICE file *
4    * distributed with this work for additional information        *
5    * regarding copyright ownership.  The ASF licenses this file   *
6    * to you under the Apache License, Version 2.0 (the            *
7    * "License"); you may not use this file except in compliance   *
8    * with the License.  You may obtain a copy of the License at   *
9    *                                                              *
10   *   http://www.apache.org/licenses/LICENSE-2.0                 *
11   *                                                              *
12   * Unless required by applicable law or agreed to in writing,   *
13   * software distributed under the License is distributed on an  *
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15   * KIND, either express or implied.  See the License for the    *
16   * specific language governing permissions and limitations      *
17   * under the License.                                           *
18   */
19  package org.apache.rat.analysis.matchers;
20  
21  import static org.junit.jupiter.api.Assertions.assertEquals;
22  import static org.junit.jupiter.api.Assertions.assertFalse;
23  
24  import java.util.ArrayList;
25  import java.util.Arrays;
26  import java.util.HashSet;
27  import java.util.List;
28  import java.util.Set;
29  import java.util.stream.Stream;
30  
31  import org.apache.rat.analysis.IHeaderMatcher.State;
32  import org.junit.jupiter.params.ParameterizedTest;
33  import org.junit.jupiter.params.provider.Arguments;
34  import org.junit.jupiter.params.provider.MethodSource;
35  
36  public class CopyrightMatcherTest {
37      private final static int NAME = 0;
38      private final static int TEXT = 1;
39      // to be added
40      private static String[] prefix = { "Copyright", "©", "(C)", "(c)" };
41  
42      private final static String[] D = { "-d", " 1990-1991" };
43      private final static String[] DO = { "-d-o", " 1990-1991 an owner" };
44      private final static String[] OD = { "-o-d", " an owner 1990-1991" };
45      private final static String[] DOS = { "-d-o-s", " 1990 - 1991 an owner" };
46      private final static String[] ODS = { "-o-d-s", " an owner 1990 - 1991" };
47      private final static String[] S = { "-s", " 1990" };
48      private final static String[] O = { "-o", " an owner" };
49      private final static String[] OS = { "-o-s", " an owner 1990" };
50      private final static String[] SO = { "-s-o", " 1990 an owner" };
51  
52      private static final int TOTAL_TESTS = prefix.length * 9;
53  
54      static Arguments startStopOwner = Arguments.of("start-stop-owner", "1990", "1991", "an owner",
55              expandResults( DO, OD, DOS, ODS) , expandResults( D, S, O, OS, SO ));
56      static Arguments startOwner = Arguments.of( "start-owner", "1990", null, "an owner", 
57              expandResults( OS, SO, OD, ODS ), expandResults( D, DO, DOS, S, O ) );
58      static Arguments start = Arguments.of("start", "1990", null, null, expandResults(D, DO, DOS, S, SO ),
59              expandResults(OD, ODS, O, OS ) );
60      static Arguments owner = Arguments.of("owner", null, null, "an owner", expandResults( O, OD, ODS, OS ),
61  expandResults( DO, DOS, S, D, SO ) );
62      static Arguments nada = Arguments.of("nada", null, null, null, expandResults( D, DO, DOS, S, SO ),
63              expandResults( OD, ODS, O, OS ) );
64  
65      
66      
67      public static Stream<Arguments> parameterProvider() {
68          return Stream.of( startStopOwner, startOwner, start, owner, nada);
69      }
70  
71      private static String[][] expandResults( String[]...args) {
72          List<String[]> arry = new ArrayList<>();
73          for (String pfx : prefix) {
74            Arrays.stream(args).map(origin -> new String[] { pfx + origin[0], pfx + origin[1] })
75                    .forEach(arry::add);
76          }
77          return arry.toArray(new String[arry.size()][2]);
78      }
79  
80      private static void verify(String testName, String[][] pass, String[][] fail) {
81          assertEquals(TOTAL_TESTS, pass.length + fail.length, "Wrong number of pass/fail tests");
82          Set<String> passSet = new HashSet<String>();
83          Arrays.stream(pass).forEach(s -> passSet.add(s[0]));
84          Set<String> failSet = new HashSet<String>();
85          Arrays.stream(fail).forEach(s -> failSet.add(s[0]));
86          for (String s : passSet) {
87              assertFalse(failSet.contains(s), ()->String.format("%s is in both pass and fail sets for %s", s, testName));
88          }
89      }
90  
91      @ParameterizedTest
92      @MethodSource("parameterProvider")
93      public void testPass(String testName, String start, String stop, String owner, String[][] pass,
94              String[][] fail) {
95          verify(testName, pass, fail);
96          CopyrightMatcher matcher = new CopyrightMatcher(start, stop, owner);
97          for (String[] target : pass) {
98              assertEquals(State.i, matcher.currentState(), ()->String.format("%s:%s failed", testName, target[NAME]));
99              assertEquals(State.t, matcher.matches(target[TEXT]), ()->String.format("%s:%s failed", testName, target[NAME]));
100             matcher.reset();
101             assertEquals(State.i, matcher.currentState(),()->String.format("%s:%s failed", testName, target[NAME]));
102         }
103     }
104 
105     @ParameterizedTest
106     @MethodSource("parameterProvider")
107     public void testFail(String testName, String start, String stop, String owner, String[][] pass,
108             String[][] fail) {
109         verify(testName, pass, fail);
110         CopyrightMatcher matcher = new CopyrightMatcher(start, stop, owner);
111         for (String[] target : fail) {
112             assertEquals( State.i, matcher.currentState(), ()->String.format("%s:%s passed", testName, target[NAME]));
113             assertEquals( State.i, matcher.matches(target[TEXT]), ()->String.format("%s:%s passed", testName, target[NAME]));
114             assertEquals( State.f, matcher.finalizeState(), ()->String.format("%s:%s passed", testName, target[NAME]));
115             matcher.reset();
116             assertEquals( State.i, matcher.currentState(), ()->String.format("%s:%s passed", testName, target[NAME]));
117         }
118     }
119 }