/* *******************************************************************
* Copyright (c) 2003 Contributors.
* 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:
* Wes Isberg initial implementation
* ******************************************************************/
package org.aspectj.testing.util.options;
import java.util.Arrays;
import org.aspectj.testing.util.LangUtil;
import junit.framework.Assert;
/**
* Drivers to test a given set of Options.
* They now throw AssertionFailedError on failure,
* but subclasses can reimplement
* assertionFailed(String)
* to handle failures differently.
*/
public class OptionChecker {
private final Options options;
public OptionChecker(Options options) {
this.options = options;
LangUtil.throwIaxIfNull(options, "options");
}
/**
* Subclasses override this to throw different exceptions
* on assertion failures.
* This implementation delegates to
* Assert.assertTrue(label, false)
.
* @param label the String message for the assertion
*
*/
public void assertionFailed(String label) {
Assert.assertTrue(label, false);
}
public void checkAssertion(String label, boolean test) {
if (!test) {
assertionFailed(label);
}
}
public void checkOptions(String[] input, String[] expected) {
checkOptions(input, expected, true);
}
public void checkOptions(
String[] input,
String[] expected,
boolean resolve) {
Values values = getValues(input);
if (resolve) {
String err = values.resolve();
checkAssertion("error: \"" + err + "\"", null == err);
}
String[] actual = values.render(); // Value.render(values);
checkEqual(expected, actual);
}
public void checkOptionsNegative(
String[] input,
String expectedMissedMatchErr,
String expectedResolveErr) {
checkOptionsNegative(
input,
null,
expectedMissedMatchErr,
expectedResolveErr);
}
public void checkOptionsNegative(
String[] input,
String expectedInValuesException,
String expectedMissedMatchErr,
String expectedResolveErr) {
Values values =
getValuesNegative(input, expectedInValuesException);
if (null == expectedInValuesException) {
String err = Options.missedMatchError(input, values);
checkContains(expectedMissedMatchErr, err);
err = values.resolve();
checkContains(expectedResolveErr, err);
}
}
private Values getValuesNegative(
String[] input,
String expectedInExceptionMessage,
Options options) {
try {
return options.acceptInput(input);
} catch (Option.InvalidInputException e) {
String m = e.getFullMessage();
boolean ok =
(null != expectedInExceptionMessage)
&& (-1 != m.indexOf(expectedInExceptionMessage));
if (!ok) {
e.printStackTrace(System.err);
if (null != expectedInExceptionMessage) {
m =
"expected \""
+ expectedInExceptionMessage
+ "\" in "
+ m;
}
assertionFailed(m);
}
return null; // actually never executed
}
}
private Values getValuesNegative(
String[] input,
String expectedInExceptionMessage) {
return getValuesNegative(
input,
expectedInExceptionMessage,
options);
}
// private Values getValues(String[] input, Options options) {
// return getValuesNegative(input, null, options);
// }
private Values getValues(String[] input) {
return getValuesNegative(input, null);
}
private void checkContains(String expected, String expectedIn) {
if (null == expected) {
if (null != expectedIn) {
assertionFailed("did not expect \"" + expectedIn + "\"");
}
} else {
if ((null == expectedIn)
|| (-1 == expectedIn.indexOf(expected))) {
assertionFailed(
"expected \""
+ expected
+ "\" in \""
+ expectedIn
+ "\"");
}
}
}
private String safeString(String[] ra) {
return (null == ra ? "null" : Arrays.asList(ra).toString());
}
private void checkEqual(String[] expected, String[] actual) {
if (!isEqual(expected, actual)) {
assertionFailed(
"expected \""
+ safeString(expected)
+ "\" got \""
+ safeString(actual)
+ "\"");
}
}
private boolean isEqual(String[] expected, String[] actual) {
if (null == expected) {
return (null == actual ? true : false);
} else if (null == actual) {
return false;
} else if (expected.length != actual.length) {
return false;
}
for (int i = 0; i < actual.length; i++) {
String e = expected[i];
String a = actual[i];
if (null == e) {
if (null != a) {
return false;
}
} else if (null == a) {
return false;
} else if (!(e.equals(a))) {
return false;
}
}
return true;
}
}