blob: 7a2233ee744fcf6bb08cb1797c9d800f966f00e5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.tests.common;
import java.util.Arrays;
import java.util.regex.Pattern;
import org.junit.Assert;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
/**
* @since 1.1
*/
public class ClasspathHelpers {
/**
* Returns classpath entry with given path. Throws AssertionError if no such entry.
*/
public static IClasspathEntry getClasspathEntry(IClasspathEntry[] cp, IPath path) {
for(IClasspathEntry cpe : cp) {
if(path.equals(cpe.getPath())) {
return cpe;
}
}
Assert.fail("Missing classpath entry " + path);
return null;
}
public static IClasspathEntry getClasspathEntry(IClasspathEntry[] cp, String path) {
return getClasspathEntry(cp, new Path(path));
}
/**
* Asserts that classpath has one and only one entry with given first path segments.
*/
public static void assertClasspathEntry(IClasspathEntry[] cp, String... segments) {
int count = 0;
for(IClasspathEntry cpe : cp) {
if(startsWith(cpe.getPath(), segments)) {
count++ ;
}
}
Assert.assertEquals("Unexpected classpath with prefix " + Arrays.toString(segments), 1, count);
}
private static boolean startsWith(IPath path, String[] segments) {
if(path.segmentCount() < segments.length) {
return false;
}
for(int i = 0; i < segments.length; i++ ) {
if(!segments[i].equals(path.segment(i))) {
return false;
}
}
return true;
}
/**
* Asserts that classpath has one and only one entry with given path.
*/
public static void assertClasspathEntry(IClasspathEntry[] cp, IPath path) {
int count = 0;
for(IClasspathEntry cpe : cp) {
if(cpe.getPath().equals(path)) {
count++ ;
}
}
Assert.assertEquals("Number of classpath entries with path " + path, 1, count);
}
/**
* Asserts that classpath matches specified path regex patterns.
*/
public static void assertClasspath(String[] expectedPathPatterns, IClasspathEntry[] cp) {
boolean matches = false;
if(expectedPathPatterns.length == cp.length) {
matches = true;
for(int i = 0; i < expectedPathPatterns.length; i++ ) {
if(!Pattern.matches(expectedPathPatterns[i], cp[i].getPath().toPortableString())) {
matches = false;
break;
}
}
}
if(!matches) {
// pretty format and fail
StringBuilder sb_expected = new StringBuilder();
for(String expected : expectedPathPatterns) {
sb_expected.append(expected).append("\n");
}
StringBuilder sb_actual = new StringBuilder();
for(IClasspathEntry cpe : cp) {
sb_actual.append(cpe.getPath().toPortableString()).append("\n");
}
Assert.assertEquals("Unexpected classpath", sb_expected.toString(), sb_actual.toString());
}
}
/**
* @since 1.6
*/
public static void assertClasspath(IProject project, String... expectedPatterns) throws CoreException {
IJavaProject javaProject = JavaCore.create(project);
Assert.assertNotNull("Is a Java project", javaProject);
assertClasspath(expectedPatterns, javaProject.getRawClasspath());
}
public static IClasspathAttribute getClasspathAttribute(IClasspathEntry entry, String attributeName) {
for(IClasspathAttribute a : entry.getExtraAttributes()) {
if(attributeName.equals(a.getName())) {
return a;
}
}
return null;
}
}