<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>src/fitnesse/responders/run/slimResponder/WikiWidgetTable.java</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,40 +1,21 @@
-{{{java.io.InvalidClassException: fitnesse.wiki.CachingPage; local class incompatible: stream classdesc serialVersionUID = 3185659053189820297, local class serialVersionUID = -8781683459235419
-	java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:546)
-	java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
-	java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
-	java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
-	java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
-	java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
-	java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
-	java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
-	fitnesse.wiki.ProxyPage.getObjectFromUrl(ProxyPage.java:155)
-	fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:51)
-	fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:52)
-	fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:45)
-	fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListOfChildPages(TOCWidget.java:85)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:45)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:58)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:47)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:58)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:47)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.render(TOCWidget.java:30)
-	fitnesse.wikitext.widgets.ParentWidget.childHtml(ParentWidget.java:63)
-	fitnesse.wikitext.widgets.WidgetRoot.render(WidgetRoot.java:69)
-	fitnesse.wiki.PageData.processHTMLWidgets(PageData.java:171)
-	fitnesse.wiki.PageData.getHtml(PageData.java:139)
-	fitnesse.html.HtmlUtil.testableHtml(HtmlUtil.java:328)
-	fitnesse.html.HtmlUtil.testableHtml(HtmlUtil.java:280)
-	fitnesse.responders.WikiPageResponder.makeHtml(WikiPageResponder.java:73)
-	fitnesse.responders.WikiPageResponder.makeResponse(WikiPageResponder.java:42)
-	fitnesse.FitNesseExpediter.createGoodResponse(FitNesseExpediter.java:130)
-	fitnesse.FitNesseExpediter.makeResponse(FitNesseExpediter.java:112)
-	fitnesse.FitNesseExpediter.start(FitNesseExpediter.java:39)
-	fitnesse.FitNesseServer.serve(FitNesseServer.java:28)
-	fitnesse.FitNesseServer.serve(FitNesseServer.java:19)
-	fitnesse.socketservice.SocketService$ServerRunner.run(SocketService.java:100)
+{{{java.io.StreamCorruptedException: invalid stream header
+	java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:764)
+	java.io.ObjectInputStream.&lt;init&gt;(ObjectInputStream.java:277)
+	fitnesse.wiki.ProxyPage.getObjectFromUrl(ProxyPage.java:164)
+	fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:58)
+	fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:54)
+	fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:47)
+	fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:39)
+	fitnesse.responders.run.SuiteResponder.addTestPagesToList(SuiteResponder.java:276)
+	fitnesse.responders.run.SuiteResponder.addTestPagesToList(SuiteResponder.java:279)
+	fitnesse.responders.run.SuiteResponder.getAllTestPagesUnder(SuiteResponder.java:239)
+	fitnesse.responders.run.SuiteResponder.getAllPagesToRunForThisSuite(SuiteResponder.java:212)
+	fitnesse.responders.run.SuiteResponder.makeMapOfPagesByTestSystem(SuiteResponder.java:324)
+	fitnesse.responders.run.SuiteResponder.executeTestPages(SuiteResponder.java:58)
+	fitnesse.responders.run.SuiteResponder.performExecution(SuiteResponder.java:40)
+	fitnesse.responders.run.TestResponder.doSending(TestResponder.java:53)
+	fitnesse.responders.ChunkingResponder.startSending(ChunkingResponder.java:69)
+	fitnesse.responders.ChunkingResponder.access$000(ChunkingResponder.java:17)
+	fitnesse.responders.ChunkingResponder$RespondingRunnable.run(ChunkingResponder.java:120)
 	java.lang.Thread.run(Thread.java:613)
 }}}
\ No newline at end of file</diff>
      <filename>FitNesseRoot/FitNesse/MarkupVirtualWiki/VirtualWikiNetworkError/content.txt</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 &lt;?xml version=&quot;1.0&quot;?&gt;
 &lt;properties&gt;
 	&lt;Files/&gt;
-	&lt;LastModified&gt;20070619094958&lt;/LastModified&gt;
+	&lt;LastModified&gt;20081128122223&lt;/LastModified&gt;
 	&lt;RecentChanges/&gt;
 	&lt;WhereUsed/&gt;
 &lt;/properties&gt;</diff>
      <filename>FitNesseRoot/FitNesse/MarkupVirtualWiki/VirtualWikiNetworkError/properties.xml</filename>
    </modified>
    <modified>
      <diff>@@ -2,33 +2,20 @@
 	java.net.URL.&lt;init&gt;(URL.java:567)
 	java.net.URL.&lt;init&gt;(URL.java:464)
 	java.net.URL.&lt;init&gt;(URL.java:413)
-	fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:50)
-	fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:52)
-	fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:45)
-	fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListOfChildPages(TOCWidget.java:85)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:45)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:58)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:47)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:58)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:47)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.render(TOCWidget.java:30)
-	fitnesse.wikitext.widgets.ParentWidget.childHtml(ParentWidget.java:63)
-	fitnesse.wikitext.widgets.WidgetRoot.render(WidgetRoot.java:69)
-	fitnesse.wiki.PageData.processHTMLWidgets(PageData.java:171)
-	fitnesse.wiki.PageData.getHtml(PageData.java:139)
-	fitnesse.html.HtmlUtil.testableHtml(HtmlUtil.java:328)
-	fitnesse.html.HtmlUtil.testableHtml(HtmlUtil.java:280)
-	fitnesse.responders.WikiPageResponder.makeHtml(WikiPageResponder.java:73)
-	fitnesse.responders.WikiPageResponder.makeResponse(WikiPageResponder.java:42)
-	fitnesse.FitNesseExpediter.createGoodResponse(FitNesseExpediter.java:130)
-	fitnesse.FitNesseExpediter.makeResponse(FitNesseExpediter.java:112)
-	fitnesse.FitNesseExpediter.start(FitNesseExpediter.java:39)
-	fitnesse.FitNesseServer.serve(FitNesseServer.java:28)
-	fitnesse.FitNesseServer.serve(FitNesseServer.java:19)
-	fitnesse.socketservice.SocketService$ServerRunner.run(SocketService.java:100)
+	fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:57)
+	fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:54)
+	fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:47)
+	fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:39)
+	fitnesse.responders.run.SuiteResponder.addTestPagesToList(SuiteResponder.java:276)
+	fitnesse.responders.run.SuiteResponder.addTestPagesToList(SuiteResponder.java:279)
+	fitnesse.responders.run.SuiteResponder.getAllTestPagesUnder(SuiteResponder.java:239)
+	fitnesse.responders.run.SuiteResponder.getAllPagesToRunForThisSuite(SuiteResponder.java:212)
+	fitnesse.responders.run.SuiteResponder.makeMapOfPagesByTestSystem(SuiteResponder.java:324)
+	fitnesse.responders.run.SuiteResponder.executeTestPages(SuiteResponder.java:58)
+	fitnesse.responders.run.SuiteResponder.performExecution(SuiteResponder.java:40)
+	fitnesse.responders.run.TestResponder.doSending(TestResponder.java:53)
+	fitnesse.responders.ChunkingResponder.startSending(ChunkingResponder.java:69)
+	fitnesse.responders.ChunkingResponder.access$000(ChunkingResponder.java:17)
+	fitnesse.responders.ChunkingResponder$RespondingRunnable.run(ChunkingResponder.java:120)
 	java.lang.Thread.run(Thread.java:613)
 }}}
\ No newline at end of file</diff>
      <filename>FitNesseRoot/FitNesse/RowFixtureMultipleKeys/VirtualWikiNetworkError/content.txt</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 &lt;properties&gt;
 	&lt;Edit&gt;true&lt;/Edit&gt;
 	&lt;Files&gt;true&lt;/Files&gt;
-	&lt;LastModified&gt;20070619094959&lt;/LastModified&gt;
+	&lt;LastModified&gt;20081128122222&lt;/LastModified&gt;
 	&lt;Properties&gt;true&lt;/Properties&gt;
 	&lt;RecentChanges&gt;true&lt;/RecentChanges&gt;
 	&lt;Refactor&gt;true&lt;/Refactor&gt;</diff>
      <filename>FitNesseRoot/FitNesse/RowFixtureMultipleKeys/VirtualWikiNetworkError/properties.xml</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,7 @@
 |ensure|login with username|Bob|and password|xyzzy|
 |note|this is a comment|
 |show|number of login attempts|
+|$symbol=|login message|
 
 The fixture for this table is:
 {{{public class LoginDialogDriver {
@@ -58,5 +59,7 @@ This should be pretty clear.  Each row is a single instruction in the script.
 
  * If the word ''show'' is in the first cell, then it should be followed by a function.  A new cell will be added when the test is run, and it will contain the return value of the function.
 
+ * If a symbol assignment is in the first cell, then it should be followed by a functions.  The symbol is assigned the value returned by that function.
+
 
 </diff>
      <filename>FitNesseRoot/FitNesse/SliM/ScriptTable/content.txt</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 	&lt;Edit/&gt;
 	&lt;Files/&gt;
 	&lt;Help/&gt;
-	&lt;LastModified&gt;20081117121916&lt;/LastModified&gt;
+	&lt;LastModified&gt;20081129072939&lt;/LastModified&gt;
 	&lt;Properties/&gt;
 	&lt;RecentChanges/&gt;
 	&lt;Refactor/&gt;
@@ -12,6 +12,6 @@
 	&lt;Test/&gt;
 	&lt;Versions/&gt;
 	&lt;WhereUsed/&gt;
-	&lt;saveId&gt;1225339583890&lt;/saveId&gt;
-	&lt;ticketId&gt;-1709707407730454200&lt;/ticketId&gt;
+	&lt;saveId&gt;1227965379500&lt;/saveId&gt;
+	&lt;ticketId&gt;-3789012764868938316&lt;/ticketId&gt;
 &lt;/properties&gt;</diff>
      <filename>FitNesseRoot/FitNesse/SliM/ScriptTable/properties.xml</filename>
    </modified>
    <modified>
      <diff>@@ -2,33 +2,20 @@
 	java.net.URL.&lt;init&gt;(URL.java:567)
 	java.net.URL.&lt;init&gt;(URL.java:464)
 	java.net.URL.&lt;init&gt;(URL.java:413)
-	fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:50)
-	fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:52)
-	fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:45)
-	fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListOfChildPages(TOCWidget.java:85)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:45)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:58)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:47)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:58)
-	fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:47)
-	fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:37)
-	fitnesse.wikitext.widgets.TOCWidget.render(TOCWidget.java:30)
-	fitnesse.wikitext.widgets.ParentWidget.childHtml(ParentWidget.java:63)
-	fitnesse.wikitext.widgets.WidgetRoot.render(WidgetRoot.java:69)
-	fitnesse.wiki.PageData.processHTMLWidgets(PageData.java:171)
-	fitnesse.wiki.PageData.getHtml(PageData.java:139)
-	fitnesse.html.HtmlUtil.testableHtml(HtmlUtil.java:328)
-	fitnesse.html.HtmlUtil.testableHtml(HtmlUtil.java:280)
-	fitnesse.responders.WikiPageResponder.makeHtml(WikiPageResponder.java:73)
-	fitnesse.responders.WikiPageResponder.makeResponse(WikiPageResponder.java:42)
-	fitnesse.FitNesseExpediter.createGoodResponse(FitNesseExpediter.java:130)
-	fitnesse.FitNesseExpediter.makeResponse(FitNesseExpediter.java:112)
-	fitnesse.FitNesseExpediter.start(FitNesseExpediter.java:39)
-	fitnesse.FitNesseServer.serve(FitNesseServer.java:28)
-	fitnesse.FitNesseServer.serve(FitNesseServer.java:19)
-	fitnesse.socketservice.SocketService$ServerRunner.run(SocketService.java:100)
+	fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:57)
+	fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:54)
+	fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:47)
+	fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:39)
+	fitnesse.responders.run.SuiteResponder.addTestPagesToList(SuiteResponder.java:276)
+	fitnesse.responders.run.SuiteResponder.addTestPagesToList(SuiteResponder.java:279)
+	fitnesse.responders.run.SuiteResponder.getAllTestPagesUnder(SuiteResponder.java:239)
+	fitnesse.responders.run.SuiteResponder.getAllPagesToRunForThisSuite(SuiteResponder.java:212)
+	fitnesse.responders.run.SuiteResponder.makeMapOfPagesByTestSystem(SuiteResponder.java:324)
+	fitnesse.responders.run.SuiteResponder.executeTestPages(SuiteResponder.java:58)
+	fitnesse.responders.run.SuiteResponder.performExecution(SuiteResponder.java:40)
+	fitnesse.responders.run.TestResponder.doSending(TestResponder.java:53)
+	fitnesse.responders.ChunkingResponder.startSending(ChunkingResponder.java:69)
+	fitnesse.responders.ChunkingResponder.access$000(ChunkingResponder.java:17)
+	fitnesse.responders.ChunkingResponder$RespondingRunnable.run(ChunkingResponder.java:120)
 	java.lang.Thread.run(Thread.java:613)
 }}}
\ No newline at end of file</diff>
      <filename>FitNesseRoot/FitNesse/TimedActionFixture/VirtualWikiNetworkError/content.txt</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 &lt;properties&gt;
 	&lt;Edit&gt;true&lt;/Edit&gt;
 	&lt;Files&gt;true&lt;/Files&gt;
-	&lt;LastModified&gt;20070619095002&lt;/LastModified&gt;
+	&lt;LastModified&gt;20081128122222&lt;/LastModified&gt;
 	&lt;Properties&gt;true&lt;/Properties&gt;
 	&lt;RecentChanges&gt;true&lt;/RecentChanges&gt;
 	&lt;Refactor&gt;true&lt;/Refactor&gt;</diff>
      <filename>FitNesseRoot/FitNesse/TimedActionFixture/VirtualWikiNetworkError/properties.xml</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,23 @@
+|JunkParent.SlimTest||07:34:27 Sat, Nov 29, 2008|
+|FitNesse.SliM.ScriptTable||07:29:39 Sat, Nov 29, 2008|
+|JunkParent.FitTest||17:29:10 Fri, Nov 28, 2008|
+|ProjectPage.JukeBox.JukeBoxStories.CashManagement||11:13:12 Fri, Nov 28, 2008|
+|ProjectPage.JukeBox.JukeBoxStories||10:13:29 Fri, Nov 28, 2008|
+|ToDo||07:44:35 Tue, Nov 25, 2008|
+|ProjectPage.ComposedTests.ComposedDecisionTable||07:34:42 Tue, Nov 25, 2008|
+|ProjectPage.ComposedTests.ComposedScriptTable||07:29:12 Tue, Nov 25, 2008|
+|ProjectPage.ComposedTests||07:16:16 Tue, Nov 25, 2008|
+|ProjectPage||06:56:43 Tue, Nov 25, 2008|
+|JunkParent.VirtualPage||05:53:10 Tue, Nov 25, 2008|
 |ProjectPage.JukeBox.JukeBoxStories.YouDecide||10:41:57 Mon, Nov 24, 2008|
 |ProjectPage.JukeBox.SongInventory||08:37:03 Mon, Nov 24, 2008|
-|ProjectPage.JukeBox.JukeBoxStories||08:28:29 Mon, Nov 24, 2008|
 |ProjectPage.JukeBox.JukeBoxStories.PlayThreeSongs||21:44:03 Sun, Nov 23, 2008|
 |ProjectPage.JukeBox.JukeBoxStories.PlayOneSong||21:40:17 Sun, Nov 23, 2008|
 |ProjectPage.JukeBox.SetUp||21:39:37 Sun, Nov 23, 2008|
-|JunkParent.SlimTest||18:24:48 Tue, Nov 18, 2008|
 |FrontPage||10:27:05 Tue, Nov 18, 2008|
 |ProjectPage.JukeBox.JukeBoxStories.CreditsAccumulateWithPayment||01:48:51 Tue, Nov 18, 2008|
 |ProjectPage.JukeBox||12:14:43 Mon, Nov 17, 2008|
 |ProjectPage.JukeBox.JukeBoxStories.PaymentDeterminesCredits||12:04:43 Mon, Nov 17, 2008|
-|ProjectPage||11:58:43 Mon, Nov 17, 2008|
 |FitNesse.SuiteAcceptanceTests.SuiteTestRunnerTests.CreateSamplePages||16:49:58 Sat, Nov 15, 2008|
 |FitNesse.SuiteAcceptanceTests.SuiteTestRunnerTests.TestRunnerExitValue||15:14:40 Sat, Nov 15, 2008|
 |FitNesse.CommandLineTestRunner||16:54:04 Fri, Nov 14, 2008|
@@ -55,7 +63,6 @@
 |FitNesse.SliM.TableTable||16:56:43 Fri, Oct 31, 2008|
 |FitNesse.SliM.DataTypes||14:33:04 Fri, Oct 31, 2008|
 |FitNesse.SliM.CustomTypes||06:39:27 Fri, Oct 31, 2008|
-|FitNesse.SliM.ScriptTable||23:06:23 Wed, Oct 29, 2008|
 |FitNesse.SliM.ValueComparisons||10:35:38 Wed, Oct 29, 2008|
 |FitNesse.SliM.SymbolsInTables||10:23:23 Wed, Oct 29, 2008|
 |FitNesse.SliM.ConstructorArguments||10:16:58 Wed, Oct 29, 2008|
@@ -91,10 +98,3 @@
 |FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestIncludeCollapsed||20:39:11 Sat, Oct 25, 2008|
 |FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestIncludeBackwardsSearchPage||20:38:18 Sat, Oct 25, 2008|
 |FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestInclude||20:37:02 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestExpression||20:25:50 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestContentsWithRecursion||19:58:31 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestContentsRegraced||19:56:50 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestContentsProperties||19:55:42 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.ContentsTestsIncludeWithHelp||19:54:02 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestContentsHelp||19:53:27 Sat, Oct 25, 2008|
-|FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestContentsFilters||19:48:52 Sat, Oct 25, 2008|</diff>
      <filename>FitNesseRoot/RecentChanges/content.txt</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 &lt;?xml version=&quot;1.0&quot;?&gt;
 &lt;properties&gt;
 	&lt;Files/&gt;
-	&lt;LastModified&gt;20081124104157&lt;/LastModified&gt;
+	&lt;LastModified&gt;20081129073427&lt;/LastModified&gt;
 	&lt;Properties/&gt;
 	&lt;RecentChanges/&gt;
 	&lt;Refactor/&gt;</diff>
      <filename>FitNesseRoot/RecentChanges/properties.xml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 #FitNesse properties
-#Mon Nov 24 10:12:56 CST 2008
+#Sat Nov 29 07:25:42 CST 2008
 WikiImportFormatUpdate=applied
 PropertiesToXmlUpdate=applied
 FilesAttributeUpdate=applied</diff>
      <filename>FitNesseRoot/properties</filename>
    </modified>
    <modified>
      <diff>@@ -72,6 +72,7 @@
 				&lt;include name=&quot;build.xml&quot; /&gt;
 				&lt;include name=&quot;dotnet/**&quot; /&gt;
 				&lt;include name=&quot;BUILD_README.txt&quot; /&gt;
+        &lt;include name=&quot;templates/**&quot; /&gt;
 				&lt;exclude name=&quot;**/fitnesse*.zip&quot; /&gt;
 			&lt;/fileset&gt;
 		&lt;/zip&gt;</diff>
      <filename>build.xml</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,8 @@
+20081128 UB
+ * Added &amp;debug flag to TestResponder url.  This forces the test to run ''inside'' the fitnesse process.  If you are running fitnesse in a debugger, you can breakpoint your fixtures.
+ * Symbols can be java properties or environment variables.  Symbols first, env variables second, java properties third.
+ * If the first cell of a script table is a symbol assignment ($V=) then the rest must be a function call.  The symbol is assigned the return value of the function.
+
 20081118 UB
 Fixed some bugs in Decision Table that misreported exceptions when the execute
 method was not present.</diff>
      <filename>changeLog.txt</filename>
    </modified>
    <modified>
      <diff>@@ -5,6 +5,7 @@ package fitnesse.components;
 import fitnesse.util.Wildcard;
 import fitnesse.wiki.InheritedItemBuilder;
 import fitnesse.wiki.WikiPage;
+import fitnesse.wiki.PageData;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -26,7 +27,8 @@ public class ClassPathBuilder extends InheritedItemBuilder
 
 	public String getPathSeparator(WikiPage page) throws Exception
 	{
-		String separator = page.getData().getVariable(&quot;PATH_SEPARATOR&quot;);
+    PageData pageData = page.getData();
+    String separator = pageData.getVariable(&quot;PATH_SEPARATOR&quot;);
 		if(separator == null)
 			separator = (String) System.getProperties().get(&quot;path.separator&quot;);
 </diff>
      <filename>src/fitnesse/components/ClassPathBuilder.java</filename>
    </modified>
    <modified>
      <diff>@@ -32,8 +32,7 @@ public class ClassPathBuilderTest extends RegexTestCase
 		assertEquals(expected, builder.getClasspath(root.getChildPage(&quot;TestPage&quot;)));
 	}
 
-	//Todo get this test to pass...
-	public void _testPathSeparatorVariable() throws Exception
+	public void testPathSeparatorVariable() throws Exception
 	{
 		WikiPage page = crawler.addPage(root, PathParser.parse(&quot;TestPage&quot;),
 			&quot;!path fitnesse.jar\n&quot; +</diff>
      <filename>src/fitnesse/components/ClassPathBuilderTest.java</filename>
    </modified>
    <modified>
      <diff>@@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream;
 import java.util.LinkedList;
 
 public class TestResponder extends ChunkingResponder implements TestSystemListener, SecureResponder {
+  private static final String PATH_SEPARATOR = System.getProperty(&quot;path.separator&quot;);
   protected static final int htmlDepth = 2;
   private static LinkedList&lt;TestEventListener&gt; eventListeners = new LinkedList&lt;TestEventListener&gt;();
   protected HtmlPage html;
@@ -39,6 +40,7 @@ public class TestResponder extends ChunkingResponder implements TestSystemListen
   private boolean fastTest = false;
 
   protected void doSending() throws Exception {
+    fastTest |= request.hasInput(&quot;debug&quot;);
     data = page.getData();
     classPath = buildClassPath();
     startHtml();
@@ -253,4 +255,8 @@ public class TestResponder extends ChunkingResponder implements TestSystemListen
   public void setFastTest(boolean fastTest) {
     this.fastTest = fastTest;
   }
+
+  public boolean isFastTest() {
+    return fastTest;
+  }
 }</diff>
      <filename>src/fitnesse/responders/run/TestResponder.java</filename>
    </modified>
    <modified>
      <diff>@@ -250,6 +250,16 @@ public class TestResponderTest {
   }
 
   @Test
+  public void debugTest() throws Exception {
+    responder.setFastTest(false);
+    request.addInput(&quot;debug&quot;, &quot;&quot;);
+    doSimpleRun(passFixtureTable());
+    assertEquals(&quot;Tests Executed OK&quot;, getExecutionStatusMessage());
+    assertEquals(&quot;ok.gif&quot;, getExecutionStatusIconFilename());
+    assertTrue(&quot;should be fast test&quot;, responder.isFastTest());
+  }
+
+  @Test
   public void testExecutionStatusOutputCaptured() throws Exception {
     responder.setFastTest(false);
     doSimpleRun(outputWritingTable(&quot;blah&quot;));</diff>
      <filename>src/fitnesse/responders/run/TestResponderTest.java</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,6 @@ package fitnesse.responders.run.slimResponder;
 import static fitnesse.responders.run.slimResponder.SlimTable.Disgracer.disgraceMethodName;
 
 import java.util.*;
-import java.util.regex.Matcher;
 
 public class DecisionTable extends SlimTable {
   private static final String instancePrefix = &quot;decisionTable&quot;;
@@ -88,31 +87,16 @@ public class DecisionTable extends SlimTable {
 
   private void callFunctionInRow(String functionName, int row) {
     int col = funcs.get(functionName);
-    Matcher matcher = cellMatchesVariableAssignment(row, col);
-    if (matcher.matches()) {
-      String symbolName = matcher.group(1);
-      addExpectation(new SymbolAssignmentExpectation(symbolName, getInstructionNumber(), col, row));
-      callAndAssign(symbolName, functionName);
+    String assignedSymbol = ifSymbolAssignment(row, col);
+    if (assignedSymbol != null) {
+      addExpectation(new SymbolAssignmentExpectation(assignedSymbol, getInstructionNumber(), col, row));
+      callAndAssign(assignedSymbol, functionName);
     } else {
       setFunctionCallExpectation(col, row);
       callFunction(getTableName(), functionName);
     }
   }
 
-  private Matcher cellMatchesVariableAssignment(int row, int col) {
-    String expected = table.getCellContents(col, row);
-    return symbolAssignmentPattern.matcher(expected);
-  }
-
-  private void callAndAssign(String symbolName, String functionName) {
-    List&lt;Object&gt; callAndAssignInstruction = prepareInstruction();
-    callAndAssignInstruction.add(&quot;callAndAssign&quot;);
-    callAndAssignInstruction.add(symbolName);
-    callAndAssignInstruction.add(getTableName());
-    callAndAssignInstruction.add(disgraceMethodName(functionName));
-    addInstruction(callAndAssignInstruction);
-  }
-
   private void setFunctionCallExpectation(int col, int row) {
     String expectedValue = table.getCellContents(col, row);
     addExpectation(new ReturnedValueExpectation(expectedValue, getInstructionNumber(), col, row));</diff>
      <filename>src/fitnesse/responders/run/slimResponder/DecisionTable.java</filename>
    </modified>
    <modified>
      <diff>@@ -12,7 +12,7 @@ public class ReturnedValueExpectationTest {
   }
   
   private void assertExpectationMessage(String expected, String value, String message) throws Exception {
-    Table t = new Table(new TableWidget(null, &quot;&quot;));
+    WikiWidgetTable t = new WikiWidgetTable(new TableWidget(null, &quot;&quot;));
     SlimTable slimTable = new DecisionTable(t, &quot;id&quot;);
     SlimTable.Expectation expectation = slimTable.makeReturnedValueExpectation(expected, 0, 0, 0);
     assertEquals(message, unescape(expectation.createEvaluationMessage(value, expected)));</diff>
      <filename>src/fitnesse/responders/run/slimResponder/ReturnedValueExpectationTest.java</filename>
    </modified>
    <modified>
      <diff>@@ -2,8 +2,6 @@ package fitnesse.responders.run.slimResponder;
 
 import fitnesse.slim.converters.BooleanConverter;
 import fitnesse.slim.converters.VoidConverter;
-import fitnesse.wikitext.widgets.TableRowWidget;
-import fitnesse.wikitext.widgets.TextWidget;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -35,7 +33,7 @@ public class ScriptTable extends SlimTable {
   }
 
   private void appendInstructionForRow(int row) {
-    String firstCell = table.getCellContents(0, row);
+    String firstCell = table.getCellContents(0, row).trim();
     if (firstCell.equalsIgnoreCase(&quot;start&quot;))
       startActor(row);
     else if (firstCell.equalsIgnoreCase(&quot;check&quot;))
@@ -50,9 +48,8 @@ public class ScriptTable extends SlimTable {
       note(row);
     else if (isSymbolAssignment(firstCell))
       actionAndAssign(row);
-    else {
+    else if (firstCell.length() &gt; 0)
       action(row);
-    }
   }
 
   private void actionAndAssign(int row) {
@@ -107,10 +104,8 @@ public class ScriptTable extends SlimTable {
 
   private void invokeAction(int startingCol, int endingCol, int row) {
     String actionName = getActionNameStartingAt(startingCol, endingCol, row);
-    if (!actionName.equals(&quot;&quot;)) {
-      String[] args = getArgumentsStartingAt(startingCol + 1, endingCol, row);
-      callFunction(&quot;scriptTableActor&quot;, actionName, (Object[])args);
-    }
+    String[] args = getArgumentsStartingAt(startingCol + 1, endingCol, row);
+    callFunction(&quot;scriptTableActor&quot;, actionName, (Object[]) args);
   }
 
   private String getActionNameStartingAt(int startingCol, int endingCol, int row) {
@@ -148,8 +143,6 @@ public class ScriptTable extends SlimTable {
     protected String createEvaluationMessage(String value, String originalValue) {
       if (value == null)
         return failMessage(literalize(originalValue), &quot;Returned null value.&quot;);
-      else if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
       else if (value.equals(VoidConverter.VOID_TAG))
         return literalize(originalValue);
       else if (value.equals(BooleanConverter.FALSE))
@@ -169,8 +162,6 @@ public class ScriptTable extends SlimTable {
     }
 
     protected String createEvaluationMessage(String value, String originalValue) {
-      if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
       return (value != null &amp;&amp; value.equals(BooleanConverter.TRUE)) ?
         pass(literalize(originalValue)) : fail(literalize(originalValue));
     }
@@ -184,8 +175,6 @@ public class ScriptTable extends SlimTable {
     protected String createEvaluationMessage(String value, String originalValue) {
       if (value == null)
         return pass(literalize(originalValue));
-      else if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
       else
         return value.equals(BooleanConverter.FALSE) ? pass(literalize(originalValue)) : fail(literalize(originalValue));
     }
@@ -197,13 +186,8 @@ public class ScriptTable extends SlimTable {
     }
 
     protected String createEvaluationMessage(String value, String originalValue) {
-      if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
-      int lastCol = table.getColumnCountInRow(row) - 1;
-      TextWidget textWidget = table.getCell(lastCol, row);
-      TableRowWidget rowWidget = (TableRowWidget) textWidget.getParent().getParent();
       try {
-        rowWidget.addCells(String.format(&quot;|!style_ignore(%s)&quot;, literalize(value)));
+        table.appendCellToRow(row, String.format(&quot;|!style_ignore(%s)&quot;, literalize(value)));
       } catch (Throwable e) {
         return failMessage(literalize(value), SlimTestSystem.exceptionToString(e));
       }
@@ -217,8 +201,6 @@ public class ScriptTable extends SlimTable {
     }
 
     protected String createEvaluationMessage(String value, String originalValue) {
-      if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
       return literalize(replaceSymbolsWithFullExpansion(originalValue));
     }
   }</diff>
      <filename>src/fitnesse/responders/run/slimResponder/ScriptTable.java</filename>
    </modified>
    <modified>
      <diff>@@ -322,6 +322,4 @@ public class ScriptTableTest {
         &quot;|!&lt;check&gt;!|!&lt;funcion&gt;!|!&lt;$V-&gt;[3]&gt;!|!style_pass(!&lt;$V-&gt;[3]&gt;!)|\n&quot;
     );
   }
-
-
 }</diff>
      <filename>src/fitnesse/responders/run/slimResponder/ScriptTableTest.java</filename>
    </modified>
    <modified>
      <diff>@@ -34,7 +34,9 @@ public abstract class SlimTable {
     this.testContext = testContext;
     tableName = getTableType() + &quot;_&quot; + id;
     instructions = new ArrayList&lt;Object&gt;();
-    table.setAsNotLiteralTable();
+    //todo remove this cast.  Slim Tables should know nothing about wiki stuff.
+    WikiWidgetTable wwt = (WikiWidgetTable) table;
+    wwt.setAsNotLiteralTable();
     literalizeTable();
   }
 
@@ -260,13 +262,28 @@ public abstract class SlimTable {
   }
 
   protected boolean isExceptionMessage(String value) {
-    return value.startsWith(&quot;!:&quot;);
+    return value != null &amp;&amp; value.startsWith(&quot;!:&quot;);
   }
 
   public boolean shouldIgnoreException(String resultKey, String resultString) {
     return false;
   }
 
+  protected String ifSymbolAssignment(int row, int col) {
+    String expected = table.getCellContents(col, row);
+    Matcher matcher = symbolAssignmentPattern.matcher(expected);
+    return matcher.find() ? matcher.group(1) : null;
+  }
+
+  protected void callAndAssign(String symbolName, String functionName) {
+    List&lt;Object&gt; callAndAssignInstruction = prepareInstruction();
+    callAndAssignInstruction.add(&quot;callAndAssign&quot;);
+    callAndAssignInstruction.add(symbolName);
+    callAndAssignInstruction.add(getTableName());
+    callAndAssignInstruction.add(fitnesse.responders.run.slimResponder.SlimTable.Disgracer.disgraceMethodName(functionName));
+    addInstruction(callAndAssignInstruction);
+  }
+
   static class Disgracer {
     public boolean capitalizeNextWord;
     public StringBuffer disgracedName;
@@ -369,10 +386,20 @@ public abstract class SlimTable {
       Object returnValue = returnValues.get(makeInstructionTag(instructionNumber));
       String value = returnValue.toString();
       String originalContent = table.getCellContents(col, row);
-      String evaluationMessage = createEvaluationMessage(value, originalContent);
+      String evaluationMessage;
+      evaluationMessage = evaluationMessage(value, originalContent);
       table.setCell(col, row, evaluationMessage);
     }
 
+    private String evaluationMessage(String value, String originalContent) {
+      String evaluationMessage;
+      if (isExceptionMessage(value))
+        evaluationMessage = literalize(originalContent) + &quot; &quot; + error(extractExeptionMessage(value));
+      else
+        evaluationMessage = createEvaluationMessage(value, originalContent);
+      return evaluationMessage;
+    }
+
     protected abstract String createEvaluationMessage(String value, String originalValue);
   }
 
@@ -447,11 +474,8 @@ public abstract class SlimTable {
     protected String createEvaluationMessage(String value, String originalValue) {
       if (VoidConverter.VOID_TAG.equals(value))
         return literalize(replaceSymbolsWithFullExpansion(originalValue));
-      else if (isExceptionMessage(value)) {
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
-      } else {
-        return String.format(&quot;!style_error(Void expected but was: )&quot;, literalize(value));
-      }
+      else
+        return String.format(&quot;!style_error(Void expected but was: %s)&quot;, literalize(value));
     }
   }
 
@@ -463,8 +487,6 @@ public abstract class SlimTable {
     protected String createEvaluationMessage(String value, String originalValue) {
       if (&quot;OK&quot;.equalsIgnoreCase(value))
         return pass(literalize(originalValue));
-      else if (isExceptionMessage(value))
-        return String.format(&quot;%s - %s&quot;, literalize(originalValue), error(extractExeptionMessage(value)));
       else
         return &quot;!style_error(Unknown construction message:) &quot; + literalize(value);
     }
@@ -479,8 +501,6 @@ public abstract class SlimTable {
     }
 
     protected String createEvaluationMessage(String value, String originalValue) {
-      if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
       setSymbol(symbolName, value);
       return String.format(&quot;$%s&lt;-[%s]&quot;, symbolName, literalize(value));
     }
@@ -497,8 +517,6 @@ public abstract class SlimTable {
       String replacedValue = replaceSymbols(expectedValue);
       if (value == null)
         evaluationMessage = fail(&quot;null&quot;); //todo can't be right message.
-      else if (isExceptionMessage(value))
-        return literalize(originalValue) + &quot; &quot; + error(extractExeptionMessage(value));
       else if (value.equals(replacedValue))
         evaluationMessage = pass(literalize(announceBlank(replaceSymbolsWithFullExpansion(originalValue))));
       else if (replacedValue.length() == 0)</diff>
      <filename>src/fitnesse/responders/run/slimResponder/SlimTable.java</filename>
    </modified>
    <modified>
      <diff>@@ -61,7 +61,7 @@ public class SlimTestSystemTest {
   @Test
   public void tableWithoutPrefixWillBeConstructed() throws Exception {
     getResultsForPageContents(&quot;|XX|\n&quot;);
-    assertTestResultsContain(&quot;!&lt;XX&gt;! - !style_error(Could not invoke constructor for XX[0])&quot;);
+    assertTestResultsContain(&quot;!&lt;XX&gt;! !style_error(Could not invoke constructor for XX[0])&quot;);
   }
 
   @Test
@@ -145,7 +145,7 @@ public class SlimTestSystemTest {
         &quot;|returnInt?|\n&quot; +
         &quot;|7|\n&quot;
     );
-    assertTestResultsContain(&quot;!&lt;DT:NoSuchClass&gt;! - !style_error(Could not invoke constructor for NoSuchClass[0])&quot;);
+    assertTestResultsContain(&quot;!&lt;DT:NoSuchClass&gt;! !style_error(Could not invoke constructor for NoSuchClass[0])&quot;);
   }
 
   @Test</diff>
      <filename>src/fitnesse/responders/run/slimResponder/SlimTestSystemTest.java</filename>
    </modified>
    <modified>
      <diff>@@ -1,109 +1,21 @@
 package fitnesse.responders.run.slimResponder;
 
-import fitnesse.wikitext.widgets.*;
-import fitnesse.wikitext.WikiWidget;
-import fitnesse.util.StringUtil;
-
 import java.util.List;
-import java.util.regex.Matcher;
-
-public class Table {
-  private TableWidget widget;
-
-  public Table(TableWidget widget) {
-    this.widget = widget;
-  }
-
-  public String getCellContents(int columnIndex, int rowIndex) {
-    TextWidget textWidget = getCell(columnIndex, rowIndex);
-    String cellText = textWidget.getText();
-    return replaceLiterals(textWidget, cellText);
-  }
-
-  private String replaceLiterals(TextWidget textWidget, String cellText) {
-    cellText = removeProcessedLiterals(textWidget, cellText);
-    cellText = removeUnprocessedLiterals(cellText);
-    return cellText;
-  }
-
-  private static String removeUnprocessedLiterals(String cellText) {
-    Matcher matcher = PreProcessorLiteralWidget.pattern.matcher(cellText);
-    while (matcher.find()) {
-      String replacement = matcher.group(1);
-      cellText = cellText.replace(matcher.group(), replacement);
-    }
-    return cellText;
-  }
-
-  private String removeProcessedLiterals(TextWidget textWidget, String cellText) {
-    Matcher matcher = LiteralWidget.pattern.matcher(cellText);
-    while (matcher.find()) {
-      int literalNumber = Integer.parseInt(matcher.group(1));
-      String replacement = textWidget.getParent().getLiteral(literalNumber);
-      cellText = cellText.replace(matcher.group(), replacement);
-      matcher = LiteralWidget.pattern.matcher(cellText);
-    }
-    return cellText;
-  }
-
-  protected TextWidget getCell(int columnIndex, int rowIndex) {
-    TableRowWidget row = getRow(rowIndex);
-    TextWidget cellContents = getCellInRow(row, columnIndex);
-    return cellContents;
-  }
-
-  public void appendToCell(int col, int row, String message) {
-    TextWidget widget = getCell(col, row);
-    widget.setText(widget.getText() + &quot; &quot; + message);
-  }
-
-  private TextWidget getCellInRow(TableRowWidget row, int columnIndex) {
-    List&lt;WikiWidget&gt; columns = row.getChildren();
-    TableCellWidget cell = (TableCellWidget) columns.get(columnIndex);
-    TextWidget cellContents = (TextWidget) cell.getChildren().get(0);
-    return cellContents;
-  }
-
-  private TableRowWidget getRow(int rowIndex) {
-    List&lt;WikiWidget&gt; rows = widget.getChildren();
-    TableRowWidget row = (TableRowWidget) rows.get(rowIndex);
-    return row;
-  }
 
-  public int getRowCount() {
-    return widget.getChildren().size();
-  }
+public interface Table {
+  String getCellContents(int columnIndex, int rowIndex);
 
-  public int getColumnCountInRow(int rowIndex) {
-    TableRowWidget row = getRow(rowIndex);
-    return row.getChildren().size();
-  }
+  void appendToCell(int col, int row, String message);
 
-  public String toString() {
-    try {
-      return widget.asWikiText();
-    } catch (Exception e) {
-      return(&quot;Could not convert table to string: &quot; + e.getMessage());
-    }
-  }
+  int getRowCount();
 
-  public void setCell(int col, int row, String contents) {
-    TextWidget textWidget = getCell(col, row);
-    textWidget.setText(contents);
-  }
+  int getColumnCountInRow(int rowIndex);
 
-  public void setAsNotLiteralTable() {
-    widget.setLiteralTable(false);
-  }
+  String toString();
 
-  public boolean isLiteralTable() {
-      return widget.isLiteralTable;
-  }
+  void setCell(int col, int row, String contents);
 
+  int addRow(List&lt;String&gt; list) throws Exception;
 
-  public int addRow(List&lt;String&gt; list) throws Exception {
-    String rowString = &quot;|&quot; + StringUtil.join(list, &quot;|&quot;) + &quot;|\n&quot;;
-    widget.addRows(rowString);
-    return getRowCount()-1;
-  }
+  void appendCellToRow(int row, String contents) throws Exception;
 }</diff>
      <filename>src/fitnesse/responders/run/slimResponder/Table.java</filename>
    </modified>
    <modified>
      <diff>@@ -101,7 +101,7 @@ public class TableScanner implements Iterable&lt;Table&gt; {
     List&lt;WikiWidget&gt; widgets = parent.getChildren();
     for (WikiWidget widget : widgets) {
       if (widget instanceof TableWidget)
-        tables.add(new Table((TableWidget) widget));
+        tables.add(new WikiWidgetTable((TableWidget) widget));
       else if (widget instanceof ParentWidget)
         scanParentForTables((ParentWidget) widget);
     }</diff>
      <filename>src/fitnesse/responders/run/slimResponder/TableScanner.java</filename>
    </modified>
    <modified>
      <diff>@@ -73,6 +73,7 @@ public class PageData implements Serializable
 		content = data.content;
 		properties = new WikiPageProperties(data.properties);
 		versions.addAll(data.versions);
+    variableRoot = data.variableRoot;
 	}
 
 	public String getStringOfAllAttributes()</diff>
      <filename>src/fitnesse/wiki/PageData.java</filename>
    </modified>
    <modified>
      <diff>@@ -43,7 +43,7 @@ public class ImageWidget extends WikiWidget
 				html.append(&quot;right&quot;);
 			html.append(&quot;\&quot;&quot;);
 		}
-		html.append(&quot;&gt;&quot;);
+		html.append(&quot;/&gt;&quot;);
 
 		return html.toString();
 	}</diff>
      <filename>src/fitnesse/wikitext/widgets/ImageWidget.java</filename>
    </modified>
    <modified>
      <diff>@@ -22,16 +22,16 @@ public class ImageWidgetTest extends WidgetTestCase
 	public void testWidget() throws Exception
 	{
 		ImageWidget widget = new ImageWidget(new MockWidgetRoot(), &quot;http://host.com/file.jpg&quot;);
-		assertEquals(&quot;&lt;img src=\&quot;http://host.com/file.jpg\&quot;&gt;&quot;, widget.render());
+		assertEquals(&quot;&lt;img src=\&quot;http://host.com/file.jpg\&quot;/&gt;&quot;, widget.render());
 
 		widget = new ImageWidget(new MockWidgetRoot(), &quot;!img http://files/file.jpg&quot;);
-		assertEquals(&quot;&lt;img src=\&quot;/files/file.jpg\&quot;&gt;&quot;, widget.render());
+		assertEquals(&quot;&lt;img src=\&quot;/files/file.jpg\&quot;/&gt;&quot;, widget.render());
 
 		widget = new ImageWidget(new MockWidgetRoot(), &quot;!img-l http://files/file.jpg&quot;);
-		assertEquals(&quot;&lt;img src=\&quot;/files/file.jpg\&quot; class=\&quot;left\&quot;&gt;&quot;, widget.render());
+		assertEquals(&quot;&lt;img src=\&quot;/files/file.jpg\&quot; class=\&quot;left\&quot;/&gt;&quot;, widget.render());
 
 		widget = new ImageWidget(new MockWidgetRoot(), &quot;!img /files/file.jpg&quot;);
-		assertEquals(&quot;&lt;img src=\&quot;/files/file.jpg\&quot;&gt;&quot;, widget.render());
+		assertEquals(&quot;&lt;img src=\&quot;/files/file.jpg\&quot;/&gt;&quot;, widget.render());
 	}
 
 	public void testAsWikiText() throws Exception</diff>
      <filename>src/fitnesse/wikitext/widgets/ImageWidgetTest.java</filename>
    </modified>
    <modified>
      <diff>@@ -111,6 +111,9 @@ public class WidgetRoot extends ParentWidget {
       value = pageData.getVariable(key);
     }
     if (value == null) {
+      value = System.getenv(key);
+    }
+    if (value == null) {
       value = System.getProperty(key);
     }
     return value;</diff>
      <filename>src/fitnesse/wikitext/widgets/WidgetRoot.java</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>36e84bcd6afbe9cdbe0bebcbde9756ada0a65977</id>
    </parent>
  </parents>
  <author>
    <name>robertmartin</name>
    <email>robertmartin</email>
  </author>
  <url>http://github.com/unclebob/fitnesse/commit/3f2b71908f21ef04ad414a9c8a8302d0672fca31</url>
  <id>3f2b71908f21ef04ad414a9c8a8302d0672fca31</id>
  <committed-date>2008-11-29T09:28:31-08:00</committed-date>
  <authored-date>2008-11-29T09:28:31-08:00</authored-date>
  <message>A few fixes and patches.  Prepare for HTML parsing of Slim Tables.</message>
  <tree>41c9a1c4661867d9bd5d4ba54253d68cf7d51172</tree>
  <committer>
    <name>robertmartin</name>
    <email>robertmartin</email>
  </committer>
</commit>
