Re: [Pharo-project] About GUI tests [was: TWM: Multiple World integration]

Previous Topic Next Topic
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view

Re: [Pharo-project] About GUI tests [was: TWM: Multiple World integration]

laurent laffont

>> I need to write tests for this. A cool thing is that with TWM I've learned a lot on how to test GUIs, Worlds, ...
> I'm interested in these tests.

Me too.

Some words about what I've learned.

As TWM move / resize windows, it's better to create a World dedicated to the tests, so you don't see all your windows moving while testing (and if you use Autotest note that tests are run as soon as you save a method, quite fun :).

So in TWM have a look at WMInANewWorldTestCase>>setUp and some of its subclasses like:
- WMInANewWorldTestCase
     |_  WMWithTwoBrowsersAndTwoWorkspacesTest>>setUp
              |_ TWMBarWithTwoBrowsersAndTwoWorkspacesTest>>setUp 

If I merge the setUps:
testWorld := PasteUpMorph new
initAsTestWorld: WorldState new;
testWorld bounds: (0@0 extent: 200@200).
windowManager := TilingWM forWorld: testWorld.
browser1 := self newBrowserIn: testWorld.
browser2 := self newBrowserIn: testWorld.
workspace1 := self newWorkspaceIn: testWorld.
workspace2 := self newWorkspaceIn: testWorld.

Then it should be easier to understand something like:

windowManager tileVisibleWindows.
self assert: (0@0 extent: 100@100) equals: workspace2 bounds.
self assert: (100@0 extent: 100@100) equals: workspace1 bounds.
self assert: (0@100 extent: 100@100) equals: browser2 bounds.
self assert: (100@100 extent: 100@100) equals: browser1 bounds.


workspace1 activate.
browser2 activate.
workspace2 activate.
browser1 activate.
browser1 minimize.
windowManager tileLastUsedWindows..
self assert: (0@0 extent: 200@100) equals: browser1 bounds.
self assert: (0@100 extent: 200@100) equals: workspace2 bounds.

Another example:

super setUp.
obbrowser :=  self newWindowFor:  #OBSystemBrowser.
taskBar := TaskbarMorph new 
openInWorld: testWorld;
adhereToEdge: #bottom.
leftBar := DockingBarMorph new 
width: 25;
openInWorld: testWorld.

Note that in Core there's no OB, so tests are expected to fail:

^ (Smalltalk at: #OBSystemBrowser ifAbsent: nil)   
ifNil: [self class testSelectors]
ifNotNil: [#()]

Now if I want to test the content of a window / morph,  I use methods you can find in Morph, protocol submorphs-accessing.

For example I want to find the menu that have a given icon. Here's an helper: 

TWMBarWithTwoBrowsersAndTwoWorkspacesTest>>menuWithIcon: aForm
^ self twmBar dock
findDeepSubmorphThat: [:aMorph|  
(aMorph isKindOf: MenuItemMorph)  and:[aMorph icon =  aForm]]
ifAbsent: [nil].

so I can test that the Other Tools menu in TWMBar have an entry named "New TestRunner":

self assertMenuWithIcon: twmBar otherToolsMenuIcon containsItemNamed: 'New TestRunner'.

I can also check that clicking on a given entry do the action I want. For example, if I have a Browser browsing class String, there should be an entry in the Browsers menu. If minimized, when I click on it, the Browser should be placed on top and expanded:

browser2 minimize.
workspace1 activate.
menuItem := self itemNamed: 'String' fromMenuWithIcon: twmBar browsersMenuIcon.
menuItem target perform: (menuItem selector).
self assert: browser2 equals: SystemWindow topWindow.
self assert: (windowManager visibleWindows includes: browser2).

Finally, if you use some settings, it's better to backup them in the setUp and restore them in the tearDown, so you keep your Settings while testing them :)

WMWithTwoBrowsersAndTwoWorkspacesTest >>setUp
backupNumberOfWindowsSetting := TilingWM numberOfLastUsedWindows.
TilingWM numberOfLastUsedWindows: 2. 

      TilingWM numberOfLastUsedWindows: backupNumberOfWindowsSetting.

Ideas welcome :)

Laurent Laffont - @lolgzs

Pharo Smalltalk Screencasts:



>> Laurent
>> On Jun 7, 2011, at 10:33 PM, laurent laffont wrote:
>>> With the help of my local developper group, I've integrated Sean DeNigris work and now Tiling Window Manager supports Multiple Worlds.
>>> Here's a screencast that shows the progress. (My English seems a little less catastrophic than the previous screencast :)
>>> Cheers,
>>> Laurent Laffont - @lolgzs
>>> Pharo Smalltalk Screencasts:
>>> Blog:
>>> Developer group:


"Yesterday is a fact.
 Tomorrow is a possibility.
 Today is a challenge."