/*******************************************************************************
* Copyright (c) 2011, 2012 Anton Gorenkov
* 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:
* Anton Gorenkov - initial implementation
*******************************************************************************/
package org.eclipse.cdt.testsrunner.testsrunners;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import junit.framework.Assert;
import org.eclipse.cdt.testsrunner.model.IModelVisitor;
import org.eclipse.cdt.testsrunner.model.ITestCase;
import org.eclipse.cdt.testsrunner.model.ITestItem;
import org.eclipse.cdt.testsrunner.model.ITestItem.Status;
import org.eclipse.cdt.testsrunner.model.ITestMessage;
import org.eclipse.cdt.testsrunner.model.ITestMessage.Level;
import org.eclipse.cdt.testsrunner.model.ITestModelUpdater;
import org.eclipse.cdt.testsrunner.model.ITestSuite;
/**
* Mock for the {@see ITestModelUpdater}.
*/
@SuppressWarnings("nls")
public class MockTestModelUpdater implements ITestModelUpdater {
private class FakeTestItem implements ITestItem {
private String name = null;
protected void unexpectedMethodCall() {
Assert.fail("Unexpected method call");
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void resetName() {
name = null;
}
// Unimplemented methods
@Override
public Status getStatus() { unexpectedMethodCall(); return null; }
@Override
public int getTestingTime() { unexpectedMethodCall(); return 0; }
@Override
public ITestSuite getParent() { unexpectedMethodCall(); return null; }
@Override
public boolean hasChildren() { unexpectedMethodCall(); return false; }
@Override
public ITestItem[] getChildren() { unexpectedMethodCall(); return null; }
@Override
public void visit(IModelVisitor visitor) { unexpectedMethodCall(); }
}
private class FakeTestCase extends FakeTestItem implements ITestCase {
@Override
public ITestMessage[] getTestMessages() { unexpectedMethodCall(); return null; }
}
private class FakeTestSuite extends FakeTestItem implements ITestSuite {
}
private class MethodInfo {
private String methodName;
private Object[] args;
MethodInfo(String methodName, Object[] args) {
this.methodName = methodName;
this.args = args;
}
private String genArgs(String methodName, Object[] args) {
StringBuilder sb = new StringBuilder();
sb.append(methodName);
sb.append("(");
boolean needDelimited = false;
for (Object arg : args) {
if (needDelimited) {
sb.append(", ");
} else {
needDelimited = true;
}
if (arg != null) {
sb.append('"');
sb.append(arg.toString());
sb.append('"');
} else {
sb.append("null");
}
}
sb.append(")");
return sb.toString();
}
public void check(String methodName, Object[] args) {
if (!this.methodName.equals(methodName)) {
Assert.failNotEquals("Unexpected method call. ",
genArgs(this.methodName, this.args), genArgs(methodName, args));
}
boolean compareFailed = (this.args.length != args.length);
if (!compareFailed) {
for (int i = 0; i < args.length; i++) {
if (this.args[i] == null) {
if (args[i] != null) {
compareFailed = true;
break;
}
} else if (!this.args[i].equals(args[i])) {
compareFailed = true;
break;
}
}
}
if (compareFailed) {
Assert.failNotEquals("Unexpected parameters of method "+this.methodName+"(). ",
genArgs(this.methodName, this.args), genArgs(methodName, args));
}
}
}
private LinkedList<MethodInfo> methodCalls = new LinkedList<MethodInfo>();
private boolean replayMode = false;
private Set<String> skippedMethods = new HashSet<String>();
// NOTE: Test suites nesting is not supported yet cause there is no need in it
private FakeTestSuite currentTestSuite = new FakeTestSuite();
private FakeTestCase currentTestCase = new FakeTestCase();
@Override
public void enterTestSuite(String name) {
genericImpl("enterTestSuite", name);
// NOTE: Test suites or cases nesting is not supported for mocking
currentTestSuite.setName(name);
}
@Override
public void exitTestSuite() {
genericImpl("exitTestSuite");
currentTestSuite.resetName();
}
@Override
public void enterTestCase(String name) {
genericImpl("enterTestCase", name);
currentTestCase.setName(name);
}
@Override
public void setTestStatus(Status status) {
genericImpl("setTestStatus", status);
}
@Override
public void setTestingTime(int testingTime) {
genericImpl("setTestingTime", testingTime);
}
@Override
public void exitTestCase() {
genericImpl("exitTestCase");
currentTestCase.resetName();
}
@Override
public void addTestMessage(String file, int line, Level level, String text) {
genericImpl("addTestMessage", file, line, level, text);
}
@Override
public ITestSuite currentTestSuite() {
return currentTestSuite;
}
@Override
public ITestCase currentTestCase() {
return currentTestCase;
}
public void skipCalls(String methodName) {
skippedMethods.add(methodName);
}
public void replay() {
replayMode = true;
}
private void genericImpl(String methodName, Object... args) {
if (!skippedMethods.contains(methodName)) {
if (replayMode) {
if (methodCalls.isEmpty()) {
Assert.fail("Unexpected method call "+methodName+"()");
} else {
methodCalls.pollFirst().check(methodName, args);
}
} else {
methodCalls.addLast(new MethodInfo(methodName, args));
}
}
}
}