FitNesse. SuiteAcceptanceTests. SuiteWidgetTests.
TestContentsWithRecursion [add child]

 Scenario Libraries

!contents with Recursive option

Use !contents to list all or some of the child pages of the current page along with additional information such as help text, suite filters, some property settings, and graceful names.
Example:  !contents -R2 -g -p -f -h
Options
-R ...include all of the descendent pages;
-Rn ...include n levels of descendent pages;
-f ...show suite filters--define FILTER_TOC {true} for global;
-g ...show graceful names in the list--define REGRACE_TOC {true} for global;
-h ...show help property text--define HELP_TOC {true} for global;
-p ...show property suffixes--define PROPERTY_TOC {true} for global;
defaults: Suite(*), Test(+), Imported(@), Symbolic(>), Pruned(-)
define PROPERTY_CHARACTERS {*+@>-} to change.


First create the parent page.
script
start Page Builder
line I'm the parent
line !contents -R
page ParentPage

Next create a child
script
start Page Builder
line I came first!
attributes Suite=true,Test=true,Suites=FC1
page ParentPage.FirstChild

Next create a sibling
script
start Page Builder
line I'm younger, but wiser
attributes WikiImport=true,Prune=true,Suites=FC2
page ParentPage.SecondChild

Next create a grandchild
script
start Page Builder
line You're too young to be grandparents
page ParentPage.FirstChild.GrandChild

Then request the parent page.
Response Requester.
uri valid? contents?
ParentPage true  

...and examine the requested page to be sure that the descendent pages are included
Response Examiner.
type pattern matches?
contents a href="ParentPage.FirstChild">FirstChild</a true
contents a href="ParentPage.FirstChild.GrandChild">GrandChild</a true
contents a href="ParentPage.SecondChild">SecondChild</a true

Also note that the html assigns css classes named toc1, toc2, etc depending on how far down you go. This allows you to define different characteristics for each level in the hierarchy by editing /files/css/fitnesse.css.
Response Examiner.
type pattern matches?
contents div class="toc1" true
contents div class="toc2" true