/* *******************************************************************
* Copyright (c) 1999-2001 Xerox Corporation,
* 2002 Palo Alto Research Center, Incorporated (PARC).
* 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:
* Xerox/PARC initial implementation
* ******************************************************************/
package org.aspectj.testing.harness.bridge;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.IMessageHolder;
import org.aspectj.bridge.ISourceLocation;
import org.aspectj.bridge.MessageUtil;
import junit.framework.Assert;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
/**
* Primarily used by others to test AjcTest
*/
public class AjcSpecTest extends TestCase {
public static final String NOTSAME = " != ";
public static void sameAjcSuiteSpec(
AjcTest.Suite.Spec lhsSpec,
AjcTest.Suite.Spec rhsSpec,
Assert a) {
assertNotNull(lhsSpec);
assertNotNull(rhsSpec);
Iterator lhs = lhsSpec.getChildren().iterator();
Iterator rhs = rhsSpec.getChildren().iterator();
while (lhs.hasNext() && rhs.hasNext()) {
AjcTest.Spec lhsTest = (AjcTest.Spec) lhs.next();
AjcTest.Spec rhsTest = (AjcTest.Spec) rhs.next();
AjcSpecTest.sameAjcTestSpec(lhsTest, rhsTest, a);
}
assertTrue(!lhs.hasNext());
assertTrue(!rhs.hasNext());
}
public static void sameAjcTestSpec(
AjcTest.Spec lhsTest,
AjcTest.Spec rhsTest,
Assert a) {
assertNotNull(lhsTest);
assertNotNull(rhsTest);
assertEquals(lhsTest.getBugId(), rhsTest.getBugId());
assertEquals(lhsTest.getTestDirOffset(), rhsTest.getTestDirOffset());
// XXX suiteDir varies by run..
// description, options, paths, comments, keywords
sameAbstractRunSpec(lhsTest, rhsTest, a);
}
public static void sameAbstractRunSpec(
AbstractRunSpec lhs,
AbstractRunSpec rhs,
Assert a) {
assertEquals(lhs.description, rhs.description);
// XXX keywords added in .txt reading -
//sameList(lhs.getKeywordsList(), rhs.getKeywordsList(), a);
// XXX sameList(lhs.globalOptions, rhs.globalOptions, a);
sameList(lhs.getOptionsList(), rhs.getOptionsList(), a);
sameList(lhs.getPathsList(), rhs.getPathsList(), a);
assertEquals(lhs.isStaging(), rhs.isStaging());
sameList(lhs.keywords, rhs.keywords, a);
assertEquals(lhs.comment, rhs.comment);
assertEquals(lhs.badInput, rhs.badInput);
// xml adds sourceloc?
//sameSourceLocation(lhs.getSourceLocation(), rhs.getSourceLocation(), a);
// XXX also sourceLocations?
sameMessages(lhs.getMessages(), rhs.getMessages(), a);
}
/** @return normal form - null is "", "" is "", and others are {fully.qualified.class}.toString().trim() */
static String normal(Object input) {
if ((null == input) || ("".equals(input))) {
return "";
} else {
return input.getClass().getName() + "." + input.toString().trim();
}
}
/** @return true if these match after normalizing */
public static void same(Object lhs, Object rhs, Assert a) {
lhs = normal(lhs);
rhs = normal(rhs);
assertTrue(lhs + NOTSAME + rhs, lhs.equals(rhs));
}
/** @return true if both are empty (null or no entries) or if all match */
public static void sameRA(String[] lhs, String[] rhs, Assert a) {
if (null == lhs) {
assertTrue((null == rhs) || (0 == rhs.length));
} else if (null == rhs) {
assertTrue(0 == lhs.length);
} else {
String l = normal(lhs);
String r = normal(rhs);
assertTrue(l + NOTSAME + r, l.equals(r));
}
}
/** @return normal form for String[] items*/
static String normal(String[] items) {
return (null == items ? "[]" : normal(Arrays.asList(items)));
}
/** @return normal form for list items */
static String normal(List list) {
StringBuffer sb = new StringBuffer();
sb.append("[");
boolean first = true;
for (Iterator iter = list.iterator(); iter.hasNext();) {
Object o = iter.next();
if (!first) {
sb.append(", ");
} else {
first = false;
}
sb.append(normal(o));
}
sb.append("]");
return sb.toString();
}
/** @return true if both are empty (null or no entries) or if all match after trimming */
public static void sameListSize(List lhs, List rhs) {
if (null == lhs) {
assertTrue((null == rhs) || (0 == rhs.size()));
} else if (null == rhs) {
assertTrue(0 == lhs.size());
} else {
assertTrue(rhs.size() == lhs.size());
}
}
/** @return true if both are empty (null or no entries) or if all match after trimming */
public static void sameList(List lhs, List rhs, Assert a) {
sameListSize(lhs, rhs);
String l = normal(lhs);
String r = normal(rhs);
String label = l + NOTSAME + r;
assertTrue(label, l.equals(r));
}
// /**
// * Normalize and compare:
// *
bug id's are not compared since extracted during xml writing
// * keyword compare is disabled since keywords are generated during xml reading.
// * description compare is normalized by stripping bug ids
// * String and arrays are equal when empty (null or 0-length)
// * @see Ajctest#stripBugId(String)
// */
// public static void sameAjcTest(AjcTest lhs, AjcTest rhs, Assert reporter) {
// Assert a = reporter;
// String label = lhs + NOTSAME + rhs;
// assertTrue(label, null != lhs);
// assertTrue(label, null != rhs);
// //assertTrue(label, lhs.ignoreWarnings == rhs.ignoreWarnings);
// // XXX disabled - not in .txt
// // sameStringList(lhs.keywords, rhs.keywords, a);
// // sameString(lhs.bugId, rhs.bugId, a);
// // argh - bugid stripped from description
// //same(AjcTest.stripBugId(lhs.description), AjcTest.stripBugId(lhs.description), a);
// //sameRA(lhs.globals, rhs.globals, a);
// //lhs.reset();
// //rhs.reset();
// boolean gotOne = false;
// IMessageHolder holder = new MessageHandler();
// assertTrue(label, !holder.hasAnyMessage(IMessage.FAIL, IMessageHolder.ORGREATER));
// while (lhs.hasNextRun() && rhs.hasNextRun()) {
// sameIAjcRun((IAjcRun) lhs.nextRun(holder), (IAjcRun) rhs.nextRun(holder), reporter);
// assertTrue(label, !holder.hasAnyMessage(IMessage.FAIL, IMessageHolder.ORGREATER));
// if (!gotOne) {
// gotOne = true;
// }
// }
// assertTrue(label, gotOne);
// assertTrue(label, !lhs.hasNextRun());
// assertTrue(label, !rhs.hasNextRun());
// }
public static void sameIAjcRun(IAjcRun lhs, IAjcRun rhs, Assert reporter) {
// Assert a = reporter;
assertTrue(lhs != null);
assertTrue(rhs != null);
Class c = lhs.getClass();
assertTrue(c == rhs.getClass());
AbstractRunSpec lhsSpec;
AbstractRunSpec rhsSpec;
if (c == CompilerRun.class) {
CompilerRun.Spec l = ((CompilerRun) lhs).spec;
CompilerRun.Spec r = ((CompilerRun) rhs).spec;
lhsSpec = l;
rhsSpec = r;
assertEquals(l.argfiles, r.argfiles);
assertEquals(l.aspectpath, r.aspectpath);
assertEquals(l.testSrcDirOffset, r.testSrcDirOffset);
assertEquals(l.compiler, r.compiler);
assertEquals(l.includeClassesDir, r.includeClassesDir);
assertEquals(l.reuseCompiler, r.reuseCompiler);
assertEquals(l.sourceroots, r.sourceroots);
assertEquals(l.extdirs, r.extdirs);
} else if (c == JavaRun.class) {
JavaRun.Spec l = ((JavaRun) lhs).spec;
JavaRun.Spec r = ((JavaRun) rhs).spec;
lhsSpec = l;
rhsSpec = r;
assertTrue(l.skipTester == r.skipTester);
assertEquals(l.className, r.className);
assertEquals(l.javaVersion, r.javaVersion);
assertEquals(l.skipTester, r.skipTester);
assertEquals(l.outStreamIsError, r.outStreamIsError);
assertEquals(l.errStreamIsError, r.errStreamIsError);
} else if (c == IncCompilerRun.class) {
IncCompilerRun.Spec l = ((IncCompilerRun) lhs).spec;
IncCompilerRun.Spec r = ((IncCompilerRun) rhs).spec;
lhsSpec = l;
rhsSpec = r;
assertEquals(l.tag, r.tag);
assertEquals(l.fresh, r.fresh);
} else {
assertTrue(lhs.equals(rhs));
return;
}
sameSpec(lhsSpec, rhsSpec, reporter);
}
public static void sameSpec(AbstractRunSpec lhs, AbstractRunSpec rhs, Assert a) {
if ((null == lhs) && (null == rhs)) {
return;
}
assertTrue(lhs != null);
assertTrue(rhs != null);
assertEquals(""+lhs.getOptionsList(), ""+rhs.getOptionsList());
sameList(lhs.getPathsList(), rhs.getPathsList(), a);
sameMessages(lhs.getMessages(), rhs.getMessages(), a);
sameDirChangesList(lhs.dirChanges, rhs.dirChanges, a);
}
public static void sameDirChangesList(ArrayList lhs, ArrayList rhs, Assert a) {
if ((null == lhs) && (null == rhs)) {
return;
}
assertTrue(rhs != null);
assertTrue(lhs != null);
sameListSize(lhs, rhs);
Iterator lhsIter = lhs.iterator();
Iterator rhsIter = rhs.iterator();
while (lhsIter.hasNext() && rhsIter.hasNext()) {
sameDirChangesSpec((DirChanges.Spec) lhsIter.next(), (DirChanges.Spec) rhsIter.next(), a);
}
}
public static void sameDirChangesSpec(DirChanges.Spec lhs, DirChanges.Spec rhs, Assert a) {
if ((null == lhs) && (null == rhs)) {
return;
}
assertTrue(rhs != null);
assertTrue(lhs != null);
assertEquals(lhs.defaultSuffix, rhs.defaultSuffix);
assertEquals(lhs.dirToken, rhs.dirToken);
assertEquals(lhs.fastFail, rhs.fastFail);
assertEquals(lhs.expDir, rhs.expDir); // XXX normalize?
sameList(lhs.updated, rhs.updated, a);
sameList(lhs.removed, rhs.removed, a);
sameList(lhs.added, rhs.added, a);
}
public static void sameMessages(IMessageHolder one, IMessageHolder two, Assert a) {
if ((null == one) && (null == two)) {
return;
}
// order matters here
ListIterator lhs = one.getUnmodifiableListView().listIterator();
ListIterator rhs = two.getUnmodifiableListView().listIterator();
while (lhs.hasNext() && rhs.hasNext()) {
sameMessage((IMessage) lhs.next(), (IMessage) rhs.next(), a);
}
assertTrue(!lhs.hasNext());
assertTrue(!rhs.hasNext());
}
public static void sameMessage(IMessage lhs, IMessage rhs, Assert a) {
if ((null == lhs) && (null == rhs)) {
return;
}
assertTrue(lhs != null);
assertTrue(rhs != null);
assertTrue(lhs.getKind() == rhs.getKind());
same(lhs.getMessage(), rhs.getMessage(), a);
same(lhs.getDetails(), rhs.getDetails(), a);
assertEquals(lhs.getThrown(), rhs.getThrown());
sameSourceLocation(lhs.getSourceLocation(), rhs.getSourceLocation());
sameSourceLocations(lhs.getExtraSourceLocations(), rhs.getExtraSourceLocations());
}
public static void sameSourceLocations(List lhs, List rhs) {
sameListSize(lhs, rhs);
if ((null == lhs) || (0 == lhs.size())) {
return;
}
// ok, do order-dependent check..
ListIterator iterLeft = lhs.listIterator();
ListIterator iterRight = rhs.listIterator();
while (iterLeft.hasNext() && iterRight.hasNext()) {
ISourceLocation left = (ISourceLocation) iterLeft.next();
ISourceLocation right = (ISourceLocation) iterRight.next();
sameSourceLocation(left, right);
}
assertTrue(!iterLeft.hasNext());
assertTrue(!iterRight.hasNext());
}
public static void sameSourceLocation(ISourceLocation lhs, ISourceLocation rhs) {
if ((null == lhs) && (null == rhs)) {
return;
}
assertTrue(lhs != null);
assertTrue(rhs != null);
assertTrue(lhs.getLine() == rhs.getLine());
assertTrue(lhs.getColumn() == rhs.getColumn());
assertTrue(lhs.getOffset() == rhs.getOffset());
assertTrue(lhs.getEndLine() == rhs.getEndLine());
// XXX need to compare files, permitting null == NONE
}
/**
* Constructor for AjcSpecTest.
* @param name
*/
public AjcSpecTest(String name) {
super(name);
}
public void testMinimal() {
AjcTest.Spec one = new AjcTest.Spec();
AjcTest.Spec two = new AjcTest.Spec();
// empty/identity tests
sameAjcTestSpec(one, two, this);
one.addOption("-one");
one.addKeyword("keyword");
one.addPath("path");
IMessage m = MessageUtil.info("info message");
one.addMessage(m);
DirChanges.Spec dcspec = new DirChanges.Spec();
dcspec.setDirToken("dirToken");
dcspec.setDefaultSuffix(".suffix");
one.addDirChanges(dcspec);
// full/identity tests
sameAjcTestSpec(one, one, this);
// XXX need to clone...
// XXX need to test that more differences are detected
boolean passed = false;
try {
sameAjcTestSpec(one, two, this);
} catch (AssertionFailedError e) {
passed = true;
}
assertTrue("did not get expected exception", passed);
}
}