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; yourself. 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: WMWithTwoBrowsersAndTwoWorkspacesTest>>testTileVisibleWindowsShouldPlaceThemInTwoColumnsAndRows 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. or WMWithTwoBrowsersAndTwoWorkspacesTest>>testTileLastUsedWindowsShouldTileOnlyLastTwoWindowsUsed 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: WMWithAnOBBrowserAndDockingBarsTest>>setUp super setUp. obbrowser := self newWindowFor: #OBSystemBrowser. taskBar := TaskbarMorph new openInWorld: testWorld; adhereToEdge: #bottom. leftBar := DockingBarMorph new adhereToLeft; width: 25; openInWorld: testWorld. Note that in Core there's no OB, so tests are expected to fail: WMWithAnOBBrowserAndDockingBarsTest>>expectedFailures ^ (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": TWMBarWithTwoBrowsersAndTwoWorkspacesTest>>testOtherToolsMenuShouldContainsEntryForOpeningSUnitTestRunner 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: TWMBarWithTwoBrowsersAndTwoWorkspacesTest>>testClickOnBrowserTwoMenuItemWhenMinimizedShouldActivateIt |menuItem| 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. WMWithTwoBrowsersAndTwoWorkspacesTest>>tearDown ..... TilingWM numberOfLastUsedWindows: backupNumberOfWindowsSetting. Ideas welcome :) Laurent Laffont - @lolgzs <http://twitter.com/#!/lolgzs> Pharo Smalltalk Screencasts: http://www.pharocasts.com/ Blog: http://magaloma.blogspot.com/ Developer group: http://cara74.seasidehosting.st
Doru
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 :)
http://magaloma.blogspot.com/2011/06/multiple-worlds-for-twm.html
Cheers,
Laurent Laffont - @lolgzs
Pharo Smalltalk Screencasts: http://www.pharocasts.com/ Blog: http://magaloma.blogspot.com/ Developer group: http://cara74.seasidehosting.st
-- www.tudorgirba.com
"Yesterday is a fact. Tomorrow is a possibility. Today is a challenge."