/******************************************************************************* * 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 com.windowtester.codegen.ICodeGenPluginTraceOptions; import com.windowtester.codegen.ITestCaseBuilder; import com.windowtester.codegen.TestCaseGenerator; import com.windowtester.codegen.assembly.block.CodeBlock; import com.windowtester.codegen.assembly.unit.ImportUnit; import com.windowtester.codegen.util.CodeGenSnippetBuilder; import com.windowtester.internal.runtime.IWidgetIdentifier; import com.windowtester.internal.runtime.PropertySet.PropertyMapping; import com.windowtester.recorder.event.IUISemanticEvent; import com.windowtester.recorder.event.user.SemanticComboSelectionEvent; import com.windowtester.recorder.event.user.SemanticFocusEvent; import com.windowtester.recorder.event.user.SemanticListSelectionEvent; import com.windowtester.recorder.event.user.SemanticMenuSelectionEvent; import com.windowtester.recorder.event.user.SemanticMoveEvent; import com.windowtester.recorder.event.user.SemanticResizeEvent; import com.windowtester.recorder.event.user.SemanticShellClosingEvent; import com.windowtester.recorder.event.user.SemanticShellDisposedEvent; import com.windowtester.recorder.event.user.SemanticShellShowingEvent; import com.windowtester.recorder.event.user.SemanticTableSelectionEvent; import com.windowtester.recorder.event.user.SemanticTreeItemSelectionEvent; import com.windowtester.recorder.event.user.SemanticWidgetClosedEvent; import com.windowtester.recorder.event.user.SemanticWidgetSelectionEvent; import com.windowtester.runtime.locator.ILocator; import com.windowtester.swt.WidgetMapper; /** * Snippet building logic used in release v1.*. * */ public class OldAPICodeBlockBuilder implements ICodeBlockBuilder { private static final String NEW_LINE = TestCaseGenerator.NEW_LINE; /** The name of the instance variable that points to a UIContext */ private String _uiContextInstanceName = "_uiContext"; /** A code snippet builder */ private final CodeGenSnippetBuilder _snippetHelper; /** A mapper instance */ private WidgetMapper _mapper; ////////////////////////////////////////////////////////////////////////// // // Instance creation // ////////////////////////////////////////////////////////////////////////// /** * Create an instance. * @param builder - the builder strategy */ public OldAPICodeBlockBuilder(ITestCaseBuilder builder) { _mapper = builder.getMapper(); _uiContextInstanceName = builder.getUIContextInstanceName(); _snippetHelper = new CodeGenSnippetBuilder(_uiContextInstanceName); } ////////////////////////////////////////////////////////////////////////// // // Code block building // ////////////////////////////////////////////////////////////////////////// /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildAssertion(com.windowtester.runtime.locator.ILocator, com.windowtester.recorder.event.PropertySet.PropertyMapping) */ public CodeBlock buildAssertion(ILocator locator, PropertyMapping propertyMapping) { return notHandled("assertion"); //legacy API does not support assertions } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#build(com.windowtester.recorder.event.user.SemanticShellClosingEvent) */ public CodeBlock buildShellClosing(SemanticShellClosingEvent event) { //gen closing code: String label = registerWidget(event.getHierarchyInfo()); StringBuffer sb = new StringBuffer(); sb.append(_snippetHelper.closeShellSnippet(label)); return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildWidgetClosing(com.windowtester.recorder.event.user.SemanticWidgetClosedEvent) */ public CodeBlock buildWidgetClosing(SemanticWidgetClosedEvent event) { return notHandled("widget closing"); //legacy API does not support closing of generic widgets } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#build(com.windowtester.recorder.event.user.SemanticMoveEvent) */ public CodeBlock buildMove(SemanticMoveEvent event) { StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("move")); } else { String label = registerWidget(info); sb.append(_snippetHelper.moveSnippet(label, event.getX(), event.getY())); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#build(com.windowtester.recorder.event.user.SemanticResizeEvent) */ public CodeBlock buildResize(SemanticResizeEvent event) { StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("resize")); } else { String label = registerWidget(info); sb.append(_snippetHelper.resizeSnippet(label, event.getWidth(), event.getHeight())); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#build(com.windowtester.recorder.event.user.SemanticFocusEvent) */ public CodeBlock buildFocus(SemanticFocusEvent curr) { StringBuffer sb = new StringBuffer(); String label = registerWidget(curr.getHierarchyInfo()); sb.append(_snippetHelper.setFocus(label)); return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildButtonSelect(com.windowtester.recorder.event.user.SemanticWidgetSelectionEvent) */ public CodeBlock buildButtonSelect(SemanticWidgetSelectionEvent event) { Tracer.trace(ICodeGenPluginTraceOptions.CODEGEN, "handling button click: " + event.getItemLabel()); //handleShellChange(event); <-- now handled by shell open event StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("click")); } else { String label = registerWidget(info); sb.append(_snippetHelper.clickButtonSnippet(label)); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildMenuSelect(com.windowtester.recorder.event.user.SemanticMenuSelectionEvent) */ public CodeBlock buildMenuSelect(SemanticMenuSelectionEvent event) { Tracer.trace(ICodeGenPluginTraceOptions.CODEGEN, "handling menu invocation: "); StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("menu invocation")); } else { String label = registerWidget(event.getHierarchyInfo()); sb.append(_snippetHelper.invokeMenuItemSnippet(label, event.getIndex(), event.getPathString(), event.getButton())); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildTreeSelect(com.windowtester.recorder.event.user.SemanticTreeItemSelectionEvent) */ public CodeBlock buildTreeSelect(SemanticTreeItemSelectionEvent event) { Tracer.trace(ICodeGenPluginTraceOptions.CODEGEN, "handling tree item selection: " + event.getItemLabel()); StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("tree item selection")); } else { String label = registerWidget(info); sb.append(_snippetHelper.treeItemSelectSnippet(label, event)); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildTableSelect(com.windowtester.recorder.event.user.SemanticTableSelectionEvent) */ public CodeBlock buildTableSelect(SemanticTableSelectionEvent tableSelection) { //this should never be reached -- table items in SWT are just items... return new CodeBlock("//ERROR: table item selections not handled"); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildSelect(com.windowtester.recorder.event.user.SemanticWidgetSelectionEvent) */ public CodeBlock buildSelect(SemanticWidgetSelectionEvent event) { Tracer.trace(ICodeGenPluginTraceOptions.CODEGEN, "handling generic item selection: " + event.toString()); String code = null; IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { code = createIdErrorMessage("widget selection").toString(); } else { String label = registerWidget(info); //handle import if necessary: String mask = event.getMask(); code = (event.requiresLocationInfo()) ? _snippetHelper.genericWidgetSelection(label, event.getIndex(), event.getMask(), event.getClicks(), event.getX(), event.getY()) : _snippetHelper.genericWidgetSelection(label, event.getIndex(), mask, event.getClicks()); } return new CodeBlock(code); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildTextEntry(java.lang.String) */ public CodeBlock buildTextEntry(String str) { String codeSnippet = _snippetHelper.enterTextSnippet(str); return new CodeBlock(codeSnippet); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildKeyEntry(java.lang.String) */ public CodeBlock buildKeyEntry(String key) { String codeSnippet = _snippetHelper.enterKeySnippet(key); return new CodeBlock(codeSnippet); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildKeyEntry(java.lang.String, java.lang.String) */ public CodeBlock buildKeyEntry(String ctrl, String key) { String codeSnippet = _snippetHelper.enterKeySnippet(ctrl, key); return new CodeBlock(codeSnippet); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildFocusChange(com.windowtester.runtime.IWidgetLocator) */ public CodeBlock buildFocusChange(IWidgetIdentifier newTarget) { StringBuffer sb = new StringBuffer(); //check for error if (newTarget == null) { sb.append(createIdErrorMessage("focus change")); } else { String label = registerWidget(newTarget); sb.append(_snippetHelper.setFocus(label)); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#build(com.windowtester.recorder.event.user.SemanticListSelectionEvent) */ public CodeBlock build(SemanticListSelectionEvent listSelection) { StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = listSelection.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("list selection")); } else { String label = registerWidget(listSelection.getHierarchyInfo()); String item = listSelection.getItem(); String mask = listSelection.getMask(); int numClicks = listSelection.getClicks(); sb.append(_snippetHelper.listSelection(label, item, mask, numClicks)); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#build(com.windowtester.recorder.event.user.SemanticComboSelectionEvent) */ public CodeBlock build(SemanticComboSelectionEvent comboSelection) { StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = comboSelection.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("combo selection")); } else { String label = registerWidget(comboSelection.getHierarchyInfo()); String item = comboSelection.getSelection(); sb.append(_snippetHelper.comboSelection(label, item)); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildDragTo(com.windowtester.recorder.event.IUISemanticEvent) */ public CodeBlock buildDragTo(IUISemanticEvent event) { StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); // check for error if (info == null) { sb.append(createIdErrorMessage("dragTo")); } else { String label = registerWidget(info); /* * Handle path here */ String path = null; if (event instanceof SemanticTreeItemSelectionEvent) { path = ((SemanticTreeItemSelectionEvent)event).getPathString(); } sb.append(_snippetHelper.dragToSnippet(label, path, event.getX(), event.getY())); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildMoveTo(com.windowtester.recorder.event.IUISemanticEvent) */ public CodeBlock buildMoveTo(IUISemanticEvent event) { StringBuffer sb = new StringBuffer(); IWidgetIdentifier info = event.getHierarchyInfo(); //check for error if (info == null) { sb.append(createIdErrorMessage("mouseMoveTo")); } else { String label = registerWidget(info); sb.append(_snippetHelper.mouseMoveToSnippet(label, event.getX(), event.getY())); } return new CodeBlock(sb.toString()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildMethodInvocation(java.lang.String) */ public CodeBlock buildMethodInvocation(String method) { return new CodeBlock(_snippetHelper.methodInvocation(method)); } public CodeBlock buildWaitForShellShowing(SemanticShellShowingEvent event) { return buildWaitForShellShowing(event.getName()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildWaitForShellShowing(java.lang.String) */ public CodeBlock buildWaitForShellShowing(String shellTitle) { Tracer.trace(ICodeGenPluginTraceOptions.CODEGEN, "(requires a wait for: " + shellTitle +")"); String waitBody = _uiContextInstanceName + ".waitForShellShowing(\"" + shellTitle + "\");" + NEW_LINE; return new CodeBlock(waitBody); } public CodeBlock buildWaitForShellDisposed(SemanticShellDisposedEvent event) { return buildWaitForShellDisposed(event.getName()); } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#buildWaitForShellDisposed(java.lang.String) */ public CodeBlock buildWaitForShellDisposed(String shellTitle) { Tracer.trace(ICodeGenPluginTraceOptions.CODEGEN, "(requires a wait for dispose: " + shellTitle +")"); String waitBody = _uiContextInstanceName + ".waitForShellDisposed(\"" + shellTitle + "\");" + NEW_LINE; return new CodeBlock(waitBody); } //////////////////////////////////////////////////////////////////////////// // // Key Events // //////////////////////////////////////////////////////////////////////////// /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#getBackSpaceKey() */ public String getBackSpaceKey() { return "SWT.BS"; } /* (non-Javadoc) * @see com.windowtester.codegen.generator.ICodeBlockBuilder#getKeyEventImport() */ public ImportUnit getKeyEventImport() { return new ImportUnit("org.eclipse.swt.SWT"); } //////////////////////////////////////////////////////////////////////////// // // Helpers // //////////////////////////////////////////////////////////////////////////// protected StringBuffer createIdErrorMessage(String eventType, String comment) { StringBuffer sb = new StringBuffer(); sb.append("//error identifying target of ").append(eventType).append(" event;").append(comment).append(NEW_LINE); return sb; } protected StringBuffer createIdErrorMessage(String eventType) { return createIdErrorMessage(eventType, "event ignored"); //a default comment } private CodeBlock notHandled(String type) { return new CodeBlock("//event type: [" + type + "] not handled" + NEW_LINE); } ////////////////////////////////////////////////////////////////////////// // // Widget registration // ////////////////////////////////////////////////////////////////////////// private String registerWidget(IWidgetIdentifier locator) { if (locator instanceof com.windowtester.swt.WidgetLocator) return registerWidget((com.windowtester.swt.WidgetLocator)locator); //TODO handle mapper for Swing case return ""; } private String registerWidget(com.windowtester.swt.WidgetLocator locator) { return _mapper.register(locator); } }