/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.tb3;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class AffectedTB3TestLocator extends TB3TestLocator {
private final ChangedTB3TestLocator changedTB3TestLocator;
public AffectedTB3TestLocator() {
changedTB3TestLocator = new ChangedTB3TestLocator();
}
@Override
protected <T> List<Class<? extends T>> findClasses(Class<T> baseClass,
String basePackage, String[] ignoredPackages) throws IOException {
List<Class<? extends T>> allTestClasses = super.findClasses(baseClass,
basePackage, ignoredPackages);
List<Class<? extends T>> changedTestClasses = changedTB3TestLocator
.findClasses(baseClass, basePackage, ignoredPackages);
return getAffectedTestClasses(allTestClasses, changedTestClasses);
}
private <T> List<Class<? extends T>> getAffectedTestClasses(
List<Class<? extends T>> allTestClasses,
List<Class<? extends T>> changedTestClasses) throws IOException {
Set testClasses = new HashSet(changedTestClasses);
testClasses
.addAll(getTestClassesWithAffectedPackageName(allTestClasses));
List<Class<? extends T>> affectedTestClasses = new ArrayList<>();
affectedTestClasses.addAll(testClasses);
return affectedTestClasses;
}
private <T> List<Class<? extends T>> getTestClassesWithAffectedPackageName(
List<Class<? extends T>> classes) {
List<Class<? extends T>> affectedTestClasses = new ArrayList<>();
List<String> affectedFiles = getAffectedFiles();
for (Class c : classes) {
String[] packageParts = c.getName().split("\\.");
String lastPart = packageParts[packageParts.length - 2];
for (String f : affectedFiles) {
if (f.toLowerCase().contains(lastPart.toLowerCase())) {
affectedTestClasses.add(c);
// Break here not to accidentally add the same test class
// multiple times if it matches more than one file.
break;
}
}
}
return affectedTestClasses;
}
private List<String> getAffectedFiles() {
List<String> affectedFilePaths = new ArrayList<>();
for (String path : changedTB3TestLocator.getChangedFilePaths()) {
if (!path.toLowerCase().contains("test")) {
affectedFilePaths.add(path);
}
}
return affectedFilePaths;
}
}