<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Dec 8, 2013 at 4:34 PM, Chris Muller <span dir="ltr">&lt;<a href="mailto:asqueaker@gmail.com" target="_blank">asqueaker@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">There has been a great effort headed up by Frank to organize behaviors<br>

into a hierarchy of packages with no cyclic dependencies.  This is a<br>
great goal and great effort.<br>
<br>
But the introduction of this new package (with just two classes)<br>
prompts a need to understand what _all_ the goals are for this<br>
process.  Certainly, everyone agrees we want no cyclic dependencies<br>
between packages.<br>
<br>
But this extraction doesn&#39;t help that.  Nothing will ever depend on<br>
ToolBuilderTests, so how does this new leaf of the package-dependency<br>
hierarchy, justify its existence in cyberspace?<br>
<br>
Getting SUnit completely out of the image will mean ALL packages must<br>
be split between their &quot;-Kernel&quot; and &quot;-Tests&quot; components.  Is that the<br>
plan?<br></blockquote><div><br></div><div>Well, splitting development from deployment is always important if the package in question is of the complexity that it has those two halves.  Whether splitting development into tests and non-tests development makes sense is a matter of taste ({deployment, development, tests} is better named but its also more tedious than {deployment, tests}, I can imaging people getting more confused when they can&#39;t develop a package without loading tests than without loading development).</div>
<div><br></div><div>This split is not merely academic.  It is also important.  Consider a substantial FFI, say to a database such as MySQL, or a graphics system such as OpenGL.  The development of these will depend on substantial tool support for parsing header files, etc, etc.  It&#39;s not reasonable to require that the deployment of such a beast entail deploying with the entire C development tools, which is likely what will happen without the separation.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
I&#39;m not necessarily against it -- I&#39;m just having trouble articulating<br>
what&#39;s wrong with co-location of a package&#39;s tests, with the package<br>
itself, and it depending on SUnit vs. not.  SUnit is not that big and<br>
depends on nothing but Core.<br></blockquote><div><br></div><div>Cuz with complex packages it drags in complex development-time-only code (and itself may have secondary dependencies) that causes bloat.  Cuz separating deployment from development makes much clearer what the run-time, deployment deoendencies of the package are.  Cuz a small core is likely impracticably hard to build without this practice.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">On Sat, Dec 7, 2013 at 1:49 PM,  &lt;<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>&gt; wrote:<br>

&gt; Frank Shearar uploaded a new version of ToolBuilderTests to project The Trunk:<br>
&gt; <a href="http://source.squeak.org/trunk/ToolBuilderTests-fbs.1.mcz" target="_blank">http://source.squeak.org/trunk/ToolBuilderTests-fbs.1.mcz</a><br>
&gt;<br>
&gt; ==================== Summary ====================<br>
&gt;<br>
&gt; Name: ToolBuilderTests-fbs.1<br>
&gt; Author: fbs<br>
&gt; Time: 7 December 2013, 7:47:14.931 pm<br>
&gt; UUID: f75a55b6-ea0a-4b43-bf08-dfcf82dc99fb<br>
&gt; Ancestors:<br>
&gt;<br>
&gt; ToolBuilder SUnit tests.<br>
&gt;<br>
&gt; ==================== Snapshot ====================<br>
&gt;<br>
&gt; SystemOrganization addCategory: #ToolBuilderTests!<br>
&gt;<br>
&gt; TestCase subclass: #PluggableMenuItemSpecTests<br>
&gt;         instanceVariableNames: &#39;&#39;<br>
&gt;         classVariableNames: &#39;&#39;<br>
&gt;         poolDictionaries: &#39;&#39;<br>
&gt;         category: &#39;ToolBuilderTests&#39;!<br>
&gt;<br>
&gt; ----- Method: PluggableMenuItemSpecTests&gt;&gt;testBeCheckableMakesItemCheckable (in category &#39;as yet unclassified&#39;) -----<br>
&gt; testBeCheckableMakesItemCheckable<br>
&gt;         | itemSpec |<br>
&gt;         itemSpec := PluggableMenuItemSpec new.<br>
&gt;         itemSpec beCheckable.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;Item not checkable&#39;.!<br>
&gt;<br>
&gt; ----- Method: PluggableMenuItemSpecTests&gt;&gt;testByDefaultNotCheckable (in category &#39;as yet unclassified&#39;) -----<br>
&gt; testByDefaultNotCheckable<br>
&gt;         | itemSpec |<br>
&gt;         itemSpec := PluggableMenuItemSpec new.<br>
&gt;         self deny: itemSpec isCheckable.!<br>
&gt;<br>
&gt; ----- Method: PluggableMenuItemSpecTests&gt;&gt;testNoMarkerMakesItemChecked (in category &#39;as yet unclassified&#39;) -----<br>
&gt; testNoMarkerMakesItemChecked<br>
&gt;         | itemSpec |<br>
&gt;         itemSpec := PluggableMenuItemSpec new.<br>
&gt;         itemSpec label: &#39;&lt;no&gt;no&#39;.<br>
&gt;         itemSpec analyzeLabel.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;item not checkable&#39;.<br>
&gt;         self deny: itemSpec checked description: &#39;item checked&#39;.!<br>
&gt;<br>
&gt; ----- Method: PluggableMenuItemSpecTests&gt;&gt;testOffMarkerMakesItemChecked (in category &#39;as yet unclassified&#39;) -----<br>
&gt; testOffMarkerMakesItemChecked<br>
&gt;         | itemSpec |<br>
&gt;         itemSpec := PluggableMenuItemSpec new.<br>
&gt;         itemSpec label: &#39;&lt;off&gt;off&#39;.<br>
&gt;         itemSpec analyzeLabel.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;item not checkable&#39;.<br>
&gt;         self deny: itemSpec checked description: &#39;item checked&#39;.!<br>
&gt;<br>
&gt; ----- Method: PluggableMenuItemSpecTests&gt;&gt;testOnMarkerMakesItemChecked (in category &#39;as yet unclassified&#39;) -----<br>
&gt; testOnMarkerMakesItemChecked<br>
&gt;         | itemSpec |<br>
&gt;         itemSpec := PluggableMenuItemSpec new.<br>
&gt;         itemSpec label: &#39;&lt;on&gt;on&#39;.<br>
&gt;         itemSpec analyzeLabel.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;item not checkable&#39;.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;item not checked&#39;.!<br>
&gt;<br>
&gt; ----- Method: PluggableMenuItemSpecTests&gt;&gt;testYesMarkerMakesItemChecked (in category &#39;as yet unclassified&#39;) -----<br>
&gt; testYesMarkerMakesItemChecked<br>
&gt;         | itemSpec |<br>
&gt;         itemSpec := PluggableMenuItemSpec new.<br>
&gt;         itemSpec label: &#39;&lt;yes&gt;on&#39;.<br>
&gt;         itemSpec analyzeLabel.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;item not checkable&#39;.<br>
&gt;         self assert: itemSpec isCheckable description: &#39;item not checked&#39;.!<br>
&gt;<br>
&gt; TestCase subclass: #ToolBuilderTests<br>
&gt;         instanceVariableNames: &#39;builder widget queries&#39;<br>
&gt;         classVariableNames: &#39;&#39;<br>
&gt;         poolDictionaries: &#39;&#39;<br>
&gt;         category: &#39;ToolBuilderTests&#39;!<br>
&gt;<br>
&gt; !ToolBuilderTests commentStamp: &#39;ar 2/11/2005 15:01&#39; prior: 0!<br>
&gt; Some tests to make sure ToolBuilder does what it says.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests class&gt;&gt;isAbstract (in category &#39;testing&#39;) -----<br>
&gt; isAbstract<br>
&gt;         ^self == ToolBuilderTests!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;acceptWidgetText (in category &#39;support&#39;) -----<br>
&gt; acceptWidgetText<br>
&gt;         &quot;accept text in widget&quot;<br>
&gt;         ^ self subclassResponsibility!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;assertItemFiresWith: (in category &#39;tests-menus&#39;) -----<br>
&gt; assertItemFiresWith: aBlock<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableMenuSpec new.<br>
&gt;         spec model: self.<br>
&gt;         aBlock value: spec.<br>
&gt;         widget := builder build: spec.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self fireMenuItemWidget.<br>
&gt;         self assert: (queries includes: #fireMenuAction)!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;buttonWidgetEnabled (in category &#39;support&#39;) -----<br>
&gt; buttonWidgetEnabled<br>
&gt;         &quot;Answer whether the current widget (a button) is currently enabled&quot;<br>
&gt;<br>
&gt;         ^ widget getModelState!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;changeListWidget (in category &#39;support&#39;) -----<br>
&gt; changeListWidget<br>
&gt;         &quot;Change the list widget&#39;s selection index&quot;<br>
&gt;         self subclassResponsibility!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;expectedButtonSideEffects (in category &#39;support&#39;) -----<br>
&gt; expectedButtonSideEffects<br>
&gt;         &quot;side effect queries we expect to see on buttons&quot;<br>
&gt;         ^#()!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;fireButton (in category &#39;tests-button&#39;) -----<br>
&gt; fireButton<br>
&gt;         queries add: #fireButton.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;fireButtonWidget (in category &#39;support&#39;) -----<br>
&gt; fireButtonWidget<br>
&gt;         &quot;Fire the widget, e.g., perform what is needed for the guy to trigger its action&quot;<br>
&gt;         self subclassResponsibility!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;fireMenuAction (in category &#39;tests-menus&#39;) -----<br>
&gt; fireMenuAction<br>
&gt;         queries add: #fireMenuAction!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;fireMenuItemWidget (in category &#39;tests-menus&#39;) -----<br>
&gt; fireMenuItemWidget<br>
&gt;         self subclassResponsibility!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getChildren (in category &#39;tests-panel&#39;) -----<br>
&gt; getChildren<br>
&gt;         queries add: #getChildren.<br>
&gt;         ^#()!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getChildrenOf: (in category &#39;tests-trees&#39;) -----<br>
&gt; getChildrenOf: item<br>
&gt;         queries add: #getChildrenOf.<br>
&gt;         ^(1 to: 9) asArray!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getColor (in category &#39;tests-text&#39;) -----<br>
&gt; getColor<br>
&gt;         queries add: #getColor.<br>
&gt;         ^Color tan!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getEnabled (in category &#39;tests-button&#39;) -----<br>
&gt; getEnabled<br>
&gt;         queries add: #getEnabled.<br>
&gt;         ^true!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getHelpOf: (in category &#39;tests-trees&#39;) -----<br>
&gt; getHelpOf: item<br>
&gt;         ^&#39;help&#39;!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getIconOf: (in category &#39;tests-trees&#39;) -----<br>
&gt; getIconOf: item<br>
&gt;         queries add: #getIconOf.<br>
&gt;         ^nil!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getLabel (in category &#39;tests-button&#39;) -----<br>
&gt; getLabel<br>
&gt;         queries add: #getLabel.<br>
&gt;         ^&#39;TestLabel&#39;!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getLabelOf: (in category &#39;tests-trees&#39;) -----<br>
&gt; getLabelOf: item<br>
&gt;         queries add: #getLabelOf.<br>
&gt;         ^item asString!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getList (in category &#39;tests-lists&#39;) -----<br>
&gt; getList<br>
&gt;         queries add: #getList.<br>
&gt;         ^(1 to: 100) collect:[:i| i printString].!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getListIndex (in category &#39;tests-lists&#39;) -----<br>
&gt; getListIndex<br>
&gt;         queries add: #getListIndex.<br>
&gt;         ^13!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getListSelection (in category &#39;tests-lists&#39;) -----<br>
&gt; getListSelection<br>
&gt;         queries add: #getListSelection.<br>
&gt;         ^&#39;55&#39;!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getMenu: (in category &#39;tests-lists&#39;) -----<br>
&gt; getMenu: aMenu<br>
&gt;         queries add: #getMenu.<br>
&gt;         ^aMenu!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getRoots (in category &#39;tests-trees&#39;) -----<br>
&gt; getRoots<br>
&gt;         queries add: #getRoots.<br>
&gt;         ^(1 to: 9) asArray!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getState (in category &#39;tests-button&#39;) -----<br>
&gt; getState<br>
&gt;         queries add: #getState.<br>
&gt;         ^true!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getText (in category &#39;tests-text&#39;) -----<br>
&gt; getText<br>
&gt;         queries add: #getText.<br>
&gt;         ^Text new!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getTextSelection (in category &#39;tests-text&#39;) -----<br>
&gt; getTextSelection<br>
&gt;         queries add: #getTextSelection.<br>
&gt;         ^(1 to: 0)!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;getTreeSelectionPath (in category &#39;tests-trees&#39;) -----<br>
&gt; getTreeSelectionPath<br>
&gt;         queries add: #getTreeSelectionPath.<br>
&gt;         ^{2. 4. 3}!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;hasChildren: (in category &#39;tests-trees&#39;) -----<br>
&gt; hasChildren: item<br>
&gt;         queries add: #hasChildren.<br>
&gt;         ^true!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;keyPress: (in category &#39;tests-lists&#39;) -----<br>
&gt; keyPress: key<br>
&gt;         queries add: #keyPress.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeButton (in category &#39;tests-button&#39;) -----<br>
&gt; makeButton<br>
&gt;         | spec |<br>
&gt;         spec := self makeButtonSpec.<br>
&gt;         widget := builder build: spec.<br>
&gt;         ^widget!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeButtonSpec (in category &#39;tests-button&#39;) -----<br>
&gt; makeButtonSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec name: #button.<br>
&gt;         spec model: self.<br>
&gt;         spec label: #getLabel.<br>
&gt;         spec color: #getColor.<br>
&gt;         spec state: #getState.<br>
&gt;         spec enabled: #getEnabled.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeInputField (in category &#39;tests-input&#39;) -----<br>
&gt; makeInputField<br>
&gt;         | spec |<br>
&gt;         spec := self makeInputFieldSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeInputFieldSpec (in category &#39;tests-input&#39;) -----<br>
&gt; makeInputFieldSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableInputFieldSpec new.<br>
&gt;         spec name: #input.<br>
&gt;         spec model: self.<br>
&gt;         spec getText: #getText.<br>
&gt;         spec selection: #getTextSelection.<br>
&gt;         spec color: #getColor.<br>
&gt;         &quot;&lt;-- the following cannot be tested very well --&gt;&quot;<br>
&gt;         spec setText: #setText:.<br>
&gt;         spec menu: #getMenu:.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeItemList (in category &#39;tests-lists&#39;) -----<br>
&gt; makeItemList<br>
&gt;         | spec |<br>
&gt;         spec := self makeItemListSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeItemListSpec (in category &#39;tests-lists&#39;) -----<br>
&gt; makeItemListSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableListSpec new.<br>
&gt;         spec name: #list.<br>
&gt;         spec model: self.<br>
&gt;         spec list: #getList.<br>
&gt;         spec getSelected: #getListSelection.<br>
&gt;         &quot;&lt;-- the following cannot be tested very well --&gt;&quot;<br>
&gt;         spec setSelected: #setListSelection:.<br>
&gt;         spec menu: #getMenu:.<br>
&gt;         spec keyPress: #keyPress:.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeList (in category &#39;tests-lists&#39;) -----<br>
&gt; makeList<br>
&gt;         | spec |<br>
&gt;         spec := self makeListSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeListSpec (in category &#39;tests-lists&#39;) -----<br>
&gt; makeListSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableListSpec new.<br>
&gt;         spec name: #list.<br>
&gt;         spec model: self.<br>
&gt;         spec list: #getList.<br>
&gt;         spec getIndex: #getListIndex.<br>
&gt;         &quot;&lt;-- the following cannot be tested very well --&gt;&quot;<br>
&gt;         spec setIndex: #setListIndex:.<br>
&gt;         spec menu: #getMenu:.<br>
&gt;         spec keyPress: #keyPress:.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makePanel (in category &#39;tests-panel&#39;) -----<br>
&gt; makePanel<br>
&gt;         | spec |<br>
&gt;         spec := self makePanelSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makePanelSpec (in category &#39;tests-panel&#39;) -----<br>
&gt; makePanelSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggablePanelSpec new.<br>
&gt;         spec name: #panel.<br>
&gt;         spec model: self.<br>
&gt;         spec children: #getChildren.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeText (in category &#39;tests-text&#39;) -----<br>
&gt; makeText<br>
&gt;         | spec |<br>
&gt;         spec := self makeTextSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeTextSpec (in category &#39;tests-text&#39;) -----<br>
&gt; makeTextSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableTextSpec new.<br>
&gt;         spec name: #text.<br>
&gt;         spec model: self.<br>
&gt;         spec getText: #getText.<br>
&gt;         spec selection: #getTextSelection.<br>
&gt;         spec color: #getColor.<br>
&gt;         &quot;&lt;-- the following cannot be tested very well --&gt;&quot;<br>
&gt;         spec setText: #setText:.<br>
&gt;         spec menu: #getMenu:.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeTree (in category &#39;tests-trees&#39;) -----<br>
&gt; makeTree<br>
&gt;         | spec |<br>
&gt;         spec := self makeTreeSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeTreeSpec (in category &#39;tests-trees&#39;) -----<br>
&gt; makeTreeSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableTreeSpec new.<br>
&gt;         spec name: #tree.<br>
&gt;         spec model: self.<br>
&gt;         spec roots: #getRoots.<br>
&gt;         &quot;&lt;-- the following cannot be tested very well --&gt;&quot;<br>
&gt;         spec getSelectedPath: #getTreeSelectionPath.<br>
&gt;         spec getChildren: #getChildrenOf:.<br>
&gt;         spec hasChildren: #hasChildren:.<br>
&gt;         spec label: #getLabelOf:.<br>
&gt;         spec icon: #getIconOf:.<br>
&gt;         spec help: #getHelpOf:.<br>
&gt;         spec setSelected: #setTreeSelection:.<br>
&gt;         spec menu: #getMenu:.<br>
&gt;         spec keyPress: #keyPress:.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeWindow (in category &#39;tests-window&#39;) -----<br>
&gt; makeWindow<br>
&gt;         | spec |<br>
&gt;         spec := self makeWindowSpec.<br>
&gt;         widget := builder build: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;makeWindowSpec (in category &#39;tests-window&#39;) -----<br>
&gt; makeWindowSpec<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableWindowSpec new.<br>
&gt;         spec name: #window.<br>
&gt;         spec model: self.<br>
&gt;         spec children: #getChildren.<br>
&gt;         spec label: #getLabel.<br>
&gt;         spec closeAction: #noteWindowClosed.<br>
&gt;         ^spec!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;noteWindowClosed (in category &#39;tests-window&#39;) -----<br>
&gt; noteWindowClosed<br>
&gt;         queries add: #noteWindowClosed.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;openWindow (in category &#39;tests-window&#39;) -----<br>
&gt; openWindow<br>
&gt;         | spec |<br>
&gt;         spec := self makeWindowSpec.<br>
&gt;         widget := builder open: spec.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;returnFalse (in category &#39;support&#39;) -----<br>
&gt; returnFalse<br>
&gt;         ^false!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;returnTrue (in category &#39;support&#39;) -----<br>
&gt; returnTrue<br>
&gt;         ^true!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;setListIndex: (in category &#39;tests-lists&#39;) -----<br>
&gt; setListIndex: index<br>
&gt;         queries add: #setListIndex.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;setListSelection: (in category &#39;tests-lists&#39;) -----<br>
&gt; setListSelection: newIndex<br>
&gt;         queries add: #setListSelection.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;setText: (in category &#39;tests-text&#39;) -----<br>
&gt; setText: newText<br>
&gt;         queries add: #setText.<br>
&gt;         ^false!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;setTreeSelection: (in category &#39;tests-trees&#39;) -----<br>
&gt; setTreeSelection: node<br>
&gt;         queries add: #setTreeSelection.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;setUp (in category &#39;support&#39;) -----<br>
&gt; setUp<br>
&gt;         queries := IdentitySet new.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;shutDown (in category &#39;support&#39;) -----<br>
&gt; shutDown<br>
&gt;         self myDependents: nil!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testAddTargetSelectorArgumentList (in category &#39;tests-menus&#39;) -----<br>
&gt; testAddTargetSelectorArgumentList<br>
&gt;         self assertItemFiresWith:<br>
&gt;                 [:spec | spec<br>
&gt;                                 add: &#39;Menu Item&#39;<br>
&gt;                                 target: self<br>
&gt;                                 selector: #fireMenuAction<br>
&gt;                                 argumentList: #()]!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonFiresBlock (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonFiresBlock<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec action: [self fireButton].<br>
&gt;         widget := builder build: spec.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self fireButtonWidget.<br>
&gt;         self assert: (queries includes: #fireButton).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonFiresMessage (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonFiresMessage<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec action: (MessageSend receiver: self selector: #fireButton arguments: #()).<br>
&gt;         widget := builder build: spec.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self fireButtonWidget.<br>
&gt;         self assert: (queries includes: #fireButton).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonFiresSymbol (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonFiresSymbol<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec action: #fireButton.<br>
&gt;         widget := builder build: spec.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self fireButtonWidget.<br>
&gt;         self assert: (queries includes: #fireButton).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonInitiallyDisabled (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonInitiallyDisabled<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec label: #getLabel.<br>
&gt;         spec color: #getColor.<br>
&gt;         spec state: #getState.<br>
&gt;         spec enabled: #returnFalse.<br>
&gt;         widget := builder build: spec.<br>
&gt;         self deny: (self buttonWidgetEnabled)!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonInitiallyDisabledSelector (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonInitiallyDisabledSelector<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec label: #getLabel.<br>
&gt;         spec color: #getColor.<br>
&gt;         spec state: #getState.<br>
&gt;         spec enabled: #returnFalse.<br>
&gt;         widget := builder build: spec.<br>
&gt;         self deny: (self buttonWidgetEnabled)!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonInitiallyEnabled (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonInitiallyEnabled<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec label: #getLabel.<br>
&gt;         spec color: #getColor.<br>
&gt;         spec state: #getState.<br>
&gt;         spec enabled: #returnTrue.<br>
&gt;         widget := builder build: spec.<br>
&gt;         self assert: (self buttonWidgetEnabled)!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonInitiallyEnabledSelector (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonInitiallyEnabledSelector<br>
&gt;         | spec |<br>
&gt;         spec := builder pluggableButtonSpec new.<br>
&gt;         spec model: self.<br>
&gt;         spec label: #getLabel.<br>
&gt;         spec color: #getColor.<br>
&gt;         spec state: #getState.<br>
&gt;         spec enabled: #returnTrue.<br>
&gt;         widget := builder build: spec.<br>
&gt;         self assert: (self buttonWidgetEnabled)!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testButtonWidgetID (in category &#39;tests-button&#39;) -----<br>
&gt; testButtonWidgetID<br>
&gt;         self makeButton.<br>
&gt;         self assert: (builder widgetAt: #button) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetButtonColor (in category &#39;tests-button&#39;) -----<br>
&gt; testGetButtonColor<br>
&gt;         self makeButton.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getColor.<br>
&gt;         self assert: (queries includes: #getColor).<br>
&gt;         self assert: self widgetColor = self getColor.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetButtonEnabled (in category &#39;tests-button&#39;) -----<br>
&gt; testGetButtonEnabled<br>
&gt;         self makeButton.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getEnabled.<br>
&gt;         self assert: (queries includes: #getEnabled).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetButtonLabel (in category &#39;tests-button&#39;) -----<br>
&gt; testGetButtonLabel<br>
&gt;         self makeButton.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getLabel.<br>
&gt;         self assert: (queries includes: #getLabel).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetButtonSideEffects (in category &#39;tests-button&#39;) -----<br>
&gt; testGetButtonSideEffects<br>
&gt;         self makeButton.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self expectedButtonSideEffects do:[:sym|<br>
&gt;                 self assert: (queries includes: sym).<br>
&gt;                 queries remove: sym.<br>
&gt;         ].<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetButtonState (in category &#39;tests-button&#39;) -----<br>
&gt; testGetButtonState<br>
&gt;         self makeButton.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getState.<br>
&gt;         self assert: (queries includes: #getState).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetInputFieldColor (in category &#39;tests-input&#39;) -----<br>
&gt; testGetInputFieldColor<br>
&gt;         self makeInputField.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getColor.<br>
&gt;         self assert: (queries includes: #getColor).<br>
&gt;         self assert: self widgetColor = self getColor.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetInputFieldSelection (in category &#39;tests-input&#39;) -----<br>
&gt; testGetInputFieldSelection<br>
&gt;         self makeInputField.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getTextSelection.<br>
&gt;         self assert: (queries includes: #getTextSelection).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetInputFieldSideEffectFree (in category &#39;tests-input&#39;) -----<br>
&gt; testGetInputFieldSideEffectFree<br>
&gt;         self makeInputField.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetInputFieldText (in category &#39;tests-input&#39;) -----<br>
&gt; testGetInputFieldText<br>
&gt;         self makeInputField.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getText.<br>
&gt;         self assert: (queries includes: #getText).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetItemListSideEffectFree (in category &#39;tests-lists&#39;) -----<br>
&gt; testGetItemListSideEffectFree<br>
&gt;         self makeItemList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetList (in category &#39;tests-lists&#39;) -----<br>
&gt; testGetList<br>
&gt;         self makeList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getList.<br>
&gt;         self assert: (queries includes: #getList).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetListIndex (in category &#39;tests-lists&#39;) -----<br>
&gt; testGetListIndex<br>
&gt;         self makeList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getListIndex.<br>
&gt;         self assert: (queries includes: #getListIndex).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetListSelection (in category &#39;tests-lists&#39;) -----<br>
&gt; testGetListSelection<br>
&gt;         self makeItemList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getListSelection.<br>
&gt;         self assert: (queries includes: #getListSelection).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetListSideEffectFree (in category &#39;tests-lists&#39;) -----<br>
&gt; testGetListSideEffectFree<br>
&gt;         self makeList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetPanelChildren (in category &#39;tests-panel&#39;) -----<br>
&gt; testGetPanelChildren<br>
&gt;         self makePanel.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getChildren.<br>
&gt;         self assert: (queries includes: #getChildren).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetPanelSideEffectFree (in category &#39;tests-panel&#39;) -----<br>
&gt; testGetPanelSideEffectFree<br>
&gt;         self makePanel.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetText (in category &#39;tests-text&#39;) -----<br>
&gt; testGetText<br>
&gt;         self makeText.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getText.<br>
&gt;         self assert: (queries includes: #getText).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetTextColor (in category &#39;tests-text&#39;) -----<br>
&gt; testGetTextColor<br>
&gt;         self makeText.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getColor.<br>
&gt;         self assert: (queries includes: #getColor).<br>
&gt;         self assert: self widgetColor = self getColor.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetTextSelection (in category &#39;tests-text&#39;) -----<br>
&gt; testGetTextSelection<br>
&gt;         self makeText.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getTextSelection.<br>
&gt;         self assert: (queries includes: #getTextSelection).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetTextSideEffectFree (in category &#39;tests-text&#39;) -----<br>
&gt; testGetTextSideEffectFree<br>
&gt;         self makeText.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetWindowChildren (in category &#39;tests-window&#39;) -----<br>
&gt; testGetWindowChildren<br>
&gt;         self makeWindow.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getChildren.<br>
&gt;         self assert: (queries includes: #getChildren).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetWindowLabel (in category &#39;tests-window&#39;) -----<br>
&gt; testGetWindowLabel<br>
&gt;         self makeWindow.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getLabel.<br>
&gt;         self assert: (queries includes: #getLabel).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testGetWindowSideEffectFree (in category &#39;tests-window&#39;) -----<br>
&gt; testGetWindowSideEffectFree<br>
&gt;         self makeWindow.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #testSignalWithNoDiscernableEffect.<br>
&gt;         self assert: queries isEmpty.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testInputWidgetID (in category &#39;tests-input&#39;) -----<br>
&gt; testInputWidgetID<br>
&gt;         self makeInputField.<br>
&gt;         self assert: (builder widgetAt: #input) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testItemListWidgetID (in category &#39;tests-lists&#39;) -----<br>
&gt; testItemListWidgetID<br>
&gt;         self makeItemList.<br>
&gt;         self assert: (builder widgetAt: #list) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testListWidgetID (in category &#39;tests-lists&#39;) -----<br>
&gt; testListWidgetID<br>
&gt;         self makeList.<br>
&gt;         self assert: (builder widgetAt: #list) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testPanelWidgetID (in category &#39;tests-panel&#39;) -----<br>
&gt; testPanelWidgetID<br>
&gt;         self makePanel.<br>
&gt;         self assert: (builder widgetAt: #panel) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testSetInputField (in category &#39;tests-input&#39;) -----<br>
&gt; testSetInputField<br>
&gt;         self makeInputField.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self acceptWidgetText.<br>
&gt;         self assert: (queries includes: #setText).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testSetListIndex (in category &#39;tests-lists&#39;) -----<br>
&gt; testSetListIndex<br>
&gt;         self makeList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changeListWidget.<br>
&gt;         self assert: (queries includes: #setListIndex).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testSetListSelection (in category &#39;tests-lists&#39;) -----<br>
&gt; testSetListSelection<br>
&gt;         self makeItemList.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changeListWidget.<br>
&gt;         self assert: (queries includes: #setListSelection).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testSetText (in category &#39;tests-text&#39;) -----<br>
&gt; testSetText<br>
&gt;         self makeText.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self acceptWidgetText.<br>
&gt;         self assert: (queries includes: #setText).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testTextWidgetID (in category &#39;tests-text&#39;) -----<br>
&gt; testTextWidgetID<br>
&gt;         self makeText.<br>
&gt;         self assert: (builder widgetAt: #text) == widget!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testTreeExpandPath (in category &#39;tests-trees&#39;) -----<br>
&gt; testTreeExpandPath<br>
&gt;         &quot;@@@@: REMOVE THIS - it&#39;s a hack (changed: #openPath)&quot;<br>
&gt;         self makeTree.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: {#openPath. &#39;4&#39;. &#39;2&#39;. &#39;3&#39;}.<br>
&gt;         self waitTick.<br>
&gt;         self assert: (queries includes: #getChildrenOf).<br>
&gt;         self assert: (queries includes: #setTreeSelection).<br>
&gt;         self assert: (queries includes: #getLabelOf).<br>
&gt; !<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testTreeExpandPathFirst (in category &#39;tests-trees&#39;) -----<br>
&gt; testTreeExpandPathFirst<br>
&gt;         &quot;@@@@: REMOVE THIS - it&#39;s a hack (changed: #openPath)&quot;<br>
&gt;         self makeTree.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: {#openPath. &#39;1&#39;. &#39;2&#39;. &#39;2&#39;}.<br>
&gt;         self waitTick.<br>
&gt;         self assert: (queries includes: #getChildrenOf).<br>
&gt;         self assert: (queries includes: #setTreeSelection).<br>
&gt;         self assert: (queries includes: #getLabelOf).<br>
&gt; !<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testTreeGetSelectionPath (in category &#39;tests-trees&#39;) -----<br>
&gt; testTreeGetSelectionPath<br>
&gt;         self makeTree.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getTreeSelectionPath.<br>
&gt;         self waitTick.<br>
&gt;         self assert: (queries includes: #getTreeSelectionPath).<br>
&gt;         self assert: (queries includes: #getChildrenOf).<br>
&gt;         self assert: (queries includes: #setTreeSelection).<br>
&gt; !<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testTreeRoots (in category &#39;tests-trees&#39;) -----<br>
&gt; testTreeRoots<br>
&gt;         self makeTree.<br>
&gt;         queries := IdentitySet new.<br>
&gt;         self changed: #getRoots.<br>
&gt;         self assert: (queries includes: #getRoots).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testTreeWidgetID (in category &#39;tests-trees&#39;) -----<br>
&gt; testTreeWidgetID<br>
&gt;         self makeTree.<br>
&gt;         self assert: (builder widgetAt: #tree) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testWindowCloseAction (in category &#39;tests-window&#39;) -----<br>
&gt; testWindowCloseAction<br>
&gt;         self openWindow.<br>
&gt;         builder close: widget.<br>
&gt;         self assert: (queries includes: #noteWindowClosed).!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;testWindowID (in category &#39;tests-window&#39;) -----<br>
&gt; testWindowID<br>
&gt;         self makeWindow.<br>
&gt;         self assert: (builder widgetAt: #window) == widget.!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;waitTick (in category &#39;support&#39;) -----<br>
&gt; waitTick<br>
&gt;         ^nil!<br>
&gt;<br>
&gt; ----- Method: ToolBuilderTests&gt;&gt;widgetColor (in category &#39;support&#39;) -----<br>
&gt; widgetColor<br>
&gt;         &quot;Answer color from widget&quot;<br>
&gt;         self subclassResponsibility<br>
&gt;<br>
&gt;         &quot;NOTE: You can bail out if you don&#39;t know how to get the color from the widget:<br>
&gt;                 ^self getColor<br>
&gt;         will work.&quot;!<br>
&gt;<br>
&gt;<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>best,<div>Eliot</div>
</div></div>