/******************************************************************************* * 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.test.widgets; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.swt.custom.CBanner; import org.eclipse.swt.widgets.Widget; import com.windowtester.runtime.swt.internal.widgets.DisplayReference; import com.windowtester.runtime.swt.internal.widgets.ISWTWidgetReference; import com.windowtester.runtime.swt.internal.widgets.SWTWidgetReference; import com.windowtester.runtime.swt.internal.widgets.ShellReference; import com.windowtester.runtime.swt.internal.widgets.WidgetPrinter; import com.windowtester.runtime.swt.internal.widgets.SWTWidgetReference.Visitor; import com.windowtester.test.eclipse.BaseTest; import com.windowtester.test.util.TestCollection; import com.windowtester.test.util.WidgetCollector; public class SWTWidgetReferenceHierarchyTest extends BaseTest { static class Collector implements Visitor { List<SWTWidgetReference<?>> widgets = new ArrayList<SWTWidgetReference<?>>(); public <W extends Widget> void visit(SWTWidgetReference<W> widget) { widgets.add(widget); } public <T extends SWTWidgetReference<?>> void visitEnter(T composite) {} public <T extends SWTWidgetReference<?>> void visitLeave(T composite) { } } DisplayReference displayRef = DisplayReference.getDefault(); LegacyFinderUtil legacyFinder = new LegacyFinderUtil(); @Override protected void oneTimeSetup() throws Exception { new WidgetPrinter().print(); } /* * NOTE: Of special interest is the Menu here which is "orphaned"; see * com.windowtester.test.widgets.LegacyFinderUtil.addOrphanedMenus(Decorations, ArrayList<Widget>) * for some background. Expected: 0: Menu {*Wrong Thread*} 1: CBanner {*Wrong Thread*} 2: StatusLine {*Wrong Thread*} 3: FastViewBar$4 {*Wrong Thread*} 4: ProgressRegion$1 {*Wrong Thread*} 5: Composite {*Wrong Thread*} 6: TrimCommonUIHandle {*Wrong Thread*} 7: TrimCommonUIHandle {*Wrong Thread*} */ public void testGetRootShellChildren() throws Exception { ShellReference shellRef = displayRef.getActiveShell(); assertSameImmediateChildren(shellRef); } public void testCBannerChildren() throws Exception { List<CBanner> banners = new WidgetCollector(getUI()).all(CBanner.class); for (CBanner cBanner : banners) { assertSameImmediateChildren(cBanner); } } public void testAllWidgetsIncludingOrphanedMenus() throws Exception { ShellReference shellRef = displayRef.getActiveShell(); assertContainsOnly(legacyWidgets(shellRef), widgets(shellRef)); } public void testAllWidgetsIgnoringOrphanedMenus() throws Exception { ShellReference shellRef = displayRef.getActiveShell(); assertContainsOnly(legacyWidgets(shellRef), new LegacyFinderUtil().ignoreOrphanedMenus().getAllWidgets(shellRef.getWidget())); } private void assertSameImmediateChildren(Widget w) { assertSameImmediateChildren(SWTWidgetReference.forWidget(w)); } private void assertSameImmediateChildren(ISWTWidgetReference<?> ref) { assertContainsOnly(legacyImmediateChildren(ref), immediateChildren(ref)); } private void assertContainsOnly(Collection<Widget> expected, Collection<Widget> actual) { System.out.println("---------------------------------"); System.out.println("testing: "); System.out.println(expected); TestCollection.assertContainsOnly(expected, actual); } public Collection<Widget> legacyImmediateChildren(ISWTWidgetReference<?> ref) { return legacyFinder.getImmediateChildren(ref.getWidget()); } public Collection<Widget> legacyWidgets(ISWTWidgetReference<?> ref) { return legacyFinder.getAllWidgets(ref.getWidget()); } @SuppressWarnings("unchecked") public List<Widget> immediateChildren(ISWTWidgetReference<?> ref) { List<Widget> widgets = new ArrayList<Widget>(); for (ISWTWidgetReference child : ref.getChildren()) { widgets.add((Widget) child.getWidget()); } return widgets; } @SuppressWarnings("unchecked") public List<Widget> widgets(SWTWidgetReference<?> ref) { Collector collector = new Collector(); ref.accept(collector); List<Widget> widgets = new ArrayList<Widget>(); for (ISWTWidgetReference child : collector.widgets) { widgets.add((Widget) child.getWidget()); } return widgets; } }