/*******************************************************************************
* Copyright (c) 2012 Google, Inc.
* 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:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package com.windowtester.codegen.generator;
import java.util.ArrayList;
import java.util.List;
import com.windowtester.codegen.ITestCaseBuilder;
import com.windowtester.codegen.assembly.block.CodeBlock;
import com.windowtester.codegen.assembly.unit.ImportUnit;
import com.windowtester.codegen.assembly.unit.MethodUnit;
import com.windowtester.codegen.assembly.unit.Modifier;
import com.windowtester.codegen.eventstream.IEventStream;
import com.windowtester.codegen.generator.setup.ISetupHandler;
import com.windowtester.recorder.event.ISemanticEvent;
import com.windowtester.runtime.swt.internal.preferences.ICodeGenConstants;
public class SetupBlockBuilder implements ICodeGenConstants {
private final ITestCaseBuilder testBuilder;
private final CodegenSettings codegenSettings;
public SetupBlockBuilder(ITestCaseBuilder testGenerator, CodegenSettings codegenSettings) {
this.testBuilder = testGenerator;
this.codegenSettings = codegenSettings;
}
public ISetupHandler[] getHandlersFor(IEventStream stream) {
stream = stream.copy();
List handlers = new ArrayList();
ISetupHandler[] allHandlers = testBuilder.getSetupHandlers();
for (int i=0; i < allHandlers.length; ++i) {
ISetupHandler handler = allHandlers[i];
if (handler.appliesTo(stream)) {
handlers.add(handler);
}
}
return (ISetupHandler[]) handlers.toArray(new ISetupHandler[]{});
}
public MethodUnit buildSetup(IEventStream stream) {
MethodUnit m = createSetupMethod();
String body = buildSetupBody(stream);
if (body == null)
return null;
m.setBody(new CodeBlock(body));
return m;
}
private String buildSetupBody(IEventStream stream) {
ISetupHandler[] handlers = getHandlersFor(stream);
if (handlers.length == 0)
return null;
StringBuffer sb = new StringBuffer();
appendPreamble(sb);
appendHandlers(handlers, sb);
return sb.toString();
}
private void appendHandlers(ISetupHandler[] handlers, StringBuffer sb) {
for (int i = 0; i < handlers.length; i++) {
ISetupHandler handler = handlers[i];
ImportUnit imprt = null;
String body = null;
if (usingStatics()) {
body = handler.getStaticBody();
imprt = new ImportUnit(handler.getStaticImport());
imprt.addModifier(Modifier.STATIC);
} else {
body = handler.getBody();
imprt = new ImportUnit(handler.getImport());
}
sb.append(body).append(NEW_LINE);
testBuilder.addImport(imprt);
}
}
private void appendPreamble(StringBuffer sb) {
sb.append("super.setUp();").append(NEW_LINE).
append("IUIContext ui = getUI();").append(NEW_LINE);
}
private boolean usingStatics() {
return codegenSettings.usingStatics();
}
private MethodUnit createSetupMethod() {
MethodUnit m = new MethodUnit("setUp");
String comment = "/* @see junit.framework.TestCase#setUp()" + NEW_LINE + "*/";
m.setComment(comment);
m.addModifier(Modifier.PROTECTED);
m.addThrows("Exception");
return m;
}
/**
* Returns true if this event was handled in setup (and can safely be ignored in
* the test main).
*/
public boolean handled(ISemanticEvent event) {
ISetupHandler[] allHandlers = testBuilder.getSetupHandlers();
for (int i=0; i < allHandlers.length; ++i) {
ISetupHandler handler = allHandlers[i];
if (handler.fullyHandles(event)) {
return true;
}
}
return false;
}
}