/*******************************************************************************
* 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 util;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.MenuComponent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import abbot.finder.AWTHierarchy;
import abbot.finder.Hierarchy;
import abbot.util.EventNormalizer;
import abbot.util.SingleThreadedEventListener;
import com.windowtester.codegen.eventstream.EventStream;
import com.windowtester.codegen.swing.SwingTestGenerator;
import com.windowtester.recorder.event.IUISemanticEvent;
import com.windowtester.recorder.event.user.SemanticEventAdapter;
import com.windowtester.swing.event.recorder.ConsoleReportingListener;
import com.windowtester.swing.event.recorder.EventCachingListener;
import com.windowtester.swing.event.recorder.SwingGuiTestRecorder;
import com.windowtester.swing.recorder.RecordingFailedException;
public class SwingEventRecordingWatcher {
private static final long FIXTURE_EVENT_MASK =
abbot.editor.recorder.EventRecorder.RECORDING_EVENT_MASK;
private static Hierarchy hierarchy;
private static SwingGuiTestRecorder recorder;
/** A cache to store recorded events */
private EventCachingListener cache = new EventCachingListener();
private static EventNormalizer normalizer = new EventNormalizer();
static ActionListener recorderListener = new ActionListener() {
public void actionPerformed(final ActionEvent event) {
System.out.println(event.getActionCommand());
}
};
public SwingEventRecordingWatcher(){
hierarchy = AWTHierarchy.getDefault();
recorder = new SwingGuiTestRecorder();
recorder.addListener(new ConsoleReportingListener());
recorder.addListener(cache);
recorder.addListener(new SemanticEventAdapter() {
public void notifyDispose() {
codegen();
}
});
// recorder.addActionListener(recorderListener);
}
/**
* Watch for events;
*/
public void watch() {
// record();
recorder.start();
waitForDisposeLoop();
}
public void codegen() {
IUISemanticEvent[] events = getEvents();
System.out.println("cached events: ");
for (int i = 0; i < events.length; i++) {
System.out.println("\t" + events[i]);
}
String src = new SwingTestGenerator("MockTest", "test", "MockApp", new String[]{}).generate(new EventStream(Arrays.asList(events)));
//String src = new CodeGenerator(new SWTTestCaseBuilder("FooTest2", null, "com.windowtester.swt.tests.apps.InstrumentedApp", null)).generate(new EventStream(Arrays.asList(events)));
System.out.println(src);
}
public IUISemanticEvent[] getEvents() {
return cache.getEvents();
}
private static void waitForDisposeLoop(){
}
private static void record() {
normalizer.startListening(new SingleThreadedEventListener() {
protected void processEvent(final AWTEvent event) {
startRecordingEvent(event);
}
}, FIXTURE_EVENT_MASK);
}
/**
* The events are sent to the recorder.
*/
public static void startRecordingEvent(AWTEvent event) {
Object src = event.getSource();
boolean isComponent = src instanceof Component;
// Keep a log of all events we see on non-filtered components
// System.out.println("ED: " + Robot.toString(event)
// + " (" + Thread.currentThread() + ")");
// Allow only component events and AWT menu actions
if (!isComponent && !(src instanceof MenuComponent)) {
System.out.println("Source not a Component or MenuComponent: " + event);
return;
}
if ( recorder != null) {
//System.out.println("recorder process event");
try {
recorder.startRecordingEvent(event);
}
catch(RecordingFailedException e) {
// Stop recording, but keep what we've got so far
recorder.stop();
e.printStackTrace();
}
}
}
/** Stop recording and update the recorder actions' state. */
public static void stopRecording(boolean discardRecording) {
recorder.terminate();
}
}