/*******************************************************************************
* 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.swt;
import com.windowtester.codegen.ExecutionProfile;
import com.windowtester.codegen.TestCaseBuilder;
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.generator.CodegenSettings;
import com.windowtester.codegen.generator.setup.ISetupHandler;
import com.windowtester.runtime.IUIContext;
import com.windowtester.runtime.swt.UITestCaseSWT;
/**
* Test case builder for new API SWT applications
*/
public class SWTV2TestCaseBuilder extends TestCaseBuilder {
private final String[] DEFAULT_IMPORTS = new String[] {
IUIContext.class.getName()
};
private static final Class<?> DEFAULT_BASETEST = UITestCaseSWT.class;
private final String mainType;
private final String[] progArgs;
private final ClassName baseClass;
private CodegenSettings settings = CodegenSettings.forUnknown(); //null object default
public SWTV2TestCaseBuilder(String name, String pkg, String mainType, String [] progArgs) {
this(name, pkg, mainType, progArgs, ExecutionProfile.UNKNOWN_EXEC_TYPE);
}
public SWTV2TestCaseBuilder(String name, String pkg, String mainType, String [] progArgs, int execType) {
this(name, pkg, mainType, ClassName.forClass(DEFAULT_BASETEST), progArgs, execType);
}
public SWTV2TestCaseBuilder withSettings(CodegenSettings settings) {
this.settings = settings;
return this;
}
public SWTV2TestCaseBuilder(String name, String pkg, String mainType, ClassName baseClassName, String [] progArgs, int execType) {
super(name, pkg);
this.mainType = mainType;
this.baseClass = baseClassName;
this.progArgs = progArgs;
setExtends(baseClass.getClassName());
//we add this here to ensure that this import appears first
addBaseTestImport();
}
/* (non-Javadoc)
* @see com.windowtester.codegen.TestCaseBuilder#getSetupHandlers()
*/
public ISetupHandler[] getSetupHandlers() {
return settings.handlers().toArray();
}
/*
* Override SWT defaults.
*
* @see com.windowtester.codegen.TestCaseBuilder#addBoilerPlateImports()
*/
protected void addBoilerPlateImports() {
addDefaultImports();
}
private void addDefaultImports() {
for (int i = 0; i < DEFAULT_IMPORTS.length; i++) {
addImport(new ImportUnit(DEFAULT_IMPORTS[i]));
}
}
private void addBaseTestImport() {
addImport(new ImportUnit(baseClass.getQualifiedClassName()));
}
/**
* Get the boiler plate test constructor.
*
* @see com.windowtester.codegen.TestCaseBuilder#getConsMethod()
*/
protected MethodUnit getConsMethod() {
//if main class is null, return null indicating not to create a constructor
if (mainType == null)
return null;
MethodUnit m = new MethodUnit(getName());
StringBuffer com = new StringBuffer();
com.append("/**").append(NEW_LINE).append("* Create an Instance").append(NEW_LINE).
append(" */");
m.setComment(com.toString());
m.setConstructor(true);
m.addModifier(Modifier.PUBLIC);
//m.addParameter(new Parameter("String", "testName"));
StringBuffer sb = new StringBuffer();
sb.append("super(").append(mainType).append(".class");
if (progArgs != null && progArgs.length != 0)
sb.append(", "). append(stringify(progArgs));
sb.append(");").append(NEW_LINE);
CodeBlock block = new CodeBlock(sb.toString());
m.setBody(block);
return m;
}
/*
* @see com.windowtester.codegen.TestCaseBuilder#getUIContextTypeName()
*/
public String getUIContextTypeName() {
return "IUIContext";
}
/**
* @see com.windowtester.codegen.TestCaseBuilder#getUIContextGetterName()
*/
public String getUIContextGetterName() {
return "getUI()";
}
private static String stringify(String[] progArgs) {
StringBuffer sb = new StringBuffer();
sb.append("new String[]{");
for (int i = 0; i < progArgs.length; i++) {
//ignore ","s
if (progArgs[i].trim().equals(","))
continue;
//ignore empty args
if (progArgs[i].trim().equals(""))
continue;
sb.append("\"").append(progArgs[i]).append("\"");
if (i+1 < progArgs.length)
sb.append(", ");
}
sb.append("}");
return sb.toString();
}
}