blob: 5b628434dbc953e3d2531dbf53b073742085c93e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.pldt.tests;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import org.eclipse.cdt.core.tests.BaseTestFramework;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.ptp.pldt.internal.common.IDs;
import org.osgi.framework.Bundle;
/**
* Basic Test framework for PLDT tests, extends that of CDT
*
* @author Beth Tibbitts
*
*/
public abstract class PldtBaseTestFramework extends BaseTestFramework {
private static HashMap<String, ArrayList<Integer>> lineMaps = new HashMap<String, ArrayList<Integer>>();
/**
* Return a file imported for use in the tests. Includes determining if the
* file exists
*/
protected IFile importFile(String srcDir, String filename) throws Exception {
assertTrue("Missing file: " + filename, testExists(srcDir, filename));
IFile result = super.importFile(filename, readTestFile(srcDir, filename));
return result;
}
/**
* Determine if a file exists
*
* @param srcDir
* source directory in which the file should be located
* @param filename
* file name of file to find
* @return
*/
private boolean testExists(String srcDir, String filename) {
String fullname = srcDir + File.separator + filename;
IPath path = new Path(fullname);
Activator a = Activator.getDefault();
Bundle bundle = a.getBundle();
URL url = FileLocator.find(bundle, path, null);
if (url == null) {
// System.out.println(filename+" **NOT FOUND***");
return false;
}
return true;
}
protected String readTestFile(String srcDir, String filename) throws IOException, URISyntaxException {
ArrayList<Integer> lineMap = new ArrayList<Integer>(50);
lineMaps.put(filename, lineMap);
lineMap.add(0); // Offset of line 1
return readStream(lineMap, getClass().getResourceAsStream("/" + srcDir + "/" + filename));
}
protected String readStream(ArrayList<Integer> lineMap, InputStream inputStream) throws IOException {
StringBuffer sb = new StringBuffer(4096);
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
for (int offset = 0, ch = in.read(); ch >= 0; ch = in.read()) {
sb.append((char) ch);
offset++;
if (ch == '\n' && lineMap != null) {
// System.out.println("Line " + (lineMap.size()+1) +
// " starts at offset " + offset);
lineMap.add(offset);
}
}
in.close();
return sb.toString();
}
protected String readStream(InputStream inputStream) throws IOException {
return readStream(null, inputStream);
}
protected String readWorkspaceFile(String filename) throws IOException, CoreException {
return readStream(project.getFile(filename).getContents());
}
/**
* @param filename
* @param line
* line number, starting at 1
* @param col
* column number, starting at 1
*/
protected int getLineColOffset(String filename, int line, int col) {
return lineMaps.get(filename).get(line - 1) + (col - 1);
}
/**
* Convenience class for sorting artifacts so we compare them in an expected
* order
*
* @author beth
*
*/
public class ArtifactWithLine implements Comparable {
public int getLineNo() {
return lineNo;
}
public String getName() {
return name;
}
public IMarker getMarker() {
return marker;
}
private int lineNo;
private String name;
private IMarker marker;
public ArtifactWithLine(int line, String nam) {
lineNo = line;
name = nam;
}
public ArtifactWithLine(IMarker marker) {
try {
String nam = marker.getAttribute(IDs.NAME).toString();
String line = getLineNoAttr(marker);
Integer ii = Integer.decode(line);
int theInt = ii.intValue();
this.lineNo = theInt;
this.name = nam;
this.marker = marker;
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean equals(ArtifactWithLine other) {
boolean a = this.lineNo == other.lineNo;
boolean b = this.name.equals(other.name);
return a && b;
}
public String toString() {
return lineNo + ": " + name;
}
boolean traceOn = false;
public int compareTo(Object o) {
int result;
String sign = "=";
ArtifactWithLine other = (ArtifactWithLine) o;
if (this.lineNo < other.lineNo) {
result = -1;
if (traceOn)
sign = "<";
} else if (this.lineNo > other.lineNo) {
result = 1;
if (traceOn)
sign = ">";
}
// lineNo's equal, must compare name
else {
result = this.name.compareTo(other.name);
}
// System.out.println("CompareTo: "+this+" -to- "+other+"; result is: "+result);
if (traceOn)
System.out.println("ArtifactWithLine.compareTo: " + this.lineNo + sign + other.lineNo);
return result;
}
}
public String getLineNoAttr(IMarker marker) throws CoreException {
return marker.getAttribute(IMarker.LINE_NUMBER).toString();
}
public String getNameAttr(IMarker marker) throws CoreException {
return (String) marker.getAttribute(IDs.NAME);
}
public String getMethodName() {
String name = (new Exception().getStackTrace()[1].getMethodName());
return name;
}
}