/*******************************************************************************
* 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.eclipse.ui.viewers;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
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.assembly.unit.Parameter;
import com.windowtester.codegen.eventstream.EventStream;
import com.windowtester.codegen.eventstream.IEventStream;
import com.windowtester.codegen.generator.NewAPICodeBlockBuilder;
import com.windowtester.codegen.generator.PluggableCodeGenerator;
import com.windowtester.codegen.swt.SWTV2TestCaseBuilder;
import com.windowtester.ui.core.model.ISemanticEvent;
public class EventSequenceSnippetBuilder {
private static final String SNIPPET_TEST_NAME = "Snippet";
static class CodeBlockBuilder {
SWTV2TestCaseBuilder builder = new SWTV2TestCaseBuilder(SNIPPET_TEST_NAME, "mock", "Mock", null);
PluggableCodeGenerator generator = new PluggableCodeGenerator(builder, new NewAPICodeBlockBuilder(builder));
String generate(IEventStream events) {
generator.generate(events);
MethodUnit mainMethod = getMainMethod();
if (mainMethod == null)
return "";
mainMethod.setComment(null); //remove generic comment
return mainMethod.getBody().toString();
}
public String generateMainMethod(ISemanticEvent[] selection) {
return generate(new EventStream(Arrays.asList(selection)));
}
ImportUnit[] getImports() {
Collection imports = generator.getTestBuilder().getImports();
return (ImportUnit[]) imports.toArray(new ImportUnit[]{});
}
MethodUnit getMainMethod() {
Collection methods = generator.getTestBuilder().getMethods();
for (Iterator iterator = methods.iterator(); iterator.hasNext();) {
MethodUnit method = (MethodUnit) iterator.next();
if (!method.isConstructor() && containsTestName(method)) {
return method;
}
}
return null;
}
private boolean containsTestName(MethodUnit method) {
return contains(method.getName(), SNIPPET_TEST_NAME);
}
private boolean contains(String str, String seq) {
return str.indexOf(seq) > -1;
}
}
private CodeBlockBuilder builder;
private final ISemanticEvent[] events;
public EventSequenceSnippetBuilder(ISemanticEvent[] events) {
this.events = events;
this.builder = new CodeBlockBuilder();
}
public String getMainMethodString() {
return builder.generateMainMethod(events);
}
public String getMethodSnippet() {
MethodUnit method = builder.getMainMethod();
if (method == null)
return "";
CodeBlock body = method.getMethodBodyContents();
if (body == null)
return "";
nullGetter(body);
return body.toString();
}
private void nullGetter(CodeBlock body) {
body.setBody(null); //this just nulls the getter
}
public ImportUnit[] getImports() {
return builder.getImports();
}
public String getParameterizedMethod() {
MethodUnit method = builder.getMainMethod();
if (method == null)
return "";
CodeBlock body = method.getMethodBodyContents();
if (body == null)
return "";
nullGetter(body);
method.setName("helperMethod");
method.addModifier(Modifier.STATIC);
method.addParameter(new Parameter("IUIContext", "ui"));
return method.getBody().toString();
}
}