diff --git a/fitnesse/.classpath b/fitnesse/.classpath new file mode 100644 index 0000000000..e36681ddfb --- /dev/null +++ b/fitnesse/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fitnesse/.project b/fitnesse/.project new file mode 100644 index 0000000000..f71aadfd6a --- /dev/null +++ b/fitnesse/.project @@ -0,0 +1,17 @@ + + + fitnesse + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/fitnesse/.settings/org.eclipse.jdt.core.prefs b/fitnesse/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..8000cd6ca6 --- /dev/null +++ b/fitnesse/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/fitnesse/FitNesseRoot/AvgCostSuite/BasicTest/content.txt b/fitnesse/FitNesseRoot/AvgCostSuite/BasicTest/content.txt new file mode 100644 index 0000000000..e32eabce79 --- /dev/null +++ b/fitnesse/FitNesseRoot/AvgCostSuite/BasicTest/content.txt @@ -0,0 +1,36 @@ +This test is intended to create repeatable test cases for Average Invoice Costing, in order to make a refactor we need to: +* stabilize current code +* guarantee that refactoring don't break actual results + +Brief description of the tests: +* login into !-GardenAdmin-! +* ensure that tenant is configured with avg inv costing +* create a product (random name/value) +* create a PO to purchase 50 products with value 10 +* create a material receipt +* create a matchPO +* post the matchPO +* create an invoice +* post the invoice +* verify that avg cost=10 and qty=50 +* create a POS sales order for 3 products +* post the shipment +* verify that shipment was posted with cost=10 +* verify that avg cost=10 and qty=47 +* create a PO to purchase 10 products with value 11 +* create a material receipt based on the PO +* check the matchPO created +* post the matchPO +* verify that avg cost=10.175438596 and qty=57 +* create an internal use inventory for 2 products +* post internal use +* verify that internal use used avg cost=10.175438596 +* verify that avg cost=10.175438596 and qty=55 + +!include -c .CommonTests.LoginGardenAdmin +!include -c .CommonTests.ValidateClientSetOnAvgInv +!include -c .CommonTests.SetRandomName +!include -c .CommonTests.CreateProduct +!include -c .CommonTests.CreateProductPrice +!include -c .CommonTests.CreatePurchaseOrder +!include -c .CommonTests.CreateMaterialReceipt \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/AvgCostSuite/BasicTest/properties.xml b/fitnesse/FitNesseRoot/AvgCostSuite/BasicTest/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/AvgCostSuite/BasicTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/AvgCostSuite/content.txt b/fitnesse/FitNesseRoot/AvgCostSuite/content.txt new file mode 100644 index 0000000000..990fb6f9e1 --- /dev/null +++ b/fitnesse/FitNesseRoot/AvgCostSuite/content.txt @@ -0,0 +1 @@ +!contents -R2 -g -p -f -h \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/AvgCostSuite/properties.xml b/fitnesse/FitNesseRoot/AvgCostSuite/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/AvgCostSuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/CommonTests/CreateMaterialReceipt/content.txt b/fitnesse/FitNesseRoot/CommonTests/CreateMaterialReceipt/content.txt new file mode 100644 index 0000000000..d54a0a7218 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreateMaterialReceipt/content.txt @@ -0,0 +1,32 @@ +Create material receipt + +!|Create Record| +|*Table* |M_InOut | +|ad_org_id |@AD_Org_ID@ | +|c_doctype_id |@Ref=C_DocType[Name='MM Receipt'].C_DocType_ID| +|c_bpartner_id |@c_bpartner.c_bpartner_id@ | +|c_bpartner_location_id|@Ref=C_BPartner_Location[C_BPartner_ID=@c_bpartner.c_bpartner_id@].C_BPartner_Location_ID | +|m_warehouse_id |@M_Warehouse_ID@ | +|salesrep_id |@Ref=AD_User[Name='GardenAdmin'].AD_User_ID | +|movementtype |V+ | +|*Save* | | + +Create material receipt line + +!|Create Record| +|*Table* |M_InOutLine | +|m_inout_id |@m_inout.m_inout_id@ | +|ad_org_id |@m_inout.AD_Org_ID@ | +|m_product_id|@m_product.M_Product_ID@| +|qtyentered |50 | +|c_uom_id |@m_product.c_uom_id@| +|m_locator_id|@Ref=M_Locator[M_Warehouse_ID=@M_Warehouse_ID@ AND IsDefault='Y'].M_Locator_ID| +|*Save* | | + +Complete the material receipt + +!|Run Process| +|*ProcessValue*|M_InOut Process | +|*RecordID* |@M_InOut.M_InOut_ID@| +|*DocAction* |CO | +|*Run* | | diff --git a/fitnesse/FitNesseRoot/CommonTests/CreateMaterialReceipt/properties.xml b/fitnesse/FitNesseRoot/CommonTests/CreateMaterialReceipt/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreateMaterialReceipt/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/CommonTests/CreateProduct/content.txt b/fitnesse/FitNesseRoot/CommonTests/CreateProduct/content.txt new file mode 100644 index 0000000000..6fd81e75d4 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreateProduct/content.txt @@ -0,0 +1,8 @@ +!|Create Record| +|*Table* |M_Product| +|Name |@RandomName@| +|Value |@RandomName@| +|C_UOM_ID |@Ref=C_UOM[Name='Each'].C_UOM_ID| +|M_Product_Category_ID |@Ref=M_Product_Category[Name='Standard' and AD_Client_ID=@AD_Client_ID@].M_Product_Category_ID| +|C_TaxCategory_ID |@Ref=C_TaxCategory[Name='Standard' and AD_Client_ID=@AD_Client_ID@].C_TaxCategory_ID| +|*Save* | | diff --git a/fitnesse/FitNesseRoot/CommonTests/CreateProduct/properties.xml b/fitnesse/FitNesseRoot/CommonTests/CreateProduct/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreateProduct/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/CommonTests/CreateProductPrice/content.txt b/fitnesse/FitNesseRoot/CommonTests/CreateProductPrice/content.txt new file mode 100644 index 0000000000..9091de0802 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreateProductPrice/content.txt @@ -0,0 +1,8 @@ +!|Create Record| +|*Table* |M_ProductPrice| +|M_PriceList_Version_ID |@Ref=M_PriceList_Version[IsActive='Y' AND M_PriceList_ID=(select m_pricelist_id from m_pricelist where name='Purchase')].M_PriceList_Version_ID| +|M_Product_ID |@m_product.m_product_id@| +|PriceLimit | 0 | +|PriceList | 0 | +|PriceStd | 0 | +|*Save* | | diff --git a/fitnesse/FitNesseRoot/CommonTests/CreateProductPrice/properties.xml b/fitnesse/FitNesseRoot/CommonTests/CreateProductPrice/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreateProductPrice/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/CommonTests/CreatePurchaseOrder/content.txt b/fitnesse/FitNesseRoot/CommonTests/CreatePurchaseOrder/content.txt new file mode 100644 index 0000000000..bbe353aa24 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreatePurchaseOrder/content.txt @@ -0,0 +1,41 @@ +Create purchase order + +!|Read Record| +|*Table* |C_BPartner | +|c_bpartner_id |@Ref=C_BPartner[Name='Patio Fun, Inc.'].c_bpartner_id| +|*Read* | | + +!|Create Record| +|*Table* |C_Order | +|ad_org_id |@AD_Org_ID@ | +|c_doctypetarget_id |@Ref=C_DocType[Name='Purchase Order'].C_DocType_ID| +|issotrx |N | +|salesrep_id |@Ref=AD_User[Name='GardenAdmin'].AD_User_ID| +|c_bpartner_id |@c_bpartner.c_bpartner_id@ | +|c_bpartner_location_id|@Ref=C_BPartner_Location[C_BPartner_ID=@c_bpartner.c_bpartner_id@].C_BPartner_Location_ID | +|paymentrule |B | +|m_warehouse_id |@M_Warehouse_ID@ | +|m_pricelist_id |@Ref=M_PriceList[Name='Purchase'].M_PriceList_ID | +|ad_user_id |@Ref=AD_User[Name='GardenAdmin'].AD_User_ID | +|*Save* | | + +Create purchase order line + +!|Create Record| +|*Table* |C_OrderLine | +|c_order_id |@C_order.c_Order_id@ | +|ad_org_id |@C_Order.AD_Org_ID@ | +|m_product_id|@M_Product.M_Product_ID@| +|qtyentered |50 | +|qtyordered |50 | +|priceactual |10 | +|c_uom_id |@m_product.c_uom_id@| +|*Save* | | + +Complete the purchase order + +!|Run Process| +|*ProcessValue*|C_Order Process | +|*RecordID* |@C_Order.C_Order_ID@| +|*DocAction* |CO | +|*Run* | | diff --git a/fitnesse/FitNesseRoot/CommonTests/CreatePurchaseOrder/properties.xml b/fitnesse/FitNesseRoot/CommonTests/CreatePurchaseOrder/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/CreatePurchaseOrder/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/CommonTests/LoginGardenAdmin/content.txt b/fitnesse/FitNesseRoot/CommonTests/LoginGardenAdmin/content.txt new file mode 100644 index 0000000000..6c410c0bcd --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/LoginGardenAdmin/content.txt @@ -0,0 +1,8 @@ +!|Login| +|User |GardenAdmin| +|Password |GardenAdmin| +|AD_Client_ID|@Ref=AD_Client[Value='GardenWorld'].AD_Client_ID| +|AD_Role_id |@Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID| +|AD_Org_ID |@Ref=AD_Org[Name='HQ'].AD_Org_ID| +|M_Warehouse_ID|@Ref=M_Warehouse[Name='HQ Warehouse'].M_Warehouse_ID| +|*Login* | | diff --git a/fitnesse/FitNesseRoot/CommonTests/LoginGardenAdmin/properties.xml b/fitnesse/FitNesseRoot/CommonTests/LoginGardenAdmin/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/LoginGardenAdmin/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/CommonTests/SetRandomName/content.txt b/fitnesse/FitNesseRoot/CommonTests/SetRandomName/content.txt new file mode 100644 index 0000000000..ebdc288879 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/SetRandomName/content.txt @@ -0,0 +1,2 @@ +!|Set Variable| +|@RandomName@ |@random_string(TestAvg-,,4)| diff --git a/fitnesse/FitNesseRoot/CommonTests/SetRandomName/properties.xml b/fitnesse/FitNesseRoot/CommonTests/SetRandomName/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/SetRandomName/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/CommonTests/ValidateClientSetOnAvgInv/content.txt b/fitnesse/FitNesseRoot/CommonTests/ValidateClientSetOnAvgInv/content.txt new file mode 100644 index 0000000000..71b077255a --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/ValidateClientSetOnAvgInv/content.txt @@ -0,0 +1,2 @@ +!|Assert Variable| +|I|@SQL=select costingmethod from c_acctschema where c_acctschema_id = (select c_acctschema1_id from ad_clientinfo where ad_client_id=@AD_Client_ID@)| diff --git a/fitnesse/FitNesseRoot/CommonTests/ValidateClientSetOnAvgInv/properties.xml b/fitnesse/FitNesseRoot/CommonTests/ValidateClientSetOnAvgInv/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/ValidateClientSetOnAvgInv/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/CommonTests/content.txt b/fitnesse/FitNesseRoot/CommonTests/content.txt new file mode 100644 index 0000000000..99c097c643 --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/content.txt @@ -0,0 +1 @@ +!contents -R2 -g -p -f -h diff --git a/fitnesse/FitNesseRoot/CommonTests/properties.xml b/fitnesse/FitNesseRoot/CommonTests/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/CommonTests/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/FitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/FitNesse/content.txt new file mode 100644 index 0000000000..c309608b5f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/FitNesse/content.txt @@ -0,0 +1 @@ +!include UserGuide.FitNesse \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/FitNesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/FitNesse/properties.xml new file mode 100644 index 0000000000..f0bbabef9a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/FitNesse/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090326123836 + true + true + true + true + true + true + 1238089116471 + 3692661061657342165 + diff --git a/fitnesse/FitNesseRoot/FitNesse/JunkPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/JunkPage/content.txt new file mode 100644 index 0000000000..9a47abe542 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/JunkPage/content.txt @@ -0,0 +1,2 @@ +|!style_pass(.)|PageOne|PageTwo| +|!style_fail(.)|PageOne's Stuff|PageTwo's Stuff| diff --git a/fitnesse/FitNesseRoot/FitNesse/JunkPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/JunkPage/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/JunkPage/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/ReadProtectedPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/ReadProtectedPage/content.txt new file mode 100644 index 0000000000..b2eafce76d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/ReadProtectedPage/content.txt @@ -0,0 +1 @@ +This page is read-protected. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/ReadProtectedPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/ReadProtectedPage/properties.xml new file mode 100644 index 0000000000..b8c02c1f33 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/ReadProtectedPage/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/content.txt new file mode 100644 index 0000000000..4f60d20f0f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/content.txt @@ -0,0 +1 @@ +great grand child page one \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/properties.xml new file mode 100644 index 0000000000..07ffe0c450 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210017 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/content.txt new file mode 100644 index 0000000000..1b0f6365df --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/content.txt @@ -0,0 +1,3 @@ +grand child page one + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/properties.xml new file mode 100644 index 0000000000..07ffe0c450 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210017 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/content.txt new file mode 100644 index 0000000000..35f97d8759 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/content.txt @@ -0,0 +1,3 @@ +child page one + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/properties.xml new file mode 100644 index 0000000000..8df5a4edc3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210016 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/content.txt new file mode 100644 index 0000000000..8392f99406 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/content.txt @@ -0,0 +1,3 @@ +child page three + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/properties.xml new file mode 100644 index 0000000000..1d529272ab --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210018 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/content.txt new file mode 100644 index 0000000000..c28be372a1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/content.txt @@ -0,0 +1 @@ +grand child page two \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/properties.xml new file mode 100644 index 0000000000..a54ba7adc7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210019 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/content.txt new file mode 100644 index 0000000000..4b512e99fe --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/content.txt @@ -0,0 +1,3 @@ +child page two + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/properties.xml new file mode 100644 index 0000000000..a54ba7adc7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210019 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/content.txt new file mode 100644 index 0000000000..8c30a0d53e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/content.txt @@ -0,0 +1,7 @@ +Here are some characters that make use of the unicode character set. They were gathered from wikipedia. +japanese: メインページ +icelandic: Forsíða +ukranian: Головна стаття +thai: หน้าหลัก +greek: Κύρια Σελίδα +arabic: الصفحة الرئيسية \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/properties.xml new file mode 100644 index 0000000000..99624e8399 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210020 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/content.txt new file mode 100644 index 0000000000..aa4101ade8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/content.txt @@ -0,0 +1,7 @@ +!c !1 Sample Wiki +!c This subwiki is used in the SuiteAcceptanceTests.SuiteWikiImportTests test suite. + +^ChildPageOne +^ChildPageTwo +^ChildPageThree +^ChildWithUnicode \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SampleWiki/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/properties.xml new file mode 100644 index 0000000000..6b8bf916d0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SampleWiki/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210015 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SliM/content.txt b/fitnesse/FitNesseRoot/FitNesse/SliM/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/SliM/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SliM/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SliM/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/content.txt new file mode 100644 index 0000000000..56410ad7b2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/content.txt @@ -0,0 +1 @@ +The following text must be here:''You have reached Child One.'' \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/properties.xml new file mode 100644 index 0000000000..431188aca6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210025 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/content.txt new file mode 100644 index 0000000000..440ae3306f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/content.txt @@ -0,0 +1,3 @@ +This page has an alias widget that links to a non existent page + +[[link][NonExistentPage]] \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/properties.xml new file mode 100644 index 0000000000..431188aca6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210025 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/content.txt new file mode 100644 index 0000000000..789ebfde86 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/content.txt @@ -0,0 +1,3 @@ +This page contains an alias link to a non existent sub page. + +[[link][^NonExistentSubPage]] \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/properties.xml new file mode 100644 index 0000000000..431188aca6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210025 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/content.txt new file mode 100644 index 0000000000..7a8aed7a6d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/content.txt @@ -0,0 +1 @@ +This page: .FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.DoesNotExist. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/properties.xml new file mode 100644 index 0000000000..f2bf75b838 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210026 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/content.txt new file mode 100644 index 0000000000..6eef550593 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/content.txt @@ -0,0 +1,3 @@ +This page has a link to a non existent sub page. + +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.ChildWithSubPageLinkToNonExistentPage.NonExistentSubPage \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/properties.xml new file mode 100644 index 0000000000..f2bf75b838 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210026 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/content.txt new file mode 100644 index 0000000000..70f8155f1d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/content.txt @@ -0,0 +1 @@ +the included page 00bF diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/properties.xml new file mode 100644 index 0000000000..f2bf75b838 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210026 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/content.txt new file mode 100644 index 0000000000..a78f4ab774 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/content.txt @@ -0,0 +1,2 @@ +Child Including Page +!include .FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.IncludedPage \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/properties.xml new file mode 100644 index 0000000000..238512fcc9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210027 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/content.txt new file mode 100644 index 0000000000..58a411cbe6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/content.txt @@ -0,0 +1,2 @@ +!include .FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.IncludedPage +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.IncludingPage.ChildIncludingPage diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/properties.xml new file mode 100644 index 0000000000..238512fcc9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210027 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/content.txt new file mode 100644 index 0000000000..32fb924c9c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/content.txt @@ -0,0 +1,10 @@ +This page is used as a target for some of the FitNesse acceptance tests. Don't delete it or any of it's children. + +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.ChildOne +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.ChildWithLinkToNonExistentPage +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.ChildWithSubPageLinkToNonExistentPage +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.ChildWithAliasLinkToNonExistentPage +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.ChildWithAliasLinkToNonExistentSubPage +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.IncludedPage +.FitNesse.SuiteAcceptanceTests.AcceptanceTestPage.IncludingPage + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/properties.xml new file mode 100644 index 0000000000..060fc5e5eb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210024 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/properties.xml new file mode 100644 index 0000000000..d13ea88e9b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210028 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/content.txt new file mode 100644 index 0000000000..7a94669b9e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/content.txt @@ -0,0 +1,2 @@ +[[!-FitNesse's-! own acceptance test suite][.FitNesse.SuiteAcceptanceTests]] | [[Front Page][.FrontPage]] | [[User Guide][.FitNesse.UserGuide]] + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/properties.xml new file mode 100644 index 0000000000..32e5b59226 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/properties.xml new file mode 100644 index 0000000000..b967a7769d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/properties.xml @@ -0,0 +1,10 @@ + + + + 20060717210028 + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..ccbd9278f0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/content.txt @@ -0,0 +1,97 @@ +!|scenario|given page|page|with content|content| +|create page|@page|with content|@content| +|$IT=|echo|@page| + +!|scenario|given page|page| +|given page|@page|with content|nothing| + +!|scenario|given test page|page| +|given page|@page| +|make|@page|a test page| + +!|scenario|given slim test page|page| +|given page|@page|with content|!define TEST_SYSTEM {slim}| +|make|@page|a test page| + +|scenario|page|source|should have link to|target| +|check|request page|@source|200| +|ensure|content contains|| +|$IT=|echo|@source| + +!|scenario|it should have link to|target| +|page|$IT|should have link to|@target| + +!|scenario|and it should have link to|target| +|page|$IT|should have link to|@target| + +!|scenario|page|source|should have creating link to|target| +|check|request page|@source|200| +|ensure|content contains|@target[?]| + +!|scenario|it should have creating link to|target| +|page|$IT|should have creating link to|@target| + +!|scenario|page|source|should contain|text| +|check|request page|@source|200| +|ensure|content contains|@text| +|show|content| + +!|scenario|page|source|should not contain|text| +|check|request page|@source|200| +|reject|content contains|@text| +|show|content| + +!|scenario|page|source|should match|text| +|check|request page|@source|200| +|ensure|content matches|@text| +|show|content| + +!|scenario|it should contain|text| +|page|$IT|should contain|@text| + +!|scenario|it should not contain|text| +|page|$IT|should not contain|@text| + +!|scenario|it should contain|text|in line|symbol| +|check|request page|$IT|200| +|$@symbol=|line number containing|@text| + +!|scenario|it should match|text| +|page|$IT|should match|@text| + +!|scenario|test results for page|source|should contain|text| +|check|request page|@source?test|200| +|ensure|content contains|@text| +|show|content| + +!|scenario|its test results should contain|text| +|test results for page|$IT|should contain|@text| + +!|scenario|test ressults for page|source|should not contain|text| +|check|request page|@source?test|200| +|reject|content contains|@text| +|show|content| + +!|scenario|and should contain|text| +|ensure|content contains|@text| +|show|content| + +!|scenario|and should match|text| +|ensure|content matches|@text| +|show|content| + +!|scenario|and should not contain|text| +|reject|content contains|@text| +|show|content| + +!|scenario|widget|wikiText|should render|htmlText| +|create page|WidgetPage|with content|@wikiText| +|check|request page|WidgetPage|200| +|ensure|content matches|@htmlText| +|show|content| + +!|scenario|the line|after|should come after|before| +|check|echo int|$@before|< $@after| + +!|scenario|pass| +|check|echo|pass|pass| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..ceb51257d4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1234380859396 + 7171568299669753244 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/content.txt new file mode 100644 index 0000000000..02993aa944 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/content.txt @@ -0,0 +1,4 @@ +!|Import| +|fitnesse.fixtures| + +!|SetUp| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/properties.xml new file mode 100644 index 0000000000..7d5abf5e7f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717210029 + docs + + + + + + 1122839767051 + 2319759440361385703 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/content.txt new file mode 100644 index 0000000000..f5fd7bfd50 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/content.txt @@ -0,0 +1,17 @@ +!|script| +|given user|Aladdin|with password|open sesame| +|given page|FrontPage| + +!note Make sure saveProperties is last, because it clears the write-lock +!|operation is authenticated| +|operation| +|purgeHistory| +|testHistory| +|pageHistory| +|shutdown| +|renamePage| +|deletePage| +|movePage| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..c1314c0518 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/content.txt @@ -0,0 +1,52 @@ +!|scenario|it should be readable with no authentication| +|check|request page|$IT|200| + +!|scenario|it should not be readable with no authentication| +|check|request page|$IT|401| + +!|scenario|it should be readable by user|user|password|password| +|check|request page|$IT|authenticated by user|@user|and password|@password|200| + +!|scenario|it should not be readable by user|user|password|password| +|check|request page|$IT|authenticated by user|@user|and password|@password|401| + +!|scenario|given read locked page|page| +|create page|@page|with authentication|secure-read=true| +|$IT=|echo|@page| + +!|scenario|given write locked page|page| +|create page|@page|with authentication|secure-write=true| +|$IT=|echo|@page| + +!|scenario|given test locked page|page| +|create page|@page|with authentication|secure-test=true| +|$IT=|echo|@page| + +!|scenario|directory|dir|should not be readable with no authentication| +|check|request page|@dir|401| + +!|scenario|directory|dir|should not be readable by user|user|password|password| +|check|request page|@dir|authenticated by user|@user|and password|@password|401| + +!|scenario|directory|dir|should be readable by user|user|password|password| +|check|request page|@dir|authenticated by user|@user|and password|@password|200| + +!|scenario|it should be not readable with no authentication| +|check|request page|$IT|401| + +!|scenario|it should not be readable by user|user|password|password| +|check|request page|$IT|authenticated by user|@user|and password|@password|401| + +!|scenario|it should be readable by user|user|password|password| +|check|request page|$IT|authenticated by user|@user|and password|@password|200| + +!|scenario|operation|operation|with bad authentication should fail| +|check|request page|$IT?@operation|authenticated by user|Aladdin|and password|open please|401| + +!|scenario|operation|operation|with good authentication should not fail| +|check not|request page|$IT?@operation|authenticated by user|Aladdin|and password|open sesame|401| + +!|scenario|operation|operation|is authenticated| +|operation|@operation|with bad authentication should fail| +|operation|@operation|with good authentication should not fail| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/content.txt new file mode 100644 index 0000000000..270d042cbf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/content.txt @@ -0,0 +1,22 @@ +!|script| +|given user|Aladdin|with password|open sesame| +|given read locked page|FrontPage| + +!|operation is authenticated| +|operation| +|properties| +|edit| +|search| +|versions| +|viewVersion| +|names| +|executeSearchProperties| +|whereUsed| +|refactor| +|pageData| +|raw| +|rss| +|importAndView| +|getPage| +|packet| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/content.txt new file mode 100644 index 0000000000..c9b2dd0005 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/content.txt @@ -0,0 +1,19 @@ +!define PATHS { +!path classes +!path fitnesse.jar +!define TEST_SYSTEM (slim) +!define SLIM_PORT (9000) +} + +!|script| +|given user|Aladdin|with password|open sesame| +|given page|ParentPage|with content|${PATHS}| +|given test locked page|ParentPage.AwkwardTurtle| + +!|operation is authenticated| +|operation| +|suite| +|test| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/content.txt new file mode 100644 index 0000000000..8c6e5a54f3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/content.txt @@ -0,0 +1,13 @@ +!|script| +|given user|Aladdin|with password|open sesame| +|given write locked page|FrontPage| + +!note Make sure saveProperties is last, because it clears the write-lock +!|operation is authenticated| +|operation| +|addChild| +|saveData| +|rollback| +|saveProperties| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SetUp/content.txt new file mode 100644 index 0000000000..399a283f0e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SetUp/content.txt @@ -0,0 +1,6 @@ +!include + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/content.txt new file mode 100644 index 0000000000..f3d9d8c184 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/content.txt @@ -0,0 +1,9 @@ +Make a request for an insecure page with out supplying any credentials. It should succeed. + +!|script| +|given user|Aladdin|with password|open sesame| +|given page|FrontPage| +|it should be readable with no authentication| +|it should be readable by user|Aladdin|password|open sesame| +|it should be readable by user|Aladdin|password|open please| +|it should be readable by user|Bob|password|xyzzy| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/content.txt new file mode 100644 index 0000000000..cb6a2ca8e9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/content.txt @@ -0,0 +1,9 @@ +Children of a page who'se 'secure-read' property is set, also require authentication in order to read. The 'secure-read' property acts as though it were inherited by the children pages. + +!|script| +|given user|Aladdin|with password|open sesame| +|given read locked page|ParentPage| +|given page|ParentPage.ChildPage| +|it should not be readable with no authentication| +|it should not be readable by user|Aladdin|password|open please| +|it should be readable by user|Aladdin|password|open sesame| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/content.txt new file mode 100644 index 0000000000..0f6106b65f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/content.txt @@ -0,0 +1,12 @@ +!|FileSection|setup| + +Requesting a file from the ''files''' directory does not require authentication, but requesting a directory does. +A response with status 401 will be received signifying lack of authentication. + +!|script| +|given user|Aladdin|with password|open sesame| +|directory|files/|should not be readable with no authentication| +|directory|files/|should not be readable by user|Aladdin|password|open please| +|directory|files/|should be readable by user|Aladdin|password|open sesame| + +!|FileSection|teardown| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/content.txt new file mode 100644 index 0000000000..4838d4ccf0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/content.txt @@ -0,0 +1,27 @@ +If we try to test a suite page that is marked secure-test, we'll have to authenticate. +A response with status 401 will be received signifying lack of authentication. + +First setup the Authentication module. +!|Authenticator Setup| +|username|password|status?| +|Aladdin|open sesame|| + +Create a page to be tested. +!|Page creator.| +|Page name.|page attributes|valid?| +|FrontPage |secure-test=true|true| + +Now request a page. We should get a 401 since we didn't suply any credentials. +!|Response Requester.| +|uri|status?| +|FrontPage?suite |401 | + +When we supply bad credintials we get a 401. +!|Response Requester.| +|uri|username|password|status?| +|FrontPage?suite |Aladdin|open please|401| + +Proper credentials give a successfull response. +!|Response Requester.| +|uri|username|password|status?| +|FrontPage?suite |Aladdin|open sesame|200| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/properties.xml new file mode 100644 index 0000000000..4cb9100788 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/properties.xml @@ -0,0 +1,12 @@ + + + + 20081020135120 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/content.txt new file mode 100644 index 0000000000..470a1b3691 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/content.txt @@ -0,0 +1,27 @@ +If we try to test a page that is marked secure-test, we'll have to authenticate. +A response with status 401 will be received signifying lack of authentication. + +First setup the Authentication module. +!|Authenticator Setup| +|username|password|status?| +|Aladdin|open sesame|| + +Create a page to be tested. +!|Page creator.| +|Page name.|page attributes|valid?| +|FrontPage |secure-test=true|true| + +Now request a page. We should get a 401 since we didn't suply any credentials. +!|Response Requester.| +|uri|status?| +|FrontPage?test |401 | + +When we supply bad credintials we get a 401. +!|Response Requester.| +|uri|username|password|status?| +|FrontPage?test |Aladdin|open please|401| + +Proper credentials give a successfull response. +!|Response Requester.| +|uri|username|password|status?| +|FrontPage?test |Aladdin|open sesame|200| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/properties.xml new file mode 100644 index 0000000000..c53497f269 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/content.txt new file mode 100644 index 0000000000..314ebc3b07 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/content.txt @@ -0,0 +1,5 @@ +!define TEST_SYSTEM {slim} +!contents -g -h -p + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/properties.xml new file mode 100644 index 0000000000..d5add12c02 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..756a3de066 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/content.txt @@ -0,0 +1,33 @@ +!|scenario|the edit response should contain|contents| +|check|request page|$IT?edit|200| +|ensure|content contains|@contents| +|show|content| + +!|scenario|attempt to edit|page | +|check |request page |@page?edit|200| + +!|scenario|save page|page|with contents|contents| +|check|request page save|@page|with contents|@contents|303| +|$IT=|echo|@page| + +!|scenario|save page|page|with contents|contents|by user|user| +|check|request page save|@page|with contents|@contents|by user|@user|and password|empty|303| +|$IT=|echo|@page| + +!|scenario|save page|page|by user|user| +|check|request page save|@page|with contents|empty|by user|@user|and password|empty|303| +|$IT=|echo|@page| + +!|scenario|save page|page| +|save page|@page|with contents|empty| + +!|scenario|it's last modified by should be|user| +|check|last modified of page|$IT|@user| + +!|scenario|it's versions should contain|content| +|page|$IT?versions|should contain|@content| + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/SetUp/content.txt new file mode 100644 index 0000000000..ffb7cf1de1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/SetUp/content.txt @@ -0,0 +1,6 @@ +!include + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/content.txt new file mode 100644 index 0000000000..4e77b4c65a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/content.txt @@ -0,0 +1,13 @@ +!2 Test editing an existent page. +The form should have a normal header, an edit area filled with the current contents of the page, and a save button. +---- + +!|script| +|given page|SomePage|with content|some content| +|the edit response should contain|SomePage| +|and should match|some content| +|and should match|| +|and should match|action="SomePage"| +|and should match|| +|and should match|type="submit"| +|and should match|value="Save"| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/properties.xml new file mode 100644 index 0000000000..c4ced86714 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1229153458931 + 3161918505796726939 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/content.txt new file mode 100644 index 0000000000..4387afbc54 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/content.txt @@ -0,0 +1,9 @@ +!2 Test editing a non-existent page. +The form should have a normal header, a blank edit area, a save button. + +!|script | +|attempt to edit |SomeNonExistentPage | +|and should match| | +|and should match| | +|and should match|action="SomeNonExistentPage"| +|and should match|type="submit" | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/properties.xml new file mode 100644 index 0000000000..f3519d2836 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1229153513098 + -3655776539143142112 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/content.txt new file mode 100644 index 0000000000..36d35aa1f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/content.txt @@ -0,0 +1,3 @@ +!|script| +|save page|NewPage|with contents|þðæö| +|it should contain|þðæö| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/properties.xml new file mode 100644 index 0000000000..2dab0f0c8f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229153634306 + 2076309857569861535 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/content.txt new file mode 100644 index 0000000000..b748acaa67 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/content.txt @@ -0,0 +1,10 @@ +The username of the person who last modified a page is displayed in the properties view of the modified page. + +!|script| +|save page|PageOne|by user|Aladdin| +|it's last modified by should be|Aladdin| +|save page|PageTwo|by user|Genie| +|it's last modified by should be|Genie| +|save page|PageThree| +|it's last modified by should be|null| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/content.txt new file mode 100644 index 0000000000..218b3a4289 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/content.txt @@ -0,0 +1,6 @@ +!-RecentChanges-! displays the username of the last user that modified each page. If the user is anonymous then it is not displayed. + +!|script| +|page|RecentChanges|should not contain|Aladdin| +|save page|SomePage|by user|Aladdin| +|page|RecentChanges|should contain|Aladdin| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/content.txt new file mode 100644 index 0000000000..55b63b1b55 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/content.txt @@ -0,0 +1,7 @@ +When viewing versions, the user who created each ''previous'' version is listed along with each version. Anonymous users are omitted. + +!|script| +|save page|MyPage|by user|Bob| +|save page|MyPage|by user|Bill| +|it's versions should contain|Bob| +|and should match|>\d+<| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/content.txt new file mode 100644 index 0000000000..4798b204d8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/content.txt @@ -0,0 +1,7 @@ +The username is saved when a page is edited. It is visible through use of the !-!lastmodified-! widget. + +!|script| +|save page|MyPage|with contents|!lastModified| +|it should not contain|bob| +|save page|MyPage|with contents|!lastmodified|by user|bob| +|it should contain|bob| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/content.txt new file mode 100644 index 0000000000..d94ff563cf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/content.txt @@ -0,0 +1,3 @@ +The edit responder is invoked with a url of the form {{{SomePage?edit}}} +!contents -R2 -p +!define TEST_SYSTEM {slim} diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/properties.xml new file mode 100644 index 0000000000..ac299047b1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229153668185 + 5760355884637638070 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/content.txt new file mode 100644 index 0000000000..6d9cd4011c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/content.txt @@ -0,0 +1,12 @@ +There are cases when you want to copy and append the last row of your column or row fixture certain number of times. + +For Ex: We make a query to the database and it return certain record 'n' number of times. Instead of writing the same record 'n' number of times in your fitnesse page, you can just specify that you expect the last column 'n' number of times using the !-CopyAndAppendLastRow-! decorator. + +!|Copy and Append Last Row|100|number of times| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| + +In the above example, we want to divide 100 by 4 101 times. diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/properties.xml new file mode 100644 index 0000000000..4646681944 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/properties.xml @@ -0,0 +1,13 @@ + + + + + 20061216213113 + + + + + 1166322673244 + + 524008525574625139 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/content.txt new file mode 100644 index 0000000000..58c220f112 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/content.txt @@ -0,0 +1,12 @@ +What if you want to call the fixture 'n' times with the same row except you want to update one or two column's value? + +Ex: If you are using fitnesse fixtures to populate database and you want to insert a record 500 times. It would be easy to write one model record and insert that 500 times. This can be easily done with the !-CopyAndAppendLastRow-! decorator. But the database table might have a primary key. So you might want to update the primary key in each row. Now you might want to pipe !-IncrementColumnsValue-! and !-CopyAndAppendLastRow-! decorators to get the job done. + +Here is an example where I want to divide 5 by 1, 100 times, but I also want to update the numerator by 5 and denominator by 1. + +!|Copy and Append Last Row|100|times| +|Increment Columns Value|numerator|of type|int|by|5| +|Increment Columns Value|denominator|of type|int|by|1| +|Division| +|numerator|denominator|quotient()| +|5|1|5| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/properties.xml new file mode 100644 index 0000000000..248425be0e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/properties.xml @@ -0,0 +1,13 @@ + + + + + 20061216215829 + + + + + 1166324308994 + + -8528063939302055872 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/content.txt new file mode 100644 index 0000000000..8f8916dc03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/content.txt @@ -0,0 +1,42 @@ +What if you want to increment the value of one of the columns of your fixture table at run time? You can use the !-IncrementColumnsValue-! decorator. This lets you increment column's values. This decorator supports the following data types: + * int or integer + * double + * string + * date + +!|Increment Columns Value|numerator|of type|int|by|5| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|10|3|5| +|10|4|5| + +!|Increment Columns Value|numerator|of type|integer|by|5| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|10|3|5| +|10|4|5| + +!|Increment Columns Value|numerator|of type|double|by|10.2| +|Division| +|numerator|denominator|quotient()| +|10.2|2|5.1| +|10.2|4|5.1| + +!|Increment Columns Value|numerator|of type|string|by|5| +|Division| +|numerator|denominator|quotient()| +|5|1|5| +|5|11|5| +|5|111|5| + +Updates the dates by 5 days. +!|Increment Columns Value|inDate|of type|date|by|5| +|Get Dates| +|inDate|updatedDate()| +|12/02/2006|12/02/2006| +|12/02/2006|12/07/2006| +|12/22/2006|01/01/2007| + +This decorator by itself is not as useful. But piped with other decorators this can be really handy. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/properties.xml new file mode 100644 index 0000000000..af3175f206 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/properties.xml @@ -0,0 +1,13 @@ + + + + + 20081020135129 + + + + + 1166413276084 + + 8229942939854899838 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/content.txt new file mode 100644 index 0000000000..6ed36baab5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/content.txt @@ -0,0 +1,20 @@ +Consider you have a simple fit test as follows: + +!|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| + +Now you want to measure how much time this test is taking to execute. But you don't want to or cannot modify the existing test fixture. Basically you want to decorate the existing fit tests with extra features. + +It would be cool if you could write a decorator around your fit test which starts a timer before the execution of the fit test starts, runs the fit test as usual and once the execution is completed it records the amount of time it took to run the test. An assertion on the execution time to make sure it executes within a max time is also quite handy to be aware of the application's performance over a period of time. Something like this: + +!|Max Time|100|milliseconds| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| + +'''Note:''' As of now, all the times are in milliseconds. The parameter "milliseconds" in the fixture above is just ignored. diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/properties.xml new file mode 100644 index 0000000000..40bef8ad26 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/properties.xml @@ -0,0 +1,13 @@ + + + + + 20081020135129 + + + + + 1166312743925 + + -1637353253013255969 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/content.txt new file mode 100644 index 0000000000..861b5a4a78 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/content.txt @@ -0,0 +1,15 @@ +What if you want to execute the same fitnesse test multiple times. This seems like nice a candidate for a decorator. + +If you want to loop 5 times over a fitnesse table and make sure each time the test does not take more than 100 milliseconds. + +!|Loop|5|times| +|Max Time|100|milliseconds| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| + +Once you run this test, you can see actual time taken for each run. In our case, we'll see 5 actual timing printed, since we are looping 5 times. + +'''Note:''' As you can see, you can pipe decorators. Similar to how you can pipe Unix shell commands. diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/properties.xml new file mode 100644 index 0000000000..98e9bd2476 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/properties.xml @@ -0,0 +1,13 @@ + + + + + 20061216185449 + + + + + 1166313289708 + + -7438421477570336896 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/content.txt new file mode 100644 index 0000000000..6bf4596ab9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/content.txt @@ -0,0 +1,4 @@ +!|Import| +|fit.decorator| +|fit.decorator.performance| +|eg| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/properties.xml new file mode 100644 index 0000000000..47bf822873 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20061216183948 + true + true + true + true + true + true + 1166312388007 + -6757238585913794424 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/content.txt new file mode 100644 index 0000000000..7931d9916b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/content.txt @@ -0,0 +1 @@ +!|fit.Summary| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/properties.xml new file mode 100644 index 0000000000..b7f5c22ccf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20061216141632 + true + true + true + true + true + true + 1166296592283 + -5128325404176707243 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/content.txt new file mode 100644 index 0000000000..66e59b8212 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/content.txt @@ -0,0 +1,19 @@ +What if you want to specify a time range for your fitnesse fixtures? + +!|Time Range|0|milliseconds min and max|50|milliseconds| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| + +In this example, you want to make sure all the division don't take less than 0 milliseconds and more than 50 milliseconds. + +By now you should be aware that these decorators ignore alternative column names. + +!|Time Range|0|alternative column values are ignored|50|this is ignored as well| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/properties.xml new file mode 100644 index 0000000000..601386def2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/properties.xml @@ -0,0 +1,13 @@ + + + + + 20081020135129 + + + + + 1166313795208 + + -6211985429310204450 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/content.txt new file mode 100644 index 0000000000..ba88c32bce --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/content.txt @@ -0,0 +1,12 @@ +What if you want to run the same fitnesse fixture, 5 times and want to make sure that each time it runs it does not take more than 75 milliseconds? Also you want to make sure overall, it does not take more than 100 milliseconds. + +!|Max Time|100|milliseconds| +|Loop|5|times| +|Max Time|75|milliseconds| +|Division| +|numerator|denominator|quotient()| +|10|2|5| +|12.6|3|4.2| +|100|4|25| + +'''Note:''' Again you can see here, how you can pipe different decorators and create powerful decorator patterns. diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/properties.xml new file mode 100644 index 0000000000..ef627940ce --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/properties.xml @@ -0,0 +1,13 @@ + + + + + 20061216185819 + + + + + 1166313499121 + + 8781183260268546089 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/content.txt new file mode 100644 index 0000000000..61c3e10cc2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/content.txt @@ -0,0 +1,17 @@ +!-FitDecorator-! is a framework for writing decorator for FIT fixtures. !-FitDecorator-! help you to add new functionality to existing fixture classes without having to update them. You can just decorate the table on the fitnesse page with the appropriate !-FitDecorator-!. + +For example, if you want to approximately know how much time each fixture is taking during a fitnesse test, you can decorate the existing fitnesse table with a !-MaxTime-! decorator. + +List of available decorators and their functionality with an example: + + * [[Measure Max Time taken by the Division Fixture by using !-MaxTime-! decorator][^MaxTimeDivision]] + * [[Execute Division Fixture multiple times using Loop Decorator][^MultipleDivision]] + * [[Example of piping !-MaxTime-! and Loop decorator to build complex decorators][^TimedMultipleDivision]] + * [[Measure if the Division Fixture is executed in the given Time Range using the !-TimeRange-! decorator][^TimeRangeDivision]] + * [[Copy the last row and append it to the end of the table 'n' number of times using !-CopyAndAppendLastRow-! decorator][^CopyAndAppendLastRow]] + * [[Increment all the subsequent column values using the !-IncrementColumnsValues-! decorator][^IncrementColumnsValues]] + * [[Example of piping !-CopyAndAppendLastRow-! and !-IncrementColumnsValues-! decorators][^CopyAppendLastRowAndIncrementColumnValues]] + +'''Note:''' !-FitDecorator-! does not support [[Fit Library][http://fitlibrary.sourceforge.net]] as of now. + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/properties.xml new file mode 100644 index 0000000000..a06213bf32 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/properties.xml @@ -0,0 +1,12 @@ + + + + + + + + + 1166331006945 + + -455847644342679400 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/content.txt new file mode 100644 index 0000000000..b9a54c3f03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/content.txt @@ -0,0 +1,16 @@ +!3 You can put arrays of objects into ColumnFixture fixtures. + +!|fitnesse.fixtures.ComplexAddFixture| +|a|b|sum?| +|1,2|3,4|4,6| + +{{{ +public class ComplexAddFixture extends ColumnFixture +{ + public int[] a; + public int[] b; + public int[] sum() { + return new int[] {a[0]+b[0], a[1]+b[1]}; + } +} +}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/properties.xml new file mode 100644 index 0000000000..34fcc1d8c6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210038 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/content.txt new file mode 100644 index 0000000000..3f1ec6f965 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/content.txt @@ -0,0 +1,28 @@ +!3 When testing a column fixture, if the header row mentions a field that is not in the fixture, then the following message should appear in that cell: +{{{Could not find field: fieldname.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +!note !-ColumnFixtureTestFixture-! is a special class used for testing Column fixtures. +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-!path ./lib/*.jar-!| +|enter|line|!-|Import|-!| +|enter|line|!-|fitnesse.fixtures|-!| +|enter|line|| +|enter|line|!-|Column fixture test fixture|-!| +|enter|line|!-|no such field|-!| +|enter|page|!-ColumnFixtureTestPage-!| + +!|Response Requester| +|uri|status?| +|ColumnFixtureTestPage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Could not find field: no such field|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/properties.xml new file mode 100644 index 0000000000..1c5113b262 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/properties.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/content.txt new file mode 100644 index 0000000000..dc22b09947 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/content.txt @@ -0,0 +1,35 @@ +!3 When testing a column fixture, if the header row mentions a method that is not in the fixture, then the following message should appear in that cell: +{{{Could not find method: methodName.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +!note !-ColumnFixtureTestFixture-! is a special class used for testing Column fixtures. +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-|Import|-!| +|enter|line|!-|fitnesse.fixtures|-!| +|enter|line|| +|enter|line|!-|Column fixture test fixture|-!| +|enter|line|!-|no such method()|-!| +|enter|page|!-ColumnFixtureTestPage-!| + +!|Response requester| +|uri|contents?| +|ColumnFixtureTestPage|| + +!|Response examiner| +|contents?| +|| + +!|Response Requester| +|uri|status?| +|ColumnFixtureTestPage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Could not find method: no such method()|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/properties.xml new file mode 100644 index 0000000000..6015b5f753 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210039 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/content.txt new file mode 100644 index 0000000000..100749d22a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/content.txt @@ -0,0 +1,41 @@ +!3 You can save and recall symbols in a !-ColumnFixture-!. You do this by using the =id? and id= syntax. + + * =id? or =id() takes the output of a function and stores it in the symbol named by the cell. In the example below the integer 1 is stored in the symbol ''one'', and the integer 2 is stored in the symbol ''two''. + * id= recalls the value of the symbol named by the cell, and puts it in the ''id'' variable. + +!|fitnesse.fixtures.ColumnFixtureTestFixture| +|input|=output?| +|1|one| +|2|two| + +!|fitnesse.fixtures.ColumnFixtureTestFixture| +|input=|output?| +|one|1| +|two|2| + +'''With classed integral types, there's a chance the value may be null as a correct result:''' +!|fitnesse.fixtures.ColumnFixtureTestFixture| +|integerInput|=integerOutput?| +|1|one| +|2|two| +|null|three| + +!|fitnesse.fixtures.ColumnFixtureTestFixture| +|integerInput=|integerOutput?| +|one|1| +|two|2| +|three|null| + +{{{ +public class ColumnFixtureTestFixture extends ColumnFixture +{ + public int input; + public int output() {return input;} + + public Integer integerInput; + public Integer integerOutput() { return integerInput; } + + public boolean exception() throws Exception {throw new Exception("I thowed up");} +} +}}} + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/properties.xml new file mode 100644 index 0000000000..b7f6c15b06 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/properties.xml @@ -0,0 +1,14 @@ + + + + 20081020135129 + + + + + + + + 1201547989632 + -7853206946547459455 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/content.txt new file mode 100644 index 0000000000..651ad304e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/content.txt @@ -0,0 +1,5 @@ +^TestSaveAndRecallSymbol +^TestArraysInColumnFixture +^TestMissingField +^TestMissingMethod + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/properties.xml new file mode 100644 index 0000000000..3cd565adee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210038 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/content.txt new file mode 100644 index 0000000000..8c62b6adf7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/content.txt @@ -0,0 +1,21 @@ +!3 If a cell contains ''"blank"'' or ''"null"'' then treat it as truly blank or truly null. + +Lots of people have had trouble with blank cells. In Fit, blank cells are automatically filled with the value of the variable or function, and no check is performed. Unfortunately this means that there was no good test for truly null or truly blank fields. So these keywords were added to allow users to enter them. + +!|fitnesse.fixtures.NullAndBlankFixture| +|nullString|blankString|nullString?|blankString?|isNull?|isBlank?| +|null |blank |null |blank |Y |Y | +| | | | |Y |Y | +|bob |micah | | |N |N | + +{{{ +public class NullAndBlankFixture extends ColumnFixture +{ + public String nullString; + public String blankString; + public String nullString() {return null;} + public String blankString() {return "";} + public boolean isNull() {return nullString == null;} + public boolean isBlank() {return blankString.length() == 0;} +} +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/properties.xml new file mode 100644 index 0000000000..fd566a158b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210040 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/content.txt new file mode 100644 index 0000000000..c5343498cf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/content.txt @@ -0,0 +1,26 @@ +!3 When testing a table, if the first cell of the table refers to a graceful name resolving to a class that does not extend Fixture, then the following message should appear in that cell: +{{{Class fixtureName is not a fixture.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +!note !-WouldBeFixture-! is a real class, but is not a Fixture +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-|Import|-!| +|enter|line|!-|fit.testFxtr|-!| +|enter|line|| +|enter|line|!-|Would Be|-!| +|enter|page|!-NotFixturePage-!| + +!|Response Requester| +|uri|status?| +|NotFixturePage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Class fit.testFxtr.WouldBeFixture is not a fixture.|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/properties.xml new file mode 100644 index 0000000000..82faa7996c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20090311030449 + + + + + + + + + 1236758689929 + -5230999437416113217 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/content.txt new file mode 100644 index 0000000000..3e331c98f5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/content.txt @@ -0,0 +1,33 @@ +!3 When testing a table, if the first cell of the table does not refer to a class in the classpath, then the following message should appear in that cell: +{{{Could not find fixture: fixtureName.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-|No such fixture|-!| +|enter|page|!-NoSuchFixturePage-!| + +!|Response Requester| +|uri|status?| +|NoSuchFixturePage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Could not find fixture: NoSuchFixture|true|| + +!|Response requester| +|uri|contents?| +|ErrorLogs.NoSuchFixturePage|| + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/properties.xml new file mode 100644 index 0000000000..dda8b12c5c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210041 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/content.txt new file mode 100644 index 0000000000..d624a1f359 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/content.txt @@ -0,0 +1,33 @@ +!3 When testing a table, if the first cell of the table does not refer to a class in the classpath, then the following message should appear in that cell: +{{{Could not find fixture: fixtureName.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-!|NoSuch|-!| +|enter|page|!-NoSuchFixturePage-!| + +!|Response Requester| +|uri|status?| +|NoSuchFixturePage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Could not find fixture: NoSuch|true|| + +!|Response requester| +|uri|contents?| +|ErrorLogs.NoSuchFixturePage|| + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/properties.xml new file mode 100644 index 0000000000..dda8b12c5c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210041 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/content.txt new file mode 100644 index 0000000000..2ab8c55d40 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/content.txt @@ -0,0 +1,23 @@ +!3 When testing a table, if the first cell of the table refers to a fixture class without a default (no argument) constructor, then the following message should appear in that cell: +{{{Class fixtureName has no default constructor.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +!note !-NoDefaultConstructorFixture-! is a real class, but is not a Fixture +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-|-!!-!-fit.testFxtr.NoDefaultConstructorFixture-!-!!-|-!| +|enter|page|!-NotFixturePage-!| + +!|Response Requester| +|uri|status?| +|NotFixturePage?test&debug|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Class fit.testFxtr.NoDefaultConstructorFixture has no default constructor.|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/properties.xml new file mode 100644 index 0000000000..fa7c300d49 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20090311030525 + + + + + + + + + 1236758725882 + -6794566941067712896 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/content.txt new file mode 100644 index 0000000000..812f924825 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/content.txt @@ -0,0 +1,23 @@ +!3 When testing a table, if the first cell of the table refers to a class that does not extend Fixture, then the following message should appear in that cell: +{{{Class fixtureName is not a fixture.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +!note !-WouldBeFixture-! is a real class, but is not a Fixture +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-|-!!-!-fit.testFxtr.WouldBeFixture-!-!!-|-!| +|enter|page|!-NotFixturePage-!| + +!|Response Requester| +|uri|status?| +|NotFixturePage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Class fit.testFxtr.WouldBeFixture is not a fixture.|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/properties.xml new file mode 100644 index 0000000000..6e3a8ebf9a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20090311030613 + + + + + + + + + 1236758773715 + -6171906091001795859 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/content.txt new file mode 100644 index 0000000000..72e9c0bb77 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/content.txt @@ -0,0 +1,45 @@ +Table cells contain strings. Fixtures deal with objects. In order to convert the strings into the objects FIT needs to know how to parse the strings. One way we accomplish this is to allow the objects to have the following method:{{{Object parse(String s);}}}The following table shows the result of adding two vectors. Each vector is represented by an ordered pair which represents it's X and Y dimensions. The class CartesianVector is used to parse, display, and sum the vectors. + +!|fitnesse.testutil.VectorSum| +|v1|v2|sum?| +|(0,0)|(0,1)|(0,1)| +|(0,1)|(0,1)|(0,2)| +|(1,1)|(1,1)|(2,2)| + +It is not always possible to add a parse method on the Object returned by the fixture. + +For Ex. if your fixture returns java.awt.Point class which does not have a {{{Object parse(String s);}}} method, this approach won't work. + +Following approach can be used to delegate the parse method to a different class (Parse Delegate class). The parse delegate class has the {{{Object parse(String s);}}} method which returns the Object we are interested in. + +The following table shows the result of adding two points. Each point is represented by an ordered pair which represents it's X and Y dimensions. + +!|fitnesse.testutil.ObjectTranslatePoint| +|p1|p2|sum?| +|(0,0)|(0,1)|(0,1)| +|(0,1)|(0,1)|(0,2)| +|(1,1)|(1,1)|(2,2)| + +In the ObjectTranslatePoint fixture, we have a static block which registers the parse delegate object for a give Class type. + +Ex: +{{{static +{ + TypeAdapter.registerParseDelegate(java.awt.Point.class, new ObjectDelegatePointParser()); +} +}}}Please note that we are passing a Object of the Parse Delegate class. It is also possible to pass a class instead of the object. Only difference being the parse delegate class should have a {{{public static Object parse(String s);}}} method. + +!|fitnesse.testutil.ClassTranslatePoint| +|p1|p2|sum?| +|(0,0)|(0,1)|(0,1)| +|(0,1)|(0,1)|(0,2)| +|(1,1)|(1,1)|(2,2)| + +In the ClassTranslatePoint fixture, we have a static block which registers the parse delegate class for a give Class type. + +Ex: +{{{static +{ + TypeAdapter.registerParseDelegate(java.awt.Point.class, ClassDelegatePointParser.class); +} +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/properties.xml new file mode 100644 index 0000000000..814e0f05a6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/properties.xml @@ -0,0 +1,14 @@ + + + + 20081020135128 + + + + + + + + 1165041374300 + -4287311746097088003 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/content.txt new file mode 100644 index 0000000000..601108b7ed --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/content.txt @@ -0,0 +1,23 @@ +!3 When testing a table, if the first cell of the table refers to a class (after adding 'Fixture' to the end of the name) that does not extend Fixture, then the following message should appear in that cell: +{{{Class fixtureName is not a fixture.}}} + + * Here is a fitnesse page that should generate the error +!note The !-!path-! must point to fitnesse.jar +!note !-WouldBeFixture-! is a real class, but is not a Fixture +|Action fixture| +|start|Page builder| +|enter|attributes|Test=true| +|enter|line|!-!path ./classes-!| +|enter|line|!-!path ./fitnesse.jar-!| +|enter|line|!-|-!!-!-fit.testFxtr.WouldBe-!-!!-|-!| +|enter|page|!-NotFixturePage-!| + +!|Response Requester| +|uri|status?| +|NotFixturePage?test|200| + + * The error message should show up in the response + +!|Response examiner| +|type|pattern|matches?|contents?| +|contents|Class fit.testFxtr.WouldBeFixture is not a fixture.|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/properties.xml new file mode 100644 index 0000000000..c12e8bff10 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20090311030647 + + + + + + + + + 1236758807059 + -6742986396526469934 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/content.txt new file mode 100644 index 0000000000..61fee234bc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/content.txt @@ -0,0 +1,8 @@ +^TestBlankAndNullCells +^TestParsingOfObjects +^TestFixtureNotFound +^TestFixtureNotFoundAfterTackingOnFixture +^TestNotFixture +^TestTackOnFixtureNotFixture +^TestCannotResolveGracefullyNamedFixture +^TestNoDefaultConstructor \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/properties.xml new file mode 100644 index 0000000000..43b44773cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/properties.xml @@ -0,0 +1,15 @@ + + + + + + 20090311030540 + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/content.txt new file mode 100644 index 0000000000..7f74b05f75 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/content.txt @@ -0,0 +1,9 @@ +A simple list of prime numbers. This fixture should pass. + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| +|11| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/properties.xml new file mode 100644 index 0000000000..8c5ff6ce3e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210045 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/content.txt new file mode 100644 index 0000000000..bcf74dfed4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/content.txt @@ -0,0 +1 @@ +^TestBasicRowFixture diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/properties.xml new file mode 100644 index 0000000000..88498919e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210044 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/content.txt new file mode 100644 index 0000000000..e520df58b2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/content.txt @@ -0,0 +1,4 @@ +^SuiteColumnFixtureSpec +^SuiteGeneralFixtureSpec +^SuiteRowFixtureSpec + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml new file mode 100644 index 0000000000..3cd565adee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210038 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/content.txt new file mode 100644 index 0000000000..b0ef86c81d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/content.txt @@ -0,0 +1,3 @@ +!|script| +|add child page|ChildPage|containing|child content|to parent page|NoSuchPage|should return Not Found| +|page|ParentPage.ChildPage|should not contain|child content| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/content.txt new file mode 100644 index 0000000000..9a5a22d5cf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/content.txt @@ -0,0 +1,4 @@ +!|script| +|given page|ParentPage| +|add child page|SuiteChild|containing|child content|to parent page|ParentPage|should return Redirect| +|ensure|page|ParentPage.SuiteChild|has attribute|Suite| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/content.txt new file mode 100644 index 0000000000..aa62a74458 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/content.txt @@ -0,0 +1,4 @@ +!|script| +|given page|ParentPage| +|add child page|TestChild|containing|child content|to parent page|ParentPage|should return Redirect| +|ensure|page|ParentPage.TestChild|has attribute|Test| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/content.txt new file mode 100644 index 0000000000..b3e954f643 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/content.txt @@ -0,0 +1,3 @@ +!|script| +|given page|ParentPage| +|add child page|bad-name|containing|child content|to parent page|ParentPage|should return BadRequest| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/content.txt new file mode 100644 index 0000000000..a127e18d62 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/content.txt @@ -0,0 +1,5 @@ +!|script| +|given page|ParentPage| +|add child page|SuiteChild|of type|Static|containing|child content|to parent page|ParentPage|should return Redirect| +|reject|page|ParentPage.SuiteChild|has attribute|Suite| +|reject|page|ParentPage.SuiteChild|has attribute|Test| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/content.txt new file mode 100644 index 0000000000..19b49c9798 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/content.txt @@ -0,0 +1,5 @@ +!|script| +|given page|ParentPage| +|add child page|TestChild|of type|Static|containing|child content|to parent page|ParentPage|should return Redirect| +|reject|page|ParentPage.TestChild|has attribute|Suite| +|reject|page|ParentPage.TestChild|has attribute|Test| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/content.txt new file mode 100644 index 0000000000..734322c57e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/content.txt @@ -0,0 +1,4 @@ +!|script| +|given page|ParentPage| +|add child page|ChildPage|containing|child content|to parent page|ParentPage|should return Redirect| +|page|ParentPage.ChildPage|should contain|child content| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/content.txt new file mode 100644 index 0000000000..83381cc2d0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/content.txt @@ -0,0 +1,6 @@ +!|script| +|given page|ParentPage| +|add child page|ChildPage|of type|Suite|containing|child content|to parent page|ParentPage|should return Redirect| +|page|ParentPage.ChildPage|should contain|child content| +|ensure|page|ParentPage.ChildPage|has attribute|Suite| +|reject|page|ParentPage.ChildPage|has attribute|Test| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/content.txt new file mode 100644 index 0000000000..ff9ceb8aac --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/content.txt @@ -0,0 +1,6 @@ +!|script| +|given page|ParentPage| +|add child page|ChildPage|of type|Test|containing|child content|to parent page|ParentPage|should return Redirect| +|page|ParentPage.ChildPage|should contain|child content| +|ensure|page|ParentPage.ChildPage|has attribute|Test| +|reject|page|ParentPage.ChildPage|has attribute|Suite| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/content.txt new file mode 100644 index 0000000000..99248b8525 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/content.txt @@ -0,0 +1,3 @@ +!|script| +|given page|ParentPage| +|add child page||containing|child content|to parent page|ParentPage|should return BadRequest| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..ea5dfcbe04 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/content.txt @@ -0,0 +1,17 @@ +!|scenario|add child page|page|containing|content|to parent page|parentPage|should return Redirect| +|add child page|@page|containing|@content|to parent page|@parentPage|should return|303| + +!|scenario|add child page|page|containing|content|to parent page|parent page|should return Not Found| +|add child page|@page|containing|@content|to parent page|@parentPage|should return|404| + +!|scenario|add child page|page|containing|content|to parent page|parent page|should return BadRequest| +|add child page|@page|containing|@content|to parent page|@parentPage|should return|400| + +!|scenario|add child page|page|containing|content|to parent page|parent page|should return|return code| +|add child page|@page|of type|Default|containing|@content|to parent page|@parentPage|should return|@returnCode| + +!|scenario|add child page|page|of type|type|containing|content|to parent page|parent page|should return Redirect| +|add child page|@page|of type|@type|containing|@content|to parent page|@parentPage|should return|303| + +!|scenario|add child page|page|of type|type|containing|content|to parent page|parent page|should return|return code| +|check|request page|@parentPage?addChild&name=@page&content=@content&pageType=@type|@returnCode| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/SetUp/content.txt new file mode 100644 index 0000000000..d0ca815019 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/SetUp/content.txt @@ -0,0 +1,4 @@ +!include + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/content.txt new file mode 100644 index 0000000000..128a7169a9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/content.txt @@ -0,0 +1,3 @@ +!contents -p -g + +!define TEST_SYSTEM {slim} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/properties.xml new file mode 100644 index 0000000000..e475416cd6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/content.txt new file mode 100644 index 0000000000..1c51d005e0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/content.txt @@ -0,0 +1,46 @@ +!The directory listing in the files section displays directories in alphabetical order - directories first, then files. + +Create the file section +|file section|setup| + +Add some files +|file section file adder| +|path|type|valid?| +|cFile.txt|file|true| +|dDir|dir|true| +|cDir|dir|true| +|bFile.txt|file|true| +|dFile.txt|file|true| +|bDir|dir|true| +|aFile.txt|file|true| +|aDir|dir|true| + +Verify that it's present through the file system +|query:file section directory listing| +|path| +|aFile.txt| +|bFile.txt| +|cFile.txt| +|dFile.txt| +|aDir| +|bDir| +|cDir| +|dDir| + +Now request the directory through fitnesse +|Response Requester| +|uri|valid?|contents?| +|files/|true|| + +|Response Examiner| +|line|inOrder?| +||true| +||true| +||true| +||true| +|aFile.txt|true| +|bFile.txt|true| +|cFile.txt|true| +|dFile.txt|true| + +|file section|teardown| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/properties.xml new file mode 100644 index 0000000000..4675a8d904 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173159323 + -3028771371104973063 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/content.txt new file mode 100644 index 0000000000..bdffdda3ad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/content.txt @@ -0,0 +1,2 @@ +!contents -g -p +!define TEST_SYSTEM {slim} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/properties.xml new file mode 100644 index 0000000000..d5add12c02 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/content.txt new file mode 100644 index 0000000000..9dbe8d0449 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/content.txt @@ -0,0 +1,42 @@ +!3 We should ''not'' be able to move a page below one of it's children. + +First build a page, a child page to move, and a grandchild page to act as the target of the move + +|Page creator.| +|Page name. |Page contents. |valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.ChildPage-! |child page |true | +|!-ParentPage.ChildPage.GrandchildPage-!|grandchild page| true | + +Then try to move the child page below the grandhild page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.ChildPage?responder=movePage&newLocation=ParentPage.ChildPage.GrandchildPage-!|400| + +Make sure we get an error message. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|Cannot move|true|| + +Make sure the page didn't really move. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.ChildPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|child page|true|| + +Make sure that the grandchild page still exists + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.ChildPage.GrandchildPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|grandchild page|true|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/properties.xml new file mode 100644 index 0000000000..c2b49f7615 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070045 + + + + + + + + 1229173245348 + -8080543676113160328 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/content.txt new file mode 100644 index 0000000000..862c733e19 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/content.txt @@ -0,0 +1,34 @@ +!3 When we move a page that is !included, the !include should be changed appropriately. + +First build a page, a subpage to move, and a target page to move it to. Then build a page that references the sub child to be moved. + +|Page creator.| +|Page name. |Page contents.|valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.SubPage-!|sub page |true | +|!-NewParentPage-! |x |true | +|!-ReferingPage-! |!-!include ParentPage.SubPage-!|true | + +Then move the sub page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SubPage?responder=movePage&newLocation=NewParentPage&refactorReferences=on-!|| + +Make sure that the refering page now !includes the old page at the new location. + +|Response Requester.| +|uri|valid?|contents?| +|!-ReferingPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-.NewParentPage.SubPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|sub page|true| + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/properties.xml new file mode 100644 index 0000000000..08d79b1082 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070132 + + + + + + + + 1229173292214 + -6812717968966184168 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/content.txt new file mode 100644 index 0000000000..6b619cc719 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/content.txt @@ -0,0 +1,21 @@ +!c !3 BUG! submitted by Etienne Charignon +!c !3 When you attempt to move a page inside of itself, you should get an error message. +!c ''prior to fix, an endless number of nested pages, all with the same name, would get created untill the os complained.'' + +First build a page to move. + +!|Page creator.| +|Page name. |Page contents.|valid?| +|TestPage| some content |true | + +Then try to move the sub page inside itself. We should get an error (400). + +!|Response Requester.| +|uri |status?| +|TestPage?responder=movePage&newLocation=TestPage|400| + +We should be told that we cannot move the page. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|Cannot move|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/properties.xml new file mode 100644 index 0000000000..89ddc24ca0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070206 + + + + + + + + 1229173326636 + 2417633247891792140 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/content.txt new file mode 100644 index 0000000000..0cc38ceb45 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/content.txt @@ -0,0 +1,40 @@ +!3 BUG. There was a problem when moving a page that was three or more levels down from the root. Moving A.B.C to A.D. + +First build a page, a subpage to move, and a target page to move it to. + +!|Page creator.| +|Page name. |Page contents. |valid?| +|ParentPageAy |>ChildBee |true | +|ParentPageAy.ChildBee |>ChildCee |true | +|ParentPageAy.ChildDee |page D |true | +|ParentPageAy.ChildBee.ChildCee|page C |true | + +The bug seems to make !-ChildBee-! disapear, so let's see if it's there now. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPageAy.ChildBee-!|true|| + +Then move the sub page. + +|Response Requester.| +|uri |status?| +|!-ParentPageAy.ChildBee.ChildCee?responder=movePage&newLocation=ParentPageAy.ChildDee&refactorReferences=on-!|| + +Next fetch old parent page and make sure the reference has been changed. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPageAy.ChildBee-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-ParentPageAy.ChildDee.ChildCee-!|true|| + +Make sure we can't get the old A.B.C page. Use the !-dontCreatePage-! query to suppress default creation of a non-existent page. + +|Response Requester.| +|uri|valid?|status?| +|!-ParentPageAy.ChildBee.ChildCee?getPage&dontCreatePage-!|false|404| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/properties.xml new file mode 100644 index 0000000000..be5e7295fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173359731 + -2531277103673867547 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/content.txt new file mode 100644 index 0000000000..f2cad25dc6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/content.txt @@ -0,0 +1,27 @@ +!3 When we move a page from one location to another, all references to that page should be changed. +This includes absolute references on the parent page. + +First build a page, a subpage to move, and a target page to move it to. + +|Page creator.| +|Page name. |Page contents.|valid?| +|!-ParentPage-! |!-.ParentPage.SubPage-! |true | +|!-ParentPage.SubPage-!|sub page |true | +|!-NewParentPage-! |x |true | +|!-ReferingPage-! |!-ParentPage.SubPage-!|true | + +Then move the sub page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SubPage?responder=movePage&newLocation=NewParentPage&refactorReferences=on-!|| + +Next fetch old parent page and make sure the reference has been changed. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-NewParentPage.SubPage-!|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/properties.xml new file mode 100644 index 0000000000..8686a41883 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070313 + + + + + + + + 1229173393012 + 5325341333142260574 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/content.txt new file mode 100644 index 0000000000..0cce500be5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/content.txt @@ -0,0 +1,47 @@ +!3 When we move a page from one location to another, all references to that page should be changed. + +First build a page, a subpage to move, and a target page to move it to. Then build a page that references the sub child to be moved. + +|Page creator.| +|Page name. |Page contents.|valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.SubPage-!|sub page |true | +|!-NewParentPage-! |x |true | +|!-ReferingPage-! |!-ParentPage.SubPage-!|true | + +Then move the sub page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SubPage?responder=movePage&newLocation=NewParentPage&refactorReferences=on-!|| + +Next fetch the moved page. + +|Response Requester.| +|uri|valid?|contents?| +|!-NewParentPage.SubPage-!|true|| + +Make sure that the sub page can be referenced in it's new location. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|sub page|true|| + +Make sure that there is no sub page beneath !-ParentPage-!. + +!|Response Requester.| +|uri|valid?|contents?| +|ParentPage.SubPage?getPage&dontCreatePage|false|| + +Finally, make sure that the refering page now refers to the new location. + +|Response Requester.| +|uri|valid?|contents?| +|!-ReferingPage-!|true|| + +!|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|NewParentPage.SubPage|true|| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/properties.xml new file mode 100644 index 0000000000..7f9e4041e3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173436909 + -1519214265074850152 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/content.txt new file mode 100644 index 0000000000..78596443cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/content.txt @@ -0,0 +1,24 @@ +!3 BUG. Given A.B.C.D, moving A.B to A.E causes C and D to be deleted. + +First build a page, a subpage to move, sub pages of the sub page, and a target page to move it to. + +|Page creator.| +|Page name. |Page contents. |valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.ChildPage-! |child page |true | +|!-ParentPage.ChildPage.GrandchildPage-!|grandchild page| true | +|!-NewParentPage-! |x |true | + +Then move the entire tree beneath the target page. + +|Response Requester.| +|uri |status?| +|!-ParentPage?responder=movePage&newLocation=NewParentPage-!|| + +Next fetch the moved page, and each of it's children. They should all be there. + +|Response Requester.| +|uri|valid?|contents?| +|!-NewParentPage.ParentPage-!|true|| +|!-NewParentPage.ParentPage.ChildPage-!|true|| +|!-NewParentPage.ParentPage.ChildPage.GrandchildPage-!|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/properties.xml new file mode 100644 index 0000000000..e45e98bf70 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210050 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/content.txt new file mode 100644 index 0000000000..409ca56c90 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/content.txt @@ -0,0 +1,27 @@ +!3 When we move a page from one location to another, all references to that page should be changed. +This includes relative references on the parent page. + +First build a page, a subpage to move, and a target page to move it to. + +|Page creator.| +|Page name. |Page contents.|valid?| +|!-ParentPage-! |!->SubPage-! |true | +|!-ParentPage.SubPage-!|sub page |true | +|!-NewParentPage-! |x |true | +|!-ReferingPage-! |!-ParentPage.SubPage-!|true | + +Then move the sub page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SubPage?responder=movePage&newLocation=NewParentPage&refactorReferences=on-!|| + +Next fetch old parent page and make sure the reference has been changed. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +!|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|.NewParentPage.SubPage|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/properties.xml new file mode 100644 index 0000000000..d02ac3087a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070603 + + + + + + + + 1229173563059 + 3592052480559424762 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/content.txt new file mode 100644 index 0000000000..d129b79552 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/content.txt @@ -0,0 +1,45 @@ +!3 We should be able to move a page that has sub pages from one location to another. The sub pages should move with the page. + +First build a page, a subpage to move, sub pages of the sub page, and a target page to move it to. + +|Page creator.| +|Page name. |Page contents. |valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.ChildPage-! |child page |true | +|!-ParentPage.ChildPage.GrandchildPage-!|grandchild page| true | +|!-NewParentPage-! |x |true | + +Then move that page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.ChildPage?responder=movePage&newLocation=NewParentPage-!|| + +Next fetch the moved page. + +|Response Requester.| +|uri|valid?|contents?| +|!-NewParentPage.ChildPage-!|true|| + +Make sure that the sub page can be referenced in it's new location. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|child page|true|| + +Make sure that the grandchild page can be referenced in its new location + +|Response Requester.| +|uri|valid?|contents?| +|!-NewParentPage.ChildPage.GrandchildPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|grandchild page|true|| + +Make sure that there is no sub page beneath !-ParentPage-!. + +!|Response Requester.| +|uri|valid?|contents?| +|ParentPage.SubPage?getPage&dontCreatePage|false|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/properties.xml new file mode 100644 index 0000000000..cf849b3013 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173607134 + 983046216905103268 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/content.txt new file mode 100644 index 0000000000..1b24243dd3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/content.txt @@ -0,0 +1,29 @@ +!3 When you try to move a page under a parent that does not exist, you should get a nice error message. + +!3 We should be able to move a page from one location to another. + +First build a page, a subpage to move, but ''no'' target page to move it to. + +|Page creator.| +|Page name. |Page contents.|valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.SubPage-!|sub page |true | + +Then try move that page to a non-existent target.. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SubPage?responder=movePage&newLocation=NewParentPage-!|400| + +Make sure we get an error message. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|Cannot move|true|| + +Make sure that the sub page is still beneath !-ParentPage-!. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.SubPage-!|true|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/properties.xml new file mode 100644 index 0000000000..d0db4da8a6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070714 + + + + + + + + 1229173634771 + 8938240666381501125 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/content.txt new file mode 100644 index 0000000000..73e9ccdd23 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/content.txt @@ -0,0 +1,41 @@ +!3 BUG: When moving a page that has children, references to the children are not renamed properly. + +Given: A.B.C.E, Move A.B.C to A.D. References to A.B.C.E should be renamed to A.D.C.E + +|Page creator.| +|Page name. |Page contents. |valid?| +|!-ReferencePage-! |!-ParentPageAy.ChildBee.ChildCee.ChildEee-!|true| +|!-ParentPageAy-! |!-^ChildBee-! |true | +|!-ParentPageAy.ChildBee-! |!-^ChildCee-! |true | +|!-ParentPageAy.ChildBee.ChildCee-! |page C |true | +|!-ParentPageAy.ChildBee.ChildCee.ChildEee-!|Page E |true | +|!-ParentPageAy.ChildDee-! |page D |true | + +Then move the sub page. + +|Response Requester.| +|uri |status?| +|!-ParentPageAy.ChildBee.ChildCee?responder=movePage&newLocation=ParentPageAy.ChildDee&refactorReferences=on-!|| + +Next fetch reference page and make sure the reference has been changed. + +|Response Requester.| +|uri|valid?|contents?| +|!-ReferencePage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-ParentPageAy.ChildDee.ChildCee.ChildEee-!|true|| + +Make sure we can't get the old A.B.C page. + +!|Response Requester.| +|uri|valid?|status?| +|ParentPageAy.ChildBee.ChildCee?getPage&dontCreatePage|false|| + +Make sure we ''can'' get the A.D.C.E page at it's new location. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPageAy.ChildDee.ChildCee.ChildEee-!|true|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/properties.xml new file mode 100644 index 0000000000..6d7100a294 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173661174 + -3944826000450782680 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/content.txt new file mode 100644 index 0000000000..875258a21f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/content.txt @@ -0,0 +1,34 @@ +!3 We should be able to move a page from one location to another. + +First build a page, a subpage to move, and a target page to move it to. + +|Page creator.| +|Page name. |Page contents.|valid?| +|!-ParentPage-! |x |true | +|!-ParentPage.SubPage-!|sub page |true | +|!-NewParentPage-! |x |true | + +Then move that page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SubPage?responder=movePage&newLocation=NewParentPage-!|| + +Next fetch the moved page. + +|Response Requester.| +|uri|valid?|contents?| +|!-NewParentPage.SubPage-!|true|| + +Make sure that the sub page can be referenced in it's new location. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|sub page|true|| + +Make sure that there is no sub page beneath !-ParentPage-!. + +!|Response Requester.| +|uri|valid?|contents?| +|ParentPage.SubPage?getPage&dontCreatePage|false|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/properties.xml new file mode 100644 index 0000000000..aef3dfe57f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173686453 + -8466104856830441988 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/content.txt new file mode 100644 index 0000000000..a83f2f2c8e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/content.txt @@ -0,0 +1,16 @@ +!3 This Suite specifies the behavior of the move responder. + +The move responder is invoked with the ''movePage'' url. This url has an argument named ''newPageLocation'' that holds the name of the new parent of the page. Thus the url:{{{http://localhost/SomePage?responder=movePage&newLocation=NewPage}}} will move''!-SomePage-!'' beneath ''!-NewPage-!'' + +^TestSimpleMove +^TestMovePageWithSubPages +^TestMovePageWithManyLevelsOfSubPages +^TestMovePageWithExternalReference +^TestMovePageWithRelativeInternalReference +^TestMovePageWithAbsoluteInternalReference +^TestCantMovePageBeneathSelf +^TestMovePageThreeLevelsDown +^TestReferencesOfChildOfMovedPageAreRenamed +^TestMoveToNonExistentPage +^TestMoveIncludedPage +^TestMovePageInsideItself diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/properties.xml new file mode 100644 index 0000000000..3096ff6ba2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/content.txt new file mode 100644 index 0000000000..cfdeaa860a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/content.txt @@ -0,0 +1,46 @@ +!3 Each page has links in the left rail. This test verifies the default set of links. + +Create a page. +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SomePage-!|any page at all|true| + +Request the page +!|Response Requester.| +|uri|valid?| +|SomePage?properties|true| + +Ensure that the Page type radios are present +!|Response Examiner.| +|type|pattern|matches?| +|contents|Page type:|true| +|contents| - Static|true| +|contents| - Test|true| +|contents| - Suite|true| +|contents| - Skip|true| + +Ensure that the Action links are present +!|Response Examiner.| +|type|pattern|matches?| +|contents|Actions:|true| +|contents| - Edit|true| +|contents| - Versions|true| +|contents| - Properties|true| +|contents| - Refactor|true| +|contents| - WhereUsed|true| + +Ensure that the Navigation links are present +!|Response Examiner.| +|type|pattern|matches?| +|contents|Navigation:|true| +|contents| - Files|true| +|contents| - RecentChanges|true| +|contents| - Search|true| + +Ensure that the Security links are present +!|Response Examiner.| +|type|pattern|matches?| +|contents|Security:|true| +|contents| - secure-read|true| +|contents| - secure-write|true| +|contents| - secure-test|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/properties.xml new file mode 100644 index 0000000000..fc28cc38ef --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + 1235158706748 + -2937605021692999419 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/properties.xml new file mode 100644 index 0000000000..a317072bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210052 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/content.txt new file mode 100644 index 0000000000..9d039e65ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/content.txt @@ -0,0 +1,42 @@ +!3 Only true page references should be changed during a rename. + +There are several widgets that contains strings that might match the pattern for a wiki word. When +a page is renamed, those strings should not be affected. + +First build a page with lots of these ''protected'' widgets. + +!|script|Page Builder| +|line|!-!path TargetPage-!| +|line|!-http://objectmentor.com/TargetPage-!| +|line|!-!img http://objectmentor.com/TargetPage.jpg-!| +|line|!-{{{TargetPage}}}-!| +|line|!-# TargetPage-!| +|line|!- !-TargetPage-! -!| +|line|this link should be renamed !-TargetPage-!| +|page|!-ProtectedWidgetPage-!| + +Next create the target page. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-TargetPage-!|whatever|true| + +Then rename that page. + +|Response Requester.| +|uri |status?| +|!-TargetPage?responder=renamePage&newName=RenamedPage&refactorReferences=on-!|| + +Next fetch the page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ProtectedWidgetPage-!|true|| + +Make sure that the new page name does not appear. + +|Response Examiner.| +|type |pattern|matchCount?|wrapped html?| +|contents|!-RenamedPage</a>-!|1|| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/properties.xml new file mode 100644 index 0000000000..8a51bdef73 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229653754358 + -1142268299964872099 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/content.txt new file mode 100644 index 0000000000..da596c048a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/content.txt @@ -0,0 +1,29 @@ +!3 When a page is renamed, any links to that page from subpages pages are changed. + +First build parent & child pages where one refers to the other. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-ParentPage-!|!-refer to .ParentPage.ChildPage-!|true| +|!-ParentPage.ChildPage-!|whatever |true| + +Then rename the target page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.ChildPage?responder=renamePage&newName=NewChild&refactorReferences=on-!|| + +Next fetch the Source page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-href="ParentPage\.NewChild"-!|true| +|contents|!-ParentPage\.ChildPage-!|false| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/properties.xml new file mode 100644 index 0000000000..ae275e728c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/properties.xml @@ -0,0 +1,15 @@ + + + + 20081020135127 + docs + + + + + + + + 1153177686974 + -9094752150551407051 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/content.txt new file mode 100644 index 0000000000..6314c2720a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/content.txt @@ -0,0 +1,41 @@ +!3 When a page is renamed, any links to that page from subpages pages are changed. + +First build parent & child pages where one refers to the other. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-ParentPage-!|!-refer to nothing-!|true| +|!-ParentPage.BrotherPage-!|!-you are my SisterPage-!|true| +|!-ParentPage.SisterPage-!|!- thanks brother, love SisterPage-!|true| + +Then rename the target page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.SisterPage?responder=renamePage&newName=NewSister&refactorReferences=on-!|| + +Next fetch the Source page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.BrotherPage-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-NewSister-!|true| +|contents|!-SisterPage-!|false| + +Next fetch the Target page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.NewSister-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-NewSister-!|true| +|contents|!-SisterPage-!|false| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/properties.xml new file mode 100644 index 0000000000..7dfec140ce --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/properties.xml @@ -0,0 +1,15 @@ + + + + 20081020135127 + docs + + + + + + + + 1153177659589 + -7332162283628447721 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/content.txt new file mode 100644 index 0000000000..0b582f66fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/content.txt @@ -0,0 +1,33 @@ +!3 A page may ''not'' be renamed to a name with dots in it. +!3 Another way of saying this is that renaming a page does not change it's position. + +First build the page to rename, and another page to try to move it beneath. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-MyPage-!|X|true| +|!-TargetPage-!|X|true| + +Then rename that page. + +|Response Requester.| +|uri |status?| +|!-MyPage?responder=renamePage&newName=TargetPage.SomePage-!|400| + +Make sure that we got an error message. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|Cannot rename|true|| + +The renamed page should not exist. + +!|Response Requester.| +|uri|valid?| +|TargetPage.SomePage?getPage&dontCreatePage|false| + +The old page should still exist. + +|Response Requester.| +|uri|valid?|contents?| +|!-MyPage-!|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/properties.xml new file mode 100644 index 0000000000..308b285bd5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173753030 + -8487183569734544471 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/content.txt new file mode 100644 index 0000000000..c1a414fb52 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/content.txt @@ -0,0 +1,27 @@ +!c !3 When a page is renamed all of its child pages remain intact. + +First build the page with children. + +!|Page creator.| +|Page name.|Page contents.|valid?| +|ParentPage|parent|true| +|ParentPage.ChildPage|child page|true| + +Then rename the parent page. + +!|Response Requester.| +|uri |status?| +|ParentPage?responder=renamePage&newName=NewParentPage|| + +Next fetch the child page using the parent's new name. + +!|Response Requester.| +|uri|valid?|contents?| +|NewParentPage.ChildPage|true|| + +The child page's content should be the same. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|child page|true|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/properties.xml new file mode 100644 index 0000000000..bd9392822e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229173773698 + -7178127820410324012 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/content.txt new file mode 100644 index 0000000000..e05f1f399f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/content.txt @@ -0,0 +1,33 @@ +!3 When a page is renamed, any internal links to that page are changed. + +If you have a page that refers to itself, then its internal references will be changed. + +First build the page with a self reference. + +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-MyPage-!|!-refer to self MyPage-!||true| + +Then rename that page. + +|Response Requester.| +|uri |status?| +|!-MyPage?responder=renamePage&newName=ThePage&refactorReferences=on-!|| + +Next fetch the page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ThePage-!|true|| + +Make sure that the new name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-ThePage-!|true|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-MyPage-!|false| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/properties.xml new file mode 100644 index 0000000000..24758dcb8f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213070957 + + + + + + + + 1229173797158 + 969063307704892573 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/content.txt new file mode 100644 index 0000000000..5a17409d23 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/content.txt @@ -0,0 +1,29 @@ +!3 When a page is renamed, any alias links that use absolute references to subpages are changed. + +First build parent & child pages where one refers to the other. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-ParentPage-!|!-refer to [[link][.ParentPage.ChildPage]]-!|true| +|!-ParentPage.ChildPage-!|whatever |true| + +Then rename the target page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.ChildPage?responder=renamePage&newName=NewChild&refactorReferences=on-!|| + +Next fetch the Source page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-href="ParentPage\.NewChild"-!|true| +|contents|!-ChildPage-!|false| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/properties.xml new file mode 100644 index 0000000000..25590671eb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/properties.xml @@ -0,0 +1,15 @@ + + + + 20081020135127 + docs + + + + + + + + 1153182710779 + -1727734104643571115 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/content.txt new file mode 100644 index 0000000000..8e9277932e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/content.txt @@ -0,0 +1,28 @@ +!3 When a page is renamed, any alias links to that page from sibling pages are changed. + +First build pages where one refers to the other. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SourcePage-!|!-refer to [[link][TargetPage]]-!|true| +|!-TargetPage-!|whatever|true| + +Then rename the target page. + +|Response Requester.| +|uri |status?| +|!-TargetPage?responder=renamePage&newName=NewTarget&refactorReferences=on-!|| + +Next fetch the Source page. + +|Response Requester.| +|uri|valid?|contents?| +|!-SourcePage-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-href="NewTarget"-!|true| +|contents|!-TargetPage-!|false| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/properties.xml new file mode 100644 index 0000000000..f5b587fcb7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/properties.xml @@ -0,0 +1,15 @@ + + + + 20081020135127 + docs + + + + + + + + 1153182700981 + 4625139863425684684 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/content.txt new file mode 100644 index 0000000000..66f34189d4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/content.txt @@ -0,0 +1,29 @@ +!3 When a page is renamed, any alias links that are using subpages are changed. + +First build parent & child pages where one refers to the other. + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-ParentPage-!|!-refer to [[link][^ChildPage]]-!|true| +|!-ParentPage.ChildPage-!|whatever |true| + +Then rename the target page. + +|Response Requester.| +|uri |status?| +|!-ParentPage.ChildPage?responder=renamePage&newName=NewChild&refactorReferences=on-!|| + +Next fetch the Source page. + +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-href="ParentPage\.NewChild"-!|true| +|contents|!-ChildPage-!|false| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/properties.xml new file mode 100644 index 0000000000..d1c10076da --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/properties.xml @@ -0,0 +1,15 @@ + + + + 20081020135127 + docs + + + + + + + + 1153182689488 + -3016663024832079308 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/content.txt new file mode 100644 index 0000000000..5840ec8c4d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/content.txt @@ -0,0 +1,47 @@ +!3 When a page is renamed, any links to that page from backwards references pages are changed. + +Create the test data. + +!|Page creator.| +|Page name.|Page contents.|valid?| +|TopPage||true| +|TopPage.TargetPage||true| +|TopPage.MiddlePage||true| +|TopPage.MiddlePage.MiddleTarget||true| +|TopPage.MiddlePage.ReferingPage||true| +|contents||true| + +Rename the middle page. + +!|Response Requester.| +|uri |status?| +|RenamedTopPage.MiddlePage?responder=renamePage&newName=RenamedMiddlePage&refactorReferences=on|| + +Next fetch the referring page. + +!|Response Requester.| +|uri|valid?|contents?| +|RenamedTopPage.RenamedMiddlePage.ReferingPage|true|| + +!|Response Examiner.| +|type |pattern|matches?| +|contents||true| +|contents||true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/properties.xml new file mode 100644 index 0000000000..5004894c33 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/properties.xml @@ -0,0 +1,14 @@ + + + true + 20081213071101 + true + true + true + true + true + true + true + 1229173861834 + -7370650774892217411 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/content.txt new file mode 100644 index 0000000000..6423301ca2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/content.txt @@ -0,0 +1,31 @@ +!3 When a page is renamed, any links to that page on other pages are changed. + +If you have a page that refers to the renamed page, then that reference will be changed. + +First build sibling pages where one refers to the other + +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SourcePage-!|!-refer to TargetPage-!|true| +|!-TargetPage-!|some page|true| + +Then rename the target page. + +|Response Requester.| +|uri |status?| +|!-TargetPage?responder=renamePage&newName=NewTarget&refactorReferences=on-!|| + +Next fetch the Source page. + +|Response Requester.| +|uri|valid?|contents?| +|!-SourcePage-!|true|| + +Make sure that the new target name is present and that the old name is not. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-NewTarget-!|true| +|contents|!-TargetPage-!|false| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/properties.xml new file mode 100644 index 0000000000..b6ff3d4117 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/properties.xml @@ -0,0 +1,15 @@ + + + + 20081020135127 + docs + + + + + + + + 1153182679458 + 1940290324349855192 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/content.txt new file mode 100644 index 0000000000..e30cfb67fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/content.txt @@ -0,0 +1,30 @@ +!3 When a page is renamed, any links to that page from subpages pages are changed. + +First build parent & child pages where one refers to the other. + +!|Page creator.| +|Page name.|Page contents.|valid?| +|ParentPage|refer to >ChildPage|true| +|ParentPage.ChildPage|whatever|true| + +Then rename the target page. + +!|Response Requester.| +|uri |status?| +|ParentPage.ChildPage?responder=renamePage&newName=NewChild&refactorReferences=on|| + +Next fetch the Source page. + +!|Response Requester.| +|uri|valid?|contents?| +|ParentPage|true|| + +Make sure that the new target name is present and that the old name is not. + +!|Response Examiner.| +|type |pattern|matches?| +|contents|>NewChild|true| +|contents|href="ParentPage\.NewChild"|true| +|contents|>ChildPage|false| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/properties.xml new file mode 100644 index 0000000000..7cdc61c86a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/properties.xml @@ -0,0 +1,14 @@ + + + + 20081213071135 + + + + + + + + 1229173895549 + -8056489792305985117 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/content.txt new file mode 100644 index 0000000000..c60d4ae41b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/content.txt @@ -0,0 +1,16 @@ +!3 This Suite specifies the behavior of the rename responder. + +The rename responder is invoked with the ''renamePage'' url. This url has an argument named ''newPageName'' that holds the new name of the page. Thus the url:{{{http://localhost/SomePage?responder=renamePage&newName=NewPage}}} will rename ''!-SomePage-!'' to ''!-NewPage-!'' + +^TestRenamePageThatRefersToItself +^TestRenamePageWithSiblingReference +^TestRenamePageWithSubpageReference +^TestRenameChildPageWithSiblingReference +^TestRenameChildPageWithAbsoluteReference +^TestRenamePageWithAliasLinkReference +^TestRenamePageWithAliasSubLinkReference +^TestRenamePageWithAliasAbsoluteReference +^TestProtectedWidgetsAreNotRenamed +^TestRenameDoesNotMove +^TestRenameMovesChildPages + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/properties.xml new file mode 100644 index 0000000000..c73e16b44c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/properties.xml @@ -0,0 +1,12 @@ + + + + 20081020135127 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..78d8603eb7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/content.txt @@ -0,0 +1,22 @@ +!|scenario|and given page|page|with content|content| +|given page|@page|with content|@content| + +!|scenario|when replacing|searchString|with|replacementString|starting from|pageName| +|check|request page|@pageName?replace&searchString=@searchString&replacementString=@replacementString|200| +|$RESPONSE=|content| + +!|scenario|replacement response from|searchString|with|replacementString|should contain|contents| +|check|request page|$IT?replace&searchString=@searchString&replacementString=@replacementString|200| +|ensure|content contains|@contents| +|show|content| + +!|scenario|it should list|pageName| +|ensure|content contains|@pageName| +|show|content| + +!|scenario|and it should list|pageName| +|it should list|@pageName| + +!|scenario|and page|pageName|should contain|content| +|page|@pageName|should contain|@content| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/SetUp/content.txt new file mode 100644 index 0000000000..ffb7cf1de1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/SetUp/content.txt @@ -0,0 +1,6 @@ +!include + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/content.txt new file mode 100644 index 0000000000..0caa1edd28 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/content.txt @@ -0,0 +1,17 @@ +!2 Test replacing text in a simple page hierarchy. +Replacing text in a page hierarchy should replace any matches found on all child pages. +---- + +!|script | +|given page |ParentPage |with content |some content | +|and given page |ParentPage.SubPage |with content |some other content | +|and given page |ParentPage.SubPage.ChildPage1|with content |non-matching page content | +|and given page |ParentPage.ChildPage2 |with content |some more matching content | +|when replacing |some |with |any|starting from|ParentPage| +|it should list |>ParentPage< | +|and it should list|>ParentPage.SubPage< | +|and it should list|>ParentPage.ChildPage2< | +|and page |ParentPage |should contain|any content | +|and page |ParentPage.SubPage |should contain|any other content | +|and page |ParentPage.SubPage.ChildPage1|should contain|non-matching page content | +|and page |ParentPage.ChildPage2 |should contain|any more matching content | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/properties.xml new file mode 100644 index 0000000000..bc6b57f1b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/properties.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/content.txt new file mode 100644 index 0000000000..e7ee9d527a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/content.txt @@ -0,0 +1,8 @@ +!2 Test replacing text using pattern groups. +This replacement uses regular expression and matching group to exchange two words in a some page content. +---- + +!|script | +|given page |SomePage |with content |group1 nogroup group2 | +|replacement response from|(group[^ ]*) nogroup (group[^ ]*)|with |$2 irrelevant $1|should contain|SomePage| +|page |SomePage |should contain|group2 irrelevant group1 | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/properties.xml new file mode 100644 index 0000000000..bc6b57f1b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/properties.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/content.txt new file mode 100644 index 0000000000..5796be0037 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/content.txt @@ -0,0 +1,8 @@ +!2 Test replacing text on a simple page. +The replacement should replace page contents of the current page when there are no other sibling pages. +---- + +!|script | +|given page |SomePage|with content |some content | +|replacement response from|some |with |any|should contain|SomePage| +|page |SomePage|should contain|any content | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/properties.xml new file mode 100644 index 0000000000..bc6b57f1b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/properties.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/content.txt new file mode 100644 index 0000000000..f54b819126 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/content.txt @@ -0,0 +1,8 @@ +The replacement responder is invoked with a url of the form {{{SomePage?replace&searchString=search&replacementString=replacement}}} +The search string thereby follows the convention from the [[Java API description][http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html]]. + +---- + + ^TestReplacesContent + ^TestReplacementWithPatternGroups + ^TestReplaceContentsInPageHierarchy diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/properties.xml new file mode 100644 index 0000000000..2b30ee13f8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/properties.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/content.txt new file mode 100644 index 0000000000..4f87d1215d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/content.txt @@ -0,0 +1,27 @@ +When you execute a test page, !-FitNesse-! gathers up the classpaths prior to running the test. The classpaths are found in the !-!path-! widgets of the test page, and every ancestor of the test page. The paths are ordered so that paths found on the subpages come before paths found on their parents. +---- + +!|Library| +|echo fixture| + +!define PROPERTY_DISPLAY ( +&bang;define TEST_SYSTEM {SLIM} +&bang;define SLIM_PORT {9900} +!path classes +!path fitnesse.jar + +!|Import| +|fitnesse.fixtures| + +!|script|java properties| +|show|property|java.class.path| +) + +!|script|page driver| +|given page|ParentPage|with content|!path parentPath| + +-!|script| +|given page|ParentPage.TestPage|with content|${PROPERTY_DISPLAY}| + +-!|script| +|page|ParentPage.TestPage?test|should contain|classes${path.separator}fitnesse.jar${path.separator}parentPath| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/content.txt new file mode 100644 index 0000000000..b5fc4813f2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/content.txt @@ -0,0 +1,3 @@ +The suite of tests that describe the behavior of the Run Responder. + +^TestLinearClassPath diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/properties.xml new file mode 100644 index 0000000000..93a42656ae --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210057 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/content.txt new file mode 100644 index 0000000000..369b03c0dd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/content.txt @@ -0,0 +1,7 @@ +Here are some sample pages. +|Page creator.| +|Page name.|Page contents. |valid?| +|!-PageAbc-! |This page has ABCs|true | +|!-XyzPage-! |A page with XYZ|true | +|!-BasePage-!|This is the base page| true| +|!-BasePage.ChildPage-!|This is the child page| true | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/properties.xml new file mode 100644 index 0000000000..dc3995c2be --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210058 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/content.txt new file mode 100644 index 0000000000..007444e369 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/content.txt @@ -0,0 +1,57 @@ +!c !2 Title Search + +Searches for the specified string in the content of every wiki page. +It's triggered by the following URL: + +http:///search?responder=search&searchType=content&searchString= + +!include SamplePages + +Search for a page !-PageAbc-! +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=content&searchString=PageAbc-!|| + +Check for the proper title. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|Content Search|true|| + +Since no page, not even !-PageAbc-! contains that content, no results will be returned. +|Response Examiner.| +|type |pattern|matches?| +|contents|!->PageAbc<-!|false| +|contents|No pages matched your search criteria.|true| + +Now search for ABC. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=content&searchString=ABC-!|| + +Make sure we get !-PageAbc-! in the result list. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-PageAbc-!|true|| + +Now search for xyz. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=content&searchString=xyz-!|| + +Make sure we get !-XyzPage-! in the result list. Searches are case insensitive. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-XyzPage-!|true|| + +Now search for the word page. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=content&searchString=page-!|| + +Make sure we get all 4 pages in the result list. +|Response Examiner.| +|type |pattern|matches?| +|contents|!-PageAbc-!|true| +|contents|!-XyzPage-!|true| +|contents|!-BasePage-!|true| +|contents|!-BasePage.ChildPage-!|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/properties.xml new file mode 100644 index 0000000000..9860a02eb2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/properties.xml @@ -0,0 +1,9 @@ + + + + + + + 1229173941114 + -1364895840942415075 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/content.txt new file mode 100644 index 0000000000..b59a705c01 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/content.txt @@ -0,0 +1,21 @@ +!c !2 Search Form + +Is located at http://-host-/...?searchForm + + +Load the search form page +|Response Requester.| +|uri |status?| +|!-?searchForm-!|| + +Make sure where on the right page and that the form has all the proper text. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-Search Form-!|true|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|onload="document.forms\[0\].searchString.focus\(\)"|true| +|contents|Search String:|true| +|contents|Search Titles!|true| +|contents|Search Content!|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/properties.xml new file mode 100644 index 0000000000..0cd5a54b02 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213071251 + + + + 1229173971996 + 8771927365021069156 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/content.txt new file mode 100644 index 0000000000..a427bb0466 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/content.txt @@ -0,0 +1,56 @@ +!c !2 Title Search + +Searches for the specified string in all of the WikiPage title in the wiki. +It's triggered by the following URL: + +http:///search?responder=search&searchType=titles&searchString= + +!include SamplePages + +First let's perform a silly search. We'll look for a page named blah. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=titles&searchString=blah-!|| + +Let's make sure the titles in and information is correct. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-Title Search Results for 'blah'-!|true|| + +Make sure we get !-PageAbc-! in the result list. +|Response Examiner.| +|type |pattern|matches?| +|contents|No pages matched your search criteria.|true| + +Now search for ABC. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=titles&searchString=ABC-!|| + +Make sure we get !-PageAbc-! in the result list. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-PageAbc-!|true|| + +Now search for xyz. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=titles&searchString=xyz-!|| + +Make sure we get !-XyzPage-! in the result list. Searches are case insensitive. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|!-XyzPage-!|true|| + +Now search for the word page. +|Response Requester.| +|uri |status?| +|!-search?responder=search&searchType=titles&searchString=page-!|| + +Make sure we get all 4 pages in the result list. +|Response Examiner.| +|type |pattern|matches?| +|contents|!-PageAbc-!|true| +|contents|!-XyzPage-!|true| +|contents|!-BasePage-!|true| +|contents|!-BasePage.ChildPage-!|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/properties.xml new file mode 100644 index 0000000000..f9e3368f1c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/properties.xml @@ -0,0 +1,9 @@ + + + + + + + 1229174034769 + 5592943275585048509 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/content.txt new file mode 100644 index 0000000000..79d784764e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/content.txt @@ -0,0 +1,11 @@ +!c !2 Search Responder + +The search responder works in two fashions: Title Search and Content Search. + + ^TestSearchForm + ^TestTitleSearch + ^TestContentSearch + +---- +Includes: + ^SamplePages \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/properties.xml new file mode 100644 index 0000000000..7e4eb1c521 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/properties.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/content.txt new file mode 100644 index 0000000000..d782ba07b3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/content.txt @@ -0,0 +1,25 @@ +Create a simple test page + +!|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|line|!-!|-!fitnesse.testutil.${FIXTURE_NAME}!-|-!| +|line|!-|blah|-!| +|page|!-TestPage-!| + +Now run the test page. + +|Response Requester.| +|uri |valid?| +|!-TestPage?responder=test-!|true| + +|Response Examiner.| +|contents?| +|| + +Check the status message. + +|Response Examiner.| +|type |pattern|matches?| +|contents|
.*?${EXPECTED_STATUS_MESSAGE}.*?
|true| +|contents|
.*?.*?
|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/properties.xml new file mode 100644 index 0000000000..67c0954194 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/properties.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/content.txt new file mode 100644 index 0000000000..1b3cb8b221 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/content.txt @@ -0,0 +1,8 @@ +When errors occur, we get the message: + * Errors Occurred + +!define FIXTURE_NAME {CrashFixture} +!define EXPECTED_STATUS_MESSAGE {Errors Occurred} +!define EXPECTED_ICON_URL {/files/images/executionStatus/error.gif} + +!include DoTest \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/properties.xml new file mode 100644 index 0000000000..0a83a3b3ad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/content.txt new file mode 100644 index 0000000000..da2db02abc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/content.txt @@ -0,0 +1,8 @@ +When everything works just fine we get the message: + * Tests Executed OK + +!define FIXTURE_NAME {PassFixture} +!define EXPECTED_STATUS_MESSAGE {Tests Executed OK} +!define EXPECTED_ICON_URL {/files/images/executionStatus/ok.gif} + +!include DoTest \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/properties.xml new file mode 100644 index 0000000000..363a715654 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210101 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/content.txt new file mode 100644 index 0000000000..15987c5bdc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/content.txt @@ -0,0 +1,8 @@ +When output is captures during execution, we get the message: + * Output Captured + +!define FIXTURE_NAME {OutputWritingFixture} +!define EXPECTED_STATUS_MESSAGE {Output Captured} +!define EXPECTED_ICON_URL {/files/images/executionStatus/output.gif} + +!include DoTest \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/properties.xml new file mode 100644 index 0000000000..f3b16d7229 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210102 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/content.txt new file mode 100644 index 0000000000..ed3755857a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/content.txt @@ -0,0 +1,6 @@ +The Execution Status Box shows how FIT behaved during test execution: + * Tests Executed OK + * Output Captured - if a FIT fixture wrote to an output stream + * Error Occurred - if a FIT fixture threw an unhandled exception + +!contents diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/properties.xml new file mode 100644 index 0000000000..9b8fe5b473 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210100 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/content.txt new file mode 100644 index 0000000000..f14b466004 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/content.txt @@ -0,0 +1,57 @@ +!define TEST_SYSTEM {slim} + +!define PATHS { +!path classes +!path fitnesse.jar +!-!define TEST_SYSTEM (slim:A)-! +!-!define SLIM_PORT (9000)-! +} + +!|Library| +|page driver| +|echo fixture| + +!|given page with content | +|page |content | +|SuiteParent |${PATHS} | +|SuiteParent.SuiteChildOne | | +|SuiteParent.SuiteChildOne.SuiteSetUp | | +|SuiteParent.SuiteChildOne.SuiteTearDown | | +|SuiteParent.SuiteChildOne.TestOneOne | | +|SuiteParent.SuiteChildOne.TestOneTwo | | +|SuiteParent.SuiteChildTwo.SuiteSetUp | | +|SuiteParent.SuiteChildTwo.SuiteTearDown | | +|SuiteParent.SuiteChildTwo.TestTwoOne | | +|SuiteParent.SuiteChildTwo.TestTwoTwo | | +|SuiteParent.SuiteChildThree | | +|SuiteParent.SuiteChildThree.TestThreeOne| | +|SuiteParent.SuiteChildThree.TestThreeTwo| | +|SuiteParent.SuiteChildOne.TestOneThree |&bang;define TEST_SYSTEM {slim:B}| + +!|script | +|check|request page|SuiteParent?suite|200| + +!|ordered query:pages run in suite|SuiteChildOne|A| +|page name | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneOne | +|SuiteChildOne.TestOneTwo | +|SuiteChildOne.SuiteTearDown | + +!|ordered query:pages run in suite|SuiteChildOne|B| +|page name | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneThree | +|SuiteChildOne.SuiteTearDown | + +!|ordered query:pages run in suite|SuiteChildTwo|A| +|page name | +|SuiteChildTwo.SuiteSetUp | +|SuiteChildTwo.TestTwoOne | +|SuiteChildTwo.TestTwoTwo | +|SuiteChildTwo.SuiteTearDown | + +!|ordered query:pages run in suite|SuiteChildThree|A| +|page name | +|SuiteChildThree.TestThreeOne | +|SuiteChildThree.TestThreeTwo | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/content.txt new file mode 100644 index 0000000000..cff66009e1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/content.txt @@ -0,0 +1,35 @@ +When you execute a suite page, the execution status box will be displayed in the upper right hand corner. +---- +Create a Suite page + +!|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create a simple test page + +!|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPage-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should containt the execution-status div +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPage-!|true| + +The error log page should not have any errors + +|Response Examiner.| +|type |pattern|matches?| +|contents|
|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/content.txt new file mode 100644 index 0000000000..2d77be67f5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/content.txt @@ -0,0 +1,53 @@ +When you execute a suite page with a specified start test, !-FitNesse-! should only run tests that start after the start test. + +---- + +Create a Suite page + +!|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create two sub pages + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageOne-!| + + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageTwo-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite&firstTest=TestPageTwo-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report the TestPages and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPageTwo-!|true| +|contents|!-TestPageOne-!|false| +|contents|Test Pages:.*1 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/content.txt new file mode 100644 index 0000000000..2840164193 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/content.txt @@ -0,0 +1,53 @@ +When you execute a suite page with a 'not' filter, !-FitNesse-! should only run tests that do not have a certain suite filter/tag + +---- + +Create a Suite page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create two sub pages + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|attributes|Suites=bad| +|page|!-SuitePage.TestPageOne-!| + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageTwo-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite&excludeSuiteFilter=bad-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report the TestPages and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPageOne-!|false| +|contents|!-TestPageTwo-!|true| +|contents|Test Pages:.*1 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/content.txt new file mode 100644 index 0000000000..c7930baeea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/content.txt @@ -0,0 +1,48 @@ +When you execute a suite page, !-FitNesse-! tests all the subpages. +This example shows just one test subpage being executed. + +---- + +Create a Suite page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create a simple test page + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPage-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report the TestPage and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPage-!|true| +|contents|Test Pages:.*1 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/content.txt new file mode 100644 index 0000000000..6d17b26392 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/content.txt @@ -0,0 +1,55 @@ +When you execute a suite page, !-FitNesse-! tests all the subpages +unless the Prune attribute on the Properties page is set. +This example shows just one test subpage of two subpages being executed. + +---- + +Create a Suite page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create two sub pages: 1 is tested, 2 is pruned/ignored + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageOne-!| + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|attributes|Prune=true| +|page|!-SuitePage.TestPageTwo-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report only the one TestPage and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPageOne-!|true| +|contents|!-TestPageTwo-!|false| +|contents|Test Pages:.*1 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/properties.xml new file mode 100644 index 0000000000..b9aeb638cc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1197951924826 + 4630030422263497093 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/content.txt new file mode 100644 index 0000000000..96e7c8075e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/content.txt @@ -0,0 +1,53 @@ +When you execute a suite page with a filter, !-FitNesse-! should only run tests that have a certain suite filter/tag + +---- + +Create a Suite page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create two sub pages + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|attributes|Suites=good| +|page|!-SuitePage.TestPageOne-!| + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageTwo-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite&suiteFilter=good-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report the TestPages and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPageOne-!|true| +|contents|!-TestPageTwo-!|false| +|contents|Test Pages:.*1 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/properties.xml new file mode 100644 index 0000000000..aea928cbaa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + good + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/content.txt new file mode 100644 index 0000000000..80894477ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/content.txt @@ -0,0 +1,56 @@ +When you execute a suite page, !-FitNesse-! tests all the pages mentioned in !-!see-! cross reference widgets. +''Note: the classpath for the cross referenced pages is not determined by the referencing page, it is determined by the referenced pages.'' + +---- +Create a simple test page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-TestPage-!| + +Create a Suite page that mentions the test page in a !-!test-! widget + +|script|Page Builder| +|line|!-!see TestPage-!| +|page|!-SuitePage-!| + +|Response Requester.| +|uri |valid?| +|!-SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report the !-TestPage-! and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPage-!|true| +|contents|Test Pages:.*1 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/content.txt new file mode 100644 index 0000000000..d17dc9eb7f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/content.txt @@ -0,0 +1,52 @@ +When you execute a suite page, !-FitNesse-! tests all the subpages. +This example shows just one test subpage being executed. + +---- + +Create a Suite page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|page|!-SuitePage-!| + +Create two sub pages + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageOne-!| + +|script|Page Builder| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-SuitePage.TestPageTwo-!| + +Now run the suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage?responder=suite-!|true| + +|Response Examiner.| +|contents?| +|| + +The suite should report the TestPages and should show no errors. + +|Response Examiner.| +|type |pattern|matches?| +|contents|!-TestPageOne.*TestPageTwo-!|true| +|contents|Test Pages:.*2 right|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/content.txt new file mode 100644 index 0000000000..f7edf45802 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/content.txt @@ -0,0 +1,2 @@ +When you execute a suite it should run all the subpages of the suite, and any pages mentioned in a !test widget. +!contents -g -p \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/properties.xml new file mode 100644 index 0000000000..fd7f8587a2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1197951428357 + -1949328092502921704 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/content.txt new file mode 100644 index 0000000000..497d77b823 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/content.txt @@ -0,0 +1,63 @@ +!3 Test normal [[!-SetUp and TearDown-!][.FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteTestResponders.SuiteSetUpAndTearDown]] +---- + * First create a normal page, plus header and footer pages. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalPage-!|normal||true| +|!-TestPage-!|test||true| +|!-PageHeader-!|header||true| +|!-PageFooter-!|footer||true| +|!-SetUp-!|set up||true| +|!-TearDown-!|tear down||true| + * Then request the normal page +|Response Requester.| +|uri|valid?| +|!-NormalPage-!|true| + * Ensure that the header and and footer text appear in the normal page. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(header).*(normal).*(footer)-!|true|| + * Ensure that setup and teardown are not in this page. +|Response Examiner.| +|type|pattern|matches?| +|contents|set up|false| +|contents|tear down|false| + * Now request the test page +|Response Requester.| +|uri|valid?| +|!-TestPage-!|true| + * Ensure that the setup and and teardown text appear in the test page along with the header and footer. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(header).*(set up).*(test).*(tear down).*(footer)-!|true|| +---- +!3 Test that sub pages inherit setups and tear downs. + * Create a sub page +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalPage.TestSubPage-!|test sub page||true| + * Then request the Sub page +|Response Requester.| +|uri|valid?| +|!-NormalPage.TestSubPage-!|true| + * Ensure that the setup and and teardown text are inherited by the sub page. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(header).*(set up).*(test sub page).*(tear down).*(footer)-!|true|| +---- +!3 Test that sub setups and sub teardowns override inherited setups and teardowns. + * Create sub setup and sub teardown +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalPage.SetUp-!|sub setup||true| +|!-NormalPage.TearDown-!|sub teardown||true| + * Then request the Sub page +|Response Requester.| +|uri|valid?| +|!-NormalPage.TestSubPage-!|true| + * Ensure that the sub header and and sub footer text are inherited override their parents.. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(header).*(sub setup).*(test sub page).*(sub teardown).*(footer)-!|true|| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/properties.xml new file mode 100644 index 0000000000..0ee90408f6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213071456 + + + + 1229174096531 + -7793342213354336999 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/content.txt new file mode 100644 index 0000000000..608fa760b7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/content.txt @@ -0,0 +1,23 @@ +!3 [[!-SetUp and TearDown-!][.FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteTestResponders.SuiteSetUpAndTearDown]] are rendered as [[Collapsable Sections][.FitNesse.MarkupCollapsableSection]]. + + * First create a normal page, plus header and footer pages. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-TestPage-!|test||true| +|!-SetUp-!|set up||true| +|!-TearDown-!|tear down||true| + + * Now request the test page +|Response Requester.| +|uri|valid?| +|!-TestPage-!|true| + + * Ensure that the setup and and teardown text appear in the test page along with the header and footer. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|.*(set up).*(test).*(tear down).*|true|| + +!|Response Examiner.| +|type|pattern|matches?| +|contents|set up
|true| +|contents|tear down|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/properties.xml new file mode 100644 index 0000000000..62596bd86e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/properties.xml @@ -0,0 +1,15 @@ + + + true + true + 20090318113214 + true + true + true + true + true + true + true + 1237154501197 + -6399284714028620109 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/content.txt new file mode 100644 index 0000000000..ee811a1718 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/content.txt @@ -0,0 +1,38 @@ +!3 [[!-SetUp and TearDown-!][.FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteTestResponders.SuiteSetUpAndTearDown]] can be set to be automatically collapsed when rendered. + +By setting the variables COLLAPSE_SETUP or COLLAPSE_TEARDOWN to true (using the [[!-VariableWidget-!][.FitNesse.MarkupVariables]]), you can tell [[!-FitNesse-!][.FitNesse]] to automatically collapse !-SetUp and TearDown-! when they are rendered. +---- +* Create a page with the variable definitions. + +|script|Page Builder| +|line|!-!define COLLAPSE_SETUP {true}-!| +|line|!-!define COLLAPSE_TEARDOWN {true}-!| +|page|!-ParentPage-!| + +* Create !-SetUp-! and !-TearDown-! +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SetUp-!|set up|true| +|!-TearDown-!|tear down|true| + +* Create a child test page + +|script|Page Builder| +|line|test something| +|page|!-ParentPage.TestPage-!| + +* Now request the test page +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.TestPage-!|true|| + +* Verify that the setup and and teardown text appear in the test page. +|Response Examiner.| +|type|pattern|matches?| +|contents|.*(set up).*(test).*(tear down).*|true| + +* Verify that the right style is being rendered. +!|Response Examiner.| +|type|pattern|matches?| +|contents|set up|true| +|contents|tear down|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/content.txt new file mode 100644 index 0000000000..3113a8e689 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/content.txt @@ -0,0 +1,23 @@ +!3 [[!-SetUp and TearDown-!][.FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteTestResponders.SuiteSetUpAndTearDown]] are rendered as [[Collapsable Sections][.FitNesse.MarkupCollapsableSection]] that are collapsed by default. + + * First create a normal page, plus header and footer pages. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-TestPage-!|test||true| +|!-SetUp-!|set up||true| +|!-TearDown-!|tear down||true| + + * Now request the test page +|Response Requester.| +|uri|valid?| +|!-TestPage-!|true| + + * Ensure that the setup and and teardown text appear in the test page along with the header and footer. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|.*(set up).*(test).*(tear down).*|true|| + +!|Response Examiner.| +|type|pattern|matches?| +|contents|set up|true| +|contents|tear down|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/properties.xml new file mode 100644 index 0000000000..0ec37e3d3b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/properties.xml @@ -0,0 +1,10 @@ + + + + 20090314114812 + + + + 1237027692279 + -2287924455913239235 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/content.txt new file mode 100644 index 0000000000..d5a79f5c85 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/content.txt @@ -0,0 +1,36 @@ +!3 [[!-SetUp and TearDown-!][.FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteTestResponders.SuiteSetUpAndTearDown]] can be set to be uncollapsed when rendered. + +By setting the variables COLLAPSE_SETUP or COLLAPSE_TEARDOWN to false (using the [[!-VariableWidget-!][.FitNesse.MarkupVariables]]), you can tell [[!-FitNesse-!][.FitNesse]] to automatically uncollapse !-SetUp and TearDown-! when they are rendered. +---- +* Create a page with the variable definitions. +|script|Page Builder| +|line|!-!define COLLAPSE_SETUP {false}-!| +|line|!-!define COLLAPSE_TEARDOWN {false}-!| +|page|!-ParentPage-!| + +* Create !-SetUp-! and !-TearDown-! +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SetUp-!|set up|true| +|!-TearDown-!|tear down|true| + +* Create a child test page +|script|Page Builder| +|line|test something| +|page|!-ParentPage.TestPage-!| + +* Now request the test page +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.TestPage-!|true|| + +* Verify that the setup and and teardown text appear in the test page. +|Response Examiner.| +|type|pattern|matches?| +|contents|.*(set up).*(test).*(tear down).*|true| + +* Verify that the right style is being rendered. +!|Response Examiner.| +|type|pattern|matches?| +|contents|set up|true| +|contents|tear down|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/properties.xml new file mode 100644 index 0000000000..b268bf680c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1237027784671 + -3141020147140614349 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/content.txt new file mode 100644 index 0000000000..398ffe304c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/content.txt @@ -0,0 +1,7 @@ +!2 !-SetUp-! and !-TearDown-! + +'''!-SetUp-! and !-TearDown-! pages behave just like [[!-PageHeader-! and !-PageFooter-!][.FitNesse.SuiteAcceptanceTests.SuiteWikiPageResponderTests.TestHeadersAndFooters]] except that they apply only to pages that have the ''Test'' attribute set.''' + +Any tables that you want executed '''before''' every Test page should go in !-SetUp-!. +Any tables that you want executed '''after''' every Test page should go in !-TearDown-!. +----!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/properties.xml new file mode 100644 index 0000000000..4f46fcad77 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210105 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/content.txt new file mode 100644 index 0000000000..a41cfaab3e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/content.txt @@ -0,0 +1,6 @@ +!path zork + +!|script|Java Properties| +|show|property|java.class.path|| +|property|java.class.path|should match|.*zork.*| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/properties.xml new file mode 100644 index 0000000000..92fbd735b2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1213102754520 + -2900228412536126644 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/content.txt new file mode 100644 index 0000000000..f991db74bf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/content.txt @@ -0,0 +1,42 @@ +When you execute a test page, !-FitNesse-! gathers up the html and passes it to FIT which runs the fixtures and colorizes the HTML appropriately. + +---- + +Create a simple test page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-TestPage-!| + +Now run the test page. + +|Response Requester.| +|uri |valid?| +|!-TestPage?responder=test-!|true| + +|Response Examiner.| +|contents?| +|| + +The bgcolor of the cell should turn green + +|Response Examiner.| +|type |pattern|matches?| +|contents|class="pass"|true| +|contents|Assertions:.*\s+.*?1 right, 0 wrong, 0 ignored, 0 exceptions|true| + +The error log page should not have any errors + +|Response Requester.| +|uri |valid?| +|!-ErrorLogs.TestPage-!|true| + +|Response Examiner.| +|contents?| +|| + +|Response Examiner.| +|type |pattern|matches?| +|contents|Exit code.*0.*Time|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/properties.xml new file mode 100644 index 0000000000..0a83a3b3ad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/content.txt new file mode 100644 index 0000000000..eb3c9ee440 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/content.txt @@ -0,0 +1,27 @@ +When you execute a test page, a status box will appear in the upper right hand corner that will provide a link to the error log. + +---- + +Create a simple test page + +|script|Page Builder| +|line|!-!path classes-!| +|line|!-!path fitnesse.jar-!| +|line|!-|!-fitnesse.testutil.PassFixture-!-!!-|-!| +|page|!-TestPage-!| + +Now run the test page. + +|Response Requester.| +|uri |valid?| +|!-TestPage?responder=test-!|true| + +|Response Examiner.| +|contents?| +|| + +Check to make sure the box exists. + +|Response Examiner.| +|type |pattern|matches?| +|contents|
|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/content.txt new file mode 100644 index 0000000000..8a3376ae44 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/content.txt @@ -0,0 +1,4 @@ +This suite specifies all the responders that run tests. + +These include +!contents diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/properties.xml new file mode 100644 index 0000000000..6e797f68b7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1213102812350 + 6235592292230792988 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/content.txt new file mode 100644 index 0000000000..87a5653b25 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/content.txt @@ -0,0 +1,27 @@ +When using authentication, the username is recorded when the page is edited and is diplayed in the version list among other places. + +First setup the Authentication module. +!|Authenticator Setup| +|username|password|status?| +|Aladdin|open sesame|| + +Create a page to be requested. +!|Page creator.| +|Page name.|valid?| +|FrontPage |true| + +No save the page a couple times wih the user logged in. This will produce a version edited by the user. +!|Response Requester.| +|uri|username|password|status?| +|FrontPage?responder=saveData&pageContent=hi+there&editTime=0&ticketId=0|Aladdin|open sesame|303| +|FrontPage?responder=saveData&pageContent=by now&editTime=0&ticketId=0|Aladdin|open sesame|303| + +Now load up the version list. +!|Response Requester.| +|uri|username|password|status?| +|FrontPage?versions|Aladdin|open sesame|200| + +The user name will be in a element without any extra characters. +|Response Examiner.| +|type |pattern|matches?|contents?| +|contents|>Aladdin<|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/properties.xml new file mode 100644 index 0000000000..5d6a79cb72 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + -7389137369786658014 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/content.txt new file mode 100644 index 0000000000..855173b985 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/content.txt @@ -0,0 +1,2 @@ +!contents -g -p +!define TEST_SYSTEM {slim} diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/properties.xml new file mode 100644 index 0000000000..bfef2414f1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/content.txt new file mode 100644 index 0000000000..a87605593f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/content.txt @@ -0,0 +1,93 @@ +!2 !c !-NameReponder-! Specification + +The !-NameResponder-! is activated by a url of the form {{{[somePage]?names}}} It responds with a text/plain list of all the page names below the specified page, one per line. If no page is specified then it responds with all page names at the root level. No subpage names are returned. +---- +!3 First check a single page at the root level. +# + * Create one page. +# +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-PageOne-!|page one||true| +# + * Request the names at the root level +# +|Response Requester.| +|uri|valid?| +|!-?names-!|true| +# + * Does the response name the page? +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-PageOne-!|true|| + +# +|Response Examiner.| +|type|pattern|matches?| +|headers|text/plain|true| +---- +!3 Now check two pages at the root level +# + * Create another page. +# +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-PageTwo-!|page two||true| +# + * Request the names at the root level +# +|Response Requester.| +|uri|valid?| +|!-?names-!|true| +# + * Does the response name both pages? +# +|Response Examiner.| +|type|pattern|matches?| +|contents|!-PageOne-!|true| +|contents|!-PageTwo-!|true| +---- +!3 Now check two pages below !-PageOne-! +# + * Create another page. +# +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-PageOne.SubOne-!|sub one||true| +|!-PageOne.SubTwo-!|sub two||true| +# + * Request the names at the root level +# +|Response Requester.| +|uri|valid?| +|!-?names-!|true| +# + * Does the response name the root level pages and not the sub pages? +# +|Response Examiner.| +|type|pattern|matches?| +|contents|!-PageOne-!|true| +|contents|!-PageTwo-!|true| +|contents|!-SubOne-!|false| +|contents|!-SubTwo-!|false| +# + * Request the names at the !-PageOne-!level +# +|Response Requester.| +|uri|valid?| +|!-PageOne?names-!|true| +# + * Does the response name the root level pages and not the sub pages? +# +|Response Examiner.| +|type|pattern|matches?| +|contents|!-PageOne-!|false| +|contents|!-PageTwo-!|false| +|contents|!-SubOne-!|true| +|contents|!-SubTwo-!|true| + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/properties.xml new file mode 100644 index 0000000000..acb19e39e9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/properties.xml @@ -0,0 +1,12 @@ + + + + 20081213071609 + + + + + + 1229174169003 + 3682311992107680289 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/content.txt new file mode 100644 index 0000000000..7cc8530491 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/content.txt @@ -0,0 +1,31 @@ +!define TEST_SYSTEM {slim} + +!path lib/*.jar +!define PACKET {|Bob| +||Angela| +|||Lexy|6| +|||Sami|4| +|||Mandy|2| +||Micah| +|||Luka|5| +||Gina| +||Justin| +} + +!define JSON ({"tables": [{"Bob": { + "Angela": { + "Lexy": "6", + "Mandy": "2", + "Sami": "4" + }, + "Gina": {}, + "Justin": {}, + "Micah": {"Luka": "5"} +}}]}) + +!|script|page driver| +|given page|PacketPage|with content|${PACKET}| +|request page|$IT?packet| +|contains json packet|${JSON}| +|show|content| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/properties.xml new file mode 100644 index 0000000000..ad0d00ed9e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1234546870709 + -1511813569038330517 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/content.txt new file mode 100644 index 0000000000..376dce56bd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/content.txt @@ -0,0 +1,32 @@ +!c !2 RSS - Real Simple Syndication + +Use the following following url to get an RSS feed. +http://-host-/PageName?responder=rss + +For FitNesse to generate the links properly, the RSS_PREFIX variable must be defined. + +Now lets set the RSS_PREFIX variable in the root page so that it is valid for the entire site. We'll also edit a couple pages. +|Response Requester.| +|uri |status?| +|!-root?responder=saveData&editTime=1&ticketId=2&pageContent=!define+RSS_PREFIX+{http://www.myserver.com/}-!|303| +|!-PageOne?responder=saveData&editTime=1&ticketId=2&pageContent=blah-!|303| +|!-PageTwo?responder=saveData&editTime=1&ticketId=2&pageContent=blah-!|303| + +Get the RSS! +|Response Requester.| +|uri |status?| +|!-?responder=rss-!|200| + +Let's have a look. +|Response Examiner.| +|type |pattern|matches?|wrapped html?| +|contents|<\?xml version="1.0"\?>|true|| + +Make sure it has all the right values. +|Response Examiner.| +|type |pattern|matches?| +|contents||true| +|contents|!-PageOne-!|true| +|contents|!-http://www.myserver.com/PageOne-!|true| +|contents|!-PageTwo-!|true| +|contents|!-http://www.myserver.com/PageTwo-!|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/properties.xml new file mode 100644 index 0000000000..fcc470dab9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1229174216509 + -3582194339243666054 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/content.txt new file mode 100644 index 0000000000..73437891cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/content.txt @@ -0,0 +1,17 @@ +!-FitNesse-! is started in the set up fixture so it's running, +!|FitNesse Status| +|isRunning?| +|true| + +A Graceful shutdown is initiated by making an HTTP request with the responder=shutdown +!|Response Requester.| +|uri|valid?| +|!-?responder=shutdown-!|true| + +Wait a bit for things to settle down +|Sleep|100| + +Now !-FitNesse-! is no longer running. +!|FitNesse Status| +|isRunning?| +|false| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/properties.xml new file mode 100644 index 0000000000..87ca53c22e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/content.txt new file mode 100644 index 0000000000..66a8656313 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/content.txt @@ -0,0 +1,4 @@ +The incoming URL determines which responder gets activated. There are many different types of responders (and more every iteration!) +!define TEST_SYSTEM {slim} + +!contents -g -p \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/properties.xml new file mode 100644 index 0000000000..a43bfc504f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1234542746248 + 6270647661064016024 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/content.txt new file mode 100644 index 0000000000..116faceadd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/content.txt @@ -0,0 +1,33 @@ +!|import| +|fitnesse.slim.test| +|fitnesse.fixtures| + +!|script|echo fixture| +|$TEST_SLIM=|echo|TestSlim| + +!|script|$TEST_SLIM| +|ensure|echo boolean|true| + +|$TEST_SLIM| +|string|get string arg?| +|Bob|Bob| + +!|script|echo fixture| +|$QUERY=|echo|Query| + +!|Query:Test$QUERY|1| +|n|2n| +|1|2| + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/content.txt new file mode 100644 index 0000000000..70db34a13d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/content.txt @@ -0,0 +1,45 @@ +!|import | +|fitnesse.slim.test| + +The fixture chaining with instances allows you to store an object instance in a Slim symbol and to use the instance as the table actor for an arbitrary Slim table. +Here createTestSlimWithString(string) is a factory method that creates a new !-TestSlim-! instance, sets the given string and returns the object. + +see SlimSymbolCanHoldInstanceUsedAsParameter + +!|script |test slim | +|$TEST_SLIM_INSTANCE=|create test slim with string|Uncle| +|start |$TEST_SLIM_INSTANCE | +|check |get string arg |Uncle| + +We can use it for a decision table. + +|$TEST_SLIM_INSTANCE| +|get string arg? | +|Uncle | + +The !-SlimHelperLibrary-! is a class that is automatically available as a library fixture. It contains methods to get and set the script table actor in the Slim !-StatementExecutor-!. + + * getFixture() returns the current table actor + * pushFixture() gets the current table actor and pushes it onto a stack + * popFixture() pops the actor from the stack and sets it in the !-StatementExecutor-! + +The pushFixture() and popFixture() methods can be used to have scenarios that change the current actor, but restore it at the end of the scenario. +So a scenario can behave more like a sub routine with local scope (but is not limited to it). + +!|scenario |do something with|name|and restore old fixture| +|push fixture | +|start |test slim | +|set string |@name | +|check |get fixture |TestSlim: 0, @name | +|check |get string arg |@name | +|$@name_INSTANCE=|get fixture | +|pop fixture | + +!|script |test slim |2 | +|set string |Uncle | +|check |get fixture |TestSlim: 2, Uncle | +|do something with|Bob |and restore old fixture| +|check |get string arg|Uncle | + +!|script|$Bob_INSTANCE | +|check |get string arg|Bob| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/content.txt new file mode 100644 index 0000000000..f3744f26a4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/content.txt @@ -0,0 +1,16 @@ +Purpose: Checks that the Define Table Type table works + +By default table should be parsed as a decision table. +|Table Or Decision Fixture | +|parsing as? | +|Parsed as Decision fixture | + + +However after this table it should be parsed as a Table: table. + +|Define Table Type | +| Table or Decision Fixture | as Table | + + +|Table Or Decision Fixture | +|parsing as? | Parsed as Table fixture | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/content.txt new file mode 100644 index 0000000000..8b2939a289 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/content.txt @@ -0,0 +1,8 @@ +!|script|fitnesse.slim.test.TestSlim| +|$VALUE=|echo string|Bob|| +|$VALUEX=|echo string|bill| + +!|script| +|check|echo string|$VALUE|Bob| +|check|echo string|$VALUEX|bill| +|check|echo string|$VALUE $VALUEX|Bob bill| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/properties.xml new file mode 100644 index 0000000000..7a1e81dc7b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + testSuite + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/content.txt new file mode 100644 index 0000000000..9fee8a7872 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/content.txt @@ -0,0 +1,4 @@ +|script| +|send|!{name:bob, address:here}|as hash| +|check|hash|name|is|bob| +|check|hash|address|is|here| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/properties.xml new file mode 100644 index 0000000000..e475416cd6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/content.txt new file mode 100644 index 0000000000..b9189949d6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/content.txt @@ -0,0 +1,15 @@ +!*> Extra Import + +!|Import| +|fitnesse.slim.test.library| + +*! + +|Library| +|echo support| +|special echo support| + +-|script|library fixture| +|given multiple libraries with the same methods| +|when such a method is called| +|then the last library created takes precedence over earlier created libraries| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/content.txt new file mode 100644 index 0000000000..2d918edbea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/content.txt @@ -0,0 +1,8 @@ +|Library| +|echo support| + +-|script| +|given multiple libraries with the same methods| +|when such a method is called| +|then the one one installed in this page takes precedence over the one in the setup page| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/content.txt new file mode 100644 index 0000000000..b8238c71c6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/content.txt @@ -0,0 +1,4 @@ +|script|library fixture| +|given a library installed in the setup page| +|when a method not present on the fixture is called| +|then is should have been invoked on the library in the setup page| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/content.txt new file mode 100644 index 0000000000..9f1fd381fe --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/content.txt @@ -0,0 +1,4 @@ +!include -c .FitNesse.SuiteAcceptanceTests.SuiteSlimTests.LibrarySuite.SetUp + +|Library| +|library in set up| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/content.txt new file mode 100644 index 0000000000..39272e249f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/content.txt @@ -0,0 +1,10 @@ +|Library| +|echo support| + +!|script|library fixture| + +-|script| +|given installed library echo support| +|when a method not present on the fixture is called| +|then it should be called on the installed library| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..377285237b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/content.txt @@ -0,0 +1,30 @@ +!|scenario|given installed library echo support| +|note|Library is installed via Library table above| + +!|scenario|when a method not present on the fixture is called| +|echo| + +!|scenario|then it should be called on the installed library| +|ensure|echo support called| + +!|scenario|given multiple libraries with the same methods| +|note|See for installed libraries the Library table above| + +!|scenario|when such a method is called| +|echo| + +!|scenario|then the last library created takes precedence over earlier created libraries| +|ensure|special echo support called| +|reject|echo support called| + +!|scenario|given a library installed in the setup page| +|given installed library echo support| + +!|scenario|then is should have been invoked on the library in the setup page| +|ensure|echo in set up library called| + +!|scenario|then the one one installed in this page takes precedence over the one in the setup page| +|ensure|echo support called| +|reject|echo in set up library called| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/content.txt new file mode 100644 index 0000000000..fc5e0455af --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/content.txt @@ -0,0 +1,5 @@ +!include -c .FitNesse.SuiteAcceptanceTests.SuiteSlimTests.SetUp + +!|Import| +|fitnesse.slim.test.library| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/content.txt new file mode 100644 index 0000000000..990fb6f9e1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/content.txt @@ -0,0 +1 @@ +!contents -R2 -g -p -f -h \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/content.txt new file mode 100644 index 0000000000..084032405a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/content.txt @@ -0,0 +1,8 @@ +|import| +|fitnesse.slim.test| + +!|test slim|3| +|string|getStringArg?| +|Bob|Bob| +|Köln|Köln| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/properties.xml new file mode 100644 index 0000000000..7a1e81dc7b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + testSuite + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/content.txt new file mode 100644 index 0000000000..8a96044144 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/content.txt @@ -0,0 +1,27 @@ +![: +scenario:login user _ with password _:user name, password: +check:echo:@userName:Bob +check:echo:@password:xyzzy +]! + +![ script +login user Bob with password xyzzy +]! + +!|scenario|beat|name|with a|object| +|check|echo|@name|Bill| +|check|echo|@object|noodle| + +![ script +beat Bill with a noodle +]! + +!|login user with password| +|user name|password| +|Bob|xyzzy| + +!|script| +|login user|Bob|with password|xyzzy| + +!|script| +|login user with password;|Bob|xyzzy| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/content.txt new file mode 100644 index 0000000000..4162dd23e7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/content.txt @@ -0,0 +1,39 @@ +!|Query:SplitFixture|Bob;Bill;Ben| +|1| +|Bob| +|Bill| +|Ben| + +!|Query:SplitFixture|Bob;Bill;Ben| +|1| +|Bob| +|Ben| +|Bill| + +!|Subset Query:SplitFixture|Bob;Bill;Ben| +|1| +|Ben| +|Bill| + +!|Query:SplitFixture|Bob,Martin;Bill,Jones;Ben,Jacobs| +|1|2| +|Bob|Martin| +|Bill|Jones| +|Ben|Jacobs| + + +!|Query:SplitFixture|Bob,Martin;Bill,Jones;Ben,Jacobs| +|1|2| +|Bob|=~/Mar.*/| +|Bill|=~/one/| +|=~/en/|Jacobs| + +!|Query:SplitFixture|1.1,2.3;5.5,6.9;3.1,5| +|1|2| +|1.1|<3| +|>3|5<_<7| +|~=3|!=6| + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/content.txt new file mode 100644 index 0000000000..435dcf60a4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/content.txt @@ -0,0 +1,8 @@ +-!|script| +|check|echo|Bob|=~/Bob/| +|check|echo|My name is Bob Martin.|=~/Bob/| +|check|echo|The name of Bob shall persist.|=~/B.b/| +|check not|echo|Pete|=~/Bob/| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/content.txt new file mode 100644 index 0000000000..18f6a2dfb8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/content.txt @@ -0,0 +1,17 @@ +!note Lighthouse issue #162. Found by student in Oslo, October, 2009 + +It looks like one-word scenario names, coupled with at least one unnamed argument causes !-FitNesse-! to mistake the scenario invocation for a method invocation. + +In the tables below, the scenario f should be called by the second table, but instead !-FitNesse-! tries to find method f for the current script actor. + +This test will pass if this bug is fixed. Otherwise you'll get !style_code(!-f Method f[2] not found in fitnesse.fixtures.PageDriver-!). + +!|scenario|f|a||b| +|start|fitnesse.slim.test.TestSlim| + +|script| +|f|1||2| +|pass| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/content.txt new file mode 100644 index 0000000000..3ba8a62595 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/content.txt @@ -0,0 +1,4 @@ +!|script| +|create page|ScenarioLibrary|with content|brother content| +|given slim test page|TestPage| +|it should contain|brother content| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/content.txt new file mode 100644 index 0000000000..89c96aa8b6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/content.txt @@ -0,0 +1,4 @@ + +!|script| +|given page|CrazyPage|with content|brother content| +|it should contain|brother content| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/properties.xml new file mode 100644 index 0000000000..65bc7b33b6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/properties.xml @@ -0,0 +1,6 @@ + + + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/content.txt new file mode 100644 index 0000000000..e0e831a6b3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/content.txt @@ -0,0 +1,11 @@ +!|script| +|create page|GrandParentPage|with content|| +|create page|GrandParentPage.ParentPage|with content|| +|create page|ScenarioLibrary|with content|grand uncle| +|create page|GrandParentPage.ScenarioLibrary|with content|uncle| +|create page|GrandParentPage.ParentPage.ScenarioLibrary|with content|brother| +|given slim test page|GrandParentPage.ParentPage.TestPage| +|it should contain|brother| +|it should contain|uncle| +|it should contain|grand uncle| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/properties.xml new file mode 100644 index 0000000000..639fb3a602 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/properties.xml @@ -0,0 +1,12 @@ + + + true + true + + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/content.txt new file mode 100644 index 0000000000..c7bf1dc097 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/content.txt @@ -0,0 +1,5 @@ +!|script| +|given slim test page|TestPage| +|it should not contain|Scenario Libraries| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..c8c76aebd1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/content.txt @@ -0,0 +1,8 @@ +!|scenario|one| +|$ONE=|echo|1| + +!|scenario|two| +|$TWO=|echo|1| + +!|scenario|three| +|$THREE=|echo|1| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..06c09ed069 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/content.txt @@ -0,0 +1,5 @@ +!|scenario|two| +|$TWO=|echo|2| + +!|scenario|three| +|$THREE=|echo|2| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..e4acdbd6a7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/content.txt @@ -0,0 +1,2 @@ +!|scenario|three| +|$THREE=|echo|3| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/content.txt new file mode 100644 index 0000000000..a0484017ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/content.txt @@ -0,0 +1,7 @@ +!|script| +|one| +|two| +|three| +|check|echo|$ONE|1| +|check|echo|$TWO|2| +|check|echo|$THREE|3| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/content.txt new file mode 100644 index 0000000000..f377901c53 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/content.txt @@ -0,0 +1,13 @@ +!|script| +|create page|GrandParentPage|with content|| +|create page|GrandParentPage.ParentPage|with content|| +|create page|ScenarioLibrary|with content|granduncy| +|create page|GrandParentPage.ScenarioLibrary|with content|uncle| +|create page|GrandParentPage.ParentPage.ScenarioLibrary|with content|brother| +|given slim test page|GrandParentPage.ParentPage.TestPage| +|it should contain|brother|in line|BROTHER_LINE| +|it should contain|uncle|in line|UNCLE_LINE| +|it should contain|granduncy|in line|GRAND_UNCLE_LINE| +|the line|BROTHER_LINE|should come after|UNCLE_LINE| +|the line|UNCLE_LINE|should come after|GRAND_UNCLE_LINE| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/content.txt new file mode 100644 index 0000000000..09a20a317c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/content.txt @@ -0,0 +1,6 @@ +!|script| +|create page|ScenarioLibrary|with content|| +|given page|SomePage| +|it should not contain|Scenario Libraries| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/content.txt new file mode 100644 index 0000000000..27c9583676 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/content.txt @@ -0,0 +1,7 @@ +![ script +given page ScenarioLibrary with content "brother content" +given test page TestPage +it should not contain "brother content" +]! + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/content.txt new file mode 100644 index 0000000000..990fb6f9e1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/content.txt @@ -0,0 +1 @@ +!contents -R2 -g -p -f -h \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SetUp/content.txt new file mode 100644 index 0000000000..6c0ccfab79 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SetUp/content.txt @@ -0,0 +1,5 @@ +!include -c + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/content.txt new file mode 100644 index 0000000000..97c55ee19f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/content.txt @@ -0,0 +1,29 @@ +!|import | +|fitnesse.slim.test| + +You can store an object instance in a Slim symbol and then use the instance in parameters for methods or constructors. +Here createTestSlimWithString(string) is a factory method that creates a new !-TestSlim-! instance, sets the given string and returns the object. + +The boolean isSame(Object other) method returns whether the other object is the same as the current !-TestSlim-! table actor. +The !-getStringFromOther(TestSlim other)-! method returns !-other.getStringArg()-!. + +!|script |test slim | +|$TEST_SLIM_INSTANCE=|create test slim with string|Uncle | +|check |get string arg |null | +|reject |is same |$TEST_SLIM_INSTANCE | +|check |get string from other |$TEST_SLIM_INSTANCE|Uncle| +|check |return constructor arg |0 | + +!-TestSlim-! has a constructor !-TestSlim(int, TestSlim)-! + +!|script | +|start |test slim |1|$TEST_SLIM_INSTANCE| +|check |get string arg |Uncle | +|check |return constructor arg|1 | +|reject|is same |$TEST_SLIM_INSTANCE | + +An instance stored in a Slim symbol can also be used for instance chaining (ChainWithInstanceTest). + +!|script|$TEST_SLIM_INSTANCE | +|ensure |is same|$TEST_SLIM_INSTANCE| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/content.txt new file mode 100644 index 0000000000..7b22a727e9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/content.txt @@ -0,0 +1,10 @@ +$$ should prevent symbol expression and reduce to a single $. +So $$a should translate to $a. + +|script| +|$x=|echo|bob| +|check|echo|$$x|$$x| +|check|echo|$$a|$$a| +|check|echo|$$|$$| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/content.txt new file mode 100644 index 0000000000..b0e86b1da1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/content.txt @@ -0,0 +1,25 @@ +The values in symbols can be blank or null. + +|Import| +|fitnesse.slim.test| + +|null fixture| +|get null? | +|$NULL= | +|null| + +|null fixture|$NULL| + +|script|test slim| +|check|echo string|$NULL|null| + + +|null fixture| +|get blank? | +|$BLANK= | + + +|null fixture|$BLANK| + +|script|test slim| +|check|echo string|$BLANK|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/properties.xml new file mode 100644 index 0000000000..f92cf94521 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20090331195040 + + + + + + + + + 1238547040373 + -5269654718806750977 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/content.txt new file mode 100644 index 0000000000..cb21366cac --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/content.txt @@ -0,0 +1,6 @@ +!|Suite| +|Page|JunkPage| +|Title|.| +|Content|| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/content.txt new file mode 100644 index 0000000000..2b7c1961b4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/content.txt @@ -0,0 +1,13 @@ +!|Import| +|fitnesse.slim.test| + + +!|script|MySystemUnderTestDriver| +|foo| +|ensure|driver called| +|reject|system under test called| + +!|script|MySystemUnderTestDriver| +|bar| +|reject|driver called| +|ensure|system under test called| \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/content.txt new file mode 100644 index 0000000000..0fb2e6d87a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/content.txt @@ -0,0 +1,6 @@ +!|Table:fitnesse.slim.test.DummyTableTableReturnsNull| +|| + +-!|script| +|pass| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/content.txt new file mode 100644 index 0000000000..ab5281db07 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/content.txt @@ -0,0 +1,18 @@ +You should be able to pass symbols into constructor arguments of slim tables. + +|import| +|fitnesse.slim.test| + +|script|test slim| +|$X=|echo int|99| + +|script|test slim|$X| +|check|return constructor arg|99| + +|script| +|start|test slim|$X| +|check|return constructor arg|99| + +|test slim|$X| +|return constructor arg?| +|99| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/properties.xml new file mode 100644 index 0000000000..2de63590d7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1232727199145 + 1276174457848841381 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/content.txt new file mode 100644 index 0000000000..f7eed77881 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/content.txt @@ -0,0 +1,46 @@ +!*> Scenarios +|scenario|comparator|a|accepts|b| +|check|echo|@b|@a| + +|scenario|comparator|a|rejects|b| +|check not|echo|@b|@a| + +|script|echo fixture| + +*! +|script| +|comparator|=5|accepts|5| +|comparator|=5|rejects|6| +|| +|comparator|!=5|accepts|6| +|comparator|!=5|rejects|5| +|| +|comparator|>=5|accepts|5| +|comparator|>=5|rejects|4| +|| +|comparator|>5|accepts|6| +|comparator|>5|rejects|5| +|comparator|>5|rejects|4| +|| +|comparator|<=5|accepts|5| +|comparator|<=5|rejects|6| +|| +|comparator|<5|accepts|4| +|comparator|<5|rejects|5| +|comparator|<5|rejects|6| +|| +|comparator|~=5.0|accepts|4.95| +|comparator|~=5.0|accepts|5.05| +|comparator|~=5.0|rejects|4.94| +|comparator|~=5.0|rejects|5.06| +|| +|comparator|!~=5.0|accepts|4.94| +|comparator|!~=5.0|accepts|5.06| +|comparator|!~=5.0|rejects|4.95| +|comparator|!~=5.0|rejects|5.05| +|| +|comparator|3<=_<=5|accepts|5| +|comparator|3<=_<=5|accepts|3| +|comparator|3<=_<=5|accepts|4| +|comparator|3<_<5|accepts|4| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/properties.xml new file mode 100644 index 0000000000..3107f84214 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/properties.xml @@ -0,0 +1,15 @@ + + + true + true + 20090123160411 + true + true + true + true + true + true + true + 1232748251278 + -7243730814292245452 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/content.txt new file mode 100644 index 0000000000..e94bcb4449 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/content.txt @@ -0,0 +1,20 @@ +!|Ordered Query:duplicate rows|A| +|x | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneOne | +|SuiteChildOne.TestOneTwo | +|SuiteChildOne.SuiteTearDown | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneThree | +|SuiteChildOne.SuiteTearDown | + +!|Ordered Query:duplicate rows|B| +|x | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneThree | +|SuiteChildOne.SuiteTearDown | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneOne | +|SuiteChildOne.TestOneTwo | +|SuiteChildOne.SuiteTearDown | + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/content.txt new file mode 100644 index 0000000000..d30e2c58cd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/content.txt @@ -0,0 +1,7 @@ +!define FOO {foobar} + +|echo fixture| +|name|name?| +|${FOO}|foobar| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/properties.xml new file mode 100644 index 0000000000..a65a6f3974 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20081209085434 + true + true + true + true + true + true + 1228834474023 + -1244951035038974341 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/content.txt new file mode 100644 index 0000000000..417b3451c3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/content.txt @@ -0,0 +1 @@ +!include >IncludedPage \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/properties.xml new file mode 100644 index 0000000000..8d5481a750 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/properties.xml @@ -0,0 +1,15 @@ + + + true + true + 20081209085200 + true + true + true + true + true + true + true + 1228736983781 + 6183774697863259098 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/content.txt new file mode 100644 index 0000000000..a0efc38b24 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/content.txt @@ -0,0 +1,36 @@ +!1 Sequential Argument Processing in Script Tables +''concatenateThreeArgs(String first, String second, String third)'' returns the concatenated arguments, separated by a space +!3 Affixing a semi-colon ";" to the end of a cell's contents should invoke sequential argument processing. Mixing every-other-cell and sequential-cell processing within the same row is permitted. +!|script |fitnesse.slim.test.TestSlim| +|concatenate three args;|1 |2.0 |three | +|concatenate |a |three args; |b |c | +|concatenate three |x |args; |why |zee | + +!3 Results of the function call should be equal regardless of processing style. +!|script | +|$RESULT_WITH_EVERY_OTHER_CELL_PROCESSING=|concatenate |a |three |b |args |c | +|$RESULT_WITH_SEQUENTIAL_CELL_PROCESSING= |concatenate three args;|a |b |c | +|$RESULT_WITH_MIXED_PROCESSING= |concatenate |a |three args; |b |c | +|check |echo string |$RESULT_WITH_SEQUENTIAL_CELL_PROCESSING|$RESULT_WITH_EVERY_OTHER_CELL_PROCESSING| +|check |echo string |$RESULT_WITH_MIXED_PROCESSING |$RESULT_WITH_EVERY_OTHER_CELL_PROCESSING| + +!3 Script Table Keywords +!|script | +|check |concatenate three args;|1|2.0|three|1 2.0 three | +|check not|concatenate three args;|a|b |c |something else| +|show |concatenate three args;|a|b |c | + +!3 Sequential argument processing can be used in scenario tables +!|scenario|concatenate |input1 |and |input2|and|input3| +|$RESULT= |concatenate three args;|@input1|@input2|@input3 | + +!|script | +|concatenate|a |and |b|and|c| +|check |echo string|$RESULT|a b c | + +!|concatenate|input1|and|input2|and|input3| +|input1 |input2|input3 | +|x |y |z | + +!|script | +|check|echo string|$RESULT|x y z| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/content.txt new file mode 100644 index 0000000000..e0b9aeb7d2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/content.txt @@ -0,0 +1,25 @@ +The empty set is always a subset. + +!|Subset Query:duplicate rows|A| +|x | + +Complete set is a subset (we do not mean proper subset). + +!|Subset Query:duplicate rows|A| +|x | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneOne | +|SuiteChildOne.TestOneTwo | +|SuiteChildOne.SuiteTearDown | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneThree | +|SuiteChildOne.SuiteTearDown | + +Only some of the rows (in different order) form a subset. + +!|Subset Query:duplicate rows|A| +|x | +|SuiteChildOne.TestOneTwo | +|SuiteChildOne.SuiteTearDown | +|SuiteChildOne.SuiteSetUp | +|SuiteChildOne.TestOneThree | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/content.txt new file mode 100644 index 0000000000..8929fa2c9a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/content.txt @@ -0,0 +1,21 @@ +|import| +|fitnesse.slim.test| + +!|script|test slim| + +!|scenario|should be bill|value| +|check|echo string|@value|bill| + +!|script| +|$x=|echo string|bill| +|should be bill|$x| + +!|script| +|$x=|echo string|bob| + +!|script| +|$x=|echo string|bill| +|should be bill|$x| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/content.txt new file mode 100644 index 0000000000..d666fa142e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/content.txt @@ -0,0 +1,33 @@ +|import | +|fitnesse.slim.test| + + +There was a bug in the Scenario selection process that caused a scenario with no inputs to be selected when it should have been method on the driver class. This happened because the !-ScenarioTable-! class was enhanced to try all rows as parameterized. So it took "login" and tried "login _ ". This resulted in the "login" scenario being used instead of the "loginWithUsernameAndPassword" method when "connect as with" scenario was called. This page demonstrates the fix. + + +!2 Scenario with no arguments and a shared root +!|scenario |login | +|connect to server| + +!2 +!|scenario |connect as|username |with|password| +|login with username|@username |and Password|@password | + + +!2 Scenario With one argument and a shared root. +!|scenario |login with|name| +|connect to server as|@name | + + +!2 Now calling a scenario that does take arguments, but since it isn't in parameterized format, the scenario with an argument isn't called, even though it shares a common root. +!|scenario |connect as|username |with|password| +|login with username|@username |and Password|@password | + + + + +!|script | +|start |Login Dialog Driver|bob |xyzz| +|connect as|bob |with|xyzz| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/properties.xml new file mode 100644 index 0000000000..4e908ad9ff --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/content.txt new file mode 100644 index 0000000000..c6c82df628 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/content.txt @@ -0,0 +1,12 @@ +!note Lighthouse #126 +''There was a bug that caused tests to silently fail, and suites to abort without notification if there were two tables on a page that were identical in every way. This was discovered when a Scenario Library was included twice.'' + +|import| +|me| + +|import| +|me| + +-!|script| +|pass| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/content.txt new file mode 100644 index 0000000000..aabe3d0610 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/content.txt @@ -0,0 +1,4 @@ +!define TEST_SYSTEM {slim} + +!contents -R2 -g -p -f -h + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/properties.xml new file mode 100644 index 0000000000..8f8f257ebd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + slim + + + 1232466948299 + -7901610663668633806 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/content.txt new file mode 100644 index 0000000000..0c1ff96ff7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/content.txt @@ -0,0 +1,14 @@ +Create an absolute symbolic link from a sub-page: + +First we need to create some pages to play with. +!|Page creator.| +|Page name. |PageContents. |valid?| +|LinkingPage |LINKING PAGE |true | +|LinkingPage.LinkingChild|LINKING CHILD |true | +|LinkedPage |LINKED PAGE |true | +|LinkedPage.LinkedChild |LINKED CHILD |true | + +Now we create a symbolic link named !-SymLink-!. This links !-LinkedPage.LinkedChild-! as a child of !-LinkingPage.LinkingChild-!. +!|Response Requester.| +|uri |status?| +|LinkingPage.LinkingChild?responder=symlink&linkName=SymLink&linkPath=.LinkedPage.LinkedChild|303| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/properties.xml new file mode 100644 index 0000000000..321f386ccf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/properties.xml @@ -0,0 +1,10 @@ + + + + + 20071209231745 + + + 1197255276583 + -2802271540647210678 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateBackwardSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateBackwardSymbolicLink/content.txt new file mode 100644 index 0000000000..236e2156bc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateBackwardSymbolicLink/content.txt @@ -0,0 +1,13 @@ +Create an absolute symbolic link from a sub-page: + +First we need to create some pages to play with. +!|Page creator.| +|Page name. |PageContents. |valid?| +|LinkingPage |LINKING PAGE |true | +|LinkingPage.LinkingChild|LINKING CHILD |true | +|LinkingPage.LinkedChild |LINKED CHILD |true | + +Now we create a symbolic link named !-SymLink-!. This links !-LinkedPage.LinkedChild-! as a child of !-LinkingPage.LinkingChild-!. +!|Response Requester.| +|uri |status?| +|LinkingPage.LinkingChild?responder=symlink&linkName=SymLink&linkPath= + + + + 20071209231818 + + + 1197255523311 + -2905294764201163185 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateNestedBackSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateNestedBackSymbolicLink/content.txt new file mode 100644 index 0000000000..0666d27454 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateNestedBackSymbolicLink/content.txt @@ -0,0 +1,15 @@ +Create an nested backward symbolic link from a sub-page: + +First we need to create some pages to play with. +!|Page creator.| +|Page name. |PageContents. |valid?| +|LinkingPage |LINKING PAGE |true | +|LinkingPage.LinkingChild |LINKING CHILD |true | +|LinkingPage.LinkingChild.LinkingGrandChild |LINKING GRAND CHILD |true | +|LinkingPage.LinkingChild.LinkingGrandChild.LinkingGreatGrandChild|LINKING GREAT GRAND CHILD |true | +|LinkingPage.LinkingChild.LinkedChild |LINKED CHILD |true | + +Now we create a symbolic link named !-SymLink-!. This links !-LinkedPage.LinkedChild-! as a child of !-LinkingPage.LinkingChild-!. +!|Response Requester.| +|uri |status?| +|LinkingPage.LinkingChild.LinkingGrandChild.LinkingGreatGrandChild?responder=symlink&linkName=SymLink&linkPath= + + + + 20071212153458 + + + 1197318232254 + -6614712250920689672 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/content.txt new file mode 100644 index 0000000000..78d3ef38f9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/content.txt @@ -0,0 +1,15 @@ +Creating a symbolic link is done in the properties view of the page that will contain the link. There is a form where a user supplies a name for the link and a path for the linked page. When submitted the URL has the following form: + +!-http://host/PathToPage?responder=symlink&linkName=&linkPath=-! + +First we need to create some pages to play with. +!|Page creator.| +|Page name.|valid?| +|LinkingPage|true| +|LinkedPage|true| + +Now we create a symbolic link named !-SymLink-!. This links !-LinkedPage-! as a child of !-LinkingPage-!. +!|Response Requester.| +|uri |status?| +|LinkingPage?responder=symlink&linkName=SymLink&linkPath=LinkedPage|303| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/properties.xml new file mode 100644 index 0000000000..cccf3d6857 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/properties.xml @@ -0,0 +1,10 @@ + + + + + 20071209231838 + + + 1197229524174 + 5360217332855886973 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/content.txt new file mode 100644 index 0000000000..1dff5c411c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/content.txt @@ -0,0 +1,12 @@ +Create a symbolic link to a sub-page: + +First we need to create some pages to play with. +!|Page creator.| +|Page name. |PageContents. |valid?| +|LinkingPage |LINKING PAGE |true | +|LinkingPage.LinkedChild |LINKED CHILD |true | + +Now we create a symbolic link named !-SymLink-!. This links !-LinkingPage.LinkedChild-! as a child of !-LinkingPage-!. +!|Response Requester.| +|uri |status?| +|LinkingPage?responder=symlink&linkName=SymLink&linkPath=>LinkedChild|303| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/properties.xml new file mode 100644 index 0000000000..54faed6942 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20071209210332 + true + true + true + true + true + true + 1197252212825 + 6202123951021509855 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/content.txt new file mode 100644 index 0000000000..30683847d8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/content.txt @@ -0,0 +1,25 @@ +!include CreateAbsoluteSymbolicLink + +Creating a symlink will redirect back to the properties page. +!|Response Examiner.| +|type |pattern |matches? |contents?| +|contents|Location: LinkingPage.LinkingChild\?properties|true|| + +Let's have a look at the properties view. +!|Response Requester.| +|uri |status?| +|LinkingPage.LinkingChild?properties|200| + +!********************> RESPONSE DATA +!|Response Examiner. | +|type |wrappedHtml?| +|contents| | + +****! + +The newly created symbolic link will be listed along with a link to the linked page. +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents|.LinkedPage.LinkedChild|true| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/properties.xml new file mode 100644 index 0000000000..92d8025aa2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20071209231853 + + + + 1197255380696 + -4394329366322317351 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/content.txt new file mode 100644 index 0000000000..1a7f2d086d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/content.txt @@ -0,0 +1,24 @@ +!include CreateBackwardSymbolicLink + +Creating a symlink will redirect back to the properties page. +!|Response Examiner.| +|type |pattern |matches? |contents?| +|contents|Location: LinkingPage.LinkingChild\?properties|true|| + +Let's have a look at the properties view. +!|Response Requester.| +|uri |status?| +|LinkingPage.LinkingChild?properties|200| + +!********************> RESPONSE DATA +!|Response Examiner. | +|type |wrappedHtml?| +|contents| | + +****! + +The newly created symbolic link will be listed along with a link to the linked page. +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents||true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/properties.xml new file mode 100644 index 0000000000..f92e5877dd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20081213071812 + + + + 1229174292637 + -3854706494573614483 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/content.txt new file mode 100644 index 0000000000..d6dedb39b0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/content.txt @@ -0,0 +1,24 @@ +!include CreateNestedBackSymbolicLink + +Creating a symlink will redirect back to the properties page. +!|Response Examiner.| +|type |pattern |matches? |contents?| +|contents|Location: LinkingPage.LinkingChild.LinkingGrandChild.LinkingGreatGrandChild\?properties|true|| + +Let's have a look at the properties view. +!|Response Requester.| +|uri |status?| +|LinkingPage.LinkingChild.LinkingGrandChild.LinkingGreatGrandChild?properties|200| + +!********************> RESPONSE DATA +!|Response Examiner. | +|type |wrappedHtml?| +|contents| | + +****! + +The newly created symbolic link will be listed along with a link to the linked page. +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents||true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/properties.xml new file mode 100644 index 0000000000..135b13ed6e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20081213071837 + + + + 1229174317653 + -4935147002126621191 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/content.txt new file mode 100644 index 0000000000..3ea169755b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/content.txt @@ -0,0 +1,17 @@ +!include CreateRelativeSymbolicLink + +Creating a symlink will redirect back to the properties page. +!|Response Examiner.| +|type |pattern|matches?|contents?| +|contents|Location: LinkingPage\?properties|true|| + +Let's have a look at the properties view. +!|Response Requester.| +|uri |status?| +|LinkingPage?properties|200| + +The newly created symbolic link will be listed along with a link to the linked page. +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents|LinkedPage|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/properties.xml new file mode 100644 index 0000000000..b1bacde95d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20071209231936 + + + + 1197229581691 + 2915598339411026699 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/content.txt new file mode 100644 index 0000000000..b2373f865a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/content.txt @@ -0,0 +1,24 @@ +!include CreateSubPageSymbolicLink + +Creating a symlink will redirect back to the properties page. +!|Response Examiner.| +|type |pattern |matches? |contents?| +|contents|Location: LinkingPage\?properties|true|| + +Let's have a look at the properties view. +!|Response Requester.| +|uri |status?| +|LinkingPage?properties|200| + +!********************> RESPONSE DATA +!|Response Examiner. | +|type |wrappedHtml?| +|contents| | + +****! + +The newly created symbolic link will be listed along with a link to the linked page. +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents|>LinkedChild|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/properties.xml new file mode 100644 index 0000000000..1617f1eaac --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20081213071906 + + + + 1229174346758 + 2734488844082203904 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/content.txt new file mode 100644 index 0000000000..b109efff10 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/content.txt @@ -0,0 +1,33 @@ +Removing a Symbolic Link is also done from the properties view of the page containing the link. Each link in the list will have an '''Unlink''' link that will perform the removal of the link. The link contains a URL of the form: + +!-
http://host/PathToPage?responder=symlink&remove=-!''nameOfLink''!-
-! + +But first we need to create a link to remove. +!include CreateRelativeSymbolicLink + +When we look at the properties page we'll see the Unlink link. +!|Response Requester.| +|uri |status?| +|LinkingPage?properties|200| +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents|Unlink |true| + +Now click the '''remove''' link. +!|Response Requester.| +|uri |status?| +|LinkingPage?responder=symlink&removal=SymLink|303| + +This should remove the symbolic link and redirect back to the properties view. +!|Response Examiner.| +|type |pattern|matches?|contents?| +|contents|Location: LinkingPage\?properties|true|| + +When we look at the properties page again, the symbolic link will no longer be listed. +!|Response Requester.| +|uri |status?| +|LinkingPage?properties|200| +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|false| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/properties.xml new file mode 100644 index 0000000000..6e7d25c77f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20081020135130 + + + + 1197477610797 + 4640860309643798136 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/content.txt new file mode 100644 index 0000000000..c678fed95c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/content.txt @@ -0,0 +1,41 @@ +Renaming a Symbolic Link is done from the properties view of the page containing the link. Each link in the list will have a '''Rename''' link that will initiate the renaming. The link contains a URL of the form: +!***********************************************< HIDDEN +!define CODE {!-
-!}
+!define code {!-
-!} +!define B {!--!} +!define b {!--!} +!define VAR {!--!} +!define var {!--!} +********************************************************! +${CODE}${B}!-http://host/PathToPage?responder=symlink&rename=-!${b}${VAR}nameOfLink${var}${B}&newname=${b}${VAR}newNameForLink${var}${code} + +But first we need to create a link to rename. +!include CreateRelativeSymbolicLink + +When we look at the properties page we'll see the rename link. +!|Response Requester.| +|uri |status?| +|LinkingPage?properties|200| +!|Response Examiner.| +|type |pattern|matches?| +|contents|SymLink|true| +|contents| Rename:|true| + +Now click the '''Rename''' link. +!|Response Requester.| +|uri |status?| +|LinkingPage?responder=symlink&rename=SymLink&newname=NewLink|303| + +This should change the name of the symbolic link and redirect back to the properties view. +!|Response Examiner.| +|type |pattern|matches?|contents?| +|contents|Location: LinkingPage\?properties|true|| + +When we look at the properties page again, the symbolic link will have a different name. +!|Response Requester.| +|uri |status?| +|LinkingPage?properties|200| +!|Response Examiner.| +|type |pattern|matches?| +|contents|NewLink|true| +|contents|SymLink|false| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/properties.xml new file mode 100644 index 0000000000..5ae5526d6a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/properties.xml @@ -0,0 +1,11 @@ + + + + + 20081020135130 + + + + 1197480508771 + 901290760874247319 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/content.txt new file mode 100644 index 0000000000..804a97e932 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/content.txt @@ -0,0 +1,24 @@ +After a Symbolic Link is created, it is possible to view it as a normal page as well as it's children. + +!include CreateRelativeSymbolicLink + +Now add a child on the linked page. +!|Page creator.| +|Page name.|valid?| +|LinkedPage.ChildPage|true| + +Let's load and view the symbolic link page. +!|Response Requester.| +|uri |status?| +|LinkingPage.SymLink|200| +!|Response Examiner.| +|type |pattern|matches?| +|contents|LinkingPage.SymLink|true| + +Now let's load and view the child page beneath the symbolic link page. +!|Response Requester.| +|uri |status?| +|LinkingPage.SymLink.ChildPage|200| +!|Response Examiner.| +|type |pattern|matches?| +|contents|LinkingPage.SymLink.ChildPage|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/properties.xml new file mode 100644 index 0000000000..7a1546ed86 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/properties.xml @@ -0,0 +1,11 @@ + + + + + 20081020135130 + + + + 1197229640317 + -8101656042803795127 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/content.txt new file mode 100644 index 0000000000..0f89b13dbb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/content.txt @@ -0,0 +1,14 @@ +!c !3 Symbolic Links + +Symbolic Links allow a user to easily create parent-child links between pages without permanently affecting the wiki structure. One common reason need for Symbolic Links is the the testing of a system on multiple environments. For example, imagine an application that site on top of an Oracle database. Hundreds of FitNesse tests have been written for this application using Oracle settings and then the team is confronted with the need to run the application on !-MySql-!. Getting both databases running under the same suite of tests can be very difficult and may result in duplicating all the tests. With Symbolic Links, the database configurations can be stored in high level pages along with appropriate path elements. Then the high-level pages may symbolically link to the test suite. In this manner one suite of tests can be executed in multiple environments. + + +>TestCreatingRelativeSymbolicLink +>TestCreatingAbsoluteSymbolicLink +>TestCreatingSubPageSymbolicLink +>TestCreatingBackwardSymbolicLink +>TestRemovingSymbolicLink +>TestSymbolicLinkBehavior +---- +All Subpages: +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/properties.xml new file mode 100644 index 0000000000..3b4d24d90e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/properties.xml @@ -0,0 +1,12 @@ + + + + + 20071209232537 + + + + + 1197260737340 + 159061011507139978 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..659fb67977 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/content.txt @@ -0,0 +1,58 @@ +!|scenario|get history for page|page| +|check|request page|@page?pageHistory|200| +|$TESTPAGE=|echo|@page| +|show|content| + +!|scenario|get top level history| +|check|request page|?testHistory|200| +|show|content| + +!|scenario|the number of page histories should be|number| +|check|count of tag|TR|with id prefix|pageHistoryRow|@number| + +!|scenario|the page history bar for|date|should have|number|elements of class|class| +|$date=|page history date signature of|@date| +|check|count of tag|TD|with id|element|and with class|@class|below tag|TR|with id prefix|pageHistoryRow_$date|@number| + +!|scenario|the page title should be|title| +|ensure|content contains|@title| + +!|scenario|the page title should be a link to|page|with value|value| +|ensure|content contains|@value| + +!|scenario|the bread crumb|crumb|should be a link to|page| +|ensure|content contains|@crumb.| + +!|scenario|The page history bar for|date|should have a|id|with class|class|and value|value| +|$date=|page history date signature of|@date| +|ensure|content of tag with id|pageHistoryRow_$date|contains|@value| +|show|content of tag with id|pageHistoryRow_$date| + +!|scenario|The page history bar for|date|should have a date field with class|class| +|$date=|page history date signature of|@date| +|ensure|content of tag with id|pageHistoryRow_$date|contains|| + +!|scenario|the top level history line for|page|is a link to the page history| +|ensure|content contains|@page| + +!|scenario|The page history line for|date|should be a link to result|resultDate| +|ensure|content contains|@date| + +!|scenario|the top level history line for|page|should have a|class|link with|sign|to result|resultDate| +|ensure|content contains|@sign| + +!|scenario|the top level history line for|page|should not have a link to|resultDate| +|reject|content contains|| + +!|scenario|class for pass fail in top level history line|page||pass class||pass count||fail class||fail count| +|ensure|html contains|@page @passCount @failCount| + +!|scenario|assume time is|time| +|freeze clock at|@time| + +!|scenario|with subpage|name|with content|content| +|create page|$IT.@name|with content|@content| + +!|scenario|run suite|name| +|check|request page|@name?suite|200| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SetUp/content.txt new file mode 100644 index 0000000000..8755de0974 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SetUp/content.txt @@ -0,0 +1,6 @@ +!include -c + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/content.txt new file mode 100644 index 0000000000..f0ab3992a1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|0|30|0|15| + +-!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a|fail_count|with class|fail|and value|45| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/content.txt new file mode 100644 index 0000000000..25c5ebeefa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/content.txt @@ -0,0 +1,28 @@ +!*< hidding defines +!define PASSING_TEST {!|script|fitnesse.slim.test.EchoScript| +|check|echo|7|7| +} + +!define FAILING_TEST {!|script|fitnesse.slim.test.EchoScript| +|check|echo|7|8| +} + +!define SUITE_ONE {!path classes +!path fitnesse.jar +!define TEST_SYSTEM (slim) +!define SLIM_PORT (9000) +} +*! + +!|script| +|assume time is|12/5/2009 00:00:00| +|given page|SuiteOne|with content|${SUITE_ONE}| +|with subpage|TestOne|with content|${PASSING_TEST}| +|with subpage|TestTwo|with content|${PASSING_TEST}| +|with subpage|TestThree|with content|${FAILING_TEST}| +|run suite|SuiteOne| +|get history for page|SuiteOne| +|the number of page histories should be|1| +|The page history bar for|5-Dec-2009|should have a|fail_count|with class|fail|and value|1| +|The page history bar for|5-Dec-2009|should have a|pass_count|with class|pass|and value|2| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/content.txt new file mode 100644 index 0000000000..6a19c75ae2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/content.txt @@ -0,0 +1,12 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|SuitePage.TestPage|5-May-2009|20|30|0|0| + +!|script| +|get history for page|SuitePage.TestPage| +|the number of page histories should be|1| +|the page title should be a link to|SuitePage.TestPage|with value|TestPage| +|the bread crumb|SuitePage|should be a link to|SuitePage| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/content.txt new file mode 100644 index 0000000000..d434095e70 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|00|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a date field with class|pass| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/content.txt new file mode 100644 index 0000000000..7e3eb82e1d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|30|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a|pass_count|with class|pass|and value|20| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/content.txt new file mode 100644 index 0000000000..bc2f523c26 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|0|0|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a date field with class|ignore| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/content.txt new file mode 100644 index 0000000000..4ef465dd7b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|0|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a|fail_count|with class|ignore|and value|0| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/content.txt new file mode 100644 index 0000000000..1805b3a743 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|0|30|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a|pass_count|with class|ignore|and value|0| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/content.txt new file mode 100644 index 0000000000..22353ed2e3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|0|20|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a date field with class|fail| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/content.txt new file mode 100644 index 0000000000..ccaaeabdb4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|30|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| +|The page history bar for|5-May-2009|should have a|fail_count|with class|fail|and value|30| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/content.txt new file mode 100644 index 0000000000..3494a1be93 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/content.txt @@ -0,0 +1,9 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|30|0|0| + +!|script| +|get history for page|TestPage| +|The page history line for|05 May, 09 00:00|should be a link to result|20090505000000| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/content.txt new file mode 100644 index 0000000000..a439de2e2f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/content.txt @@ -0,0 +1,13 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|30|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|1| + +|the page history bar for|date|should have|number|elements of class|class| +|date|number|class| +|5-May-2009|20|pass| +|5-May-2009|30|fail| +|5-May-2009|0|ignore| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/content.txt new file mode 100644 index 0000000000..ca39dd014a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/content.txt @@ -0,0 +1,17 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|TestPage|5-May-2009|20|30|0|0| +|TestPage|6-May-2009|60|40|0|0| + +!|script| +|get history for page|TestPage| +|the number of page histories should be|2| + +|the page history bar for|date|should have|n|elements of class|class| +|date|number|class| +|5-May-2009|10|pass| +|5-May-2009|15|fail| +|5-May-2009|25|ignore| +|6-May-2009|30|pass| +|6-May-2009|20|fail| +|6-May-2009|0|ignore| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/content.txt new file mode 100644 index 0000000000..a5bed4727b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/content.txt @@ -0,0 +1,2 @@ +!contents -R2 -g -p -f -h + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/content.txt new file mode 100644 index 0000000000..6bf7eb0e1b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/content.txt @@ -0,0 +1,13 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|SuitePage.TestPage|5-May-2009|20|30|0|0| + +!|script| +|get top level history| +|the top level history line for|SuitePage.TestPage|is a link to the page history| + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/content.txt new file mode 100644 index 0000000000..2bfd289ece --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/content.txt @@ -0,0 +1,13 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|SuitePage.TestPage|5-May-2009|20|30|0|0| + +!|script| +|get top level history| +|the top level history line for|SuitePage.TestPage|should have a|fail|link with|-|to result|20090505000000| + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/content.txt new file mode 100644 index 0000000000..38e65bc4b7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/content.txt @@ -0,0 +1,60 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|SuitePage.TestPage|1-May-2009|20|30|0|0| +|SuitePage.TestPage|2-May-2009|20|0|0|0| +|SuitePage.TestPage|3-May-2009|0|0|1|0| +|SuitePage.TestPage|4-May-2009|0|0|0|1| +|SuitePage.TestPage|5-May-2009|0|1|0|0| +|SuitePage.TestPage|6-May-2009|0|0|0|1| +|SuitePage.TestPage|7-May-2009|0|0|0|1| +|SuitePage.TestPage|8-May-2009|0|0|0|1| +|SuitePage.TestPage|9-May-2009|0|0|0|1| +|SuitePage.TestPage|10-May-2009|0|0|0|1| +|SuitePage.TestPage|11-May-2009|0|0|0|1| +|SuitePage.TestPage|12-May-2009|0|0|0|1| +|SuitePage.TestPage|13-May-2009|0|0|0|1| +|SuitePage.TestPage|14-May-2009|0|0|0|1| +|SuitePage.TestPage|15-May-2009|0|0|0|1| +|SuitePage.TestPage|16-May-2009|0|0|0|1| +|SuitePage.TestPage|17-May-2009|0|0|0|1| +|SuitePage.TestPage|18-May-2009|0|0|0|1| +|SuitePage.TestPage|19-May-2009|0|0|0|1| +|SuitePage.TestPage|20-May-2009|0|0|0|1| +|SuitePage.TestPage|21-May-2009|0|0|0|1| + + +!|script| +|get top level history| + +!|script| +|the top level history line for|SuitePage.TestPage|should not have a link to|20090501000000| + +!|the top level history line for|page|should have a|class|link with|sign|to result|resultDate| +|page|class|sign|resultDate| +|SuitePage.TestPage|pass|+|20090502000000| +|SuitePage.TestPage|fail|-|20090503000000| +|SuitePage.TestPage|fail|-|20090504000000| +|SuitePage.TestPage|fail|-|20090505000000| +|SuitePage.TestPage|fail|-|20090506000000| +|SuitePage.TestPage|fail|-|20090507000000| +|SuitePage.TestPage|fail|-|20090508000000| +|SuitePage.TestPage|fail|-|20090509000000| +|SuitePage.TestPage|fail|-|20090510000000| +|SuitePage.TestPage|fail|-|20090511000000| +|SuitePage.TestPage|fail|-|20090512000000| +|SuitePage.TestPage|fail|-|20090513000000| +|SuitePage.TestPage|fail|-|20090514000000| +|SuitePage.TestPage|fail|-|20090515000000| +|SuitePage.TestPage|fail|-|20090516000000| +|SuitePage.TestPage|fail|-|20090517000000| +|SuitePage.TestPage|fail|-|20090518000000| +|SuitePage.TestPage|fail|-|20090519000000| +|SuitePage.TestPage|fail|-|20090520000000| + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/content.txt new file mode 100644 index 0000000000..1aa977e52a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/content.txt @@ -0,0 +1,18 @@ +!|page history| +|name |date |right|wrong|ignores|exceptions| +|OneFailPage |5-May-2009|20 |30 |0 |0 | +|OnePassPage |5-May-2009|20 |0 |0 |0 | +|OnePassOneFail|5-May-2009|1 |0 |0 |0 | +|OnePassOneFail|6-May-2009|0 |1 |0 |0 | +|OneError |5-May-2009|0 |0 |0 |1 | + +!|script| +|get top level history| + +!|class for pass fail in top level history line| +|page |pass class|pass count|fail class|fail count| +|OneFailPage |ignore |0 |fail |1 | +|OnePassPage |pass |1 |ignore |0 | +|OnePassOneFail|pass |1 |fail |1 | +|OneError |ignore |0 |fail |1 | + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/content.txt new file mode 100644 index 0000000000..968f26706a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/content.txt @@ -0,0 +1,13 @@ +!|page history| +|name|date|right|wrong|ignores|exceptions| +|SuitePage.TestPage|5-May-2009|20|30|0|0| + +!|script| +|get top level history| +|the page title should be|Test History| + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/content.txt new file mode 100644 index 0000000000..990fb6f9e1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/content.txt @@ -0,0 +1 @@ +!contents -R2 -g -p -f -h \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/content.txt new file mode 100644 index 0000000000..d5565d1685 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/content.txt @@ -0,0 +1,2 @@ +!define TEST_SYSTEM {slim} +!contents -R2 -g -p -f -h \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/content.txt new file mode 100644 index 0000000000..a48e6b51fe --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/content.txt @@ -0,0 +1,15 @@ +In this test we make sure we can fetch the virtual child page. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/FitNesse.SuiteAcceptanceTests.AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.ChildOne|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|You have reached Child One.|true|| + +!note Why doesn't the page look blue? Something about the URLRequester or !-ResponseExaminer-! fixtures must be bypassing the colorization. diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/properties.xml new file mode 100644 index 0000000000..7ddf6814bb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072044 + + + + 1229174444028 + -570500463035178939 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/content.txt new file mode 100644 index 0000000000..f777134967 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/content.txt @@ -0,0 +1,13 @@ +An alias link to a non-existent page on a virtual child should generate a '''[?]''' that links to an edit page on the remote server, not on the local server. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/FitNesse.SuiteAcceptanceTests.AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.ChildWithAliasLinkToNonExistentPage|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|\[\?\]|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/properties.xml new file mode 100644 index 0000000000..bd25833be0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072127 + + + + 1229174487043 + -8660594137363316073 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/content.txt new file mode 100644 index 0000000000..3a5803beb4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/content.txt @@ -0,0 +1,13 @@ +An alias link to a non-existent page on a virtual child should generate a '''[?]''' that links to an edit page on the remote server, not on the local server. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/FitNesse.SuiteAcceptanceTests.AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.ChildWithAliasLinkToNonExistentSubPage|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|\[\?\]|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/properties.xml new file mode 100644 index 0000000000..0d74f2f767 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072217 + + + + 1229174537699 + -8455436134318421144 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/content.txt new file mode 100644 index 0000000000..f4ea083175 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/content.txt @@ -0,0 +1,15 @@ +!3 BUG. Thanks John Goodsen. + +If a virtual page includes another that is in the same virtual subwiki, it should be able to find it remotely. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/FitNesse.SuiteAcceptanceTests.AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.IncludingPage|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|included page|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/properties.xml new file mode 100644 index 0000000000..09457ce559 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072238 + + + + 1229174558451 + 9079472808022855710 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/content.txt new file mode 100644 index 0000000000..d32f94250f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/content.txt @@ -0,0 +1,19 @@ +!3 BUG. Thanks John Goodsen. + +If a virtual page includes another that is outside the virtual subwiki, it should still be able to find it remotely. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/FitNesse.SuiteAcceptanceTests.AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.IncludingPage.ChildIncludingPage|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|the included page 00bF|true|| + +!|Response Examiner| +|type|pattern|matches?| +|contents|Page include failed|false| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/properties.xml new file mode 100644 index 0000000000..60e609b8f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072259 + + + + 1229174579492 + 6672562401416929673 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/content.txt new file mode 100644 index 0000000000..a6ac96bfad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/content.txt @@ -0,0 +1,17 @@ +!c !1 Test Deactivated +!c !3 Due to changes in the virtual wiki feature. This test should eventually get deleted. + +A link to a non-existent page on a virtual child should generate a '''[?]''' that links to an edit page on the remote server, not on the local server. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.ChildWithLinkToNonExistentPage|true| + +!|Response Examiner| +|type|pattern|matches?|value| +|contents|\?|true|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/properties.xml new file mode 100644 index 0000000000..1234df43aa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/properties.xml @@ -0,0 +1,10 @@ + + + + 20081105124106 + + + + 1225906866680 + 6773079787846968340 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/content.txt new file mode 100644 index 0000000000..33f1db9b2e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/content.txt @@ -0,0 +1,19 @@ +!c !1 Test Deactivated +!c !3 Due to changes the virtual wiki features is undergoing. This test should eventually get deleted. + +A sub page link to a non-existent page on a virtual child should generate a '''[?]''' that edits the subpage of the remote parent. + + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage.ChildWithSubPageLinkToNonExistentPage|true| + +!|Response Examiner| +|type|pattern|matches?|value| +|contents|\?|true|| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/properties.xml new file mode 100644 index 0000000000..38b51007b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/properties.xml @@ -0,0 +1,10 @@ + + + + 20081105124132 + + + + 1225906892617 + 2604514604538018580 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/content.txt new file mode 100644 index 0000000000..31d2604354 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/content.txt @@ -0,0 +1,13 @@ +This test makes sure that we can build a simple virtual wiki link. We create a page with a !-!contents-! widget and then set the virtual wiki property to point to .FitNesse.SuiteAcceptanceTests.AcceptanceTestPage. When we fetch the page that !-!contents-! should show the !-ChildOne-! page that is below .FitNesse.SuiteAcceptanceTests.AcceptanceTestPage. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/FitNesse.SuiteAcceptanceTests.AcceptanceTestPage|true | + +!|Response Requester.| +|uri |valid?| +|VirtualPage|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|ChildOne|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/properties.xml new file mode 100644 index 0000000000..7692f9dc42 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072318 + + + + 1229174598553 + -1388058458338497579 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/content.txt new file mode 100644 index 0000000000..bba34dc152 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/content.txt @@ -0,0 +1,16 @@ +This test makes sure that a !-VirtualWikiNetworkError-! page is created if the virtual wiki property is set to a non-existent page. + +!|Page creator.| +|Page name. |Page contents.|Page attributes. |valid?| +|VirtualPage|!contents |VirtualWiki=http://localhost:${FITNESSE_PORT}/InvalidPage|true | + +!note we fetch the page twice here because the first fetch detects the error after the !-!contents-! has found all the local pages, thus preventing if from listing the !-VirtualWikiNetworkError-! page. This is probably a bug, but it's not serious enough to break this test at this point. + +!|Response Requester.| +|uri |valid?|| +|VirtualPage|true|''This one mimics the save of the properties''| +|VirtualPage|true| + +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|VirtualWikiNetworkError|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/properties.xml new file mode 100644 index 0000000000..7339f60a4f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213072337 + + + + 1229174617733 + -559825304016805882 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/content.txt new file mode 100644 index 0000000000..651edc4ff2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/content.txt @@ -0,0 +1,11 @@ +This suite specifies the behavior of the virtual wiki feature. These tests use some special pages that exist in ''this'' wiki. The pages are .FitNesse.SuiteAcceptanceTests.AcceptanceTestPage and its children. + +^TestVirtualLinkConnection +^TestVirtualLinkError +^TestAccessVirtualChild +^TestQuestionMarkLinkDefersToRemoteServer +^TestQuestionMarkLinkForChildPage +^TestAliasLinkToNonExistentPageDefersToRemoteServer +^TestAliasLinkToNonExistentSubPage +^TestIncludedPageInRange +^TestIncludedPageOutOfRange \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/properties.xml new file mode 100644 index 0000000000..e13ddbac8e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/properties.xml @@ -0,0 +1,14 @@ + + + + 20081105123242 + + + + + + + + 1225906362023 + 455850599843702522 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/content.txt new file mode 100644 index 0000000000..02ea787899 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/content.txt @@ -0,0 +1,13 @@ +'''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-!| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/properties.xml new file mode 100644 index 0000000000..0a48d1e8c1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/properties.xml @@ -0,0 +1,9 @@ + + + + 20081025194722 + + + 1224982042195 + 532420964490787760 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/content.txt new file mode 100644 index 0000000000..113ebc90fc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/content.txt @@ -0,0 +1,13 @@ +'''Next create a child''' +-|script| +|start|Page Builder| +|line |I came first!| +|attributes |Help=First Child's help| +|page |!-ParentPage.FirstChild-!| + +'''Next create a sibling''' +-|script| +|start|Page Builder| +|line |I'm younger, but wiser| +|attributes |Help=Second Child's help| +|page |!-ParentPage.SecondChild-!| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/properties.xml new file mode 100644 index 0000000000..42fcfd78b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/properties.xml @@ -0,0 +1,10 @@ + + + + + + + + 1224982442282 + 8969296584301579115 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/content.txt new file mode 100644 index 0000000000..f7493d2848 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/content.txt @@ -0,0 +1,11 @@ +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(>), Skip(-) + define PROPERTY_CHARACTERS {*+@>-} to change.}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/properties.xml new file mode 100644 index 0000000000..07efb25289 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/properties.xml @@ -0,0 +1,9 @@ + + + + + + + 1201555617074 + 8190442723712919484 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUp/content.txt new file mode 100644 index 0000000000..399a283f0e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUp/content.txt @@ -0,0 +1,6 @@ +!include + + true + true + true + true + true + true + true + true + 1234545813838 + -1749210898043018724 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/content.txt new file mode 100644 index 0000000000..1077041e87 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/content.txt @@ -0,0 +1,5 @@ +!|script| +|given page|ParentPage| +|given page|ParentPage.ChildPage|with content|>SetUp| +|given page|ParentPage.ChildPage.SetUp| +|page|ParentPage.ChildPage|should have link to|ParentPage.ChildPage.SetUp| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ShouldNotBeAbleToIncludeParentPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ShouldNotBeAbleToIncludeParentPage/content.txt new file mode 100644 index 0000000000..1d9d8e659d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ShouldNotBeAbleToIncludeParentPage/content.txt @@ -0,0 +1,4 @@ +!|script| +|given page|ParentPage| +|given page|ParentPage.ChildPage|with content|&bang;include + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/content.txt new file mode 100644 index 0000000000..48530520ed --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/content.txt @@ -0,0 +1,12 @@ +{{{From David Hooker: + +In my page, I have the following markup: + +All files received within the ''do...while'' loop will be stored using the +names "reply'''-x'''", where ''x'' is a number corresponding to which pass +through the loop the fixture is taking. + +If I put two single quotes around the letter x (in red above), it starts an +italic section, but the closing two single quotes do not stop the italics, +and the entire rest of my page is itallics. Bold markup does not seem to have +this problem.}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/properties.xml new file mode 100644 index 0000000000..7388852e63 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090111073938 + true + true + true + true + true + true + 1231681178844 + 5795227355115484696 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/content.txt new file mode 100644 index 0000000000..72ba13c26b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/content.txt @@ -0,0 +1,46 @@ +!|widget should render | +|wiki text |html text | +|normal text |normal text | +|this is ''italic'' text |this is italic text |italic widget | +|this is '''bold''' text |this is bold text |bold widget | +|!c This is centered text |
This is centered text
| +|!1 header |

header

| +|!2 header |

header

| +|!3 header |

header

| +|!4 header |

header

| +|!5 header |
header
| +|!6 header |
header
| +|http://files/x |http://files/x |file link | +|http://fitnesse.org |http://fitnesse.org |http link | +|SomePage |SomePage\[\?\] |missing wiki word | +|[[tag][WidgetPage]] |tag |link alias | +|[[tag][http://fitnesse.org]] |tag |http link alias | +|[[tag][http://files/x]] |tag |files alias | +|!- !-This is literal text-!-! |This is literal text |simple literal | +|!- !-This is ''literal'' text-! -! |!-This is ''literal'' text-! |literal text with markup | +|!-This is normal, ''italic'', and '''bold''' text-!|This is normal, italic, and bold text |Mixed Italic and Bold | +|!-!note hello-! |hello
| +|!-{{{prefomatted text}}}-! |
prefomatted text
| +|!-''x''-! |x |''David Hookers bug. Single character italics didn't parse correctly.''| +|!---strike---! |strike | +|!-!style_myStyle(hello)-! |hello | +|!-!style_myStyle[hello]-! |hello | +|!-!style_myStyle{hello}-! |hello | +|WikiWord |WikiWord\[\?\] | +|MdM |MdM\[\?\] | +|AbCdEfGhIjKlMnOpQrTuVxYz |AbCdEfGhIjKlMnOpQrTuVxYz\[\?\] | +|TheNumber1 |TheNumber1\[\?\] | +|ParenT.ChilD |ParenT.ChilD\[\?\] | +|^SubPage |\^SubPage\[\?\]|DEPRECATED | +|>SubPage |>SubPage\[\?\] | +|This is an@email.com text |This is an@email.com text |email widget | + +>DavidHookersBug + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/properties.xml new file mode 100644 index 0000000000..0e3f0a6d94 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + slim + + + + 1233779413308 + -5607632332474131237 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBackwardsSearchWidget/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBackwardsSearchWidget/content.txt new file mode 100644 index 0000000000..23c3616ea2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBackwardsSearchWidget/content.txt @@ -0,0 +1,14 @@ +!2 The Backwards Search widget. +Sometimes we want to search backwards through a path to a named page. For example, if we are on the page !style_code(!-.PageOne.PageTwo.PageThree.PageFour-!) we might be able to say !style_code(!-<PageTwo-!) to search backwards to !style_code(!-PageTwo-!). Now let's say there is a page named !style_code(!-.PageOne.PageTwo.AnotherPage-!) and we are on !style_code(!-.PageOne.PageTwo.PageThree.PageFour-!) We could say !style_code(!-<PageTwo.AnotherPage-!) + +!|script| +|given page|PageOne.PageTwo.AnotherPage| +|| +|given page|PageOne.PageTwo.PageThree.PageFour|with content| + + + 20090326094124 + + + + + 1233786481267 + 3864084191741944938 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/content.txt new file mode 100644 index 0000000000..f7d262a927 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/content.txt @@ -0,0 +1,8 @@ +!2 Test the rendering of a broken WikiPageReference. + * A broken WikiPageReference is a reference to a page that does not not exist. + * It should be rendered as a '''[?]'''. The '''[?]''' is a link to the wiki page followed by '''?edit''' +---- +!|script| +|given page|ReferencePage|with content|SomePage| +|it should have creating link to|SomePage| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/properties.xml new file mode 100644 index 0000000000..575331e142 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204162921 + + + + 1233786561543 + 4684496641888779625 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/content.txt new file mode 100644 index 0000000000..6a5e679400 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/content.txt @@ -0,0 +1,5 @@ +Classpath widgets can cantain variables. The text of !path widgets do not get processed with exception of variable references. + +!|script| +|given page|ClasspathTestPage|with content|!define BASE_PATH {/some/path/}!-
-!!path ${BASE_PATH}blah.jar| +|it should contain|classpath: /some/path/blah.jar| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/properties.xml new file mode 100644 index 0000000000..14757a486f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204161702 + + + + 1233785822993 + -6227523914168338832 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/content.txt new file mode 100644 index 0000000000..32b945c511 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/content.txt @@ -0,0 +1,9 @@ +!3 BUG - when you define a classpath entry on a line immediately following a variable definition, the classpath entry is not processed and the fixtures are therefore not found. +---- + +First, build a page with variable definitions followed immediately by a classpath definition. Also include a test that should pass. + +!|script| +|given page|ClasspathTestPage|with content|!define PI {3.141592}!-
-!!path classes!-
-!!path fitnesse.jar!-
-!&bar;fitnesse.testutil.PassFixture&bar;!-
-!| +|its test results should contain|PassFixture| +|and should not contain|Exception| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/properties.xml new file mode 100644 index 0000000000..c813571718 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/properties.xml @@ -0,0 +1,9 @@ + + + + + + + 1238173957690 + 4585069183088655392 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/content.txt new file mode 100644 index 0000000000..f82f555486 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/content.txt @@ -0,0 +1,94 @@ +!2 Test Collapsable sections +When a section of wiki test is surrounded by: + * !-!*** ... ***!-! it is rendered as a collapsable section; + * !-!**> ... ***!-! it is rendered as a collapsed section; + * !-!**< ... ***!-! it is rendered as a invisible section; + +The number of stars is optional; at least one is required at the start and end. +The formal format for using this widget involved multiple lines and looks like so: +#--------------------------------------------------- +{{{TOP +!*** section title +content +more content +****************! +BOTTOM +}}} + +and will be rendered as: +TOP +!*** section title +content +more content +****************! +BOTTOM +#--------------------------------------------------- +----- +{{{TOP +!**> section title +content +more content +****************! +BOTTOM +}}} + +and will be rendered as: +TOP +!***> section title +content +more content +****************! +BOTTOM +#--------------------------------------------------- +----- +{{{TOP +!**< section title +content +more content +****************! +BOTTOM +}}} + +and will be rendered as: +TOP +!**< section title +content +more content +****************! +BOTTOM + +!*> Scenarios +!|scenario|given a page with a collapsible section containing|text| +|given page|PageWithCollapsibleSection|with content|!** My Section!-
-!@text!-
-!****!| + +!|scenario|given a page with a collapsed section containing|text| +|given page|PageWithCollapsibleSection|with content|!*> My Section!-
-!@text!-
-!****!| + +!|scenario|given a page with an invisible section containing|text| +|given page|PageWithCollapsibleSection|with content|!*< My Section!-
-!@text!-
-!****!| + +!|scenario|the content|text|should be in a div of class|class| +|it should match|div.*class="@class".*>@text(
)?
| + +!|scenario|it should have|text|within a|class|div| +|the content|@text|should be in a div of class|@class| +|and it should have a collapsible div| + +!|scenario|and it should have a collapsible div| +|and should contain|div class="collapse_rim">| +|and should contain|a href="javascript:expandAll()| +|and should contain|a href="javascript:collapseAll()| +|and should contain|a href="javascript:toggleCollapsable| +|and should contain|span class="meta">My Section| + +*! + +!|script| +|given a page with a collapsible section containing|line one!-
-!line two| +|it should have|line one!-
-!line two|within a|collapsable|div| +|| +|given a page with a collapsed section containing|line one!-
-!line two| +|it should have|line one!-
-!line two|within a|hidden|div| +|| +|given a page with an invisible section containing|line one!-
-!line two| +|the content|line one!-
-!line two|should be in a div of class|invisible| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/properties.xml new file mode 100644 index 0000000000..3753ea6009 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204172330 + + + + 1233789810186 + -7128568304062498080 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/content.txt new file mode 100644 index 0000000000..a41b4803af --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/content.txt @@ -0,0 +1,6 @@ +!3 This page tests comments on a wiki page. + +!|script| +|given page|CommentTextPage|with content|one!-
-!#two!-
-!three| +|it should contain|one!-
-!three| +|and should not contain|two| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/properties.xml new file mode 100644 index 0000000000..02949d86f1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1233873345782 + 4734847856303348003 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/content.txt new file mode 100644 index 0000000000..2100e34301 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/content.txt @@ -0,0 +1,11 @@ +!3 !-!contents-! + +Ensure the contents widget builds links to child pages. + +!|script| +|given page|ParentPage|with content|!contents| +|given page|ParentPage.FirstChild| +|given page|ParentPage.SecondChild| +|page|ParentPage|should have link to|ParentPage.FirstChild| +|and it should have link to|ParentPage.SecondChild| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/properties.xml new file mode 100644 index 0000000000..2e61b8b66d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/properties.xml @@ -0,0 +1,12 @@ + + + + + 20090312121359 + + + + + 1234380940807 + -2763713559722277881 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsFilters/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsFilters/content.txt new file mode 100644 index 0000000000..827fb3bb91 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsFilters/content.txt @@ -0,0 +1,45 @@ +!3 !-!contents-! with Suite Filters Option +!include -seamless ContentsUsage +!3 Explicit Property Option +'''First create the parent page.''' +|script| +|start|Page Builder| +|line|I'm the parent| +|line|!-!contents -f-!| +|page|!-ParentPage-!| + +!include -seamless ContentsTestsInclude + +'''Then request the parent page.''' +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +'''...and examine the requested page to be sure that the child pages are included''' +!|Response Examiner.| +|type|pattern|matches?| +|contents|a href="ParentPage.FirstChild">FirstChild \(FC1\)|true| +|contents|a href="ParentPage.SecondChild">SecondChild \(FC2\)|true| + +!3 Indirect via PROPERTY_TOC Variable +'''First create the parent page.''' +|script| +|start|Page Builder| +|line|I'm also the parent| +|line|!-!define FILTER_TOC {true}-!| +|line|!-!contents-!| +|line|!-!define FILTER_TOC {false}-!| +|page|!-ParentPage-!| + +!include -seamless ContentsTestsInclude + +'''Then request the parent page.''' +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +'''...and examine the requested page to be sure that the child pages are included''' +!|Response Examiner.| +|type|pattern|matches?| +|contents|a href="ParentPage.FirstChild">FirstChild \(FC1\)SecondChild \(FC2\) + + + 20081025194852 + + + + + 1224982132762 + -2323379029053860621 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsHelp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsHelp/content.txt new file mode 100644 index 0000000000..5de39688e4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsHelp/content.txt @@ -0,0 +1,71 @@ +!3 !-!contents-! with Help Text Option +!include -seamless ContentsUsage +#------------------------------------------------- +!3 Test Rollover Help +'''First create the parent page.''' +-|script| +|start|Page Builder| +|line|I'm the parent| +|line|!-!contents-!| +|page|!-ParentPage-!| + +!include ContentsTestsIncludeWithHelp + +'''Then request the parent page.''' +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +'''...and examine the requested page to insure rollover help text exists''' +!|Response Examiner.| +|type|pattern|matches?| +|contents|a href="ParentPage.FirstChild" title="First Child's help">FirstChildSecondChildFirstChild: First Child's helpSecondChild: Second Child's helpFirstChild: First Child's helpSecondChild: Second Child's help + + + + + + + + + + + + 1224982407810 + -6939253104715124315 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsProperties/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsProperties/content.txt new file mode 100644 index 0000000000..a86ea69757 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsProperties/content.txt @@ -0,0 +1,45 @@ +!3 !-!contents-! with Properties Option +!include -seamless ContentsUsage +!3 Explicit Property Option +'''First create the parent page.''' +|Script| +|start|Page Builder| +|line|I'm the parent| +|line|!-!contents -p-!| +|page|!-ParentPage-!| + +!include ContentsTestsInclude + +'''Then request the parent page.''' +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +'''...and examine the requested page to be sure that the child pages are included''' +!|Response Examiner.| +|type|pattern|matches?| +|contents|a href="ParentPage.FirstChild">FirstChild \*\+SecondChild @-FirstChild \*\+SecondChild @- + + + 20081025195542 + + + + + 1224982542847 + -6265898487473210936 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsRegraced/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsRegraced/content.txt new file mode 100644 index 0000000000..d68655659a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsRegraced/content.txt @@ -0,0 +1,45 @@ +!3 !-!contents-! with Graceful option +!include -seamless ContentsUsage +!3 Explicit Graceful Option +'''First create the parent page.''' +|script| +|start|Page Builder| +|line|I'm the parent| +|line|!-!contents -g-!| +|page|!-ParentPage-!| + +!include -seamless ContentsTestsInclude + +'''Then request the parent page.''' +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage-!|true|| + +'''...and examine the requested page to be sure that the child pages are included''' +!|Response Examiner.| +|type|pattern|matches?| +|contents|a href="ParentPage.FirstChild">First ChildSecond ChildFirst ChildSecond Child + + + 20081025195650 + + + + + 1224982610036 + -8086447222767895818 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsWithRecursion/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsWithRecursion/content.txt new file mode 100644 index 0000000000..b27de60403 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsWithRecursion/content.txt @@ -0,0 +1,34 @@ +!3 !-!contents-! with Recursive option +!include -seamless ContentsUsage +'''First create the parent page.''' +|script| +|start|Page Builder| +|line|I'm the parent| +|line|!-!contents-! -R| +|page|!-ParentPage-!| + +!include -seamless ContentsTestsInclude +'''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">FirstChildGrandChildSecondChild + + + 20081025195831 + + + + 1224982711490 + 7863389155429661458 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/content.txt new file mode 100644 index 0000000000..1cfb756698 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/content.txt @@ -0,0 +1,19 @@ +This page tests bold text on a wiki page. + +First create a page with bold text on it. + +!|Page Creator| +|page name|page contents|page attributes|valid?| +|EmailPage|This is an@email.com text||true| + +Then request that page + +!|Response Requester| +|uri|valid?| +|EmailPage|true| + +Examine the page to be sure it has the bold text + +!|Response Examiner| +|type|pattern|matches?|value| +|contents|This is an@email.com text|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/properties.xml new file mode 100644 index 0000000000..6a67452920 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213003859 + + + + 1229150339876 + -5994279846297980652 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/content.txt new file mode 100644 index 0000000000..782dd31aea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/content.txt @@ -0,0 +1,291 @@ +!1 Evaluator of expressions: $!--!{= =} +!2 Syntax +'''{{{ $!--!{= [format:] expression =} }}}''' +!3 Expression +An expression may be a combination of constants, variables, and opertors. All internal calculations use the Java ''double'' numeric type. +!3 Format +A format is a specifier that describes the rendering of the numeric result. The format specifier is described by the Java 5 String class's .format() method: +{{{ %[flags][width][.precision]conversion}}} *!note N.B., The ''[argument_index$]'' specifier is not permitted. +!3 Links + * [[format string][http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax]] + * [[String.format()][http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#format(java.lang.String,%20java.lang.Object...)]] + * [[String class][http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html]] +!3 Examples +{{{ $!--!{= 12 + 23 =} renders (sand brackets) as [35] + $!--!{=%5.4f:1.414=} : [1.4140] + $!--!{=%05X:14+14=} : [0001C] + $!--!{= %-10s : 123 =} : [123 ]}}} +!3 Operators supported +|Comment| !note Spaces between items are optional | +|'''Operator'''|'''Argument'''|'''Description'''| +|!c ''arg'' | ''constant or variable'' | Examples: 3, 12.4, 4E+8, $!--!{VALUE}, $!--!{some.var} | +|!c ''expr'' |!c ''expression'' | Any valid combination of arguments and optional operations and parentheses| +|!c '''+''' |!c ''expr'' + ''expr'' | Addition | +|!c '''-''' |!c -''expr'' | Unary negation | +|!c '''-''' |!c ''expr'' - ''expr'' | Subtraction | +|!c '''!-*-!'''|!c ''expr'' !-*-! ''expr'' | Multiplication | +|!c '''/''' |!c ''expr'' / ''expr'' | Division | +|!c '''^''' |!c ''expr'' ^ ''expr'' | Exponentiation | +|!c '''sin''' |!c sin ''expr'' | Radian Sine of ''expr'' | +|!c '''cos''' |!c cos ''expr'' | Radian Cosine of ''expr'' | +|!c '''tan '''|!c cos ''expr'' | Radian Tangent of ''expr'' | +|!c '''( )''' |!c ( ''expr'' ) | Parenthetical grouping of an expression | +#----------------------------------------------------------------- +----- +!3 Test Blank Expressions +''' Build blank expression page ''' +!|script| +| start | Page Builder| +| line |~1a:${==}~| +| line |~1b:${= =}~| +| line |~1c:${= =}~| +| page | ExpressionPage | + +''' Render it ''' +!|Response Requester| +| uri | valid? | +| ExpressionPage | true | + +!**> Contents +!|Response Examiner| +|type | string? | +|contents| | + +!|Response Examiner| +|type | wrapped html? | +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +| type | pattern |matches?| +| contents | ~1a:~ |true | +| contents | ~1b:~ |true | +| contents | ~1c:~ |true | + +#----------------------------------------------------------------- +----- +!3 Test Single Argument Expressions +''' Build expression page ''' +!|script| +| start | Page Builder| +| line |!- ~2a:${=3=}~ -!| +| line |!- ~2b:${= 4.2 =}~ -!| +| line |!- ~2c:${= 2E+1 =}~ -!| +| line |!- ~2d:${= 2.3E+42 =}~ -!| +| line |!- ~2e:${= 4.2E + 24 =}~ -!| +| page | ExpressionPage | + +''' Render it ''' +!|Response Requester| +| uri | valid? | +| ExpressionPage | true | + +!**> Contents +!|Response Examiner| +|type | string? | +|contents| | + +!|Response Examiner| +|type | wrapped html? | +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +| type | pattern |matches?| +| contents | ~2a:3~ |true | +| contents | ~2b:4.2~ |true | +| contents | ~2c:20~ |true | +| contents | ~2d:2.3E+42~|true | +| contents | ~2e:4.2E+24~|true | + +#----------------------------------------------------------------- +----- +!3 Test spaces around experssions +''' Build expression page ''' +!|script| +| start | Page Builder| +| line |!- ~3a:${=1+1=}~ -!| +| line |!- ~3b:${=2 + 2=}~ -!| +| line |!- ~3c:${= 3 + 3=}~ -!| +| line |!- ~3d:${=4 + 4 =}~ -!| +| line |!- ~3e:${=5 +5 =}~ -!| +| page | ExpressionPage | + +''' Render it ''' +!|Response Requester| +| uri | valid? | +| ExpressionPage | true | + +!**> Contents +!|Response Examiner| +|type | string? | +|contents| | + +!|Response Examiner| +|type | wrapped html? | +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +| type | pattern |matches?| +| contents | ~3a:2~ |true | +| contents | ~3b:4~ |true | +| contents | ~3c:6~ |true | +| contents | ~3d:8~ |true | +| contents | ~3e:10~ |true | + +#----------------------------------------------------------------- +----- +!3 Test each operator +''' Build expression page ''' +!|script| +| start | Page Builder| +| line |!- ~4plus:${= 1 + 2 =}~ -!| +| line |!- ~4minus:${= 2 - 3 =}~ -!| +| line |!- ~4unary:${= -12 =}~ -!| +| line |!- ~4mult:${= 3 * 4 =}~ -!| +| line |!- ~4div:${= 4 / 5 =}~ -!| +| line |!- ~4exp:${=%2d: 5 ^ 6 =}~ -!| +| line |!- ~4sin1:${=%5.4f: sin0.39269875 =}~ -!| +| line |!- ~4sin2:${=%5.4f: sin 0.39269875 =}~ -!| +| line |!- ~4sin3:${=%5.4f: sin(0.39269875) =}~ -!| +| line |!- ~4sin4:${=%5.4f: sin(3.14159/8) =}~ -!| +| line |!- ~4sin5:${=%5.4f: sin (3.14159/8) =}~ -!| +| line |!- ~4cos:${=%5.4f: cos(3.14159 / 8) =}~ -!| +| line |!- ~4tan:${=%5.4f: tan(3.14159 / 8) =}~ -!| +| page | ExpressionPage | + +''' Render it ''' +!|Response Requester| +| uri | valid? | +| ExpressionPage | true | + +!**> Contents +!|Response Examiner| +|type | string? | +|contents| | + +!|Response Examiner| +|type | wrapped html? | +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +| type | pattern |matches?| +| contents | ~4plus:3~ |true | +| contents | ~4minus:-1~ |true | +| contents | ~4unary:-12~ |true | +| contents | ~4mult:12~ |true | +| contents | ~4div:0.8~ |true | +| contents | ~4exp:15625~ |true | +| contents | ~4sin1:0.3827~ |true | +| contents | ~4sin2:0.3827~ |true | +| contents | ~4sin3:0.3827~ |true | +| contents | ~4sin4:0.3827~ |true | +| contents | ~4sin5:0.3827~ |true | +| contents | ~4cos:0.9239~ |true | +| contents | ~4tan:0.4142~ |true | + +#----------------------------------------------------------------- +----- +!3 Test parentheses +''' Build expression page ''' +!|script| +| start | Page Builder| +| line |!- ~5a:${= 2 * 3 + 4 / 2 - 3 =}~ -!| +| line |!- ~5b:${= 2 * ( 3 + 4 ) / 2 - 3 =}~ -!| +| line |!- ~5c:${= 2 * ( 3 + 4 ) / ( 2 - 3 ) =}~ -!| +| line |!- ~5d:${= 2 * ( 3 + ( 4 / ( 2 - 3 ) ) ) =}~ -!| +| page | ExpressionPage | + +''' Render it ''' +!|Response Requester| +| uri | valid? | +| ExpressionPage | true | + +!**> Contents +!|Response Examiner| +|type | string? | +|contents| | + +!|Response Examiner| +|type | wrapped html? | +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +| type | pattern |matches?| +| contents | ~5a:5~ |true | +| contents | ~5b:4~ |true | +| contents | ~5c:-14~ |true | +| contents | ~5d:-2~ |true | + +#----------------------------------------------------------------- +----- +!3 Test formatting +''' Build expression page ''' +!|script| +| start | Page Builder| +| line |!- ~6a:${=%d:2 =}~ -!| +| line |!- ~6b:${= %d : 3.2 =}~ -!| +| line |!- ~6c:${=%02d: 2 + 1 =}~ -!| +| line |!- ~6d:${= %4.4f: 2.2 / 3.4 =}~ -!| +| line |!- ~6e:${=%03o: 16 =}~ -!| +| line |!- ~6f:${= %03o : 18 =}~ -!| +| line |!- ~6g:${=%03x: 26 =}~ -!| +| line |!- ~6h:${=%03X: 27 =}~ -!| +| line |!- ~6i:${= %-12s : 123 =}~ -!| +| line |!- ~6j:${=%TY: 73422123127 =}~ -!| +| line |!- ~6k:${=%b: 27 =}~ -!| +| line |!- ~6l:${=%b: 0 =}~ -!| +| line |!- ~6m:${=%B: 27 =}~ -!| +| line |!- ~6n:${=%B: 0 =}~ -!| +| line |!- ~6o:${= % d : 3.2 =}~ -!| +| page | ExpressionPage | + +''' Render it ''' +!|Response Requester| +| uri | valid? | +| ExpressionPage | true | + +!**> Contents +!|Response Examiner| +|type | string? | +|contents| | + +!|Response Examiner| +|type | wrapped html? | +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +| type | pattern |matches?| +| contents | ~6a:2~ |true | +| contents | ~6b:3~ |true | +| contents | ~6c:03~ |true | +| contents | ~6d:0.6471~ |true | +| contents | ~6e:020~ |true | +| contents | ~6f:022~ |true | +| contents | ~6g:01a~ |true | +| contents | ~6h:01B~ |true | +| contents | ~6i:123         ~|true| +| contents | ~6j:1972~ |true | +| contents | ~6k:true~ |true | +| contents | ~6l:false~ |true | +| contents | ~6m:true~ |true | +| contents | ~6n:false~ |true | +| contents | ~6o: 3~ |true | + +#---[EOT]--- diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/properties.xml new file mode 100644 index 0000000000..92623a952c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/properties.xml @@ -0,0 +1,11 @@ + + + + 20081213004646 + + + + + 1229150806385 + 3090056070224906711 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/content.txt new file mode 100644 index 0000000000..2edbcacfd4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/content.txt @@ -0,0 +1,65 @@ +!2 Test that ''existing'' WikiPageReference tokens are converted to links. + * A WikiPageReference is said to be ''existing'' if the page to which it refers already exists in the wiki. + * A WikiPageReference can be a simple .FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.WikiWord, or it can be a WikiPagePath. + * A WikiPageReference that begins with a dot ("'''.'''") is taken to be relative to the ''root'' of the wiki. + * A WikiPageReference that does not begin with a dot is taken to be relative to the parent of the current page. +---- +!3 Test simple relative WikiPageReference. + * Create pages at the root level. One page refers to the other. +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SomePage-!|some page|true| +|!-RelativeReferencePage-!|!-SomePage-!|true| + * Then request the page with the reference +|Response Requester.| +|uri|valid?| +|!-RelativeReferencePage-!|true| + * Make sure the rendered page has a link. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|!-SomePage-!|true|| +---- +!3 Test simple global .FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.WikiWord + * Create pages at the root level. One page refers to the other using a global WikiPageReference. +|Page creator.| +|Page name.|Page contents.|valid?| +|!-GlobalReferencePage-!|!-.SomePage-!|true| + * Then request the page with the reference +|Response Requester.| +|uri|valid?| +|!-GlobalReferencePage-!|true| + * Make sure the rendered page has a link. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|!-.SomePage-!|true|| +---- +!3 Test relative WikiPagePath +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SomePage.SubPage-!|!-sub page-!|true| +|!-SomePage.RelativeReference-!|!-SubPage-!|true| + * Then request the page with the reference +|Response Requester.| +|uri|valid?| +|!-SomePage.RelativeReference-!|true| + * Make sure the link is to !-SomePage.SubPage-! +|Response Examiner.| +|type|pattern|matches?|value| +|contents|!-SubPage-!|true|| +---- +!3 Test global WikiPagePath +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SomePage.GlobalReference-!|!-.SomePage.SubPage-!|true| + * Then request the page with the reference +|Response Requester.| +|uri|valid?| +|!-SomePage.GlobalReference-!|true| + * Make sure the link is to !-SomePage.SubPage-! +|Response Examiner.| +|type|pattern|matches?|value| +|contents|!-.SomePage.SubPage-!|true|| + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/properties.xml new file mode 100644 index 0000000000..603c12948e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/properties.xml @@ -0,0 +1,8 @@ + + + + 20081020135123 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/content.txt new file mode 100644 index 0000000000..ee885ab8e0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/content.txt @@ -0,0 +1,223 @@ +!1 Expressions using the ${= =} mark up +!3 Syntax: +'''{{{ $!--!{= expression =} }}}''' + +An expression may be a combination of constants, variables, and opertors. All internal calculations use the Java ''double'' numeric type. + +!3 Operators supported +|Comment |!note Spaces between items are optional | +|'''Operator'''|'''Argument''' |'''Description''' | +|!c ''arg'' |''constant or variable'' |Examples: 3 12.4 4E+8 $!--!{VALUE} $!--!{some.var} | +|!c ''expr'' |!c ''expression'' |Any valid combination of arguments and optional operations and parentheses| +|!c '''+''' |!c ''expr'' + ''expr'' |Addition | +|!c '''-''' |!c -''expr'' |Unary negation | +|!c '''-''' |!c ''expr'' - ''expr'' |Subtraction | +|!c '''!-*-!'''|!c ''expr'' !-*-! ''expr''|Multiplication | +|!c '''/''' |!c ''expr'' / ''expr'' |Division | +|!c '''^''' |!c ''expr'' ^ ''expr'' |Exponentiation | +|!c '''sin''' |!c sin ''expr'' |Radian Sine of ''expr'' | +|!c '''cos''' |!c cos ''expr'' |Radian Cosine of ''expr'' | +|!c '''tan ''' |!c cos ''expr'' |Radian Tangent of ''expr'' | +|!c '''( )''' |!c ( ''expr'' ) |Parenthetical grouping of an expression | +#----------------------------------------------------------------- +----- +!3 Test Blank Expressions +''' Build blank expression page ''' +!|script| +|start|Page Builder | +|line|!- ~1a:${==}~ -!| +|line|!- ~1b:${= =}~ -!| +|line|!- ~1c:${= =}~ -!| +|page|ExpressionPage | + +''' Render it ''' +!|Response Requester| +|uri |valid?| +|ExpressionPage|true | + +!**> Contents +!|Response Examiner| +|type |string?| +|contents| | + +!|Response Examiner| +|type |wrapped html?| +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +|type |pattern|matches?| +|contents|~1a:~ |true | +|contents|~1b:~ |true | +|contents|~1c:~ |true | + +----- +!3 Test Single Argument Expressions +''' Build expression page ''' +!|script| +|start|Page Builder | +|line|!- ~2a:${=3=}~ -! | +|line|!- ~2b:${= 4.2 =}~ -! | +|line|!- ~2c:${= 2E+1 =}~ -! | +|line|!- ~2d:${= 2.3E+42 =}~ -! | +|line|!- ~2e:${= 4.2E + 24 =}~ -!| +|page|ExpressionPage | + +''' Render it ''' +!|Response Requester| +|uri |valid?| +|ExpressionPage|true | + +!**> Contents +!|Response Examiner| +|type |string?| +|contents| | + +!|Response Examiner| +|type |wrapped html?| +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +|type |pattern |matches?| +|contents|~2a:3~ |true | +|contents|~2b:4.2~ |true | +|contents|~2c:20~ |true | +|contents|~2d:2.3E+42~|true | +|contents|~2e:4.2E+24~|true | + +#----------------------------------------------------------------- +----- +!3 Test spaces around experssions +''' Build expression page ''' +!|script| +|start|Page Builder | +|line|!- ~3a:${=1+1=}~ -! | +|line|!- ~3b:${=2 + 2=}~ -! | +|line|!- ~3c:${= 3 + 3=}~ -!| +|line|!- ~3d:${=4 + 4 =}~ -!| +|line|!- ~3e:${=5 +5 =}~ -! | +|page|ExpressionPage | + +''' Render it ''' +!|Response Requester| +|uri |valid?| +|ExpressionPage|true | + +!**> Contents +!|Response Examiner| +|type |string?| +|contents| | + +!|Response Examiner| +|type |wrapped html?| +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +|type |pattern|matches?| +|contents|~3a:2~ |true | +|contents|~3b:4~ |true | +|contents|~3c:6~ |true | +|contents|~3d:8~ |true | +|contents|~3e:10~|true | + +#----------------------------------------------------------------- +----- +!3 Test each operator +''' Build expression page ''' +!|script| +|start|Page Builder | +|line|!- ~4plus:${= 1 + 2 =}~ -! | +|line|!- ~4minus:${= 2 - 3 =}~ -! | +|line|!- ~4unary:${= -12 =}~ -! | +|line|!- ~4mult:${= 3 * 4 =}~ -! | +|line|!- ~4div:${= 4 / 5 =}~ -! | +|line|!- ~4exp:${=%2d: 5 ^ 6 =}~ -! | +|line|!- ~4sin1:${=%5.4f: sin0.39269875 =}~ -!| +|line|!- ~4sin2:${=%5.4f: sin 0.39269875 =}~ -!| +|line|!- ~4sin3:${=%5.4f: sin(0.39269875) =}~ -!| +|line|!- ~4sin4:${=%5.4f: sin(3.14159/8) =}~ -!| +|line|!- ~4sin5:${=%5.4f: sin (3.14159/8) =}~ -!| +|line|!- ~4cos:${=%5.4f: cos(3.14159 / 8) =}~ -!| +|line|!- ~4tan:${=%5.4f: tan(3.14159 / 8) =}~ -!| +|page|ExpressionPage | + +''' Render it ''' +!|Response Requester| +|uri |valid?| +|ExpressionPage|true | + +!**> Contents +!|Response Examiner| +|type |string?| +|contents| | + +!|Response Examiner| +|type |wrapped html?| +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +|type |pattern |matches?| +|contents|~4plus:3~ |true | +|contents|~4minus:-1~ |true | +|contents|~4unary:-12~ |true | +|contents|~4mult:12~ |true | +|contents|~4div:0.8~ |true | +|contents|~4exp:15625~ |true | +|contents|~4sin1:0.3827~|true | +|contents|~4sin2:0.3827~|true | +|contents|~4sin3:0.3827~|true | +|contents|~4sin4:0.3827~|true | +|contents|~4sin5:0.3827~|true | +|contents|~4cos:0.9239~ |true | +|contents|~4tan:0.4142~ |true | + +#----------------------------------------------------------------- +----- +!3 Test parentheses +''' Build expression page ''' +!|script| +|start|Page Builder | +|line|!- ~5a:${= 2 * 3 + 4 / 2 - 3 =}~ -!| +|line|!- ~5b:${= 2 * ( 3 + 4 ) / 2 - 3 =}~ -!| +|line|!- ~5c:${= 2 * ( 3 + 4 ) / ( 2 - 3 ) =}~ -!| +|line|!- ~5d:${= 2 * ( 3 + ( 4 / ( 2 - 3 ) ) ) =}~ -!| +|page|ExpressionPage | + +''' Render it ''' +!|Response Requester| +|uri |valid?| +|ExpressionPage|true | + +!**> Contents +!|Response Examiner| +|type |string?| +|contents| | + +!|Response Examiner| +|type |wrapped html?| +|contents| | + +***! + +''' Verify results ''' +!|Response Examiner| +|type |pattern |matches?| +|contents|~5a:5~ |true | +|contents|~5b:4~ |true | +|contents|~5c:-14~|true | +|contents|~5d:-2~ |true | + +#----------------------------------------------------------------- +#----------------------------------------------------------------- +#----------------------------------------------------------------- diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/properties.xml new file mode 100644 index 0000000000..fea0c940cf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/properties.xml @@ -0,0 +1,11 @@ + + + + 20090204155209 + + + + + 1233784329733 + -8383620453588142810 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/content.txt new file mode 100644 index 0000000000..edfc12c3b5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/content.txt @@ -0,0 +1,32 @@ +!2 The GT Sub Page widget. +!note We are in the process of deprecating the ^ widget and replacing it with >. This test proves that the > widget works. + +Sometimes we want to conveniently create a link to a sub page. We could do this by using the syntax ''!-SuperPage.SubPage-!'', but this is inconvenient. Instead we want to be able to say ''!->SubPage-!''. + +!|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|SuperPage|>SubPage||true| + +!|Response Requester.| +|uri|valid?|contents?| +|SuperPage|true|| + +The widget should translate into a ? link of the form: + * ''!->SubPage-![?]'' +!|Response Examiner.| +|type |pattern|matches?|value| +|contents|>SubPage\[\?\]|true|| + +If the sub page is already present, then the widget should translate into a normal link. + +!|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|SuperPage.SubPage|nothing||true| + +!|Response Requester.| +|uri|valid?|contents?| +|SuperPage|true|| + +!|Response Examiner.| +|type |pattern|matches?|value| +|contents|>SubPage|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/properties.xml new file mode 100644 index 0000000000..952acab587 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/properties.xml @@ -0,0 +1,11 @@ + + + + 20081213004747 + + + + + 1229150867919 + -7497153667046787360 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/content.txt new file mode 100644 index 0000000000..6d8f24ad74 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/content.txt @@ -0,0 +1,33 @@ +!2 The Sub Page widget in an alias. + +!note we are deprecating the ^ syntax in favor of the > syntax. + +Sometimes we want to create an alias to a subpage link as follows: !-[[click here][>SubPage]]-!. + +!|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|SuperPage|[[tag][>SubPage]]||true| + +!|Response Requester.| +|uri|valid?|contents?| +|SuperPage|true|| + +The widget should translate into a ? link of the form: + * ''tag[?]'' +!|Response Examiner.| +|type |pattern|matches?|value| +|contents|tag\[\?\]|true|| + +If the sub page is already present, then the widget should translate into a normal link. + +!|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|SuperPage.SubPage|nothing||true| + +!|Response Requester.| +|uri|valid?|contents?| +|SuperPage|true|| + +!|Response Examiner.| +|type |pattern|matches?|value| +|contents|tag|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/properties.xml new file mode 100644 index 0000000000..83d0df1118 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/properties.xml @@ -0,0 +1,11 @@ + + + + 20081213004831 + + + + + 1229150911604 + -788386058501389389 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/content.txt new file mode 100644 index 0000000000..125c3285c4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/content.txt @@ -0,0 +1,8 @@ +!|script| +|given page|HashPage|with content|!-!{a:b}-!| +|it should match|.table class="hash_table">.*tr class="hash_row">.*td class="hash_key">.*a.*/td>.*td class="hash_value">.*b.*/td>.*/tr>.*/tr>.*/table>| + +!|script| +|given page|HashPageTwo|with content|!-!{a:b,c:d}-!| +|it should match|.tr class="hash_row">.*td class="hash_key">.*a.*/td>.*td class="hash_value">.*b.*/td>.*/tr>| +|it should match|.tr class="hash_row">.*td class="hash_key">.*c.*/td>.*td class="hash_value">.*d.*/td>.*/tr>| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/content.txt new file mode 100644 index 0000000000..2443d98bde --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/content.txt @@ -0,0 +1,21 @@ +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-HelpTestPage-!| !-some content !help-! | Help= Sample help string|true| +|!-HelpTestPage2-!| !-some content !help -editable-! | |true| + +|Response Requester.| +|uri|valid?| +|!-HelpTestPage-!|true| + +|Response Examiner.| +|type|pattern|matches?|value| +|contents| Sample help string |true|| +|contents| (edit help text) |false|| + +|Response Requester.| +|uri|valid?| +|!-HelpTestPage2-!|true| + +|Response Examiner.| +|type|pattern|matches?|value| +|contents| (edit help text) |true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/content.txt new file mode 100644 index 0000000000..10761621c9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/content.txt @@ -0,0 +1,20 @@ +!2 Test that HTTP links are rendered correctly +If a string of the form !-http://-!''some_url'' appears in wiki text, it is converted to a link. +---- +!3 Check the variables get rendered in links + * First create a page with a variable and http link on it. +!|script| +|start|Page Builder| +|line|!define HOST {localhost:8081}| +|line|http://${HOST}/page|| +|page|!-HttpLinkPage-!| + + * Then fetch the page. +|Response Requester.| +|uri|valid?| +|!-HttpLinkPage-!|true| + + * Then check that the link was properly rendered. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|!-http://localhost:8081/page-!|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/properties.xml new file mode 100644 index 0000000000..4ce9ce4fa4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/properties.xml @@ -0,0 +1,10 @@ + + + + 20081028013208 + + + + 1225175528935 + -3752958530354414031 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/content.txt new file mode 100644 index 0000000000..95108d0abf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/content.txt @@ -0,0 +1,23 @@ +Test that the http status entries returned in a wiki page are correct. + +First create a page with normal text on it. + +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalTextPage-!|This is normal text||true| + +Then request that page + +|Response Requester.| +|uri|valid?| +|!-NormalTextPage-!|true| + +Examine the response for its status. + +|Response Examiner.| +|type|pattern|matches?|value| +|status|200|true|| +|headers|Cache-Control: max-age=0|true|| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/properties.xml new file mode 100644 index 0000000000..abb3da8277 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/properties.xml @@ -0,0 +1,9 @@ + + + + 20071130010014 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/content.txt new file mode 100644 index 0000000000..5a8a53626c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/content.txt @@ -0,0 +1,41 @@ +!3 This page tests includes on a wiki page. +When a !include is the first string on a line in a wiki page, then the argument of the !include is presumed to be another wiki page. The contents of that wiki page are inserted in place of the !include. + +The following is a test that demonstrates how this works. +# + * First create a page to be included. +# +|script| +|start|Page Builder| +|line|included| +|page|!-IncludedPage-!| +# + * Next create a page to do the including. +# +|script| +|start|Page Builder| +|line|before| +|line|&bang;include !-IncludedPage-! | +|line|after| +|page|!-IncludingPage-!| +# + * Then request the including page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-IncludingPage-!|true|| +# + * Examine the requested page to be sure the included page was in fact included. +# +|Response Examiner.| +|type|pattern|matches?|value| +|contents|included|true|| +# + * Now look at every line on the including page to make sure that the inclusions were done in order. +# +|Response Examiner.| +|line|occurs after?| +|before|true| +|included|true| +|after|true| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/properties.xml new file mode 100644 index 0000000000..d1a42e4618 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/properties.xml @@ -0,0 +1,11 @@ + + + + 20081025203702 + + + + + 1224985022046 + -1624419353663413223 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeBackwardsSearchPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeBackwardsSearchPage/content.txt new file mode 100644 index 0000000000..8c9a7ee3e8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeBackwardsSearchPage/content.txt @@ -0,0 +1,32 @@ +!3 This page tests includes of a backwards search page. + +Make sure the !-!include + + + 20081025203818 + + + + + 1224985098949 + 1988325188839757829 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/content.txt new file mode 100644 index 0000000000..3e0c869d7d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/content.txt @@ -0,0 +1,37 @@ +!3 You can set an included page to be collapsed when the page is rendered. +To do this, add the option "-c": + +!-!include -c SomePage-! + +See TestInclude for more info on included pages. +---- +# + * First create a page to be included. +# +|script| +|start|Page Builder| +|line|included| +|page|!-IncludedPage-!| +# + * Next create a page to do the including. +# +|script| +|start|Page Builder| +|line|before| +|line|!-&bang;include -c IncludedPage-! | +|line|after| +|page|!-IncludingPage-!| +# + * Then request the including page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-IncludingPage-!|true|| +# + * Now make sure the page was included and that the correct style and image are used. +# +|Response Examiner.| +|type|pattern|matches?| +|contents|included|true| +|contents|class="hidden"|true| +|contents|collapsableClosed.gif|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/properties.xml new file mode 100644 index 0000000000..d4487bb456 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/properties.xml @@ -0,0 +1,11 @@ + + + + 20081025203911 + + + + + 1224985151218 + 1162019334740908922 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/content.txt new file mode 100644 index 0000000000..5f2e2d4ba6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/content.txt @@ -0,0 +1,32 @@ +!3 Included Pages are Collapsable +When a page is included it is included within a division that is collapsable. + +The following is a test that demonstrates how this works. +# + * First create a page to be included. +# +|script| +|start|Page Builder| +|line|included| +|page|!-IncludedPage-!| +# + * Next create a page to do the including. +# +|script| +|start|Page Builder| +|line|before| +|line|!-&bang;include IncludedPage-! | +|line|after| +|page|!-IncludingPage-!| +# + * Then request the including page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-IncludingPage-!|true|| +# + * Examine the requested page to be sure the included page was in fact included. +# +|Response Examiner.| +|type|pattern|matches?|value| +|contents|class="collapsable"|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/properties.xml new file mode 100644 index 0000000000..53f41527f6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/properties.xml @@ -0,0 +1,10 @@ + + + + 20081025204002 + + + + 1224985202193 + -5717088232592493606 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/content.txt new file mode 100644 index 0000000000..370f0b1894 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/content.txt @@ -0,0 +1,45 @@ +!3 This page tests seamless includes on a wiki page. + +'''NOTE - this is not part of the 20050301 release, but is checked in and will be part of the next release''' + +You can follow !include (see TestInclude) with the option "!--seamless-!", which renders the included comment with no additional decoration. + +The following is a test that demonstrates how this works. +# + * First create a page to be included. +# +|script| +|start|Page Builder| +|line|included line 1| +|line|included line 2| +|page|!-IncludedPage-!| +# + * Next create a page to do the including. +# +|script| +|start|Page Builder| +|line|before| +|line|!-&bang;include -seamless IncludedPage-! | +|line|after| +|page|!-IncludingPage-!| +# + * Then request the including page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-IncludingPage-!|true|| +# + * Examine the requested page to be sure the included page was in fact included. +# +|Response Examiner.| +|type|pattern|matches?|value| +|contents|included|true|| +# + * Now look at every line on the including page to make sure that the inclusions were done in order. +# +|Response Examiner.| +|type|number|string?| +|line|1|before| +|line|2|included line 1| +|line|3|included line 2| +|line|4|after| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/properties.xml new file mode 100644 index 0000000000..591ca95c23 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/properties.xml @@ -0,0 +1,10 @@ + + + + 20081025204051 + + + + 1224985251533 + 6002595183983437420 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/content.txt new file mode 100644 index 0000000000..a330531c8a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/content.txt @@ -0,0 +1,17 @@ +!*< test page content definition +!define pageContent (!include -setup SetUp +!include IncludedPage +Including page name is !-${PAGE_NAME}-! +!include -teardown TearDown) + +*! + +!|script| +|create page|SetUp|with content|Set Up page name is !-${PAGE_NAME}-!| +|create page|TearDown|with content|Tear Down page name is !-${PAGE_NAME}-!| +|create page|IncludedPage|with content|Included page name is !-${PAGE_NAME}-!| +|given page|IncludingPage|with content|${pageContent}| +|it should contain|Included page name is IncludedPage| +|it should contain|Including page name is IncludingPage| +|it should contain|Set Up page name is IncludingPage| +|it should contain|Tear Down page name is IncludingPage| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/properties.xml new file mode 100644 index 0000000000..e0d6ece32d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/properties.xml @@ -0,0 +1,15 @@ + + + true + true + 20090319152813 + true + true + true + true + true + true + true + 1237470268676 + -6178655714902395693 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/content.txt new file mode 100644 index 0000000000..469fbe6e4f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/content.txt @@ -0,0 +1,32 @@ +!3 This page tests includes of a sub page. + +Make sure the !-!include >MySubPage-! syntax works. +# + * First create a page to be included. +# +|script| +|start|Page Builder| +|line|this subpage was included 3.14159| +|page|!-IncludingPage.IncludedPage-!| +# + * Next create a page to do the including. +# +|script| +|start|Page Builder| +|line|before| +|line|!-&bang;include >IncludedPage-! | +|line|after| +|page|!-IncludingPage-!| +# + * Then request the including page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-IncludingPage-!|true|| +# + * Examine the requested page to be sure the included page was in fact included. +# +|Response Examiner.| +|type|pattern|matches?|value| +|contents|this subpage was included 3.14159|true|| +# diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/properties.xml new file mode 100644 index 0000000000..b9824dcbee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/properties.xml @@ -0,0 +1,11 @@ + + + + 20081025204138 + + + + + 1224985298639 + -7592481394649690785 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/content.txt new file mode 100644 index 0000000000..665bac3ba1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/content.txt @@ -0,0 +1,30 @@ +!3 This page tests line breaks. +# + * First create a page with line breaks in it. +# +|script| +|start|Page Builder| +|line|one| +|line|| +|line|two| +|page|!-LineBreakPage-!| +# + * Then request that page +# +|Response Requester.| +|uri|valid?|contents?| +|!-LineBreakPage-!|true|| +# + * Make sure the page has three line breaks. +# +|Response Examiner.| +|type|pattern|matches?|value| +|contents|one.*
.*
.*two.*
.*|true|| + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/properties.xml new file mode 100644 index 0000000000..1ea45d9b41 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/properties.xml @@ -0,0 +1,10 @@ + + + + 20081026072729 + + + + 1225024049237 + -7002969980886143726 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/content.txt new file mode 100644 index 0000000000..cce71d4752 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/content.txt @@ -0,0 +1,143 @@ +!2 Test the Link Alias syntax. +Aliases to links can be created using the !-[[tag][link]]-! syntax. +The tag is interpreted for markup syntax, so it can be italic, or bold, or an image, etc. The link can be a relative or global wiki word, or it can be an http link. + +---- +!3 Test relative link alias + * First create two sub pages. One has a relative link to the other. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-SomePage.TargetPage-!|target page||true| +|!-SomePage.LinkPage-!|!-[[tag][TargetPage]]-!||true| + * Then get the page with the relative link on it. +|Response Requester.| +|uri|valid?| +|!-SomePage.LinkPage-!|true| + * Then make sure the relative link is properly constructed. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|
tag|true|| +---- +!3 Test global link alias + * First create a sub page that has a global reference to another sub page. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-SomePage.GlobalLinkPage-!|!-[[tag][.SomePage.TargetPage]]-!||true| + * Then fetch that page. +|Response Requester.| +|uri|valid?| +|!-SomePage.GlobalLinkPage-!|true| + * Make sure the link is properly formed. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|tag|true|| +---- +!3 Test variables get rendered in http link alias + * First create a page with a variable and http link on it. +!|script| +|start|Page Builder| +|line|&bang;define HOST {localhost:8080}| +|line|!-[[tag][http://${HOST}/page]]-! works fine.| +|page|!-HttpLinkPage-!| + + * Fetch the page. +|Response Requester.| +|uri|valid?| +|!-HttpLinkPage-!|true| + * Make sure the link is properly constructed. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|tag works fine.|true|| +---- +!3 Test variables defined in parent page get rendered in http link alias on child pages + * First define parent page with variable definition and child page with a http link which uses the variable. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-SomePage.ParentPage-!|!-!define HOST {localhost:8080}-!||true| +|!-SomePage.ParentPage.ChildPage-!|!-[[tag][http://${HOST}/page]]-! works fine.||true| + + * Fetch the page. +|Response Requester.| +|uri|valid?| +|!-SomePage.ParentPage.ChildPage-!|true| + + * Make sure the link is properly constructed. +|Response Examiner.| +|type|pattern|matches?|value| +|contents|tag works fine.|true|| +----- +!3 Test expressions without variables in link alias + * Create pages to refer to +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-PageLink2-!|contents||true| +|!-PageLink4-!|contents||true| +|!-PageLink10-!|contents||true| + + * First create a page with a variables and http link on it. +|script| +|start|Page Builder| +|line|!-!define X {5}-!| +|line|!-!define Y (4)-!| +|line|!-!define EXPR (${=3+2-1=})-!| +|line|!-[[tag][PageLink${= 3 - 2 + 1 =}]]-! works fine.| +|line|!-[[tag][PageLink${EXPR}]]-! works too.| +|line|!-[[tag][PageLink${=${X}+${Y}+1=}]]-! works as well.| +|page|!-HttpExprPage-!| + + * Fetch the page. +|Response Requester.| +|uri|valid?|contents?| +|!-HttpExprPage-!|true|| + + * Make sure the link is properly constructed. +|Response Examiner.| +|type|pattern|matches?| +|contents|tag works fine.|true| +|contents|tag works too.|true| +|contents|tag works as well.|true| + +!3 Test that links with query strings and fragments are handled properly. + * Create a page hierarchy +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-QueryPageRoot-! |!-!anchor QPLabel -!||true| +|!-QueryPageRoot.TopPage-! |!-!anchor QPTopLabel-!||true| + + * Create a page of query and fragment links...and a child +|script| +|start|Page Builder| +|line|!-[[tag1 ][TopPage?edit]]-! has query.| +|line|!-[[tag2 ][TopPage?edit#QPTopLabel]]-! has query and frag.| +|line|!-[[tag3 ][TopPage#QPTopLabel]]-! has fragment.| +|line|!-[[tag4 ][ChildFrag?edit]]-! child has query.| +|line|!-[[tag9 ][>ChildFrag?edit#QPTopLabel]]-! child has query and frag.| +|line|!-[[tag10][>ChildFrag#QPTopLabel]]-! child has fragment.| +|page|!-QueryPageRoot.QueryFragmentLinks-!| + +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-QueryPageRoot.QueryFragmentLinks.ChildFrag-!|!-!anchor QPChild-!||true| + + * Fetch the page. +|Response Requester.| +|uri|valid?|contents?| +|!-QueryPageRoot.QueryFragmentLinks-!|true|| + + * Make sure the query and fragments don't interfere with page paths. +|Response Examiner.| +|type|pattern|matches?| +|contents|tag1 has query.|true| +|contents|tag2 has query and frag.|true| +|contents|tag3 has fragment.|true| +|contents|tag4 back has query.|true| +|contents|tag5 root has query.|true| +|contents|tag6 back has query and frag.|true| +|contents|tag7 back has fragment.|true| +|contents|tag8 child has query.|true| +|contents|tag9 child has query and frag.|true| +|contents|tag10 child has fragment.|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/properties.xml new file mode 100644 index 0000000000..93238f6b2a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/properties.xml @@ -0,0 +1,10 @@ + + + + 20090111072849 + + + + 1231680529753 + -2612781470226117311 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/content.txt new file mode 100644 index 0000000000..b67a8fb042 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/content.txt @@ -0,0 +1,41 @@ +!3 This page tests a multi-line table. +A multi-line table is created as follows {{{|a|b|c| +|d|e|f|}}} The resulting text will be rendered in a one line table of the form.{{{ + + +
abc
def
}}} +# + * First create a page with a simple table in it. +# +|script| +|start|Page Builder| +|line|!-|a|b|c|-!| +|line|!-|d|e|f|-!| +|page|!-MultiLineTablePage-!| +# + * Then request that page +# +|Response Requester.| +|uri|valid?|contents?| +|!-MultiLineTablePage-!|true|| +# + * Make sure the html is correct for a simple table. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|a|true|| + +|Response Examiner.| +|type|number|string?| +|line|1|!-<table border="1" cellspacing="0">-!| +|line|2|!-<tr>-!| +|line|3|!-<td>a</td>-!| +|line|4|!-<td>b</td>-!| +|line|5|!-<td>c</td>-!| +|line|6|!-</tr>-!| +|line|7|!-<tr>-!| +|line|8|!-<td>d</td>-!| +|line|9|!-<td>e</td>-!| +|line|10|!-<td>f</td>-!| +|line|11|!-</tr>-!| +|line|12|!-</table>-!| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/properties.xml new file mode 100644 index 0000000000..7a63ce6ad5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204154027 + + + + 1233783627144 + 6262768124281368712 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/content.txt new file mode 100644 index 0000000000..d7d865a0cd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/content.txt @@ -0,0 +1,30 @@ +!3 Normal lists with leading numbers +An old bug in Fitnesse. If you created a normal list with leading numbers in the text, the parser got confused and thought that the leading numbers were part of a numeric list. + +A list created as follows {{{* 50 ways to leave your lover}}} should be rendered as a normal list with "50 ways to leave your lover" as the text of the list. +# + * First create a page with a simple table in it. +# +!note We use \ here as a way to capture the leading space before the *. +!|script| +|start|Page Builder| +|line|\ * 50 ways to leave your lover.| +|page|NormalListWithLeadingNumericPage| +# + * Then request that page +# +!|Response Requester.| +|uri|valid?|contents?| +|NormalListWithLeadingNumericPage|true|| +# + * Make sure the html is correct for a simple table. +# +!|Response Examiner.| +|type|pattern|matches?|value| +|contents|
  • 50 ways to leave your lover.
  • |true|| + +!|Response Examiner.| +|type|number|string?| +|line|1|
      | +|line|2|
    • 50 ways to leave your lover.
    • | +|line|3|
    | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/properties.xml new file mode 100644 index 0000000000..f63fecb104 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/properties.xml @@ -0,0 +1,10 @@ + + + + 20081026080117 + + + + 1225026077500 + -475629030298269946 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/content.txt new file mode 100644 index 0000000000..1247c396f9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/content.txt @@ -0,0 +1,32 @@ +!3 A simple list + +A list created as follows {{{ 1 Item one + 2 Item two}}} should be rendered as a two item ordered list. +# + * First create a page with a simple table in it. +# +!note We use backslash is a way to capture the leading space before the *. +!|script| +|start|Page Builder| +|line|\ 1 Item One| +|line|\ 2 Item Two| +|page|SimpleList| +# + * Then request that page +# +!|Response Requester.| +|uri|valid?|contents?| +|SimpleList|true|| +# + * Make sure the html is correct for a simple table. +# +!|Response Examiner.| +|type|pattern|matches?|value| +|contents|
  • Item One
  • |true|| + +!|Response Examiner.| +|type|number|string?| +|line|1|
      | +|line|2|
    1. Item One
    2. | +|line|3|
    3. Item Two
    4. | +|line|4|
    | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/properties.xml new file mode 100644 index 0000000000..d0a1face13 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/properties.xml @@ -0,0 +1,10 @@ + + + + 20081026080231 + + + + 1225026151448 + -3780571587416529903 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/content.txt new file mode 100644 index 0000000000..a9a991b1c6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/content.txt @@ -0,0 +1,50 @@ +!2 Test variables declared on parent page. +When a variable is expressed on a page, if that variable was not defined on that page, then !-FitNesse-! looks on the parent pages until it finds one that has the variable. +---- +!3 Test parent variable + * Build parent page with variable definition. +# +|script| +|start|Page Builder| +|line|!-!define x {1}-!| +|page|!-ParentPage-!| +# + * Build sub page with variable expression +# +|script| +|start|Page Builder| +|line|!-x is ${x}-!| +|page|!-ParentPage.SubPage-!| +# + * fetch sub page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.SubPage-!|true|| +# + * Make sure variable was expressed. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|x is 1|true|| +---- +!3 Make sure child variables override parent variables. + * Build sub page with both variable definition and expression. +# +|script| +|start|Page Builder| +|line|!-!define x {2}-!| +|line|!-x is ${x}-!| +|page|!-ParentPage.SubPageTwo-!| +# + * fetch sub page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-ParentPage.SubPageTwo-!|true|| +# + * Make sure variable definition from sub page was expressed. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|x is 2|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/properties.xml new file mode 100644 index 0000000000..92ea5ac1f2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204154649 + + + + 1233784009304 + 8647160220561030480 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestRunningPageName/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestRunningPageName/content.txt new file mode 100644 index 0000000000..f0a3fa7234 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestRunningPageName/content.txt @@ -0,0 +1,34 @@ +!*< test page content definition +!define pageContent (!include -setup SetUp +!include IncludedPage +Including Page running page name is !-${RUNNING_PAGE_NAME}-! +!include -teardown TearDown) +!define firstLevelPageContent (!include SecondLevelIncludedPage +First Level Included running page name is !-${RUNNING_PAGE_NAME}-!) + +*! + +!3 Test that the RUNNING_PAGE_NAME variable is always the top level running page's name +!|script| +|create page|SetUp|with content|Set Up running page name is !-${RUNNING_PAGE_NAME}-!| +|create page|TearDown|with content|Tear Down running page name is !-${RUNNING_PAGE_NAME}-!| +|create page|IncludedPage|with content|Included Page running page name is !-${RUNNING_PAGE_NAME}-!| +|given page|IncludingPage|with content|${pageContent}| +|it should contain|Included Page running page name is IncludingPage| +|it should contain|Including Page running page name is IncludingPage| +|it should contain|Set Up running page name is IncludingPage| +|it should contain|Tear Down running page name is IncludingPage| + + +!3 Test that the RUNNING_PAGE_NAME variable recurses over multiple levels of included pages +!|script| +|create page|SetUp|with content|Set Up running page name is !-${RUNNING_PAGE_NAME}-!| +|create page|TearDown|with content|Tear Down running page name is !-${RUNNING_PAGE_NAME}-!| +|create page|SecondLevelIncludedPage|with content|Second Level Included Page running page name is !-${RUNNING_PAGE_NAME}-!| +|create page|IncludedPage|with content|${firstLevelPageContent}| +|given page|IncludingPage|with content|${pageContent}| +|it should contain|Set Up running page name is IncludingPage| +|it should contain|Tear Down running page name is IncludingPage| +|it should contain|Second Level Included Page running page name is IncludingPage| +|it should contain|First Level Included running page name is IncludingPage| +|it should contain|Including Page running page name is IncludingPage| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/content.txt new file mode 100644 index 0000000000..9562630ab7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/content.txt @@ -0,0 +1,32 @@ +!3 A simple list + +A list created as follows {{{ * Item one + * Item two}}} should be rendered as a two item bullet list. +# + * First create a page with a simple table in it. +# +!note We use backslash is a way to capture the leading space before the *. +!|script| +|start|Page Builder| +|line|\ * Item One| +|line|\ * Item Two| +|page|SimpleList| +# + * Then request that page +# +!|Response Requester.| +|uri|valid?|contents?| +|SimpleList|true|| +# + * Make sure the html is correct for a simple table. +# +!|Response Examiner.| +|type|pattern|matches?|value| +|contents|
  • Item One
  • |true|| + +!|Response Examiner.| +|type|number|string?| +|line|1|
      | +|line|2|
    • Item One
    • | +|line|3|
    • Item Two
    • | +|line|4|
    | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/properties.xml new file mode 100644 index 0000000000..dbd729687d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/properties.xml @@ -0,0 +1,10 @@ + + + + 20081026080355 + + + + 1225026235792 + -4842165197939052867 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/content.txt new file mode 100644 index 0000000000..924f4aab78 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/content.txt @@ -0,0 +1,34 @@ +!3 This page tests a simple one-line table. +A simple table is created as follows {{{|a|b|c|}}} The resulting text will be rendered in a one line table of the form.{{{ + +
    abc
    }}} +# + * First create a page with a simple table in it. +# +|script| +|start|Page Builder| +|line|!-|a|b|c|-!| +|page|!-SimpleTablePage-!| +# + * Then request that page +# +|Response Requester.| +|uri|valid?|contents?| +|!-SimpleTablePage-!|true|| +# + * Make sure the html is correct for a simple table. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|a|true|| + +|Response Examiner.| +|type|number|string?| +|line|1|!-<table border="1" cellspacing="0">-!| +|line|2|!-<tr>-!| +|line|3|!-<td>a</td>-!| +|line|4|!-<td>b</td>-!| +|line|5|!-<td>c</td>-!| +|line|6|!-</tr>-!| +|line|7|!-</table>-!| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/properties.xml new file mode 100644 index 0000000000..69dc0db667 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204153903 + + + + 1233783543552 + 1862507681361489088 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/content.txt new file mode 100644 index 0000000000..5c6f7477d7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/content.txt @@ -0,0 +1,34 @@ +!3 A sub list + +A list created as follows {{{ * Item one + * Item two}}} should be rendered as a list with a sub list. +# + * First create a page with a simple table in it. +# +!note We use backslash is a way to capture the leading space before the *. +!|script| +|start|Page Builder| +|line|\ * Item One| +|line|\ * Item Two| +|page|SubList| +# + * Then request that page +# +!|Response Requester.| +|uri|valid?|contents?| +|SubList|true|| +# + * Make sure the html is correct for a simple table. +# +!|Response Examiner.| +|type|pattern|matches?|value| +|contents|
  • Item One
      |true|| + +!|Response Examiner.| +|type|number|string?| +|line|1|
        | +|line|2|
      • Item One
          | +|line|3|
        • Item Two
        • | +|line|4|
        | +|line|5|
      • | +|line|6|
      | diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/properties.xml new file mode 100644 index 0000000000..71e3fde380 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1225026520183 + -2916964933429086644 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/content.txt new file mode 100644 index 0000000000..d3e50534ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/content.txt @@ -0,0 +1,30 @@ +!2 The Sub Page widget. +Sometimes we want to conveniently create a link to a sub page. We could do this by using the syntax ''!-SuperPage.SubPage-!'', but this is inconvenient. Instead we want to be able to say ''!-^SubPage-!''. + +!|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|SuperPage|^SubPage||true| + +!|Response Requester.| +|uri|valid?|contents?| +|SuperPage|true|| + +The widget should translate into a ? link of the form: + * ''!-^SubPage-!
      [?]'' +!|Response Examiner.| +|type |pattern|matches?|value| +|contents|\^SubPage\[\?\]|true|| + +If the sub page is already present, then the widget should translate into a normal link. + +!|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|SuperPage.SubPage|nothing||true| + +!|Response Requester.| +|uri|valid?|contents?| +|SuperPage|true|| + +!|Response Examiner.| +|type |pattern|matches?|value| +|contents|\^SubPage|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/properties.xml new file mode 100644 index 0000000000..14faf199a4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213011308 + + + + 1229152388734 + -2200930259395588095 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/content.txt new file mode 100644 index 0000000000..5b2f1ebc68 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/content.txt @@ -0,0 +1,30 @@ +!2 The Sub Page widget in an alias. +Sometimes we want to create an alias to a subpage link as follows: !-[[click here][^SubPage]]-!. + +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-SuperPage-!|!-[[tag][^SubPage]]-!||true| + +|Response Requester.| +|uri|valid?|contents?| +|!-SuperPage-!|true|| + +The widget should translate into a ? link of the form: + * ''tag[?]'' +|Response Examiner.| +|type |pattern|matches?|value| +|contents|tag\[\?\]|true|| + +If the sub page is already present, then the widget should translate into a normal link. + +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-SuperPage.SubPage-!|nothing||true| + +|Response Requester.| +|uri|valid?|contents?| +|!-SuperPage-!|true|| + +|Response Examiner.| +|type |pattern|matches?|value| +|contents|tag|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/properties.xml new file mode 100644 index 0000000000..5e33cb58e2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213011402 + + + + 1229152442036 + 5555914994555846525 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/content.txt new file mode 100644 index 0000000000..2e2a85144d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/content.txt @@ -0,0 +1,62 @@ +!3 This page tests the construction of tables. +# + * First create a page with comment text on it. +# +|script| +|start|Page Builder| +|line|!-|1 Row 1 Cell|-!| +|page|!-TableTestPage-!| +# + * Then request that page +# +|Response Requester.| +|uri|valid?|contents?| +|!-TableTestPage-!|true|| +# + * Examine the page to be sure it is empty. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|\s*\s*1 Row 1 Cell\s*\s*\s*|true|| + +'''Test that spaces inside table cells don't get interpreted.''' +|script| +|start|Page Builder| +|line|!-| 1 is not a list|-!| +|page|!-TableTestPageTwo-!| +# +# +|Response Requester.| +|uri|valid?|contents?| +|!-TableTestPageTwo-!|true|| +# +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|1 is not a list|true|| +# +|Response Examiner.| +|type|pattern|matches?| +|contents|
        |false| +|contents|
      1. |false| +# + +'''Test that nothing gets interpreted inside literal tables.''' +|script| +|start|Page Builder| +|line|!-!|'''bold'''|''italic''|-!| +|page|!-TableTestPageThree-!| +# +# +|Response Requester.| +|uri|valid?|contents?| +|!-TableTestPageThree-!|true|| +# +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-'''bold'''-!|true|| +# +|Response Examiner.| +|type|pattern|matches?| +|contents|!-''italic''-!|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/properties.xml new file mode 100644 index 0000000000..72cef4fc06 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204154144 + + + + 1233783704087 + 4236233898432547799 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/content.txt new file mode 100644 index 0000000000..9d9fac9eaf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/content.txt @@ -0,0 +1,40 @@ +The !-!see-! widget takes a page name as argument. It displays the fully qualified page name in bold, prefixed by '''See:''' + +|Comment| +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-!see SomeTestPage-!|!see SomeTestPage| + +Create some page. + +|script| +|start|Page Builder| +|line|Dummy Text| +|page|!-SomePage-!| + +Create a suite page with a !-!see-! widget + +|script| +|start|Page Builder| +|line|!-!see SomePage-!| +|page|!-SuitePage-!| + +Get the Suite page. + +|Response Requester.| +|uri |valid?| +|!-SuitePage-!|true| + +|Response Examiner.| +|contents?| +|| + +Make sure the page name is formatted properly + +!|Response Examiner.| +|type |pattern|matches?| +|contents|See: SomePage|true| + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/properties.xml new file mode 100644 index 0000000000..03b292d590 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213011505 + + + + 1229152505066 + 7293162177854007306 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/content.txt new file mode 100644 index 0000000000..91c43b6546 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/content.txt @@ -0,0 +1,20 @@ +This page tests the tag. + +First create a page. + +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-TitleTestPage-!|some content||true| + +Then request that page + +|Response Requester.| +|uri|valid?| +|!-TitleTestPage-!|true| + +Examine the page to be sure it has <title> tag + +|Response Examiner.| +|type|pattern|matches?|value| +|contents|<title>!-TitleTestPage-!|true|| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/properties.xml new file mode 100644 index 0000000000..426aee821b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210150 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/content.txt new file mode 100644 index 0000000000..ecfde90896 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/content.txt @@ -0,0 +1,125 @@ +!2 Test that variables are properly defined and expressed on a page. + * Variables are defined as !-!define name {value}-!. + * Alternately they are defined as !-!define name (value)-!. + * This is so that you can create variables with {} or () in them. + * They are expressed using !-${name}-! +----- +!3 Test a variable defined and used on the same page. +# + * Create a page with a variable definition and use.. +# +|script| +|start|Page Builder| +|line|!-!define x {1}-!| +|line|!-x is ${x}-!| +|line|!-PAGE_NAME is ${PAGE_NAME}-!| +|line|!-PAGE_PATH is ${PAGE_PATH}-!| +|page|!-VariablePage-!| +# + * Fetch that page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-VariablePage-!|true|| +# + * Inspect the text to see if the variable was expressed. +# +|Response Examiner.| +|type|pattern|matches?| +|contents|x is 1|true| +|contents|PAGE_NAME is !-<-!;a href="Variable!--!Page"!->-!Variable!--!Page|true| +|contents|PAGE_PATH is .|true| + +---- +!3 Test a variable defined and used on the same page using () syntax. +# + * Create a page with a variable definition and use.. +# +|script| +|start|Page Builder| +|line|!-!define x (1)-!| +|line|!-x is ${x}-!| +|page|!-ParenVariablePage-!| +# + * Fetch that page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-ParenVariablePage-!|true|| +# + * Inspect the text to see if the variable was expressed. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|x is 1|true|| + +---- +!3 Test literals in variables with {} and () syntax. +!note The internal representation of a literal is changed from !lit(n) to !lit?n? so as to avoid conflict with the !define X () widget syntax. +# + * Create a page with a variable definition and use.. +# +|script| +|start|Page Builder| +|line|!-!-!define xLitBRACE {!-!-!-xLitBRACE-!-!-!}| +|line|!!--!define xLitPAREN (!-!-!-xLitPAREN-!-!-!)| +|line|!-xLitBRACE is ${xLitBRACE}-!| +|line|!-xLitPAREN is ${xLitPAREN}-!| +|page|!-ParenVariablePage-!| +# + * Fetch that page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-ParenVariablePage-!|true|| +# + * Inspect the text to see if the variable was expressed. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|xLitPAREN is xLitPAREN|true|| +|contents|xLitBRACE is xLitBRACE|true|| + +---- +!3 Test a variables with periods +# + * Create a page with a variable definitions with periods. +# +|script| +|start|Page Builder| +|line|!-!define xy. (1)-!| +|line|!-!define x.y (2)-!| +|line|!-!define .xy (3)-!| +|line|!-!define .x.y. (4)-!| +|line|!-!define .xy. (5)-!| +|line|!-!define .x.y (6)-!| +|line|!-!define x.y. (7)-!| +|line|!-!define x..y (8)-!| +|line|!-~xy. is ${xy.}~-!| +|line|!-~x.y is ${x.y}~-!| +|line|!-~.xy is ${.xy}~-!| +|line|!-~.x.y. is ${.x.y.}~-!| +|line|!-~.xy. is ${.xy.}~-!| +|line|!-~.x.y is ${.x.y}~-!| +|line|!-~x.y. is ${x.y.}~-!| +|line|!-~x..y is ${x..y}~-!| +|page|!-ParenVariablePage-!| +# + * Fetch that page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-ParenVariablePage-!|true|| +# + * Inspect the text to see if the variables were expressed properly. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|~xy. is 1~|true|| +|contents|~x.y is 2~|true|| +|contents|~.xy is 3~|true|| +|contents|~.x.y. is 4~|true|| +|contents|~.xy. is 5~|true|| +|contents|~.x.y is 6~|true|| +|contents|~x.y. is 7~|true|| +|contents|~x..y is 8~|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/properties.xml new file mode 100644 index 0000000000..629ea6806f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204154421 + + + + 1233783861431 + 7894600991634282977 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/content.txt new file mode 100644 index 0000000000..06e2d2af5c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/content.txt @@ -0,0 +1,61 @@ +!2 Test that variables can be defined as system properties + * If Fitnesse can not find a variable definition on any pages it will look to system properties. +---- +!3 Test a variable defined in system properties + +# + * Set a system property. +# +|System property setter fixture| +|key|value| +|xKey|xValue| +# + * Create a page that uses that property as a variable. +# +|script| +|start|Page Builder| +|line|!-xKey is ${xKey}-!| +|page|!-VariablePage-!| +# + * Fetch that page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-VariablePage-!|true|| +# + * Inspect the text to see if the variable was expressed. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|xKey is xValue|true|| + + +---- +!3 Test that a variable defined in a page supercedes one set in system properties + +# + * Set a system property. +# +|System property setter fixture| +|key|value| +|xKey|xValue| +# + * Create a page that defines the same variable and uses it. +# +|script| +|start|Page Builder| +|line|!-!define xKey {xValueFromPage}-!| +|line|!-xKey is ${xKey}-!| +|page|!-VariablePage-!| +# + * Fetch that page. +# +|Response Requester.| +|uri|valid?|contents?| +|!-VariablePage-!|true|| +# + * Inspect the text to see if the variable was expressed. +# +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|xKey is xValueFromPage|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/properties.xml new file mode 100644 index 0000000000..05026b23b3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/properties.xml @@ -0,0 +1,10 @@ + + + + 20090204154859 + + + + 1233784139519 + 6097975137540537166 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/content.txt new file mode 100644 index 0000000000..67851f0572 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/content.txt @@ -0,0 +1,6 @@ +!define BRACE ({) +!define BRACKET {[} +!define PAREN [(] + +|script| +|check|echo|${BRACE} ${BRACKET} ${PAREN}|{ [ (| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/content.txt new file mode 100644 index 0000000000..7e602fae1b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/content.txt @@ -0,0 +1,2 @@ +A WikiPagePath is a set of .FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.WikiWord elements seperated by dots. +e.g. '''!-FitNesse.UserGuide-!''' diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/properties.xml new file mode 100644 index 0000000000..04409d7e8c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210152 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/content.txt new file mode 100644 index 0000000000..4ed14b60ab --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/content.txt @@ -0,0 +1,3 @@ +A reference to a wiki page. A WikiPageReference can be a simple .FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.WikiWord, or it can be a WikiPagePath. + * A .FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.WikiWord is a word with no punctuation with capital letters as the word seperators. + * A WikiPagePath is a set of .FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.WikiWord elements separated by dots. diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/properties.xml new file mode 100644 index 0000000000..b9a6ff6d19 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135121 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/content.txt new file mode 100644 index 0000000000..4c7718d3d3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/content.txt @@ -0,0 +1 @@ +See .FitNesse.WikiWord diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/properties.xml new file mode 100644 index 0000000000..d07871eab4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210153 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/content.txt new file mode 100644 index 0000000000..584b8020fe --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/content.txt @@ -0,0 +1,2 @@ +!define TEST_SYSTEM {slim} +!contents -R1 -g \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/properties.xml new file mode 100644 index 0000000000..c7bf3d8fbf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/properties.xml @@ -0,0 +1,12 @@ + + + + + 20090321095127 + + + slim + + 1224951903697 + -9087830465292801545 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/content.txt new file mode 100644 index 0000000000..799b33682e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/content.txt @@ -0,0 +1,10 @@ +First setup the Authentication module. +!|Authenticator Setup| +|username|password|status?| +|Aladdin|open sesame|| + +Create a page to be requested. +!|Page creator.| +|Page name.|page attributes|valid?| +|ImporteePage |secure-read=true|true| +|ImporteePage.ChildPage||true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/properties.xml new file mode 100644 index 0000000000..e65381b8d8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/properties.xml @@ -0,0 +1,8 @@ + + + + 20060717210153 + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/content.txt new file mode 100644 index 0000000000..8a3c5d9b8f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/content.txt @@ -0,0 +1,14 @@ +!|scenario|import|importedPage|into|importingPage| +|check|request page|@importingPage?responder=import&remoteUrl=http://localhost:${INTERNAL_PORT}/@importedPage|200| + +!|scenario|Water mark and edit buttons should be on page|page| +|check|request page|@page|200| +|ensure|content matches|| +|ensure|content matches|Edit Locally| +|ensure|content matches|Edit Remotely| + +!|scenario|Water mark and edit buttons should not be on page|page| +|check|request page|@page|200| +|reject|content matches|| +|reject|content matches|Edit Locally| +|reject|content matches|Edit Remotely| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/SetUp/content.txt new file mode 100644 index 0000000000..21788eda64 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/SetUp/content.txt @@ -0,0 +1,5 @@ +!include + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/content.txt new file mode 100644 index 0000000000..b2ed7ebef2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/content.txt @@ -0,0 +1,52 @@ +!c !3 Importing pages can be configured to automatically update upon test. + +Create a page tree to be imported. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportedRoot|!contents |true | +|ImportedRoot.PageOne|page one |true | +|ImportedRoot.PageOne.ChildOne|child one |true | +|ImportedRoot.PageTwo|page two |true | + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the !-ImportingRoot-! page created above. +'''Auto Update is turned one''' +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&autoUpdate=0&remoteUrl=http://localhost:${INTERNAL_PORT}/ImportedRoot|true| + +We see all 3 pages imported. +!|Response Examiner| +|type|pattern|matches?| +|contents|3 pages were imported|true| + +Sleep a bit so that the last modification time actually changes. +|Sleep|1000| + +Change one of the imported pages. +!|Save Page Requester| +|uri |save contents|status!| +|ImportedRoot.PageOne?edit|Some ultra fresh content|303| + +Now lets run the Suite. +!|Response Requester.| +|uri |valid?| +|ImportingPage?suite|true| + +An import message is displayed in the test output. +!|Response Examiner| +|type|pattern|matches?|contents?| +|contents|Updating imported content...|true|| + +Looking at the imported copy of the modified page will reveal that it was indeed updated. +!|Response Requester.| +|uri |valid?| +|ImportingPage.PageOne|true| + +!|Response Examiner| +|type|pattern|matches?| +|contents|Some ultra fresh content|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/content.txt new file mode 100644 index 0000000000..1812ad1806 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/content.txt @@ -0,0 +1,18 @@ +!c !3 Can't Import From Secure Wiki +!define TEST_SYSTEM {slim} +!include CreateSecureWiki + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the secure wiki page. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:9123/ImporteePage|true| + +Since the wiki being imported is secure, the response will promt the user for credentials. +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|ImporteePage requires authentication|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/properties.xml new file mode 100644 index 0000000000..03d61cc43d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1229175050909 + 4429069674233144705 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/content.txt new file mode 100644 index 0000000000..024e2580ea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/content.txt @@ -0,0 +1,19 @@ +!c !3 Import From Secure Wiki With Credentials +!define TEST_SYSTEM {slim} + +!include CreateSecureWiki + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the secure wiki page. Credentials for accessing the remote wiki are included in the request. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:9123/ImporteePage&remoteUsername=Aladdin&remotePassword=open+sesame|true| + +The import should succeed just like normal. +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|1 page was imported|true|| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/properties.xml new file mode 100644 index 0000000000..19c9037fa9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1229175072272 + -7844670793563563311 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/content.txt new file mode 100644 index 0000000000..eedd3bcdb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/content.txt @@ -0,0 +1,41 @@ +!c !3 Importing Sample Wiki +The Wiki Import feature is triggered by requesting a wiki page along with two parameters: + * responder=import + * remoteUrl= + +e.g. !-http://localhost/ImportingPage?responder=import&remoteUrl=http://fitnesse.org/FitNesse-! + +The .FitNesse.SampleWiki page will be used by these tests. + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the !-SampleWiki-! page. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:${FITNESSE_PORT}/FitNesse.SampleWiki|true| + +The above request will initiate a chunked response where all the imported pages are listed. +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|ChildPageOne|true|| + +!|Response Examiner| +|type|pattern|matches?| +|contents|GrandChildPageOne|true| +|contents|GreatGrandChildPageOne|true| +|contents|ChildPageTwo|true| +|contents|GrandChildPageTwo|true| +|contents|ChildPageThree|true| + +All the pages that were import can now be retrieved. +!|Response Requester.| +|uri |valid?| +|ImportingPage.ChildPageOne|true| +|ImportingPage.ChildPageOne.GrandChildPageOne|true| +|ImportingPage.ChildPageOne.GrandChildPageOne.GreatGrandChildPageOne|true| +|ImportingPage.ChildPageTwo|true| +|ImportingPage.ChildPageTwo.GrandChildPageTwo|true| +|ImportingPage.ChildPageThree|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/properties.xml new file mode 100644 index 0000000000..8c10d56aa3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073138 + + + + 1229175098918 + -3185279582113091109 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/content.txt new file mode 100644 index 0000000000..3524a80f43 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/content.txt @@ -0,0 +1,30 @@ +!c !3 Importing Pages with Unicode Characters + +The .FitNesse.SampleWiki page will be used by these tests. + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the !-SampleWiki-! page. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:${FITNESSE_PORT}/FitNesse.SampleWiki|true| + +Make sure the unicode page was imported. +!|Response Examiner| +|type|pattern|matches?| +|contents|ChildWithUnicode|true| + +Load the imported unicode page. +!|Response Requester.| +|uri |valid?| contents?| +|ImportingPage.ChildWithUnicode|true|| + +The unicode should still be intact. +!|Response Examiner| +|type|pattern|matches?| +|contents|!-japanese: メインページ-!|true| +|contents|icelandic: Forsíða|true| +|contents|ukranian: !-Головна стаття-!|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/properties.xml new file mode 100644 index 0000000000..4876d36a75 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/properties.xml @@ -0,0 +1,10 @@ + + + + 20081105124028 + + + + 1225906828508 + 4343884691942306093 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/content.txt new file mode 100644 index 0000000000..f73d6fa38c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/content.txt @@ -0,0 +1,46 @@ +!c !3 Orphaned pages are removed. + +Create a page tree to be imported. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportedRoot|!contents |true | +|ImportedRoot.PageOne|page one |true | +|ImportedRoot.PageOne.ChildOne|child one |true | +|ImportedRoot.PageTwo|page two |true | + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the !-ImportingRoot-! page created above. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:${INTERNAL_PORT}/ImportedRoot|true| + +We see all 3 pages imported. +!|Response Examiner| +|type|pattern|matches?| +|contents|3 pages were imported|true| + +Now delete one of the pages from the imported root. +!|Response Requester.| +|uri |status?| +|ImportedRoot.PageOne?responder=deletePage&confirmed=yes|303| + +Importing again will shows only that that orphaned pages have been removed. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import|true| + +!|Response Examiner| +|type|pattern|matches?|contents?| +|contents|0 pages were imported|true|| + +!|Response Examiner| +|type|pattern|matches?| +|contents|2 orphaned pages were found and have been removed.|true| +|contents|Orphans:|true| +|contents|PageOne|true| +|contents|PageOne.ChildOne|true| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/properties.xml new file mode 100644 index 0000000000..ffffc4e483 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135125 + docs + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasImportForm/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasImportForm/content.txt new file mode 100644 index 0000000000..8c9e146bdf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasImportForm/content.txt @@ -0,0 +1,23 @@ +!c !3 Import Form on Properties Page +Users will initiate a Wiki Import by visiting the page that will do the importing. The properties view of the page will have a form where the user will supply the URL of the wiki to import and then click the Import button. + +First we need a page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +Request the properties view of this page. +!|Response Requester.| +|uri |valid?| +|ImportingPage?properties|true| + +Now lets look at the form. +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|Wiki Import.|true|| + +!|Response Examiner| +|type|pattern|matches?| +|contents|
        + + + 20081213073207 + + + + 1229175127339 + -5400251305088093012 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasUpdateForm/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasUpdateForm/content.txt new file mode 100644 index 0000000000..2b3cccc7f3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasUpdateForm/content.txt @@ -0,0 +1,28 @@ +!c !3 Import Update Form on Properties Page +Once a page has been updated, it no longer has the Wiki Import form. Instead is has a Wiki Import Update form. Essentially it is just one button that will update the imported pages. + +First we need a page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +Import the !-SampleWiki-!. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:${FITNESSE_PORT}/FitNesse.SampleWiki|true| + +Request the properties view of this page. +!|Response Requester.| +|uri |valid?| +|ImportingPage?properties|true| + +Now lets look at the form. +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|Wiki Import Update|true|| + +!|Response Examiner| +|type|pattern|matches?| +|contents| + + + 20081213073235 + + + + 1229175155084 + -2757044400059238608 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/content.txt new file mode 100644 index 0000000000..ea575a0d65 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/content.txt @@ -0,0 +1,55 @@ +!c !3 Unmodified Pages are not imported. + +Create a page tree to be imported. +!|Page creator. | +|Page name. |Page contents.|valid?| +|ImportedRoot |!contents |true | +|ImportedRoot.PageOne |page one |true | +|ImportedRoot.PageOne.ChildOne|child one |true | +|ImportedRoot.PageTwo |page two |true | + +Create an importing page. +!|Page creator. | +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the !-ImportingRoot-! page created above. +!|Response Requester. | +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:${INTERNAL_PORT}/ImportedRoot|true | + +We see all 3 pages imported. +!|Response Examiner | +|type |pattern |matches?| +|contents|3 pages were imported|true | + +Sleep a bit so that the last modification time actually changes. +|Sleep|1000| + +Importing again will show that no pages were imported since none had changed. +!|Response Requester. | +|uri |valid?| +|ImportingPage?responder=import|true | + +!|Response Examiner | +|type |pattern |matches?|wrapped html?| +|contents|0 pages were imported |true | | +|contents|3 pages were unmodified|true | | + +Now we'll update one of the imported pages... +!|Save Page Requester | +|uri |save contents|status!| +|ImportedRoot.PageOne?edit|3.141592 |303 | + +Importing again will shows only 1 page imported, 2 unchanged. +!|Response Requester. | +|uri |valid?| +|ImportingPage?responder=import|true | + +!|Response Examiner | +|type |pattern |matches?| +|contents|1 page was imported |true | +|contents|PageOne |true | +|contents|2 pages were unmodified|true | + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/properties.xml new file mode 100644 index 0000000000..2e383f08b7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1229175184444 + 1590348794266587059 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/content.txt new file mode 100644 index 0000000000..f6dfe79897 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/content.txt @@ -0,0 +1,38 @@ +!c !3 Updating an Imported Wiki +Once a wiki has been imported, the import can be updated. When updating the remoteUrl parameter is no longer needed. + +Create an importing page. +!|Page creator.| +|Page name. |Page contents.|valid?| +|ImportingPage|!contents |true | + +This !-ImportingPage-! will now import the !-SampleWiki-! page. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import&remoteUrl=http://localhost:${FITNESSE_PORT}/FitNesse.SampleWiki|true| + +Now we'll change the content of one of the local pages. +!|Save Page Requester| +|uri |save contents|status!|contents?| +|ImportingPage.ChildPageOne?edit|3.141592|303|| + +Update the imported wiki. +!|Response Requester.| +|uri |valid?| +|ImportingPage?responder=import|true| + +The !-ChildPageOne-! page will be listed. +!|Response Examiner| +|type|pattern|matches?|wrapped html?| +|contents|0 pages were imported|true|| + +When we view !-ChildPageOne-!... +!|Response Requester.| +|uri |valid?| +|ImportingPage.ChildPageOne|true| + +We'll see the changed content since the page on the server was not modified. +!|Response Examiner| +|type|pattern|matches?| +|contents|child page one|false| +|contents|3.141592|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/properties.xml new file mode 100644 index 0000000000..3ccbaafe20 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073331 + + + + 1229175211723 + -6587953256246175028 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/content.txt new file mode 100644 index 0000000000..9c44e49579 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/content.txt @@ -0,0 +1,11 @@ +!|script| +|given page|ImportingPage| +|given page|ImportedPage| +|given page|ImportedPage.ImportedChild| +|import|ImportedPage|into|ImportingPage| +|Water mark and edit buttons should be on page|ImportingPage.ImportedChild| +|| +|Water mark and edit buttons should not be on page|ImportingPage| +|Water mark and edit buttons should not be on page|ImportedPage| +|Water mark and edit buttons should not be on page|ImportedPage.ImportedChild| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/properties.xml new file mode 100644 index 0000000000..0179324c5f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238349003304 + 2669078479729799561 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/content.txt new file mode 100644 index 0000000000..472c78caa4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/content.txt @@ -0,0 +1,10 @@ +!c !3 Wiki Import Suite +Wiki Import is a key feature for development teams. It allows each developer to have their own FitNesse playground to run tests on the code they're playing with while sharing the test definitions with a central repository. A test author need only write a test once and all the developers will be able to import that test to their local environment. + +Wiki Import is meant to replace the existing Virtual Wiki feature. + +!note make sure to define PORT {80} in root. + +!contents + +!define TEST_SYSTEM {slim} diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/properties.xml new file mode 100644 index 0000000000..bfef2414f1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/content.txt new file mode 100644 index 0000000000..712d223c45 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/content.txt @@ -0,0 +1,54 @@ +!2 Every wiki page displays a series of links (breadcrumbs) to the ancestors of the current page. + * The last breadcrumb should name the current page without a link. +!3 Test top level page + * Create a top level page +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-TopLevelPage-!|top level page||true| + + * Request the page. +|Response Requester.| +|uri|valid?|contents?| +|!-TopLevelPage-!|true|| + + * Examine the requested page to be sure the link to itself is displayed. +!|Response Examiner.| +|type|pattern|matches?| +|contents|TopLevelPage|true| + +!3 A second level page - the top level should link up, the current page should not link. + * Create a top level page +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-TopLevelPage.SecondLevelPage-!|second level page||true| + + * Request the page. +|Response Requester.| +|uri|valid?|contents?| +|!-TopLevelPage.SecondLevelPage-!|true|| + + * Examine the requested page to be sure the link to itself is displayed. +!|Response Examiner.| +|type|pattern|matches?| +|contents|TopLevelPage.|true| +|contents|SecondLevelPage|true| + +!3 A second level page - the top four levels should link up, the current page should not link. + * Create a fifth level page +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-TopLevelPage.SecondLevelPage.ThirdLevelPage.FourthLevelPage.FifthLevelPage-!|fifth level page||true| + + * Request the page. +|Response Requester.| +|uri|valid?|contents?| +|!-TopLevelPage.SecondLevelPage.ThirdLevelPage.FourthLevelPage.FifthLevelPage-!|true|| + + * Examine the requested page to be sure the link to itself is displayed. +!|Response Examiner.| +|line|inOrder?| +|TopLevelPage.|true| +|SecondLevelPage.|true| +|ThirdLevelPage.|true| +|FourthLevelPage.|true| +|
        FifthLevelPage|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/properties.xml new file mode 100644 index 0000000000..53dc3dbfa2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073444 + + + + 1229175284140 + -3891867006271891204 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/content.txt new file mode 100644 index 0000000000..760788a355 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/content.txt @@ -0,0 +1,49 @@ +!2 This page tests !-PageHeader and PageFooter-! + * The contents of the !-PageHeader-! should appear at the start of every page. Likewise the contents of !-PageFooter-! should appear at the end of every page. + * Sub pages inherit the headers and footers of their parent, unless they have !-PageHeader-! and !-PageFooter-! siblings. +!3 Test normal header and footer without sub pages. + * First create a normal page, plus header and footer pages. +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalPage-!|normal||true| +|!-PageHeader-!|header||true| +|!-PageFooter-!|footer||true| + * Then request the normal page +|Response Requester.| +|uri|valid?| +|!-NormalPage-!|true| + * Ensure that the header and and footer text appear in the normal page. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(header).*(normal).*(footer)-!|true|| +---- +!3 Test that sub pages inherit headers and footers. + * Create a sub page +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalPage.SubPage-!|sub page||true| + * Then request the Sub page +|Response Requester.| +|uri|valid?| +|!-NormalPage.SubPage-!|true| + * Ensure that the header and and footer text are inherited by the sub page. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(header).*(sub page).*(footer)-!|true|| +---- +!3 Test that sub headers and sub footers override inherited headers and footers. + * Create sub header and sub footer +|Page creator.| +|Page name.|Page contents.|Page attributes.|valid?| +|!-NormalPage.PageHeader-!|sub header||true| +|!-NormalPage.PageFooter-!|sub footer||true| + * Then request the Sub page +|Response Requester.| +|uri|valid?| +|!-NormalPage.SubPage-!|true| + * Ensure that the sub header and and sub footer text are inherited override their parents.. +|Response Examiner.| +|type|pattern|matches?|wrapped html?| +|contents|!-(sub header).*(sub page).*(sub footer)-!|true|| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/properties.xml new file mode 100644 index 0000000000..1a50247b13 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073520 + + + + 1229175320843 + -5730101293875182094 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/content.txt new file mode 100644 index 0000000000..39b73d5995 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/content.txt @@ -0,0 +1,27 @@ +!3 Each page has links in the left rail. This test verifies the default set of links. + +Create a page. +|Page creator.| +|Page name.|Page contents.|valid?| +|!-SomePage-!|any page at all|true| + +Request the page +|Response Requester.| +|uri|valid?|contents?| +|!-SomePage-!|true|| + +Examine the requested page to ensure the correct links are displayed in the correct order. +!|Response Examiner.| +|line|inOrder?| +|
        |true| +|Edit|true| +|Properties|true| +|Refactor|true| +|Where Used|true| +|Search|true| +|Files|true| +|Versions|true| +|Recent Changes|true| +|User Guide|true| +|
        |true| +|
        |true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/properties.xml new file mode 100644 index 0000000000..3bd5171053 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073551 + + + + 1229175351546 + -4501338062287278289 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/content.txt new file mode 100644 index 0000000000..777b7b62b8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/content.txt @@ -0,0 +1,28 @@ +!3 If the Suite attribute is set to true, the Suite button should show up on top with a break between it and the other action buttons. + +Create a suite page. +|Page creator.| +|Page name.|Page contents.|page attributes|valid?| +|!-SomePage-!|any page at all|Suite=true|true| + +Request the page +|Response Requester.| +|uri|valid?|contents?| +|!-SomePage-!|true|| + +Examine the requested page to ensure the correct links are displayed in the correct order. +!|Response Examiner.| +|line|inOrder?| +|
        |true| +|Suite|true| +|Edit|true| +|Properties|true| +|Refactor|true| +|Where Used|true| +|Search|true| +|Files|true| +|Versions|true| +|Recent Changes|true| +|User Guide|true| +|
        |true| +|
        |true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/properties.xml new file mode 100644 index 0000000000..d08c98669e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073613 + + + + 1229175373086 + -8968734420492115848 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/content.txt new file mode 100644 index 0000000000..cbd3b3d611 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/content.txt @@ -0,0 +1,28 @@ +!3 If the Test attribute is set to true, the Test button should show up on top with a break between it and the other action buttons. + +Create a test page. +|Page creator.| +|Page name.|Page contents.|page attributes|valid?| +|!-SomePage-!|any page at all|Test=true|true| + +Request the page +|Response Requester.| +|uri|valid?|contents?| +|!-SomePage-!|true|| + +Examine the requested page to ensure the correct links are displayed in the correct order. +!|Response Examiner.| +|line|inOrder?| +|
        |true| +|Test|true| +|Edit|true| +|Properties|true| +|Refactor|true| +|Where Used|true| +|Search|true| +|Files|true| +|Versions|true| +|Recent Changes|true| +|User Guide|true| +|
        |true| +|
        |true| diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/properties.xml new file mode 100644 index 0000000000..ccb7edc1f2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/properties.xml @@ -0,0 +1,10 @@ + + + + 20081213073634 + + + + 1229175394179 + -5519690890382735370 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/content.txt new file mode 100644 index 0000000000..9946b06128 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/content.txt @@ -0,0 +1,3 @@ +Tests for components that are displayed on every wiki page. + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/properties.xml new file mode 100644 index 0000000000..04fada3f7d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210157 + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/content.txt new file mode 100644 index 0000000000..58bb80fe87 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/content.txt @@ -0,0 +1,3 @@ +---- +|tear down| + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/properties.xml new file mode 100644 index 0000000000..05722f3a3f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/properties.xml @@ -0,0 +1,11 @@ + + + + + + + + + 1224951822819 + -6503696846980252314 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/content.txt new file mode 100644 index 0000000000..71b73cb282 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/content.txt @@ -0,0 +1,31 @@ +!2 ''!-FitNesse-! acceptance tests suites'' +|>SuiteWidgetTests|''Specify the markup language of wiki pages.''| +|>SuiteWikiPageResponderTests|''Specify general behavior of all wiki pages.''| +|>SuiteEditResponderTests|''Specify the behavior of edit requests.''| +|>SuiteResponderTests|''Specify the behavior of the responders.''| +|>SuiteVirtualWikiTests|''Demonstrate the behavior of virtual wikis''| +|>SuiteWikiImportTests|''Specify the behavior of the Wiki Import feature''| +|>SuiteAuthenticationTests|''Specify the authentication design''| +|>SuiteFixtureTests|''Specify the behavior of various fixtures''| +|>SuiteSymbolicLinkTests|''Demonstrate usage and behavior of symbolic links''| +|>SuiteFitDecoratorTests|''Demonstrate usage and behavior of Fit Decorators''| +|>SuiteSlimTests|''Slim Specific Tests''| +|>SuiteTestHistory|''Test History tests''| + +!2 ''Classpaths'' +!path classes +!path lib/*.jar +---- +!2 ''Port'' +FitNesse is running on port: ${FITNESSE_PORT} +!define INTERNAL_PORT {9123} +---- +!2 ''Utilities'' + * SuiteAcceptanceTests.PageHeader + * SuiteAcceptanceTests.PageFooter + * SuiteAcceptanceTests.SetUp + * SuiteAcceptanceTests.TearDown +---- +!2 Collapse Set Up and Tear Down +!define COLLAPSE_SETUP {true} +!define COLLAPSE_TEARDOWN {true} diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/properties.xml new file mode 100644 index 0000000000..636ccc619e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTests/properties.xml @@ -0,0 +1,12 @@ + + + + + + + + + + 1228834237169 + -6459613553884691275 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/content.txt new file mode 100644 index 0000000000..d0aa247c82 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/content.txt @@ -0,0 +1,30 @@ +!2 ''!-FitNesse-! acceptance tests suites'' +|^SuiteWidgetTests|''Specify the markup language of wiki pages.''| +|^SuiteWikiPageResponderTests|''Specify general behavior of all wiki pages.''| +|^SuiteEditResponderTests|''Specify the behavior of edit requests.''| +|^SuiteResponderTests|''Specify the behavior of the responders.''| +|^SuiteVirtualWikiTests|''Demonstrate the behavior of virtual wikis''| +|^SuiteWikiImportTests|''Specify the behavior of the Wiki Import feature''| +|^SuiteAuthenticationTests|''Specify the authentication design''| +|^SuiteFixtureTests|''Specify the behavior of various fixtures''| +|^SuiteTestRunnerTests|''Describe the behavior of the command line test runner''| +|^SuiteSymbolicLinkTests|''Demonstrate usage and behavior of symbolic links''| + +!2 ''Classpaths'' +!path fitnesse.jar +---- +!2 ''Port'' +!define PORT {8082} +---- +!2 ''Utilities'' + * SuiteAcceptanceTests.PageHeader + * SuiteAcceptanceTests.PageFooter + * SuiteAcceptanceTests.SetUp + * SuiteAcceptanceTests.TearDown +---- +!2 Collapse Set Up and Tear Down +!define COLLAPSE_SETUP {true} +!define COLLAPSE_TEARDOWN {true} +---- +!2 ''Contents'' +!contents -R diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/properties.xml new file mode 100644 index 0000000000..71b8215dd3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717210200 + + + + + + + + 1114462430133 + 6780773820115907 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/content.txt new file mode 100644 index 0000000000..8669729214 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/content.txt @@ -0,0 +1,3885 @@ +!- + +
        + +

        Fit Specification: Fixtures

        + +

         

        + +

        Fit documents are owned by the customers +and domain experts on your team.  The documents +contain examples of how the program should +work and Fit checks +the examples against the actual program.  The examples are placed +in tables with a special first row, but other +than that, there are no limitations on how the examples are structured.  Customers should write tables in the way that +comes most naturally to them.

        + +

         

        + +

        Since there aren’t any limits to the way +tables are structured, Fit can’t +interpret the tables automatically.  It requires a fixture to interpret the +table.  A fixture is a piece +of code, written by the team’s programmers, +that understands the structure of each +type of table and how to check +it against the actual program.

        + +

         

        + +

        Contents:

        + +

         

        + +

        Loading +Fixtures. 1

        + +

        Errors. 2

        + +

        Interpreting +Tables. 2

        + +

        Default +Interpretation. 3

        + +

        Checking +Cells. 4

        + +

        Right +and Wrong. 4

        + +

        Empty +Cells. 4

        + +

        Unexpected +Errors. 4

        + +

        Expected +Errors. 5

        + +

        Expected +Blank. 5

        + +

        Cell +HTML Converts to Text 6

        + +

        Comparison +Values Convert to HTML. 6

        + +

        Type +Conversion.. 7

        + +

        HTML +to Text Conversion. 7

        + +

        Type +Conversion. 7

        + +

        Predefined +Fixtures. 7

        + +

        Run +Results. 8

        + +

         

        + +

        Loading Fixtures

        + +

         

        + +

        The first row of a table is always the name of the fixture used to interpret +that table.  There’s no special +logic applied; if the first cell +in the first row is not the correct +fixture name, Fit won’t try to guess where it is.  (Note: we use the keyword “(missing)” to indicate +a missing fixture name in the table below.)

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.FixtureNameFixture

        +
        +

         

        +
        +

        Table

        +
        +

        FixtureName()

        +
        +

        [exampleFixture]

        +
        +

        exampleFixture

        +
        +

        [exampleFixture]

        +

        [1] [2]

        +

        [3] [4]

        +
        +

        exampleFixture

        +
        +

        [] [exampleFixture]

        +
        +

        (missing) 

        +
        +

        [exampleFixture] [foo]

        +
        +

        exampleFixture

        +
        +

        []

        +

        [exampleFixture]

        +
        +

        (missing)

        +
        + +

         

        + +

        The fixture name is the full name of the code +that will interpret the table.  (In Java, +it’s a class.)  +The fixture name is case sensitive and +must be fully qualified (that is, include any +namespace information).  All implementations of Fit use the “dot” +notation of Java to qualify names.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.FixtureLoadFixture

        +
        +

         

        +
        +

        FixtureName

        +
        +

        LoadResult()

        +
        +

        fat.ExampleFixture

        +
        +

        loaded

        +
        +

        fat.exampleFixture

        +
        +

        error

        +
        +

        Fat.ExampleFixture

        +
        +

        error

        +
        +

        ExampleFixture

        +
        +

        error

        +
        +

        fat.Example

        +
        +

        error

        +
        + +

         

        + +

        Errors

        + +

         

        + +

        When the fixture isn’t valid, Fit annotates the cell +with an explanatory error message.  What +makes something a fixture or not depends on which +implementation of Fit you’re using.  In +Java, for example, only classes that extend +the “Fixture” class are fixtures.  Other languages might use the presence +of specific +methods to determine whether something is a fixture or not.

        + +

         

        + +

        This error message may be displayed as part of additional information, such +as an exception stack +trace.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.FixtureLoadFixture

        +
        +

         

        +
        +

         

        +
        +

        FixtureName

        +
        +

        LoadResult()

        +
        +

        ErrorMessage()

        +
        +

        fat.ExampleFixture

        +
        +

        loaded

        +
        +

        (none)

        +
        +

        NoSuchFixture

        +
        +

        error

        +
        +

        The fixture + "NoSuchFixture" was not found.

        +
        +

        fat.NotAFixture

        +
        +

        error

        +
        +

        "fat.NotAFixture” + was found, but it’s not a fixture.

        +
        + +

         

        + +

        Case-sensitivity errors use the same error message as other “not found” +errors.

        + +

         

        + + + + + + + + + + + + + + + + + +
        +

        fat.FixtureLoadFixture

        +
        +

         

        +
        +

         

        +
        +

        FixtureName

        +
        +

        LoadResult()

        +
        +

        ErrorMessage()

        +
        +

        fat.exampleFixture

        +
        +

        error

        +
        +

        The fixture "fat.exampleFixture" was not found.

        +
        + +

         

        + +

         

        + +

         

        + +

        NOTE TO IMPLEMENTORS:

        + +

        The remainder of this document is incomplete.  The above examples should pass.  Don’t try to make any of the following +examples pass, as they will surely change.

        + +

         

        + +

        Interpreting Tables

        + +

         

        + +

        By default, fixtures interpret tables from left to right and top to bottom.

        + +

         

        + + + + + + + + + + + + + + +
        +

        fat.InterpretationOrderFixture

        +
        +

         

        +
        +

        Table

        +
        +

        InterpretationOrder()

        +
        +

        [fat.ConcatenateFixture]

        +

        [top left] [top middle] [top right]

        +

        [bottom left] [bottom middle] [bottom right]

        +
        +

        top left, top middle, top right, bottom left, bottom middle, bottom right

        +
        + +

         

        + +

        Although left-to-right and top-to-bottom is the default, fixtures may +interpret tables in any order they please.  +The fixture in the following example interprets tables column +by column, from right to left and top to +bottom.

        + +

         

        + + + + + + + + + + + + + + +
        +

        fat.InterpretationOrderFixture

        +
        +

         

        +
        +

        Table

        +
        +

        InterpretationOrder()

        +
        +

        [fat.ReverseConcatenateFixture]

        +

        [top left] [top middle] [top right]

        +

        [bottom left] [bottom middle] [bottom right]

        +
        +

        top right, bottom right, top middle, bottom middle, top left, bottom left

        +
        + +

         

        + +

        Default Interpretation

        + +

         

        + +

        Fit’s default interpretation of a cell +is to mark it with the “ignore” standard annotation.  (See the annotation +specification for details about standard annotations.)

        + +

         

        + + + + + + + + + + + + + + + + + +
        +

        fat.InterpreterFixture

        +
        +

         

        +
        +

         

        +
        +

        InputTable

        +
        +

        InterpretedTable()

        +
        +

        RenderedOutput()

        +
        +

        [fat.DoNothingFixture]

        +

        [left] [right]

        +
        +

        <table>

        +

          + <tr><td>fat.DoNothingFixture</td></tr>

        +

          <tr><td bgcolor="#efefef">left</td><td + bgcolor="#efefef">right</td></tr>

        +

        </table>

        +
        +

         

        +
        + +

         

        + +

        If an error occurs +while interpreting a cell, Fit marks it with +the “error” annotation and includes whatever +error information is available.  (In +Java, this is a stack trace.)

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + +
        +

        ??

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        + +

         

        + +

        Fixtures may override the default interpretation and do whatever they +wish.  The fixture in the following +example marks all cells with the “right” +standard annotation unless an error occurs, +in which case +it is marked with the “ignore” standard annotation.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + +
        +

        ??

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        + +

         

        + +

        Checking +Cells

        + +

         

        + +

        Fit provides a standard service +for checking +a table cell’s correctness.  Given a table cell +and a value, Fit compares the two and annotates +the cell accordingly.  (This section +assumes that the comparison value is a +string.  See “Type Conversion,” below, +for information about what happens when it’s not.)

        + +

         

        + +

        Right and Wrong

        + +

         

        + +

        When the table cell and the +comparison value match, +Fit marks the cell “right” using a standard +annotation.  (See the annotation specification for more about standard +annotations.)

        + +

         

        + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        <td>Something</td>

        +
        +

        Something

        +
        +

        right

        +
        + +

         

        + +

        When they don’t match, Fit +marks the cell wrong and includes +the comparison value.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Expected()

        +
        +

        Actual()

        +
        +

        <td>Something</td>

        +
        +

        Something else

        +
        +

        wrong

        +
        +

        Something

        +
        +

        Something else

        +
        + +

         

        + +

        Empty Cells

        + +

         

        + +

        If the table cell is empty, +Fit uses the “info” standard annotation to put the comparison +value in the cell.

        + +

         

        + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Info()

        +
        +

        <td></td>

        +
        +

        Anything

        +
        +

        info

        +
        +

        Anything

        +
        + +

         

        + +

        Unexpected +Errors

        + +

         

        + +

        If an error occurs +while comparing the table cell +to the fixture’s value, Fit uses the “error” standard annotation to put +information about the error into the table.  +If a stack trace +or similar information is available, it is included.

        + +

         

        + +

        The following examples use the keyword “(causes +error)” in the “ComparisonValue” column to +indicate that an error occurs.

        + +

         

        + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        <td>something</td>

        +
        +

        (causes error)

        +
        +

        error

        +
        + +

         

        + +

        If the table cell is empty, +Fit uses the “info” standard annotation to put the word “error” into the +table.  No error information (such +as a stack trace) +is included.

        + +

         

        + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Info()

        +
        +

        <td></td>

        +
        +

        (causes error)

        +
        +

        info

        +
        +

        error

        +
        + +

         

        + +

        Expected +Errors

        + +

         

        + +

        If the table cell contains +the word “error,” Fit assumes that an error was expected.  If an error occurs, +Fit marks the cell right.  If it doesn’t, Fit marks the cell +wrong.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Expected()

        +
        +

        Actual()

        +
        +

        <td>error</td>

        +
        +

        (causes error)

        +
        +

        right

        +
        +

        n/a

        +
        +

        n/a

        +
        +

        <td>error</td>

        +
        +

        Anything

        +
        +

        wrong

        +
        +

        error

        +
        +

        Anything

        +
        + +

         

        + +

        Expected +Blank

        + +

         

        + +

        Fit does not support +a standard “blank” keyword similar to the “error” keyword.  (Although the following example uses a +“(blank)” keyword to indicate a blank comparison +value, this keyword was programmed as part of fat.CheckFixture +and is not a standard part of Fit.)

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Expected()

        +
        +

        Actual()

        +
        +

        Info()

        +
        +

        <td>blank</td>

        +
        +

        (blank)

        +
        +

        wrong

        +
        +

        blank

        +
        +

        (blank)

        +
        +

        n/a

        +
        +

        <td>blank</td>

        +
        +

        Anything

        +
        +

        wrong

        +
        +

        blank

        +
        +

        Anything

        +
        +

        n/a

        +
        +

        <td></td>

        +
        +

        (blank)

        +
        +

        info

        +
        +

        n/a

        +
        +

        n/a

        +
        +

        (blank)

        +
        +

        <td></td>

        +
        +

        Anything

        +
        +

        info

        +
        +

        n/a

        +
        +

        n/a

        +
        +

        Anything

        +
        + +

         

        + +

        If a fixture wishes to allow blank values, it must handle +this on its own.  A common +approach is for the fixture to look for blank +results and to convert them into a special +keyword, such as “(blank)” or “(none)”.  Use this keyword in the table when a blank +result is expected.

        + +

         

        + +

        Cell HTML Converts to Text

        + +

         

        + +

        The contents of the cell +are converted from HTML to text as described +in the parsing specification.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Expected()

        +
        +

        Actual()

        +
        +

        <td><i>anything</i></td>

        +
        +

        anything

        +
        +

        right

        +
        +

        n/a

        +
        +

        n/a

        +
        +

        <td><i>anything</i></td>

        +
        +

        <i>anything</i>

        +
        +

        wrong

        +
        +

        anything

        +
        +

        <i>anything</i>

        +
        +

        <td>&lt;i>anything&lt;/i></td>

        +
        +

        <i>anything</i>

        +
        +

        right

        +
        +

        n/a

        +
        +

        n/a

        +
        +

        <td>&lt;i>anything&lt;/i></td>

        +
        +

        anything

        +
        +

        wrong

        +
        +

        <i>anything</i>

        +
        +

        anything

        +
        + +

         

        + +

        This conversion applies to +blank cells and the “error” keyword as well.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.CheckFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Cell

        +
        +

        ComparisonValue

        +
        +

        Annotation()

        +
        +

        Info()

        +
        +

        <td>&nbsp;</td>

        +
        +

        anything

        +
        +

        info

        +
        +

        anything

        +
        +

        <td><font color="red">error</font></td>

        +
        +

        (causes error)

        +
        +

        right

        +
        +

        n/a

        +
        + +

         

        + +

        Comparison Values Convert to HTML

        + +

         

        + +

        When a comparison value is +used in an annotation, it’s converted to HTML +as described in the annotations +specification.  See that section for +examples.

        + +

         

        + +

        Type Conversion

        + +

         

        + +

        (to do)

        + +

         

        + +

        Converting strings to objects

        + +

        Converting objects to strings

        + +

        Comparing objects

        + +

         

        + +

        Predefined Fixtures

        + +

         

        + +

        Fit includes several predefined +fixtures.  Each +fixture is described in a separate document, +shown in the table below.

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.ReferenceFixture

        +
        +

         

        +
        +

         

        +
        +

        Description

        +
        +

        Location

        +
        +

        Result()

        +
        +

        Primitive Fixture

        +
        +

        primitive-fixture.html

        +
        +

         

        +
        +

        Column Fixture

        +
        +

        column-fixture.html

        +
        +

         

        +
        +

        Row Fixture

        +
        +

        row-fixture.html

        +
        +

         

        +
        +

        Action Fixture

        +
        +

        action-fixture.html

        +
        +

         

        +
        +

        Summary Fixture

        +
        +

        summary-fixture.html

        +
        +

         

        +
        + +

         

        + +

        Run Results

        + +

         

        + + + + + +
        +

        fit.Summary

        +
        + +

         

        + +

         

        + +

         

        + +

         

        + +

         

        + +

        (to do)

        + +

         

        + +

        Be sure to include right, wrong, exception, +and ignore counts in ‘check’ +discussion

        + +

         

        + +

         

        + +
        + +
        + +
        + +

        Check

        + +

        Expected values specified +in cells are tested for equality with actual +values extracted from the program under test.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Equals

        +
        +

        type

        +
        +

        x

        +
        +

        y

        +
        +

        =

        +
        +

        boolean

        +
        +

        true

        +
        +

        TRUE

        +
        +

        true

        +
        +

        integer

        +
        +

        00001

        +
        +

        1

        +
        +

        true

        +
        +

        real

        +
        +

        1000

        +
        +

        1e3

        +
        +

        true

        +
        +

        string

        +
        +

        abc

        +
        +

        ABC

        +
        +

        false

        +
        +

        string

        +
        +

        a b c

        +
        +

        a b c

        +
        +

        true

        +
        + +

        A sequence of values can +be entered and checked +as a single (composite) value.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Equals

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        type

        +
        +

        x

        +
        +

        y

        +
        +

        =

        +
        +

        integers

        +
        +

        1, 3, 5

        +
        +

        01,03,05

        +
        +

        true

        +
        +

        integers

        +
        +

        1, 3, 5

        +
        +

        01,05,03

        +
        +

        false

        +
        +

        booleans

        +
        +

        true, true, false

        +
        +

        true, false

        +
        +

        false

        +
        +

        strings

        +
        +

        a , b , c

        +
        +

        a,b,c

        +
        +

        true

        +
        + +

        Domain values can be constructed +from cell contents. +Equality comparisons will be subject +to appropriate domain rules (i.e. delegated to the domain objects.) +

        + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Equals

        +
        +

        type

        +
        +

        x

        +
        +

        y

        +
        +

        =

        +
        +

        date

        +
        +

        Jan 1, 1995

        +
        +

        January 1, 1995

        +
        +

        true

        +
        +

        money

        +
        +

        $10000

        +
        +

        $10,000.00

        +
        +

        true

        +
        + +

        Floating point numbers are checked +to the precision that is normal in the host +language. It is possible for a domain object +to infer precision from the string +representation of expected values. For +example, [?]ScientificDouble +checks +equality to the precision implied by the +number of significant digits in a value.

        + +

        ·         +non-zeros -- 123.45 is 5 digits

        + +

        ·         +zeros between non-zeros -- 100003 is 6 digits

        + +

        ·         +zeros in the fraction +part -- 12.20 is 4 digits

        + +

        ·         +but not leading zeros -- 0001000 is 4 digits

        + +

        ·         +and not exponent digits -- 6.02e23 is 3 digits

        + +

        ·         +left argument (receiver) +controles precision +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Equals

        +
        +

        type

        +
        +

        x

        +
        +

        y

        +
        +

        =

        +
        +

        real

        +
        +

        123.45

        +
        +

        123.449

        +
        +

        false

        +
        +

        scientific +

        +
        +

        123.45

        +
        +

        123.449

        +
        +

        true

        +
        +

        scientific +

        +
        +

        100003

        +
        +

        100003.1

        +
        +

        true

        +
        +

        scientific +

        +
        +

        100003.1

        +
        +

        100003

        +
        +

        false

        +
        +

        scientific +

        +
        +

        12.20

        +
        +

        12.210

        +
        +

        false

        +
        +

        scientific +

        +
        +

        12.21

        +
        +

        12.210

        +
        +

        true

        +
        + +

        Improperly specified values may throw exceptions +which are reported in the cell +that contains the invalid number. Improper +value detection is only as good as would be +expected in the host language. (We are +assuming that incorrectly +converted values will lead to detected +errors elsewhere.)

        + +

        ·         +xyz is not an integer

        + +

        ·         +10000000000000000000000000 may or may not be an +integer

        + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Table

        +
        +

        fat.Equals

        +
        +

         

        +
        +

        type

        +
        +

        x

        +
        +

        integer

        +
        +

        200

        +
        +

        integer

        +
        +

        xyz

        +
        + +

         

        + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Color

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        yellow

        +
        + +

        Some character +strings have special meaning outside of type conversion. +

        + +

        ·         +blank -- omit check, +report value (reported in gray letters)

        + +

        ·         +error -- expect +an error

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Table

        +
        +

        fat.Divide

        +
        +

         

        +
        +

         

        +
        +

        x

        +
        +

        y

        +
        +

        divide()

        +
        +

        100

        +
        +

        2

        +
        +

        50

        +
        +

        100

        +
        +

        2

        +
        +

         

        +
        +

        100

        +
        +

        0

        +
        +

        error

        +
        +

        100

        +
        +

        0

        +
        +

         

        +
        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.Color

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        white

        +
        +

        green

        +
        +

        white

        +
        +

        white

        +
        +

        gray/white

        +
        +

        white

        +
        +

        white

        +
        +

        green

        +
        +

        white

        +
        +

        white

        +
        +

        gray/white

        +
        + +

        The framework looks for parse support in different places. +

        + +

        ·         +fixture

        + +

        ·         +domain object

        + +

        ·         +type adapter

        + +

        The framework will allow fixtures to implement custom +parsing.

        + +

        ·         +yea = true

        + +

        ·         +nay = false

        + +
        + +
        + +
        + +

        Fixture

        + +

        By default cells are processed +in order, by table, by row within tables, and by cell +within rows. Distinct routines handle sequencing +(plural) and interpretation (singular).

        + +

        ·         +doTables -- sequence +tables within a document

        + +

        ·         +doTable -- interpret a table

        + +

        ·         +doRows -- sequence +rows within a table

        + +

        ·         +doRow -- interpret a row

        + +

        ·         +doCells -- sequence +cells within a row

        + +

        ·         +doCell -- interpret a row

        + +

        The default interpretation of a cell is to +mark it as ignored.

        + +

        Cells contain givens or expected +results. The fixture is responsible for distinguishing givens from expected +results, checking +expected results against actuals, +and indicating the result with the background +annotation as follows.

        + +

        ·         +white -- no check +wanted (blank input)

        + +

        ·         +green -- right: expected +equals actual

        + +

        ·         +red -- wrong: expected +not equal actual

        + +

        ·         +yellow -- exception: +trouble computing actual +or comparing result

        + +

        ·         +gray -- ignore: desired check +not possible

        + +

        Fixtures cooperate to count +the number of each result.

        + +

        ·         +counts accumulate +between tables

        + +

        ·         +counts are +summarized as "# right, # wrong, # exceptions, +# ignores".

        + +

        ·         +runner fixtures (e.g. AllFiles) can +control accumulation +of counts

        + +

        Fixtures cooperate to accumulate +state that can be summarized at any point in +the processing of a document. +

        + +

        ·         +state variables

        + +

        ·         +state lifetime

        + +

        ·         +state summary

        + +
        + +
        + +
        + +

        PrimitiveFixture +

        + +

        The primitive fixture does not depend on TypeAdapter. Type specific +functions handle all checking. +

        + +

        ·         +checkBoolean +

        + +

        ·         +checkInteger +

        + +

        ·         +checkFloat +

        + +

        ·         +checkString +

        + +
        + +
        + +
        + +

        ColumnFixture +

        + +

        A column fixture distinguishes givens from +expected values by the form of the column +head.

        + +

        ·         +name is setter or field

        + +

        ·         +name() is getter or field

        + +

        ·         +camel case +-- present value ( ) = presentValue()

        + +

        ·         +deprecate execute() +

        + +
        + +
        + +
        + +

        RowFixture +

        + +

        A row fixture expects all rows to be expected +values. The fixture is assumed to have access +to actual rows which +it pairs with expected rows.

        + +

        ·         +name is field or getter

        + +

        ·         +name() is getter

        + +

        ·         +camel case +

        + +

        Rows are matched by comparing +just enough values from the left most columns +to get a unique match.

        + +

        ·         +some given, none actual +-- missing row

        + +

        ·         +none given, some actual +-- surplus rows

        + +

        ·         +one given, one actual +-- check +remaining columns

        + +

        ·         +many given, many actual +-- match on more columns +

        + +

        Missing and surplus rows are marked as such +in their first column

        + +

        ·         +each counts +as one wrong

        + +

        ·         +surplus rows added to table in gray

        + +
        + +
        + +
        + +

        ActionFixture +

        + +

        An action fixture distinguishes given from +expected values based on keywords in the first +column.

        + +

        ·         +enter -- put given in setter or field

        + +

        ·         +check +-- check +value with getter or field

        + +

        ·         +press -- call action +(no check +other than for execptions)

        + +

        ·         +start -- new actor +

        + +

        An actor represents some interface +state such as the currently +active window. The actor +gives meaning to many of the words in the second +column (field to be entered and buttons to be +pressed).

        + +

        ·         +actor persists +between tables

        + +

        ·         +initial actor +is action fixture (subclass) +itself

        + +

        ·         +start with no argument specifies +initial actor

        + +

        Start could have various meanings depending +on the nature of the interface being modeled.

        + +

        ·         +create a new actor +

        + +

        ·         +return to an existing actor +

        + +

        Other actions, like press, can +change the current +actor.

        + +

        ·         +replace the current +actor with a new actor +

        + +

        ·         +replace the current +actor with another preexisting actor +

        + +

        ·         +restore the previous actor +

        + +

        Subclasses of action +fixture can add new action +words.

        + +

        ·         +camel case +

        + +
        + +
        + +
        + +

        Runner

        + +

        A runner creates top-level Fixtures and +provides them with parsed documents to be +annotated.

        + +

        ·         +top-level fixture is instance +of Fixture

        + +

        A runner retrieves and disposes of documents +as appropriate to its environment. The FileRunner reads and +writes html files.

        + +

        ·         +input-file only -- default output

        + +

        ·         +input-file output-file -- specific +output

        + +

        ·         +input-directory +only -- default output in directory

        + +

        ·         +input-directory +output-directory -- default outputs in specific +directory

        + +

        ·         +index.html result summaries

        + +

        ·         +- is standard in/out

        + +

        A runner signals the presence of errors to +its environment so that subsequent processing can +be triggered.

        + +

        ·         +exit status is sum of wrong and exceptions +up to 255

        + +

        ·         +main is factored +to simplify [?]RunnerFixtures +

        + +

        A runner establishes run specific +state that may influence loading and/or configuration +of the program under test.

        + +

        ·         +[?]AssemblyPath ???

        + +

         

        +-! \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/properties.xml new file mode 100644 index 0000000000..b08e34d6d2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/properties.xml @@ -0,0 +1,14 @@ + + + true + docs + true + true + true + true + true + true + true + 1155243203336 + -1217241164486364196 + diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/content.txt new file mode 100644 index 0000000000..c949e8dd85 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/content.txt @@ -0,0 +1,596 @@ +!- +
        + +

        Fit Specification, +v1.1

        + +

         

        + +

        Fit is a tool for improving communication +between customers, programmers, and +testers.  It allows the customer to describe +his or her requirements in a way that can be checked +against the actual program.

        + +

         

        + +

        The technique Fit uses is called +"specification +by example."  It allows customers to +create a document +with tables that describe specific +examples of how the software should work.  Fit looks at the document +and checks to +see if the software works the way the tables say it should.

        + +

         

        + +

        Fit uses small programs, called +"fixtures," to connect +tables to software.  Programmers on the development team are responsible +for creating those fixtures.  Customers +are responsible for creating the tables.  +Testers work with both groups of people to help make sure that all situations +are adequately covered.  The three groups +work together, interactively, to create +great software.

        + +

         

        + +

        This document, and the documents +it references, describes +Fit using specification +by example.  It is, itself, an example of how to use Fit.  If all the “pass” cells +in the table below are colored green, then you +can be confident +that your copy of Fit meets this specification.

        + +

         

        + +

        Using Fit to test itself, as we do here, leads to circular +logic that can +be unraveled more easily by the computer than +by humans.  To avoid a headache, +ignore the fact that this document +is written in HTML or that the tables use Fit fixtures.  Instead, just think of it as a regular document--one +that happens to be colored green and red.

        + +

         

        + +

        Functional changes +to Fit that are new in this version of the spec +are highlighted yellow.  Layout, formatting, and other non-functional +changes to the specification +are not highlighted.

        + +

         

        + +

        Details

        + +

         

        + +

        Fit knows how to do these things:

        + +

         

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +

        fat.ReferenceFixture

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        Description

        +
        +

        Location

        +
        +

        Result()

        +
        +

        Note

        +
        +

        Parse HTML documents

        +
        +

        parse.html

        +
        +

        pass

        +
        +

         

        +
        +

        Modify HTML documents

        +
        +

        annotation.html

        +
        +

        pass

        +
        +

         

        +
        +

        Interpret tables using fixtures    

        +
        +

        fixtures.html

        +
        +

         

        +
        +

        incomplete

        +
        +

        Provide a command-line interface

        +
        +

        cli.html

        +
        +

         

        +
        +

        incomplete

        +
        + +

         

        + +

        Click the links for details about how Fit +does each of these things.  This specification +is a work in progress and the “fixtures” and “command-line +interface” portion are incomplete.  Implementers: you may ignore these sections +for now.

        + +
        + +

         

        + +

        Fit is available for many programming languages.  The sections +above apply to all implementations of Fit.  +Extensions specific +to this implementation of Fit are described +here:

        + +

         

        + + + + + + + + + + + + + + + + + +
        +

        fat.ReferenceFixture

        +
        +

         

        +
        +

         

        +
        +

        Description

        +
        +

        Location

        +
        +

        Result()

        +
        +

        Implementation-specific + extensions

        +
        +

        extensions.html

        +
        +

        pass

        +
        + +

         

        + +

        Errata

        + +

         

        + +

        Known errors and omissions, to be fixed in a future version:

        + +

         

        + +
          +
        • The + <wiki> tag is not specified.
        • +
        • Parsing-related + errors are described but the errors + aren’t specified.
        • +
        • Nested + tables are not specified
        • +
        • Argument + list (next to fixture name) is not specified.
        • +
        • Parser + can handle any XML heirarchy, but + only <table>, <tr>, + <td> is specified.
        • +
        • Files + are expected to be CP1252, but this is + not specified.
        • +
        + +

        To Do

        + +

         

        + +

        To look at in a future release:

        + +

        ·        +Why is info text coming +out with a line break when this spec is +run?  (Because +Word creates empty cells +with this markup: “<p>&nbsp;</p>”.  Accomodate this?)

        + +
          +
        • Possible + bug: when a variable column has a blank cell + (in a ColumnFixture), the value is filled in but + it isn’t shown in grey.
        • +
        • More + flexibility in charset handling.
        • +
        + +

         

        + +

        Possible feature changes:

        + +
          +
        • Add + “blank” keyword?
        • +
        • make fat.ReferenceFixture + a standard fit fixture?
        • +
        • Provide + a way for ColumnFixture to easily annotate a cell + (including when it passes)
        • +
        • Data + setup fixture, similar to RowFixture[?]
        • +
        + +

         

        + +

        Change History

        + +

         

        + +

        Changes in version 1.1:

        + +

        ·        +HTML to text: Added support for class +attribute in MS Word <p> tag parsing

        + +

        ·        +HTML to text: Clarified handling of +leading and trailing line breaks

        + +

        ·        +Text to HTML: Changed handling of “backwards +line feed”

        + +

        ·        +Fixture loading: Added specific +error messages when fixtures don’t load

        + +

        ·        +Standard annotations: Changed all HTML to +put quotes around color attributes

        + +

        ·        +Standard annotations: Changed “error” and +“info” annotations to convert new text to +HTML.

        + +

        ·        +Standard annotations: Changed “wrong” and +“error” annotations to strip mark-up from original cell.

        + +

        ·        +Standard annotations: Changed “error” annotation to use standard font size +for error message.

        + +

        ·        +Malformed HTML Parsing: Changed unclosed table, tr, and td tags to generate an error.

        + +

        ·        +ColumnFixture: +Changed headers to allow multiple words.  (not yet specified.)

        + +

        ·        +Fixture +loading: Added argument list by fixture name.  (not yet specified.)

        + +

        ·        +Parsing: +Added support for nested tables.  +(not yet specified.)

        + +

         

        + +

        Changes in version 1.0:

        + +

        ·        +Rewrite of the spec.

        + +

        ·        +HTML to text: Changed &nbsp; entity to combine +with other leading and trailing whitespace.

        + +

        ·        +HTML to text: Changed non-breaking space +character to not +combine with other internal whitespace.

        + +

        ·        +HTML to text: Added conversion +of <br> and <p> tags to line-feed characters.

        + +

        ·        +HTML to text: Added conversion +of “smart quotes” to regular quotes.

        + +

        ·        +Text to HTML: Added conversion +of line-feed characters +to <br> tags.

        + +

        ·        +Text to HTML: Added conversion +of adjoining spaces to &nbsp; entities.

        + +

         

        + +

        Initial version:

        + +

        ·        +Experimental specification +created by Ward Cunningham +and Jim Shore.

        + +

         

        + +

         

        + +
        + +

         

        + + + + + +
        +

        fit.Summary

        +
        + +

         

        + +-! +---- +!contents diff --git a/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/properties.xml new file mode 100644 index 0000000000..f05fbab4d1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/properties.xml @@ -0,0 +1,14 @@ + + + true + docs + true + true + true + true + true + true + true + 1155243419139 + -2818257665539849994 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/content.txt new file mode 100644 index 0000000000..f93725a30b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/content.txt @@ -0,0 +1,8 @@ +!1 !c Acceptance Test Patterns. +There seem to be patterns associated with writing acceptance tests with Fit and !-FitNesse-!. + +|BuildOperateCheck|''Three tables for each test.''| +|CommonIncludes|''Avoid duplicate test content by creating pages that are included into tests.''| +|ParameterizedIncludes|''Using variables and Includes together to achieve function-like behavior.''| +|StaticBeforeDynamic|''First check the end results, then check the in-process results.''| +|OperateFunction|''Column Fixtures often need a special function to perform an operation between input and output.''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/properties.xml new file mode 100644 index 0000000000..403307dac9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135112 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/content.txt new file mode 100644 index 0000000000..94a0dfdfbb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/content.txt @@ -0,0 +1,32 @@ +!1 Automated Acceptance Tests: Building the Right Code +FitNesse automated acceptance tests are power tools for fixing a broken requirements process. Skillfully applied, such tests make it possible to avoid the problems of ProjectDeathByRequirements. (Note: if you have not yet done so, you should probably first get a quick intro on FitNesse tests at the TwoMinuteExample.) +!2 The Advantages of FitNesse Tests +FitNesse automated acceptance tests have several advantages over many kinds of traditional black-box, GUI-based functional tests: + * FitNesse tests can give us feature feedback '''very early''' in the project. In fact, the tests ought to be written '''first''', so programmers can ''code to'' the tests. + * FitNesse tests can give us feature feedback '''very frequently'''. They can be run manually or automatically by anyone with web access to the server, as frequently as required. Every week, every day, every hour in a crunch. + * FitNesse tests are '''deterministic''': they either run green or red. If they run green for a given requirement, either the requirement is done and we move on to others, or the set of tests is not yet exactly right, in which case we refine them. Either way, we are '''successively refining''' the system in an orderly way. With each new test running green, we can all see the system getting better, more valuable, closer to what we need. + * Being based on example data, FitNesse tests '''exercise more paths through the business logic'''. When you use FitNesse, you run less risk of missing important features or functional behavior. +!2 Acceptance Tests vs. Unit Tests +If you are familiar with the emerging [[xUnit][http://encyclopedia.thefreedictionary.com/XUnit]] style of automated unit testing (e.g., using [[JUnit][http://www.junit.org]] for Java, or [[NUnit][http://www.nunit.org]] for C#), you may well wonder why both kinds of testing are necessary, and how they work together. Let's discuss that. +!3 [[xUnit][http://encyclopedia.thefreedictionary.com/XUnit]]: Building the ''Code Right'' +Automated unit tests (or programmer tests, as they are increasingly called), are white-box tests that describe and verify very low-level behavior. Especially when working test-first, programmers rely on such tests to make sure that the design is sound, and that there are no defects. Such tests are built by and largely for programmers, and can be independent of functionality. + +If a team using [[JUnit][http://www.junit.org]] or [[NUnit][http://www.nunit.org]] to do Test-Driven Development is still hampered by a broken requirements process, they can easily end up building robust, lean, well-factored code with no business value. (This is, in fact, happening with increasing frequency.) +!3 FitNesse: Building the ''Right Code'' +FitNesse automated tests are about building the right code in the first place: the code with the most business value. While programmers may be involved in writing such tests, they are not just for programmers. FitNesse tests are especially for customers, business analysts, testing professionals, support staff, management, and all other stakeholders who need evidence that the project is producing solid return on investment. +!3 "Running, Tested Features" +Ron Jeffries articulates the idea that the ultimate software project metric, the one closest to ROI, is '''[[Running, Tested Features][http://www.xprogramming.com/xpmag/jatRtsMetric.htm]]'''. You can read about it [[here][http://www.xprogramming.com/xpmag/jatRtsMetric.htm]]. How many RTF did we deliver last iteration, or last month, or last release? '''Only a tool like FitNesse can answer these questions.''' + +Without a solid tool for automated acceptance tests, you cannot know how many RTF you produce per unit time, so perhaps you cannot easily determine what your project ROI is. Perhaps your team is headed for ProjectDeathByRequirements. +!2 Consider Using Both Tools +If you use FitNesse without using [[JUnit][http://www.junit.org]] or [[NUnit][http://www.nunit.org]] to test-drive and refactor your code, you may end up with tremendous business value, but rotten, buggy code. Even if the bugs don't kill you, this is short-sighted; it's a way of sacrificing release 3 to release 1. You have to keep the code lean and extensible to prevent code rot. Otherwise, your rotten codebase will need to be rewritten from scratch, long before it has exhausted its business value. + +With both tools, you can balance production and production capacity. You can deliver the features that produce highest ROI, while producing robust, clean, extensible code. You might find that you get addicted to the early, frequent feedback that automated tests provide. Your whole team could get addicted to Building the Right Code, and Building the Code Right. +!2 Summary + * FitNesse automated acceptance tests have several advantages over traditional functional testing. These advantages are good both for requirements management and for feature verification. + * Only automated acceptance testing (such as that provided by FitNesse) enables you to measure [[Running, Tested Features][http://www.xprogramming.com/xpmag/jatRtsMetric.htm]], which is a key metric for measuring software project progress and success. + * FitNesse automated acceptance testing is a natural complement to [[xUnit][http://encyclopedia.thefreedictionary.com/XUnit]]-based unit testing. The former helps you build the right code, while the latter helps you build the code right. Consider using both tools. +!2 Learning More +If you have not yet done so, check out the TwoMinuteExample. For more information on how teams can work together with FitNesse tests to deliver better systems, see DeliveringTheRightSystem. + +If you are ready to start creating FitNesse pages and test tables, check out EditingFitNessePages and CreatingTestTables. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/properties.xml new file mode 100644 index 0000000000..ad5e21ac90 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135130 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixture/content.txt new file mode 100644 index 0000000000..4e4cb74221 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixture/content.txt @@ -0,0 +1,47 @@ +!1 ActionFixture: Testing Sequences of Events + +Sometimes the software behavior you are testing is inherently sequential: a series of events occur in a prescribed order. The ActionFixture style of test table (and FixtureCode) make it easy to write and run tests for such sequences of events. The metaphor for this fixture is a simple control panel: + * You ''enter'' values into '''registers''' that have specified names. + * You ''press'' '''buttons''' that have specified names. + * You ''check'' the values of named '''meters'''. + + +For example, let's write a test for a simple counter. + +|Action Fixture.| +|start|!-fitnesse.fixtures.CountFixture-!| +|check|counter|0| +|press|count| +|check|counter|1| +|press|count| +|check|counter|2| +|enter|counter|5| +|press|count| +|check|counter|6| + +Many kinds of event sequences can be boiled down to sets of these simple actions: entering, pressing, and checking. This style of table is often used, for example, to check sequences of user interface events. + +To see the FixtureCode for this example, check out ActionFixtureCode. + +!2 Seeing How Long ActionFixture Actions Take: !-TimedActionFixture-! + +You can used !-TimedActionFixture-! if you want to see visual feedback on how long certain functions take to execute. (Technical note: This is strictly a matter of making sure that the FixtureCode for your table extends !-TimedActionFixture-! instead of ActionFixture.) Here is a version of our counter example that uses !-TimedActionFixture-!: + +|!-fit.TimedActionFixture-!| +|start|!-fitnesse.fixtures.DelayedCountFixture-!| +|check|counter|0| +|press|count| +|check|counter|1| +|press|count| +|check|counter|2| +|enter|counter|5| +|press|count| +|check|counter|6| + +This !-DelayedCountFixture-! example simply adds a random delay to the ''count'' function. + +!-TimedActionFixture-! does not give you a means of testing the time or the ''split''. It simply displays them for visual inspection. Also note that the TimedActionFixture-! does not report any delays that are less than one second. We don't know why Ward (inventor of the FitFramework) decided to impose this lower limit. Perhaps he'll remove it one day. + +!2 Learning More +To see an example of the fixture code for the ActionFixture test table style, check out ActionFixtureCode. Also check out the other TestTableStyles. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixture/properties.xml new file mode 100644 index 0000000000..ad5e21ac90 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixture/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135130 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/content.txt new file mode 100644 index 0000000000..9621110c98 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/content.txt @@ -0,0 +1,26 @@ +!1 The Fixture Code for Action Fixtures + +Here is our example test table from the ActionFixture page: + +|Action Fixture.| +|start|!-fitnesse.fixtures.CountFixture-!| +|check|counter|0| +|press|count| +|check|counter|1| +|press|count| +|check|counter|2| +|enter|counter|5| +|press|count| +|check|counter|6| + +And here is the code for the !-CountFixture-!:{{{public class CountFixture extends Fixture { + private int counter = 0; + + public void count() { + counter++; + } + + public int counter() { + return counter; + } +} }}} As you can see, the names of the buttons (''check'', ''press'', and ''enter'') and registers (''count'' and ''counter'') correspond directly to methods in the 'started' fixture. And the meter values (the numbers in the rightmost column) are returned by the ''counter()'' method. It's really as simple as that. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/properties.xml new file mode 100644 index 0000000000..1186492247 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326160025 + + + 1238101225197 + -5298968066639391546 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/content.txt new file mode 100644 index 0000000000..3a90084200 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/content.txt @@ -0,0 +1,7 @@ +!2 Administering FitNesse +|[[Starting and Stopping][StartingAndStoppingFitNesse]]|''The details of starting and stopping the FitNesse wiki/web server.''| +|[[Administration over REST][RestfulServices]]|''Controlling FitNesse through URLs.''| +|[[Customizing Look and Feel][CustomizingLookAndFeel]]|''Changing the colors and layout of the various pages.''| +|[[Server Access Logging][LogFiles]]|''Logging access to the FitNesse server.''| +|[[Using Static and Image Files][FilesSection]]|''How to upload, and manage and link to static files and images.''| +|[[Security][SecurityDescription]] |''Managing the security of wiki pages''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/content.txt new file mode 100644 index 0000000000..232339d105 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/content.txt @@ -0,0 +1,22 @@ +You'll occasionally see a big ATTENTION message in your tests. This typically means that something went wrong with the test and either Fit or Fitnesse had to bail out. If you click on the !-ErrorLog-! link inside the message you'll be taken to a page that will show you everything we know about what went wrong, including any standard error output from any of your fixtures. + +The page you are taken to when you click the !-ErrorLog-! link is !-ErrorLogs.-!''yourPageName''. This page is ''always'' created whenever you run a test, not just when there are errors. So even if you don't get the big ATTENTION message, you can still go to the appropriate !-ErrorLog-! page to see things like the command that was used to run your test, and the time it took to run the test, etc. + +An !-ErrorLog-! page typically looks like this: + +|'''Date: '''|!-6:49:19 PM (CST) on Thursday, February 26, 2004-!| +|'''Command: '''|!-java -cp fitnesse.jar;classes fit.FitServer-!| +|'''Exit code: '''|!-0-!| +|'''Time elapsed: '''|!-0.28 seconds-!| +----'''Standard Error:''' +{{{ This is an error +}}} + +!2 Try Hitting Test Again +Some of the problems that cause the Attention messages are spurious and intermittent. You can sometimes get them to go away simply by hitting the Test button (or Suite button) again. + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/properties.xml new file mode 100644 index 0000000000..f91e1834de --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205849 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/BeingAsister/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BeingAsister/content.txt new file mode 100644 index 0000000000..21902a97a5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BeingAsister/content.txt @@ -0,0 +1,6 @@ +!-FitNesse-! can be a good sister. The sites that want to cross reference a !-FitNesse-! site simply invoke the following URL: {{{http://somefitnessesite.com/?names}}}This returns a list of all page names at the ''top level'' of the !-FitNesse-! site. Note that it does not return any of the names of the subpages. + +!-FitNesse-! is a hierarchical wiki. Most wikis are not hierarchical. The spec for SisterSites does not provide for hierarchy in a wiki. It can't deal with the ''dots'' in the page names. + +If you think about it, a hierarchical wiki is just a tree structure of flat wikis. That means that each level of the hierarchy can be a sister of some other wiki. Thus, if one wiki wants to cross reference to the !-FrabDaz-! project on !-http://fitnesse.zapadoodle.com-! it might request the sister page names by invoking the following URL:{{{http://fitnesse.zpadoodle.com/Projects.FrabDaz?names}}} + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/BeingAsister/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BeingAsister/properties.xml new file mode 100644 index 0000000000..e8e7604d6d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BeingAsister/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135107 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildOperateCheck/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildOperateCheck/content.txt new file mode 100644 index 0000000000..f5a960390c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildOperateCheck/content.txt @@ -0,0 +1,14 @@ +This pattern shows up repeatedly in !-FitNesse-! Acceptance Tests. You need to use several tables on a single page, in order to fully test a given requirement. These tables naturally fall into three categories: + + 1 '''Build''': One or more tables to ''Build'' the test data. These tables are typically based upon a + + + + + 1238101475545 + 5143830989649989012 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/content.txt new file mode 100644 index 0000000000..2709adfa9b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/content.txt @@ -0,0 +1,3 @@ +Classpaths are built by finding the [[!path][MarkupPath]] directives on the current page, and on every ancestor page. These are collected in order so that !path directives on sub pages override !path widgets on parent pages. + +!note The old !-ClassPath-! page method as been removed. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/properties.xml new file mode 100644 index 0000000000..452da17471 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/properties.xml @@ -0,0 +1,9 @@ + + + + 20080610145535 + + + 1213127735537 + -8905546225527859314 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ClassPath/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ClassPath/content.txt new file mode 100644 index 0000000000..2b1a893399 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ClassPath/content.txt @@ -0,0 +1,21 @@ +!1 The !-ClassPath-!: Telling FitNesse Where the FixtureCode Is + +For a given SubWiki of test pages, you can specify to FitNesse where it can find all of the fixture classes it needs by supplying a so-called ClassPath definition, which is a full absolute filepath to the directory that contains the package (in Java) or assembly (in C#) in which all the compiled classes can be found. Simply include a ClassPath definition on the main page of your SubWiki. + +The wiki markup widget you use is the !-!path-! widget. The format, in wiki markup language, looks like this: + +!-!path C:\workspace\TriviaGameFitNesseExample\-! + +And on a page, the same definition looks like this: + +!path C:\workspace\TriviaGameFitNesseExample\ + +!3 How Fit Locates ClassPath Definitions in !-SubWikis-! +Whenever Fit processes test tables on a given page, it build its own internal class path by finding the !path directives on the current page, and on every ancestor page. In other words, it looks '''up''' the page hierarchy of [[!-SubWikis-!][SubWiki]]. + +This makes it possible for you to use !path directives on sub pages to override !path directives on parent pages. Thus you can create global classpaths, project specific classpaths, and even module-specific classpaths. + +!2 Learning More +If you are interested in FitNesse fixture code in general, check out FixtureCode. For information on organizing test pages into hierarchies, see SubWiki and TestSuites. + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ClassPath/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ClassPath/properties.xml new file mode 100644 index 0000000000..6a188b47f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ClassPath/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135131 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixture/content.txt new file mode 100644 index 0000000000..3473ef6ea3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixture/content.txt @@ -0,0 +1,82 @@ +!1 Using !-ColumnFixtures-! +This table style is probably the most generally useful in FitNesse. Many kinds of software features can be tested with ColumnFixture: any feature that can be expressed as rows of inputs and outputs. + +ColumnFixture has the advantages of being easy to design and easy to understand. Below, we show a few more examples of uses for ColumnFixture. For starters, let's look at our test table for testing the division function of a calculator application: + +!|eg.Division| +|numerator|denominator|quotient?| +|10 |2 |5 | +|12.6 |3 |4.2 | +|100 |4 |33 | + +The top row of the table provides the name of the ColumnFixtureCode that Fit will use to process the table. The second row specifies the inputs and outputs of the fixture; the column headings ''numerator'' and ''denominator'' specify columns of input values, and the ''quotient?'' heading specifies a column of expected return values. So if we divide 10 by 2, we expect to get back 5. + +For a description of the fixture code for the Division example, see ColumnFixtureCode. + +!2 A Slightly More Complex Example: A Trivia Game +Let's imagine that we are building a trivia game. The overall design of our trivia game is straightforward: players take turns rolling a single die, and move around a circular board. When they land on a square, they are asked a trivia question of some category. There are requirements for answering questions incorrectly, for winning, and so on. + +For now let's imagine that we are addressing a specific first requirement or user story (call it what you like): +!3 "You can add players to the game, and you can ask the game how many players are playing." +Sounds pretty straightforward. Let's first set up a ClassPath that points to where our trivia game project is. Without the ClassPath, FitNesse would not be able to find our fixture code: + +!path C:\workspace\TriviaGameFitNesseExample\ + +How about this for a test table for this requirement? +!| org.fitnesse.triviaGameExample.fitnesseFixtures.AddRemovePlayerFixture| +| playerName | addPlayer? | countPlayers? | +| Al | true | 1 | +| Bertha | true | 2 | + +It says that if we add a player named Al to our game successfully, the total number of players should be 1, and if we then add a player named Bertha, our total number of players should be 2. If you click Test, you'll see that we have met this requirement. This is well and good, but it will be seldom that we can use a single table to do all the work to test a single requirement. We will typically need to use more than one table. + +Say we have another requirement that goes like this: +!3 "Once the game has started, players cannot be added or removed." + +For this test, we'll ask the game to take a fake turn by specifying that the player whose turn it is "rolls" a 6. That should start the game. We'll check the result of that by checking to see which player it was who actually took the turn (we expect it to be Al), and whether indeed the game has started. + +!|org.fitnesse.triviaGameExample.fitnesseFixtures.GameTurnFixture| +|roll | player? | gameHasStarted? | +|6 | Al | true | + +Now that the game has started, we'll try to add a new player to the game, and this should fail (we should get back false from addPlayer()). And we should still have only two players in the game: + +!| org.fitnesse.triviaGameExample.fitnesseFixtures.AddRemovePlayerFixture| +| playerName | addPlayer? | countPlayers? | +| Joe | false | 2 | + +Finally, we'll try to remove a player from the game, and this too should fail: + +!| org.fitnesse.triviaGameExample.fitnesseFixtures.AddRemovePlayerFixture| +| playerName | removePlayer? | countPlayers? | +| Al | false | 2 | + +This shows how you can use a sequence of tables to verify a requirement by setting up and testing different states in your application code. This table sequence also illustrates one of the common AcceptanceTestPatterns: BuildOperateCheck. + +For a description of the fixture code for the trivia Game example, see ColumnFixtureCode. + +!2 Another Example: an Inventory System +Let's say you were writing an inventory system, and you wanted to test its ability to keep track of stocked items. You might write tables like this: + +|!-inventory.AddStockFixture-!| +|partNumber|quantity|valid?| +|324|28|true| +|586|14|true| + +This test adds two stock items. The valid() method calls the parts of the system that cause a stock item to be added. Next, we might write a table that simulates some purchases that reduce the stock of an item. + +|!-inventory.PurchaseItemFixture-!| +|partNumber|quantity|valid?| +|324|3|true| +|586|2|true| + +Finally we'd write a table that checked to make sure that the inventory had been properly updated. + +|!-inventory.CheckInventoryFixture-!| +|partNumber|quantity()| +|324|25| +|586|12| + +!2 Learning More +To learn about the fixture code for the above examples, see ColumnFixtureCode. +Check out the other TestTableStyles to see which one suites your purposes best. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixture/properties.xml new file mode 100644 index 0000000000..210f7886d3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixture/properties.xml @@ -0,0 +1,9 @@ + + + + 20081102003719 + + + 1225604239004 + -8927698339001903465 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/content.txt new file mode 100644 index 0000000000..3b02754a4b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/content.txt @@ -0,0 +1,14 @@ +{{{ +package eg; +import fit.ColumnFixture; + +public class Division extends ColumnFixture { + public double numerator; + public double denominator; + public double quotient() {return numerator/denominator;} +} +}}} + +Input variables must be public. + +If the fixture declares the method ''public void execute()'' it will be called after all fields have been loaded, but before any output methods have been called. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/properties.xml new file mode 100644 index 0000000000..2a73618620 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20081102004033 + true + true + true + true + true + true + 1225604433616 + 5487233518994786467 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/content.txt new file mode 100644 index 0000000000..54e9f4e151 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/content.txt @@ -0,0 +1,43 @@ +!3 Designing Tests with ColumnFixture +Think of each row of a ColumnFixture as one or more function calls. The values of the named variables are set, and then the functions are called. + +For example, lets say you were writing an inventory system, and you wanted to test its ability to keep track of stocked items. You might write tables like this: + +|!-inventory.AddStockFixture-!| +|partNumber|quantity|valid?| +|324|28|true| +|586|14|true| + +This test adds two stock items. The valid() function calls the parts of the system that cause a stock item to be added. The code for the !-AddStockFixture-! might look like this:{{{ +package inventory; +import fit.ColumnFixture; +public class AddStockFixture extends ColumnFixture { + public int partNumber; + public int quantity; + public boolean valid() { + try { + StockItem item = new StockItem(partNumber); + Inventory.addStockItem(item,quantity); + return true; + } catch (Exception e) { + return false; + } + } +} +}}}Next, we might write a table that simulates some purchases that reduce the stock of an item. + +|!-inventory.PurchaseItemFixture-!| +|partNumber|quantity|valid?| +|324|3|true| +|586|2|true| + +It should be clear how this fixture would be written. + +Finally we'd write a table that checked to make sure that the inventory had been properly updated. + +|!-inventory.CheckInventoryFixture-!| +|partNumber|quantity()| +|324|25| +|586|12| + +See how easy this is? diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/properties.xml new file mode 100644 index 0000000000..150025efae --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205852 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/content.txt new file mode 100644 index 0000000000..2062d6772e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/content.txt @@ -0,0 +1,8 @@ +|{{{-p {80} }}}|The port number that FitNesse listens to. The default is 80 because this is the port that internet browsers use by default. If your machine already has a web server running, it will be using port 80, so FitNesse should be set up to use a different port, like 8080. {{{java -jar fitnesse.jar -p 8080}}} | +|{{{-d {.} }}}|The directory in which FitNesse expects to find its page root. It defaults to the current directory ('.'). | +|{{{-r {FitNesseRoot} }}}|The directory in which FitNesse looks for top level pages.| +|{{{-l {no logging} }}}|If this argument is not present, then FitNesse will not create log files. Otherwise it will create log files in the specified directory. See LogFiles.| +|{{{-e {14} }}}|Sets the expiration date for page versions. Any page version older that the number of days specified by this argument are considered to have expired. Expired pages are subject to deletion. Just ''when'' they are deleted is not specified.| +|{{{-o }}}|When a new version of FitNesse is run for the first time, it checks the existing environment to see if any changes need to be made in order for the existing environment to be compatible with the new version of FitNesse. For example, if we change the icon on the upper right, FitNesse might go to the http://fitnesse.org/files site and automatically download the new icon. Or if the format of the properties files, or of the wikipages changes, FitNesse might run through all the existing pages and update their format. This process is called ''updating''. Sometimes you don't want updating to take place. If so, then use the '''-o''' argument to disable updating.| +|{{{-a authentication-parameter}}}|Enable authentication. ---- If the authentication-parameter is of the form "username:password" then single user authentication is enabled, and just that one user will be known to the system. ---- If the authentication-parameter is of the form "filename" then the file will be read. It will consist of any number of lines of the form username:password and all those users will be known to the system. See PasswordFile for more information| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/properties.xml new file mode 100644 index 0000000000..150025efae --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205852 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineOption/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineOption/content.txt new file mode 100644 index 0000000000..4d71d4b77a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineOption/content.txt @@ -0,0 +1,16 @@ +There are several commands you can run to control the FitNesse wiki, as shown below. (The values shown between braces are the default values.) + +{{{ java -jar fitnesse.jar [-pdrleoa] + -p {80} or {9123 if -c} + -d {.} + -r {FitNesseRoot} + -l {no logging} + -e {14} Number of days before page versions expire + -o omit updates + -a {user:pwd | user-file-name} enable authentication. + -i Install only, do not run fitnesse after install. + -c Run a Rest Command and then exit. + (Return status is the number of test pages that failed as a result of the command.) +}}} + +You can find more information on the -c options at CommandLineRestCommands. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineOption/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineOption/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommandLineOption/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommentTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommentTables/content.txt new file mode 100644 index 0000000000..aad4a3edb3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommentTables/content.txt @@ -0,0 +1,12 @@ +!1 Using Comment Tables +Sometimes you just want to explain something using a table. You don't want it to be a test table. But FitNesse presumes all tables are test tables. You need a CommentTable. + +You can make comment tables using the ''Comment'' table notation. It's simple. Simply put the word ''Comment'' all alone in the first row of the table, like so: + +|Comment| +|This table is just a comment| +|and will not participate| +|in the tests on this page.| + +If you click the Test button on a page containing such comment tables, FitNesse and the FitFramework will ignore the comment tables. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommentTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommentTables/properties.xml new file mode 100644 index 0000000000..48df617034 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommentTables/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135108 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommonIncludes/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommonIncludes/content.txt new file mode 100644 index 0000000000..bcc0222b0a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommonIncludes/content.txt @@ -0,0 +1,11 @@ +It is very common to have a many tests that look alike. In most cases these test will have duplicate content perhaps to setup the environment for the test. This duplication can very very painful when the environment changes. The change to the enviroment will have to be made in all the tests that share the duplicated content. This can very tedious and time consuming work. Fortunately it can be avoided. + +Using the [[Include widget][MarkupPageInclude]] is the key. Let's assume that our tests follow the standard [[BOC][BuildOperateCheck]] pattern and they look like this: + +!include SampleSetupForTest + +!include SampleOperateForTest + +And now we'll perform the Check step. + +!|A table that checks something| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommonIncludes/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommonIncludes/properties.xml new file mode 100644 index 0000000000..026559d6f2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CommonIncludes/properties.xml @@ -0,0 +1,10 @@ + + + + 20090228113824 + docs + true + + 1130158434501 + 5401049948558438943 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/content.txt new file mode 100644 index 0000000000..39e0e14e6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/content.txt @@ -0,0 +1,17 @@ +!1 Comparison Expressions in Table Cells +!note specific to certain FIT implementations. + +Comparison expressions can also be used in numeric cells that represent expected outputs. In these expression the underscore character represents the return value of the method. You can use standard inequalities. + * For example: + * '''_ < 32''' or + * '''_ >= 99'''. + * You can also use a range such as: + * '''38 <= _ <55'''. + * For simple expressions the underscore can be omitted, thus: + * '''<99''' is legal. + +There are two special functions that you can override when you write a !-ColumnFixture-! + * ''reset()'' will be called at the beginning of each row. + * ''execute()'' will be called just prior to processing the first ''()'' or ''?'' cell in each row, or after the last cell in the row has been processed, whichever comes first. + +You can use these two functions to treat each row as a transaction. ''reset()'' can clear all the variables and get ready for the next transaction. ''execute()'' can do the transaction processing. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/properties.xml new file mode 100644 index 0000000000..d6a7751d7a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326160703 + + + 1238101623822 + 5418038042288268028 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/content.txt new file mode 100644 index 0000000000..4e795dd4a3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/content.txt @@ -0,0 +1,71 @@ +!3 Motivations + +It is possible to issue single commands to FitNesse from the command line. This is useful when: + * Running test suites from your build scripts (see how this is achieved for Ant [[below][#antIntegration]]) + * Generating XML output from a test execution to a file + +!3 Command Syntax + +You can run any REST command (See RestfulServices) from the command line by using the -c command line option as follows: + +|!style_code(java -jar fitnesse.jar -c )| + +This starts up fitnesse, runs the command, emits the output to standard out, and then exits. + +Most often you will use this to run tests and/or suites from the command line as follows: + +|!style_code(!-java -jar fitnesse.jar -c "MyTestPage?test&format=text"-!)| + +The ''text'' format causes a simple summary of the tests to be printed to standard output. It looks like this:{{{ +Starting Test System: slim using fitnesse.slim.SlimService. +. 07:37:29 R:0 W:0 I:0 E:0 JunkPage (JunkPage) 0.124 seconds +X 07:37:29 R:0 W:0 I:0 E:3 ExceptionTest (JunkPage.ExceptionTest) 0.034 seconds +. 07:37:29 R:0 W:0 I:0 E:0 FirstPage (JunkPage.FirstPage) 0.329 seconds +. 07:37:29 R:2 W:0 I:0 E:0 GivWenZen (JunkPage.GivWenZen) 0.528 seconds +F 07:37:30 R:6 W:1 I:0 E:0 HashTablePage (JunkPage.HashTablePage) 0.045 seconds +F 07:37:30 R:1 W:20 I:0 E:8 CanTotalOrder (JunkPage.ImportingPage.CanTotalOrder) 0.623 seconds +X 07:37:30 R:0 W:0 I:0 E:6 JunkPage (JunkPage.JunkPage) 0.083 seconds +. 07:37:30 R:0 W:0 I:0 E:0 JunkTest (JunkPage.JunkTest) 0.884 seconds +F 07:37:30 R:1 W:20 I:0 E:8 CanTotalOrder (JunkPage.PointOfSale.CanTotalOrder) 0.004 seconds +. 07:37:30 R:0 W:0 I:0 E:0 SeeTest (JunkPage.SeeTest) 0.765 seconds +. 07:37:31 R:1 W:0 I:0 E:0 SymbolPage (JunkPage.SymbolPage) 0.198 seconds +. 07:37:31 R:0 W:0 I:0 E:0 TestNothing (JunkPage.TestNothing) 0.923 seconds +X 07:37:31 R:2 W:0 I:0 E:2 TestTableTable (JunkPage.TestTableTable) 1.120 seconds +X 07:37:31 R:0 W:0 I:0 E:4 UseVarPage (JunkPage.UseVarPage) 0.034 seconds +. 07:37:31 R:0 W:0 I:0 E:0 VariableTest (JunkPage.VariableTest) 0.512 seconds +. 07:37:31 R:0 W:0 I:0 E:0 SuiteSetUp (JunkPage.ParentSuite.SuiteChildTwo.SuiteSetUp) 0.321 seconds +. 07:37:31 R:0 W:0 I:0 E:0 TestPage (JunkPage.ParentSuite.SuiteChildTwo.TestPage) 0.432 seconds +. 07:37:31 R:0 W:0 I:0 E:0 SuiteTearDown (JunkPage.ParentSuite.SuiteChildTwo.SuiteTearDown) 0.387 seconds +. 07:37:31 R:0 W:0 I:0 E:0 SuiteSetUp (JunkPage.ParentSuite.SuiteSetUp) 0.712 seconds +. 07:37:31 R:0 W:0 I:0 E:0 TestPage (JunkPage.ParentSuite.TestPage) 0.209 seconds +. 07:37:31 R:0 W:0 I:0 E:0 SuiteTearDown (JunkPage.ParentSuite.SuiteTearDown) 0.314 seconds +. 07:37:31 R:0 W:0 I:0 E:0 SuiteSetUp (JunkPage.ParentSuite.SuiteChildOne.SuiteSetUp) 0.159 seconds +. 07:37:32 R:0 W:0 I:0 E:0 TestPage (JunkPage.ParentSuite.SuiteChildOne.TestPage) 0.265 seconds +. 07:37:32 R:0 W:0 I:0 E:0 SuiteTearDown (JunkPage.ParentSuite.SuiteChildOne.SuiteTearDown) 0.358 seconds +-------- +24 Tests, 7 Failures. 90.409 seconds.}}} +Each line begins with . if the test passes, F if the test fails, or X if the test throws an exception. +The key for the counts is Right, Wrong, Ignored, Exceptions. +The rest should be self explanatory. + +The exit code for the command is 0 unless you run a test with ''text'' formatting, in which case it is the number of failing tests. + +!anchor antIntegration + +!2 Executing Tests from Ant +You can run a test suite with Ant using the following ant task {{{ + + + + + + + + }}} +!note !style_green[You only need to set the port if the default command port (9123) will collide with something.] + +!2 Running Password-Protected Suites or Tests +Some work environments which do not allow FitNesse instances without authentication (as the FitNesse tests may access password-protected databases). +In these cases, the suites and pages will need to be password-protected and authentication must be provided as part of the -c command: + +|!style_code(!-java -jar fitnesse.jar -a [user:pwd or user-file-name] -c "username:password:MyTestPage?test&format=text"-!)| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/content.txt new file mode 100644 index 0000000000..2c431b075c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/content.txt @@ -0,0 +1,49 @@ +!1 Getting Test Tables Onto the Page +As we have seen FitNesse expresses AcceptanceTests as tables of '''input''' data and '''expected output''' data. (If you have not done so, you should probably check out the example table tutorial in the TwoMinuteExample. You should then check out the wiki page-editing tutorial on EditingFitNessePages.) Yet again, let's look at our test table for testing the division function of a calculator application: + +!|eg.Division| +|numerator|denominator|quotient?| +|10 |2 |5 | +|12.6 |3 |4.2 | +|100 |4 |33 | + +So how do we get this table on to the page? Well the [[wiki markup language][MarkupLanguageReference]] that defines the above table looks like this:{{{ +|eg.Division| +|numerator|denominator|quotient?| +|10 |2 |5 | +|12.6 |3 |4.2 | +|100 |4 |33 | }}} +!3 Typing it In By Hand +We can pretty easily type in the above markup code for our Division table by hand in the page editing window. The vertical bars (!-|-!) delimit cells within rows. As long as you have the right number of vertical bars between data elements, FitNesse will correctly format your table for you. For small tables that will not change frequently, that's a perfectly reasonable way to do it. +!3 Using a Spreadsheet to Create Tables +Let's face it: a simple text-editing frame (such as the FitNesse edit frame) is not the best tool in the world for manipulating tabular representations of data. It's not especially easy to copy and paste rows or columns, move rows or collumns, etc. That's the sort of thing that spreadsheets are great at. When you work with lots of FitNesse tables, particularly large ones, it's great to be able to work in a spreadsheet like Excel to get the table just the way you want it, then copy it over to FitNesse, formatted properly using the wiki markup language. Fortunately, FitNesse makes this easy to do. + +!3 Spreadsheet Example +Let's say that you have the ''Division'' table in Excel and you want to move it into !-FitNesse-!. + + * Within Excel, select the table and copy it to the clipboard. + * Go to the !-FitNesse-! page where you want the table and ''Edit'' it (or create it). + * Paste the table into the edit pane. It will show up without any wiki markup formatting: +{{{ +eg.Division +numerator denominator quotient? +10 2 5 +12.6 3 4.2 +100 4 33 }}} + * Now click the '''!-Spreadsheet to FitNesse-!''' button on the bottom of the page. + +''Voila!'' FitNesse reformats the table (and any other table on the page) with the proper wiki markup delimiters: +{{{ +!|eg.Division| +|numerator|denominator|quotient?| +|10|2|5| +|12.6|3|4.2| +|100|4|33| }}} + +'''Note: This is best done one table at a time''', one page at a time. Furthermore, the table must have '''at least two columns'''. When you click the '''!-Spreadsheet to FitNesse-!''' button, FitNesse attempts to format everything on the page that '''might''' be a table. + +!3 Copying Tables From FitNesse to the Spreadsheet +You can also take an existing FitNesse table, select it, and click the '''!-FitNesse to Spreadsheet-!''' button to get it back into non-wiki markup language format. You can then easily paste it back into the spreadsheet application. + +!2 Learning More +If you are interested in the fixture code that makes it possible to run test tables, check out FixtureCode. If you want to learn what the different styles of test tables are and how to apply them, check out TestTableStyles. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/properties.xml new file mode 100644 index 0000000000..3423b46755 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1125002094317 + 1381714279921804562 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/content.txt new file mode 100644 index 0000000000..a6433ec277 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/content.txt @@ -0,0 +1,17 @@ +FitNesse uses CSS (cascading syle sheets) for presentation. This gives much more flexibility to the look and feel of the web pages, allowing you to customize the look and feel of your own FitNesse installation. + +You will find 3 .css files in the Files section of FitNesse. + * fitnesse.css + * fitnesse_base.css + * fitnesse_print.css + +!3 fitnesse_base.css +This is a critical file that must remain as it is; do not change it. It defines all of the specific CSS classes required by FitNesse. Without it, none of the pages would look right at all. For this reason FitNesse has an updater that will install this file if it is missing and overwrite it if it has been modified. (This updater runs every time FitNesse is started.) + +!3 fitnesse.css +This is the place to customize the look and feel of your FitNesse site. You can redefine or make modifications to the imported classes. + +Be careful, though. By default this file simply imports ''fitnesse_base.css''. Be careful to maintain the import of ''fitnesse_base.css'' or FitNesse page display will look terrible. + +!3 fitnesse_print.css +Some of the CSS attributes used are not friendly with printers. When you print a page, FitNesse uses this file to format content in a printer-friendly way. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/properties.xml new file mode 100644 index 0000000000..48df617034 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135108 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/content.txt new file mode 100644 index 0000000000..ffe9048eb2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/content.txt @@ -0,0 +1,37 @@ +You may customize the way tests are executed to suit your needs. You can even change the language of execution! +The is done by defining any of a few special variables in the scope (see VariableScope) of the tests you wish to execute. +The special variables are: + + * TEST_SYSTEM + * COMMAND_PATTERN + * TEST_RUNNER + * PATH_SEPARATOR + * REMOTE_DEBUG_COMMAND + * REMOTE_DEBUG_RUNNER + * CLASSPATH_PROPERTY + +'''TEST_SYSTEM''' Defines the interface that FitNesse will use to execute tests. Right now there are two such interfaces: {fit | slim} +''default: '' '''''' which implies fit. + +'''COMMAND_PATTERN''' is the basis for every execution performed in FitNesse. It specifies the command that will be executed. +''default: '' '''java -cp %p %m''' +There are two special symbols used that will get replaced before execution. + * '''%p''' will be replaces with the calculated path/classpath. This is the accumulation of all the ''!path'' elements on all the ''ClassPath'' pages in the scope of the current page. + * '''%m''' stands for '''main''' or '''main class'''. For Java it is the name of the class that will be executed. + +'''TEST_RUNNER''' is the name of the class or executable that will be used when the ''Test'' button is clicked. +''default: '' '''!-fit.FitServer-!''' +If you're running tests in Java you probably don't want to change this. + +'''PATH_SEPARATOR''' is the charater that is used to separate all the path elements in the calculated path. +''default: '' '''system dependant.... either ; or :''' + +'''REMOTE_DEBUG_COMMAND''' is the command pattern used to execute tests in debug mode. See DebugingFixtureCode for more details. +''default:'' Same as command pattern, except if contains "java" then '''"java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -cp %p %m"''' is used instead +It has the same format as the standand '''COMMAND_PATTERN''' + +'''REMOTE_DEBUG_RUNNER''' is the test runner used to execute tests in debug mode. See DebugingFixtureCode for more details. +''default:'' Same as TEST_RUNNER, except substring "runner.exe" is replaced by '''"runnerw.exe"''' +It has the same format as the standand '''TEST_RUNNER''' + +'''CLASSPATH_PROPERTY''' specifies the name of the environment variable into which the classpath (gathered from !path statements) will be placed before running the test. This is most commonly used when the size of the classpath is too large for certain inept operating systems to deal with. Instead of specifying the %p argument of the COMMAND_PATTERN, you can instead !style_code[!-!define CLASSPATH_PROPERTY {CLASSPATH}-!]. This is most useful for Java. For other languages it may not have much meaning. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/properties.xml new file mode 100644 index 0000000000..a965fd73bf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1224243062251 + -2035431799417459728 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/content.txt new file mode 100644 index 0000000000..5b2d763192 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/content.txt @@ -0,0 +1,21 @@ +You can use all the standard Java data types in RowFixture and ColumnFixture. These types are automatically translated in and out of cell contents for you. They include: + + * String + * A trimmed string. You can use the keyword ''null'' or ''blank'' to mean a true java null, or an empty string respectively + * byte or Byte + * short or Short + * int or Integer + * long or Long + * float or Float + * double or Double + * char or Character + * boolean or Boolean + * Will interpret ''true'', ''yes'', ''y'', ''+'', ''1'' to be true. + * All else will be false. + * Array + * Any comma separated list of items will be converted into an array. + * Click [[here][.FitNesse.SuiteAcceptanceTests.SuiteFixtureTests.SuiteColumnFixtureSpec.TestArraysInColumnFixture]] to see the acceptance test for this. + +!3 Managing your own types with Fit. +Any user defined type that implements toString and parse will be managed correctly by RowFixture and ColumnFixture. The signatures of these methods are:{{{String toString(); +static Object parse(String s);}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/properties.xml new file mode 100644 index 0000000000..e9c901701a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135106 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/content.txt new file mode 100644 index 0000000000..96159bc14e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/content.txt @@ -0,0 +1,23 @@ +So, you'd like to debug your fixtures? Remember that fixtures are run in a ''completely'' different process from !-FitNesse-! It's not easy to set a breakpoint in a fixture and then hope to trap there when the fixture is going to be run in a different process. But don't worry too much. If your fixture is written in java, then you can use !style_code(&debug), otherwose you can still use print statements. + +!4 &debug +When you hit the test button it runs the test by issuing the URL !style_code(!-http://myHost:myPort/MyPage?test-!). You can force the execution to take place in the same JVM that FitNesse is running in by modifying that url to !style_code(!-http://myHost:myPort/MyPage?test&debug-!). If you have connected your debugger to fitnesse, then you should be able to set breakpoints in your fixtures. Of course this will only work if the fixtures are written in Java. + +!4 Print Statements +Anything you print to standard out, or standard ''error'' will be placed in the error log page for your test run. This is true whether the test fails or succeeds. The error log page is created whenever you run a test. IF output has been captured on the error log paid, then you'll see the ''warning icon'' that says ''Output Captured'' at the upper right of the test results page. You can click on this to see the error logs. + +The name of the error log page is !-.ErrorLogs.-!''yourPageName''. So, for example, if you just pushed the test button on a page named !-TestTheDravnitzTarget-! then the error log page will be at !-.ErrorLogs.TestTheDravnitzTarget-! + +Debugging your fixtures should be something you rarely need to do. After all, the code in your fixtures shouldn't be doing very much. At most it should be simply wiring and piping to get the data from your tables into your application and back. + +An error log page looks like this: +----- +|'''Date: '''|!-6:49:19 PM (CST) on Thursday, February 26, 2004-!| +|'''Command: '''|!-java -cp fitnesse.jar;classes fit.FitServer-!| +|'''Exit code: '''|!-0-!| +|'''Time elapsed: '''|!-0.28 seconds-!| +----'''Standard Error:''' +{{{ This is an error +}}} +----- +Notice that you can see the command that was used to run your test. This is very useful if you are concerned that your fixtures aren't running with the right classpaths. You can see the classpaths sent to the test in the ''-cp'' argument of the ''java'' command. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/properties.xml new file mode 100644 index 0000000000..070470c905 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/properties.xml @@ -0,0 +1,8 @@ + + + + + + 1238102099872 + -7325283609995888998 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/content.txt new file mode 100644 index 0000000000..9417b62d9e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/content.txt @@ -0,0 +1,27 @@ +!2 Debugging with a local wiki site + +To debug fixture execution when wiki pages are accessible over a local file system, see RunningFromJunit + +!2 Debugging with a remote wiki site + +Fixture code of a remote FitNesse wiki site can be debugged using the remote debugger to connect to the slim executor or fit client. + +To set up debugging for your fixture code: + 1 If necessary (it should work out of the box for java and C# slim), set up the '''REMOTE_DEBUG_COMMAND''' and '''REMOTE_DEBUG_RUNNER''' in your wiki. Together these commands should start the server in debug mode and wait for the debugger to connect before the code is run. As these variales are only used when you start a test in debug mode it is a good idea to specify this define on root page of your wiki. + 2 When you want to debug a test, start by adding '''?responder=test&remote_debug=true''' to the url for the test. + 3 After starting the test in FitNesse, start a remote debugging process in your debugging tool which should connect to slim/fit server. Remember to make sure you are using the right port. (Port 8000 if you are using the default settings for java) + +!2 Set up a remote debug bookmark in your browser. + 1 Just drag the link below to bookmark toolbar of your favourite browser. !-
        Debug FitNesse
        -! + 2 Then to use it just go to the page you which to debug and click on the link. + +!2 Alternative way to debug when using Slim +For.NET it was found to be easier to debug starting the slim runner with the debugger attached and then getting fitnesse to connect to this started instance. + +To do it this way: +1. Make sure !define MANUALLY_START_TEST_RUNNER_ON_DEBUG=true is set on the page you want to debug running +2. Start the runner, on the default slim port. To find out what this is try ${SLIM_PORT} on your page. +3. Start fitnesse. It should automatically connect to the runner you started. + +One thing to note is that when fitnesse finishes the page it will automatically close down the runner. So you will need to start the slim runner each time you go to debug. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DeliveringTheRightSystem/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DeliveringTheRightSystem/content.txt new file mode 100644 index 0000000000..4e8d9cf70d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DeliveringTheRightSystem/content.txt @@ -0,0 +1,44 @@ +!1 How Teams Can Use FitNesse: an Introduction +As we discussed in AcceptanceTests, FitNesse testing is about building the ''right code'', as opposed to unit-level testing, which is about building the ''code right''. By "right code" we mean "right system": the feature set with the most business value. + +!3 Everybody Helps Deliver the Right System +Unit-level testing can be done by individual programmers or pairs of programmers without any involvement on the part of non-programmers. FitNesse must be shared among programmers and non-programmers. Try sharing the use of FitNesse among all the disciplines on your software team: managers, programmers, testers, business analysts and experts, customer representatives, users, useability experts, technical writers, support staff, and others. Everybody can benefit from helping to define and run FitNesse tests. + +!3 Write The Tests First +As close as possible to the beginning of a software project, before you have done much requirements analysis, try to get key project stakeholers together to begin defining FitNesse AcceptanceTests. If you are using an agile development method such as Extreme Programming, it will be fairly straightforward to fit this into your schedule and routine. But if not, you'll likely have to win over some hearts and minds, and break through a bit of inertia. + +!3 Put Prose and Test Tables Together +We're not necessarily suggesting that you replace your entire requirements process, in its current form, with FitNesse tests. But we are suggesting that you integrate FitNesse tests and test pages into your requirements process. You may even find, as we have, that all of the prose, images, and everything else that typically goes into a requirements document can just as easily go on FitNesse test pages, along with the tests. The prose describe what the tests mean, + +!3 Example Scenario: Once There Was Some Pizza... +Imagine that a large shipping company is replacing an aging inventory control system. It's a mammoth undertaking. Everybody is involved. But before they get underway, one of the key executives decides that FitNesse might be a big help. She asks the Product Manager for the new system to investigate FitNesse, and to try using it from the outset on the new system. They hire a contractor to provide some FitNesse training, and put together a plan for using it on the project. + +In the first two weeks of the project, before any requirements meetings or documents have happened, the Product Manager gets together with just a few major stakeholders: one of the lead architects, a senior developer, a testing veteran, and one of the inventory experts who will be an eventual user of the system. + +The Product Manager brings these other 4 people together in a small meeting room containing some Actual Food in the form of pizza and drinks. The senior developer agrees to create test tables in FitNesse on te fly on his laptop. Yes! Test tables on the fly! Can that possibly work? Absolutely. +!3 A Few First Test Tables +This team uses pizza, white boards, paper, Excel, FitNesse, and animated discussion to create only two first FitNesse tables. Each table has 6 or 8 rows, and 5 or 6 columns. Both tables concern a single requirement (at least that's what everybody currently believes), and fit on a single test page. The test page contains only the two tables and a first stab at some explanatory prose. The meeting breaks up, after scheduling another similar meeting the next day. +!3 "Wait. You Meant ''That''? +Test tables describe requirements differently than prose (as we discuss in AcceptanceTests). The exercise of defining test tables for a requirement is a bracing and enlightening one. + +Even when a team thinks they have a set of requirements nailed down in prose, using traditional requirements analysis and documents, they will often find that they learn useful things by trying to express those requirements in terms of executable sets of inputs and expected outputs. + +You may often find that during the course of writing those tables, heated debates arise about the true meaning of the requirement. These are a healthy thing! You want these debates to occur, and you want them to occur as early as possible in the project, and certainly before any code has been written. + +Our intrepid team has several such heated debates between mouthfuls of pizza, and they manage to come to agreement on all of them, in a way that is then expressed in those first two tables. Lots of discussion and sketching and writing all get boiled down to a small handful of inputs and expected outputs that eventually must execute correctly. +!3 So What? What Does that Give You? +What can our team show for these first couple of hours of work? Well, they all agree that: + * The two tables and their accompanying prose describe all the important inputs and outputs for this one requirement (as far as they can tell so far) + * The programmers have a very good idea what it means to write the code to get those two test tables to pass. + * Once those two test tables both run green, '''that requirement will be done''', and they can move on to another requirement. + * The Product Manager, tester, and inventory expert all agree that they may be able to refine the two test tables to describe a few ''unhappy path'' scenarios that they did not identify in the meeting. +!3 "Successive Refinement: Let's Talk About the Tests +As the days and weeks go by, the team creates and publishes more test pages containing more test tables and prose. They organize these into a Test Suite. As the weeks pass, tables and test pages get split, combined, moved a round, and otherwise refined. + +Within the first couple of weeks, the programmers get those first two test tables for that first requirement to turn from red to green. They send out a triumphant email. But instead of getting back a congratulatory email from the Product Manager, they get back an email saying "You know what? It turns out that that work is not ''exactly'' what we needed..." So the Development Manager and the Product Manager get together and '''refine those first two tables''' so that they ''do'' describe exactly what was needed. Over the next couple of weeks, the programmers refine their work to get these new test tables to pass. And then they do in fact receive their congratulatory email. + +The point of this is that when it comes to addressing any ambiguities or misunderstandings in requirements, '''test tables are the perfect thing to talk about'''. By refining the test tables, and organizing the requirements discussion around them, the team successively refines the system itself. (They may also successively refine their ability to deliver the system iteratively and incrementally, but that's another story!) +!2 Learning More +If you haven't already done so, check out the [[One Minute Description][ + + + 20090326161622 + true + + 1238102182100 + 6331798438264035314 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitNesse/content.txt new file mode 100644 index 0000000000..f89ba6eb8b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitNesse/content.txt @@ -0,0 +1 @@ +!include + + true + true + 20090326161917 + true + true + true + true + true + true + 1238102357028 + -3862941609085628687 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServer/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServer/content.txt new file mode 100644 index 0000000000..1ccb372be0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServer/content.txt @@ -0,0 +1 @@ +!include + + true + true + 20090326161939 + true + true + true + true + true + true + 1238102379068 + 6342756788263573056 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/content.txt new file mode 100644 index 0000000000..dcf9042787 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/content.txt @@ -0,0 +1,18 @@ +The protocol between FitNesse and Fit is reasonably complex. Remember that all the Fit code runs in a completely different process, possibly in a completely different language. + +When you click the test button on a test page or a suite page, FitNesse needs to send the HTML for the test tables to FIT, FIT needs to run the tests and send the colorized HTML back to FitNesse so that it can be displayed. The moment that you click the test button two things happen. First FitNesse creates a session for the test. Secondly it starts the FitServer command line process and passes it the session identifier along with the hostname and port number of FitNesse. + +For Java this command is ''FitServer''. There are three arguments:{{{java FitServer host port ticket + host -- The name or IP address of the computer running FitNesse + port -- The number of the socket that FitNesse is listening on. + ticket -- The unique identifier for the session.}}}. + +FitServer (or the corresponding program in a differenr language) opens a connection to FitNesse and issues the following HTTP request. {{{GET /?responder=socketCatcher&ticket=<> HTTP/1.1}}} This tells FitNesse which session the current socket is attached to. FitNesse then sends the HTML for the test tables over that socket. FitServer runs the tests and sends the colorized HTML back over the same socket. + +The protocol is character based. Every block of characters is preceded by ten characters which are ASCII digits representing the decimal length of the block being sent. A block with a length of zero consists only of the ten decimal digits which are all the character zero. This block, named ZERO, has special meanings depending on the context. + +Once FitNesse recieves the !-HttpRequest-! for the socketCatcher, it sends a ZERO block to FitServer to tell FitServer that the connection is live. It then proceeds to send the HTML for every test page as a separate block. If this is just a single page test, then only on block is sent. If this is a suite, then one block per page is sent. When the last page is sent FitNesse follows with a ZERO block. + +The FitServer also sends blocks of colorized HTML using the same character based protocol. A page of colorized HTML may be returned as one large block or as many small blocks. At the end of each page, FitServer sends a ZERO block followed by four more ten digit numbers which contain the counts as follows: right, wrong, ignores, exceptions. + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/properties.xml new file mode 100644 index 0000000000..d2b6552e97 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326162022 + true + + 1238102422175 + 5792858531518117524 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/content.txt new file mode 100644 index 0000000000..1ef71fb527 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/content.txt @@ -0,0 +1,3 @@ +Articles and discussions on the design of FitNesse + +|[[Fit Server][^FitServerProtocol]]|''The protocol between FitNesse and Fit.''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/properties.xml new file mode 100644 index 0000000000..9af8d92c4c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesignNotes/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113828 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/content.txt new file mode 100644 index 0000000000..36d7d8c2ce --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/content.txt @@ -0,0 +1,2 @@ +Action fixtures give you very simple scripting ability. Any test that requires a simple set of interactions could be based on an Action Fixture. For example, you ought to be able to completely test the software that controls a simple dialog box by using the appropriate 'enter', 'press', and 'check' operations. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/properties.xml new file mode 100644 index 0000000000..7a5f6608cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113825 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/content.txt new file mode 100644 index 0000000000..a83801e965 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/content.txt @@ -0,0 +1,4 @@ +The RowFixture implementations that you have seen here have been simplistic, but educational. In each case the fixture just built up an array of little objects. In most cases you will build that array up by inspecting your real application data. + +However, think about this. If you have these tests written up front, then you will know what kind of objects they are going to need. You might be able to create applications that have these objects in them. Then the fixtures would simply return those objects without having to build them. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/properties.xml new file mode 100644 index 0000000000..48df617034 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135108 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/content.txt new file mode 100644 index 0000000000..f490f69d43 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/content.txt @@ -0,0 +1,17 @@ +First, you have to tell !-FitNesse-! to use an alternate COMMAND_PATTERN, formatted specifically for the .NET !-FitServer-!. To do this, add these lines to the wiki page (on the Edit Page): +{{{!-!define COMMAND_PATTERN {%m %p} +!define TEST_RUNNER {dotnet\FitServer.exe} +!define PATH_SEPARATOR {;}-!}}} +The classpath should be modified to list the .dll files that should be loaded. Use the ''' !path ''' widget for this: +!-!path dotnet\*.dll-! + +And, if you have a config file for your application, you can tell !-FitNesse-! to use it with the ''' !path ''' widget as well. +!-!path c:\path\to\my\project\MyProject.config-! + +Here is what that looks like when the page is rendered (not including a config file): +!define COMMAND_PATTERN {%m %p} +!define TEST_RUNNER {dotnet\FitServer.exe} +!define PATH_SEPARATOR {;} +!path dotnet\*.dll + +These are the paths needed to execute the SuiteAcceptanceTests, which uses the .NET !-FitServer-! to test the .NET !-FitServer-!! diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/properties.xml new file mode 100644 index 0000000000..1d44fa78dc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326162317 + + + 1238102597145 + 1671692069292874591 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/content.txt new file mode 100644 index 0000000000..8513492d76 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/content.txt @@ -0,0 +1,125 @@ +The DotNetTestRunner is a command line application named '''!-TestRunner.exe-!'''. It is included in the '''dotnet''' folder of the standard !-FitNesse-! distribution. + +It can be used as follows:{{{ +Usage: TestRunner [options] [assembly[;assembly]] + -v verbose: prints test progress to colsole + -debug prints FitServer actions to console + -nopaths prevents addition of assemblies from remote FitNesse + -results sends test results data to the specified file or the console}}} +The sections below document the options. Expand them to learn more. + +!*> '''Exit Values and the -nopaths Option''' +The exit value if !-TestRunner-! is the number of failures and exceptions. So an exit value of 0 means that all the tests passed. Without any options the execution of the !-TestRunner-! is not all that exciting. As an example here is the command to execute all of the .NET FIT acceptance tests assuming that !-FitNesse-! is running on port 8080 of your computer: {{{C:\projects\fitnesse\dotnet>TestRunner localhost 8080 FitNesse.DotNet.SuiteAccep +tanceTests + +C:\projects\fitnesse\dotnet>echo %ERRORLEVEL% +0 + +C:\projects\fitnesse\dotnet>TestRunner -nopaths localhost 8080 FitNesse.DotNet.S +uiteAcceptanceTests + +C:\projects\fitnesse\dotnet>echo %ERRORLEVEL% +134}}} Notice that the exit value (ERRORLEVEL) is 0, meanning all tests passed in the first execution. In the second execution the '''-nopaths''' options prevented the assembly path from being loaded and the !-TestRunner-! was unable to find any of the Fixture classes. This resulted in 134 errors. +*************! +!*> '''-v The Verbose Option''' +Now let's run the same tests using the -v (verbose option):{{{C:\projects\fitnesse\dotnet>TestRunner -v localhost 8080 FitNesse.DotNet.SuiteAc +ceptanceTests +Adding assemblies: C:\projects\fitnesse\dotnet\acceptanceTests.dll;C:\projects\f +itnesse\dotnet\eg.dll;C:\projects\fitnesse\dotnet\fit.dll;fitnesse.jar;classes +................................................................................ +................................................................................ +................................................................................ +............................... +Test Pages: 27 right, 0 wrong, 0 ignored, 0 exceptions +Assertions: 271 right, 0 wrong, 18 ignored, 0 exceptions}}} This generates readable output as you can see. +***********! +!*> '''-debug The Debug Option''' +This is an option that'll you should never need. However, if you're encoutering unexpected behavior it may be usefull to see the protocol activity between !-FitNesse-! and !-TestRunner-!. This -debug option will print all the verbose output from !-FitServer-! to the console. {{{C:\projects\fitnesse\dotnet>TestRunner -debug localhost 8080 FitNesse.DotNet.Sui +teAcceptanceTests + HTTP request: GET /FitNesse.DotNet.SuiteAcceptanceTests?responder=fitCli +ent&includePaths=yes HTTP/1.1 + + +Validating connection... + ...ok + +processing document of size: 5027 + results: 21 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 1542 + results: 8 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 1510 + results: 3 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2429 + results: 6 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2734 + results: 5 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2901 + results: 4 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 4162 + results: 1 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 4203 + results: 41 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 1987 + results: 6 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 3414 + results: 27 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2290 + results: 18 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2323 + results: 6 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2572 + results: 4 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 1675 + results: 2 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 3536 + results: 8 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2256 + results: 7 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 1451 + results: 1 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 4189 + results: 3 right, 0 wrong, 18 ignored, 0 exceptions +processing document of size: 1655 + results: 3 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 3315 + results: 18 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2263 + results: 3 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 1656 + results: 2 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 3755 + results: 39 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2845 + results: 3 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2351 + results: 3 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 3133 + results: 20 right, 0 wrong, 0 ignored, 0 exceptions +processing document of size: 2435 + results: 9 right, 0 wrong, 0 ignored, 0 exceptions + +completion signal recieved +exiting... +End results: 271 right, 0 wrong, 18 ignored, 0 exceptions}}} +*************! +!*> '''-results The Results Option''' +Without this option the !-TestRunner-! will throw away all of the processed HTML test documents. It can be very useful to keep them around so they be formatted into HTML or archived if you wish. The '''-results''' option allows you to print the results either to standard output or to a file. Here's the command to print them to standard output:{{{ +0000002439TestFieldsPropertiesAndMethods +3 right, 0 wrong, 0 ignored, 0 exceptions +
        +SNIP - Lots of HTML is ommited here. You get the idea. +
        + +00000000000000000271000000000000000000180000000000}}} +****************! +!*> '''Formatting Test Results''' +The .NET !-TestRunner-! doesn't fotmat the test results for you but it genereates output of the required format. Use the '''-results''' option to keep the results from a test execution. Then you can use the Java '''[[!-FormattingOption-!][TestRunner -results dotnet.results localhost 8080 Fi +tNesse.DotNet.SuiteAcceptanceTests + +C:\projects\fitnesse\dotnet>java -cp ..\fitnesse.jar fitnesse.runner.FormattingOption + dotnet.results html dotnet.html localhost 8080 FitNesse.DotNet.SuiteAcceptanceT +ests}}} + +Have a look at the HTML that was generated. +http://docs.fitnesse.org/files/dotnet/dotnet.html +************! \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/properties.xml new file mode 100644 index 0000000000..fc2ca6d054 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326162759 + + + 1238102879967 + -115218819227991423 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/content.txt new file mode 100644 index 0000000000..e29ec00b32 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/content.txt @@ -0,0 +1,2 @@ +!|Import| +|fitnesse.acceptanceTests| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/properties.xml new file mode 100644 index 0000000000..f8812143b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/properties.xml @@ -0,0 +1,10 @@ + + + + 20060717205859 + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/content.txt new file mode 100644 index 0000000000..14712a506f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/content.txt @@ -0,0 +1,378 @@ +!3 Empty cells should display the value of a field or property. If a cell contains ''"blank"'' or ''"null"'' then treat it as blank ("") or truly null. + +Empty cells are automatically filled with the value of the field or property, and no check is performed. To explicitly set a value to empty string ("") or null, or to check for empty string or null, use the "blank" and "null" keywords. + +This works in column fixtures... +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        string fixture
        fieldfieldfield?field?field?
        null nullblankjoe
        blank nullblankjoe
        joe nullblankjoe
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        string fixture
        fieldfieldfield?field?field?
        null  nullnullblank expected
        null actual
        joe expected
        null actual
        blank  blanknull expected
        actual
        blankjoe expected
        actual
        joe  joenull expected
        joe actual
        blank expected
        joe actual
        joe
        -!| + +...row fixtures... +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        blank and null keyword row fixture
        fieldpropertygetfieldpropertygetfieldpropertyget
        nullnullnullblankblankblankJoeJoeJoe
        blankblankblankJoeJoeJoenullnullnull
        JoeJoeJoenullnullnullblankblankblank
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        blank and null keyword row fixture
        fieldpropertygetfieldpropertygetfieldpropertyget
        nullnullnullblank expected
        null actual
        blank expected
        null actual
        blank expected
        null actual
        Joe expected
        null actual
        Joe expected
        null actual
        Joe expected
        null actual
        blankblankblankJoe expected
        actual
        Joe expected
        actual
        Joe expected
        actual
        null expected
        actual
        null expected
        actual
        null expected
        actual
        JoeJoeJoenull expected
        Joe actual
        null expected
        Joe actual
        null expected
        Joe actual
        blank expected
        Joe actual
        blank expected
        Joe actual
        blank expected
        Joe actual
        -!| + +{{{ +public class BlankAndNullKeywordRowFixture : RowFixture +{ + public override object[] Query() + { + StringFixture fixture1 = new StringFixture(); + fixture1.Field = null; + fixture1.Property = null; + fixture1.Set(null); + StringFixture fixture2 = new StringFixture(); + fixture2.Field = ""; + fixture2.Property = ""; + fixture2.Set(""); + StringFixture fixture3 = new StringFixture(); + fixture3.Field = "Joe"; + fixture3.Property = "Joe"; + fixture3.Set("Joe"); + return new object[]{fixture1, fixture2, fixture3}; + } + + public override Type GetTargetClass() + { + return typeof(StringFixture); + } +} +}}} + +...and action fixtures... +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        action fixture
        startstring fixture
        enterfieldnull
        checkfield 
        checkfieldnull
        checkfieldblank
        checkfieldJoe
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        action fixture
        startstring fixture
        enterfieldnull
        checkfield  null
        checkfieldnull
        checkfieldblank expected
        null actual
        checkfieldJoe expected
        null actual
        -!| + +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        action fixture
        startstring fixture
        enterfieldblank
        checkfield 
        checkfieldnull
        checkfieldblank
        checkfieldJoe
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        action fixture
        startstring fixture
        enterfieldblank
        checkfield  blank
        checkfieldnull expected
        actual
        checkfieldblank
        checkfieldJoe expected
        actual
        -!| + +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        action fixture
        startstring fixture
        enterfieldJoe
        checkfield 
        checkfieldnull
        checkfieldblank
        checkfieldJoe
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        action fixture
        startstring fixture
        enterfieldJoe
        checkfield  Joe
        checkfieldnull expected
        Joe actual
        checkfieldblank expected
        Joe actual
        checkfieldJoe
        -!| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/properties.xml new file mode 100644 index 0000000000..d5cce60a56 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/properties.xml @@ -0,0 +1,14 @@ + + + + 20061020065944 + docs + + + + + + + 1153581106438 + -5469804282980307073 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/content.txt new file mode 100644 index 0000000000..92ae21c145 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/content.txt @@ -0,0 +1,320 @@ +!3 !-FitNesse-! treats "y" or "yes" (case insensitive) as true and "n" or "no" as false for bools. + +This works with fields... +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        bool fixture
        fieldfield?field?field?field?field?field?field?field?field?field?field?field?
        truetrueTrueYyYesyesfalseFalseNnNono
        falsefalseFalseNnNonotrueTrueYyYesyes
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        bool fixture
        fieldfield?field?field?field?field?field?field?field?field?field?field?field?
        truetrueTrueYyYesyesfalse expected
        True actual
        False expected
        True actual
        N expected
        True actual
        n expected
        True actual
        No expected
        True actual
        no expected
        True actual
        falsefalseFalseNnNonotrue expected
        False actual
        True expected
        False actual
        Y expected
        False actual
        y expected
        False actual
        Yes expected
        False actual
        yes expected
        False actual
        -!| + +...properties... +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        bool fixture
        propertyproperty?property?property?property?property?property?property?property?property?property?property?property?
        truetrueTrueYyYesyesfalseFalseNnNono
        falsefalseFalseNnNonotrueTrueYyYesyes
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        bool fixture
        propertyproperty?property?property?property?property?property?property?property?property?property?property?property?
        truetrueTrueYyYesyesfalse expected
        True actual
        False expected
        True actual
        N expected
        True actual
        n expected
        True actual
        No expected
        True actual
        no expected
        True actual
        falsefalseFalseNnNonotrue expected
        False actual
        True expected
        False actual
        Y expected
        False actual
        y expected
        False actual
        Yes expected
        False actual
        yes expected
        False actual
        -!| + +..and methods... +|!-fitlibrary.spec.SpecifyFixture-!| +|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        bool fixture
        setget?get?get?get?get?get?get?get?get?get?get?get?
        truetrueTrueYyYesyesfalseFalseNnNono
        falsefalseFalseNnNonotrueTrueYyYesyes
        -!|!- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        bool fixture
        setget?get?get?get?get?get?get?get?get?get?get?get?
        truetrueTrueYyYesyesfalse expected
        True actual
        False expected
        True actual
        N expected
        True actual
        n expected
        True actual
        No expected
        True actual
        no expected
        True actual
        falsefalseFalseNnNonotrue expected
        False actual
        True expected
        False actual
        Y expected
        False actual
        y expected
        False actual
        Yes expected
        False actual
        yes expected
        False actual
        +-!| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/properties.xml new file mode 100644 index 0000000000..8373e92033 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/properties.xml @@ -0,0 +1,14 @@ + + + + 20061020065945 + docs + + + + + + + 1153581545794 + 7598588527939124778 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/content.txt new file mode 100644 index 0000000000..fdc6aae13b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/content.txt @@ -0,0 +1,8 @@ +!3 Use the "error" keyword when you expect an error. In this case, an error turns the cell a nice shade of green! +---- +This example uses a fixture that has string property and two string methods that throw errors - one that throws it directly and one that throws it by delegating to another method that throws an error. + +When you use the error keyword and errors are received the cells turn green. +|error throwing fixture| +|error throwing method()|error throwing property()|redirect to error throwing method()| +|error|error|error| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/properties.xml new file mode 100644 index 0000000000..fd7534ccda --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/properties.xml @@ -0,0 +1,14 @@ + + + + 20081020135118 + docs + + + + + + + 1153582298165 + 3707161786303087126 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/content.txt new file mode 100644 index 0000000000..8cc05b920a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/content.txt @@ -0,0 +1,16 @@ +!3 In addition to the "error" keyword, you can use the "exception" keyword to specify that an exception with a specific message and/or of a specific class is thrown. + +Works with just messages +!|exception throwing fixture| +|message|throw null reference exception!|throw application exception!| +|this is the message|exception["this is the message"]|exception["this is the message"]| + +.. or just the class name +!|exception throwing fixture| +|message|throw null reference exception!|throw application exception!| +|this is the message|exception[NullReferenceException]|exception[ApplicationException]| + +.. or both! +!|exception throwing fixture| +|message|throw null reference exception!|throw application exception!| +|this is the message|exception[NullReferenceException: "this is the message"]|exception[ApplicationException: "this is the message"]| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/properties.xml new file mode 100644 index 0000000000..9b3fd3ec80 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205900 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/content.txt new file mode 100644 index 0000000000..628460d1f4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/content.txt @@ -0,0 +1,26 @@ +!3 This is primarily necessary to test Fitnesse itself. We need the ability to show that Fitnesse will correctly fail a test when comparing different expected and actual values, but we need that test to turn GREEN so we don't have failing tests! + +Works for primatives +|int fixture| +|field|field?| +|21|fail[37]| + +Works for strings +|string fixture| +|field|field?| +|some value|fail[some other value]| + +Works for objects (people) +|person fixture| +|field|field?| +|Joe Smith|fail[Joe Smithe]| + +You can even use the fail keyword to prove that the fail keyword works. In this test, we wrap "fail[Joe Smith]" inside a fail - so when the application returns a person named "Joe Smith", which fails to fail (get it?), the test PASSES! +|person fixture| +|field|field?| +|Joe Smith|fail[fail[Joe Smith]]| + +And this one shows that "Joe Smith" (correctly) does not equal "failure[Joe Smith]" +|person fixture| +|field|field?| +|Joe Smith|fail[failure[Joe Smith]]| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/properties.xml new file mode 100644 index 0000000000..90814f323a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205901 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestSaveAndRecallSymbols/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestSaveAndRecallSymbols/content.txt new file mode 100644 index 0000000000..ccc31d8e5e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestSaveAndRecallSymbols/content.txt @@ -0,0 +1,28 @@ +!3 You can save values in arbitary symbols and recall them later + +'''NOTE: This functionality works differently from similar functionality in java !-FitNesse-!. The plan is to add this approach to the java version in an upcoming release.''' +---- +In the first column, set the value of the field. In the second, query for the value of that field (indicated by the column header ending with "?") and store that value in the symbol "id". +!|string fixture| +|field|field?| +|3|>>id| + +In another table (for the purposes of demonstration - this would work fine in one table) recall the value of the symbol "id" and assign it to the field in the first column. In the second column, query for the value of field (field?) and assert that its value is what was submitted in the previous table.. +!|string fixture| +|field|field?| +|<>a|2|>>b|3|>>c| + +Retrieve the values for setting +!|string fixture| +|field|field?|property|property?|set|get?| +|< + + + 20060717205901 + + + + + + + 1119968415065 + -324361682006869056 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/content.txt new file mode 100644 index 0000000000..0fc922758a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/content.txt @@ -0,0 +1,3 @@ +!3 !-FitNesse-! comes loaded with a handy set of handlers by default. + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/properties.xml new file mode 100644 index 0000000000..a4b9af81c1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205859 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/content.txt new file mode 100644 index 0000000000..f82dc0168b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/content.txt @@ -0,0 +1,76 @@ +!3 You can easily create and load your own custom handlers. + +Here's how we added the !-IntegralRangeHandler-! to !-FitNesse-!, which you use to assert that an int value returned from the application is within a given range. + +First, we overrode the Match method, which takes a string (the contents of a cell) and a Type. In this example, we want an int followed by ".." followed by an int in the string AND the Type of the field must also be an int. It is very important that the Match method be as unique as possible. For example, there are three substring handlers: substring (..abc..), starts with (abc..) and ends with (..abc). The Match method on the !-StartsWithHandler-! needs to ensure that the text ends with ".." and does NOT start with "..". + +The second thing you must do is override the Check method (you can also override Input, Save, Recall and Execute methods, though these are far less useful). In this example, we test that the actual int is >= the left number and <= the right number in the expression. + +{{{public class IntegralRangeHandler : DefaultCellHandler +{ + private static Regex matchExpression = new Regex("^-?[0-9]*\\.\\.-?[0-9]*$"); + public override bool Match(string searchString, Type type) + { + return type == typeof (int) && matchExpression.IsMatch(searchString); + } + + public override void HandleCheck(Fixture fixture, Parse cell, Accessor accessor) + { + if (IsInRange(Actual(accessor, fixture), LowEnd(Args(cell)), HighEnd(Args(cell)))) + { + fixture.Right(cell); + } + else + { + fixture.Wrong(cell, accessor.Get(fixture).ToString()); + } + } + + private string[] Args(Parse cell) + { + return cell.Text().Split('.'); + } + + private int Actual(Accessor accessor, Fixture fixture) + { + return (int) accessor.Get(fixture); + } + + private int HighEnd(string[] args) + { + return Convert.ToInt32(args[args.Length - 1]); + } + + private int LowEnd(string[] args) + { + return Convert.ToInt32(args[0]); + } + + private bool IsInRange(int actual, int low, int high) + { + return actual >= low && actual <= high; + } +}}}} + +To use this handler, load it using the !-CellHandlerLoaderFixture-!... +!|cell handler loader| +|load|integral range handler| + +or load it within your own fixture... +{{{public class CustomFixture : ColumnFixture { + public CustomFixture { + CellOperation.LoadHandler(new IntegralRangeHandler()); + } + ... +} +}}} + +and then use it! +|int fixture| +|field|field?| +|39|37..42| + +Lastly, this clears all the cell handlers and loads the defaults. This is not required, but if you use a lot of custom handlers you may run into matching collisions (i.e. two Match methods that both return true for the same expression). Clearing them is advisable. +!|cell handler loader| +|clear| +|loadDefaults| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/properties.xml new file mode 100644 index 0000000000..010536644f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/properties.xml @@ -0,0 +1,14 @@ + + + + 20081020135118 + docs + + + + + + + 1142086870388 + 7971458849460663522 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/content.txt new file mode 100644 index 0000000000..3bd76313f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/content.txt @@ -0,0 +1,79 @@ +!3 You can manipulate the list of loaded cell handlers using the !-CellHandlerLoaderFixture-!. +---- +Here are the defaults. + +!|cell handler inspector| +|Name| +|DefaultCellHandler| +|BlankKeywordHandler| +|NullKeywordHandler| +|ErrorKeywordHandler| +|EmptyCellHandler| +|BoolHandler| +|SymbolSaveHandler| +|SymbolRecallHandler| +|FailKeywordHandler| +|ExceptionKeywordHandler| + +Now clear the handlers.. +!|cell handler loader| +|clear| + +and the list should be empty. +!|cell handler inspector| +|Name| + +No reload the defaults.. +!|cell handler loader| +|loadDefaults| + +and they should all be in the list. +!|cell handler inspector| +|Name| +|DefaultCellHandler| +|BlankKeywordHandler| +|NullKeywordHandler| +|ErrorKeywordHandler| +|EmptyCellHandler| +|BoolHandler| +|SymbolSaveHandler| +|SymbolRecallHandler| +|FailKeywordHandler| +|ExceptionKeywordHandler| + +Add an optional handler.. +!|cell handler loader| +|load|SubstringHandler| + +and it should be in the list. +!|cell handler inspector| +|Name| +|DefaultCellHandler| +|BlankKeywordHandler| +|NullKeywordHandler| +|ErrorKeywordHandler| +|EmptyCellHandler| +|BoolHandler| +|SymbolSaveHandler| +|SymbolRecallHandler| +|FailKeywordHandler| +|ExceptionKeywordHandler| +|SubstringHandler| + +Remove a single handler.. +!|cell handler loader| +|remove|SubstringHandler| + +and it should not be in the list. +!|cell handler inspector| +|Name| +|DefaultCellHandler| +|BlankKeywordHandler| +|NullKeywordHandler| +|ErrorKeywordHandler| +|EmptyCellHandler| +|BoolHandler| +|SymbolSaveHandler| +|SymbolRecallHandler| +|FailKeywordHandler| +|ExceptionKeywordHandler| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/properties.xml new file mode 100644 index 0000000000..4f90de61c0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205902 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/content.txt new file mode 100644 index 0000000000..e020994964 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/content.txt @@ -0,0 +1,13 @@ +!3 You can assert that a numeric value is within a given range using the optional !-IntegralRangeHandler-!. +---- +First, make sure to load the handler as it is not loaded by default. + +!|cell handler loader| +|load|IntegralRangeHandler| + +Type the low end of the range, ".." and the high end and the cell will turn green if the actual value is within that range. + +|int fixture| +|field|field?|property|property?|set|get?| +|256 |0..256|5 |4..7 |9 |3..9| +|0 |-12..37|-19 |-256..0 |-1 |-12..12| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/properties.xml new file mode 100644 index 0000000000..4f90de61c0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205902 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/content.txt new file mode 100644 index 0000000000..17c59dff5e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/content.txt @@ -0,0 +1,30 @@ +!3 You can assert that a returned value contains a given substring, or specifically starts or ends with that substring. + +Coincidentally, this will work for the string representation of any type (excluding arrays). + +- use ..abc.. to assert that the returned value contains "abc" +- use abc.. to assert that the returned value starts with "abc" +- use ..abc to assert that the returned value ends with "abc" +---- +!|cell handler loader| +|load|SubstringHandler| +|load|StartsWithHandler| +|load|EndsWithHandler| + +|string fixture| +|field|field?|property|property?|set|get?| +|abcdef|..bcd..|ghijk|..hi..|lmnop|..no..| +|abcdef|abc..|ghijk|gh..|lmnop|lm..| +|abcdef|..def|ghijk|..jk|lmnop|..op| + +|int fixture| +|field|field?|property|property?|set|get?| +|12345|..234..|12345|..234..|12345|..234..| +|12345|123..|12345|123..|12345|123..| +|12345|..345|12345|..345|12345|..345| + +|person fixture| +|field|field?|property|property?|set|get?| +|john doe|..john..|dr suess|..sue..|sam iam|..m i..| +|john doe|john..|dr suess|dr s..|sam iam|sam..| +|john doe|..doe|dr suess|..ess|sam iam|..am| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/properties.xml new file mode 100644 index 0000000000..4f90de61c0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205902 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/content.txt new file mode 100644 index 0000000000..cf50cc16aa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/content.txt @@ -0,0 +1,3 @@ +!3 There are several optional handlers that you can load explicitly (using the !-CellHandlerLoader-!). You can also create and load your own custom handlers. + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/properties.xml new file mode 100644 index 0000000000..6402a41983 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205901 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/content.txt new file mode 100644 index 0000000000..b64ee8d6ad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/content.txt @@ -0,0 +1,16 @@ +!3 The !-DotNet FitServer-! treats "()", "?" and "!" as indications that you are trying to access information (for fields, properties and methods). +---- +!|string fixture| +|field|field!|field?|field()| +|aValue|aValue|aValue|aValue| +|anotherValue|anotherValue|anotherValue|anotherValue| + +!|string fixture| +|property|property!|property?|property()| +|aValue|aValue|aValue|aValue| +|anotherValue|anotherValue|anotherValue|anotherValue| + +!|string fixture| +|set|get!|get?|get()| +|aValue|aValue|aValue|aValue| +|anotherValue|anotherValue|anotherValue|anotherValue| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/properties.xml new file mode 100644 index 0000000000..b7542eeb12 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205903 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/content.txt new file mode 100644 index 0000000000..91d34e908b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/content.txt @@ -0,0 +1,7 @@ +'''NOTE: These will only work for !-ColumnFixture-!, though they may be supported in !-RowFixture-! in a future release.''' + +!-CellHandlers-! allow !-FitNesse-! to figure out how to handle a cell based on certain characters or keywords in that cell. In Column Fixtures, the text in the column header will determine whether to input new data or examine existing data (^TestQuerySymbols). + +The individual cells in a column will be handled in different ways depending on the patterns that exist in the cells. There are default handlers (^SuiteDefaultCellHandlerTests), optional handlers that are available in [[!-FitNesse-!][.FitNesse]] (^SuiteOptionalAndCustomHandlerTests) and a mechanism for adding your own handlers (^SuiteOptionalAndCustomHandlerTests). + +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/properties.xml new file mode 100644 index 0000000000..a4b9af81c1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205859 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/content.txt new file mode 100644 index 0000000000..4797192bd6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/content.txt @@ -0,0 +1,16 @@ +The !-PathParser-! is used by the .NET !-FitServer-! to parse the path passed to it from [[!-FitNesse-!][.FitNesse]]. You can include a config file on the path, and .NET !-FitServer-! will use that config file during the test run. + +Try just one path entry... +|path parser fixture| +|path string|assembly paths?|config file path?| +|c:\path\to\assembly.dll|c:\path\to\assembly.dll|null| + +Now two... +|path parser fixture| +|path string|assembly paths?|config file path?| +|c:\path\to\assembly.dll;c:\path\to\other\assembly.dll|c:\path\to\assembly.dll,c:\path\to\other\assembly.dll|null| + +Now one assembly and one config file +|path parser fixture| +|path string|assembly paths?|config file path?| +|c:\path\to\assembly.dll;c:\path\to\assembly.config|c:\path\to\assembly.dll|c:\path\to\assembly.config| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/properties.xml new file mode 100644 index 0000000000..b7542eeb12 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205903 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/content.txt new file mode 100644 index 0000000000..df9b0cd7d2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/content.txt @@ -0,0 +1 @@ +^TestPathParser \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/properties.xml new file mode 100644 index 0000000000..e859e7aa33 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205903 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/content.txt new file mode 100644 index 0000000000..cc339e4ca9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/content.txt @@ -0,0 +1,33 @@ +!3 An !-ActionFixture-! allows you to set values, get values and call methods repeatedly within the same fixture. The first row has one cell with "Action Fixture". The subsequent rows can have 2 or 3 cells: + +'''start''' in the left most cell names the fixture that you'll test using ActionFixture +'''check''' in the left most cell will test the value of the field named in the second cell with the value in the third cell +'''press''' will execute the method named in the second cell +'''enter''' will assign the value of the third cell to the the field or property named in the second cell +---- +|Action Fixture.| +|start|Count Fixture| +|check|Counter|0| +|press|Count| +|check|Counter|1| +|press|Count| +|check|Counter|2| +|enter|Counter|5| +|press|Count| +|check|Counter|6| + + +{{{ +public class CountFixture : Fixture { + private int counter = 0; + + public void Count() { + counter++; + } + + public int Counter { + set { counter = value; } + get { return counter; } + } +} +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/properties.xml new file mode 100644 index 0000000000..3a3aa62d60 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205904 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/content.txt new file mode 100644 index 0000000000..0911458089 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/content.txt @@ -0,0 +1,18 @@ +!3 Column Fixtures have a virtual Execute() method which is called before the first output operation in a given row. You can override this method to handle some processing after input/before output. +---- +!|ExecuteExampleFixture| +|int field|int field?| +|1|2| +|2|4| + +{{{ + public class ExecuteExampleFixture : ColumnFixture + { + public int IntField; + + public override void Execute() + { + IntField = IntField*2; + } + } +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/properties.xml new file mode 100644 index 0000000000..3a3aa62d60 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205904 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/content.txt new file mode 100644 index 0000000000..6612512ece --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/content.txt @@ -0,0 +1,75 @@ +!3 In a row fixture or column fixture, any cells in the first row after the cell with the name of the fixture, are treated as arguments against parameters defined within the fixture. + +As shown in both of these examples, you access the text in these cells using a protected IList named Args: + +!|parameterized column fixture|string value|2|true|Joe Zawinul| +|string field?|int field?|bool field?|person field?| +|string value|2|true|Joe Zawinul| + +{{{using fit; + +namespace fitnesse.acceptanceTests +{ + public class ParameterizedColumnFixture : ColumnFixture + { + public string StringField; + public int IntField; + public bool BoolField; + public Person PersonField; + + public override void Execute() + { + StringField = (string) new TypeAdapter(typeof(string)).Parse(Args[0]); + IntField = (int) new TypeAdapter(typeof(int)).Parse(Args[1]); + BoolField = (bool) new TypeAdapter(typeof(bool)).Parse(Args[2]); + PersonField = (Person) new TypeAdapter(typeof(Person)).Parse(Args[3]); + } + } +}}}} + +!|parameterized row fixture|string value|2|True|Joe Zawinul| +|value| +|string value| +|2| +|True| +|Joe Zawinul| + +{{{using System; +using System.Collections; +using fit; + +namespace fitnesse.acceptanceTests +{ + public class ParameterizedRowFixture : RowFixture + { + public override object[] Query() + { + ArrayList list = new ArrayList(); + list.Add(new ValueWrapper(new TypeAdapter(typeof(string)).Parse(Args[0]))); + list.Add(new ValueWrapper(new TypeAdapter(typeof(int)).Parse(Args[1]))); + list.Add(new ValueWrapper(new TypeAdapter(typeof(bool)).Parse(Args[2]))); + list.Add(new ValueWrapper(new TypeAdapter(typeof(Person)).Parse(Args[3]))); + return list.ToArray(); + } + + public override Type GetTargetClass() + { + return typeof(ValueWrapper); + } + } + + public class ValueWrapper + { + private object value; + + public ValueWrapper(object value) + { + this.value = value; + } + + public object Value + { + get { return value.ToString(); } + } + } +}}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/properties.xml new file mode 100644 index 0000000000..a32993b90e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/properties.xml @@ -0,0 +1,11 @@ + + + + 20081020135118 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/content.txt new file mode 100644 index 0000000000..24093ff4bd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/content.txt @@ -0,0 +1,26 @@ +!3 The !-DotNet FitServer-! will look for your Fixture in any of the namespaces defined in an Import table. + +By default, the !-DotNet FitServer-! includes the "fit" namespace. This test suite includes the "fitnesse.acceptanceTests" namespace in the !-SetUp-! fixture, and clears all namespaces (except "fit") after each test in the !-TearDown-! fixture. +---- +Show that only "fit" and "fitnesse.acceptanceTests" are present. (If there are any other namespaces present already, this table will show a failure). + +!|Namespace Inspector| +|Namespace | +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +Add "some.namespace". + +!|Import| +|some.namespace| + +Show that "some.namespace" is present. + +!|Namespace Inspector| +|Namespace | +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| +|some.namespace| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/properties.xml new file mode 100644 index 0000000000..a32993b90e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/properties.xml @@ -0,0 +1,11 @@ + + + + 20081020135118 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/content.txt new file mode 100644 index 0000000000..cf6b54756d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/content.txt @@ -0,0 +1,16 @@ +!3 [[!-RowFixture-!][.FitNesse.RowFixture]] supports multiple instances with some common properties. +Thanks to Alexey Verkhovsky for catching this bug. When three objects share two properties and come up out of order, the row fixture didn't work correctly. Here is the example he provided - which works now due to the fix he provided as well. + +|people row fixture cleaner| + +|people loader fixture| +|first name|last name| +|A|2| +|B|1| +|A|1| + +|people row fixture| +|first name|last name| +|A|1| +|A|2| +|B|1| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/properties.xml new file mode 100644 index 0000000000..736d4fc991 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/properties.xml @@ -0,0 +1,15 @@ + + + + 20060717205905 + docs + + + + + + + + 1130213043782 + -385164570367861455 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/content.txt new file mode 100644 index 0000000000..3caf8d86e9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/content.txt @@ -0,0 +1,10 @@ +Row fixtures work correctly with arrays. + +!|ArrayOfStringsFixture| +|field|save!| +|a,b,c|| + +!|ArrayOfStringsRowFixture| +|field| +|a,b,c| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/properties.xml new file mode 100644 index 0000000000..8f30a74e20 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205905 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/content.txt new file mode 100644 index 0000000000..b32b6ed7e6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/content.txt @@ -0,0 +1,35 @@ +!3 [[!-RowFixture-!][.FitNesse.RowFixture]] supports multiple instances with like properties +|people row fixture cleaner| + +Load one person +|people loader fixture| +|first name|last name| +|john|doe| + +Is he there? +|people row fixture| +|first name|last name| +|john|doe| + +Load another person +|people loader fixture| +|first name|last name| +|jane|roe| + +Are they both there? +|people row fixture| +|first name|last name| +|john|doe| +|jane|roe| + +Load another just like the first +|people loader fixture| +|first name|last name| +|john|doe| + +Are all three there? +|people row fixture| +|first name|last name| +|john|doe| +|john|doe| +|jane|roe| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/properties.xml new file mode 100644 index 0000000000..bb399ebdfa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205905 + docs + + + + + + + 1130212593731 + -775899498686458197 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/content.txt new file mode 100644 index 0000000000..6f4a3d5a64 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/content.txt @@ -0,0 +1,24 @@ +!3 Convenient access to table cells. +Sometimes you just want a fixture that lets you access the cells in a table by row and column. TableFixture provides some simple methods that allow just that. + * The (row,column) coordinates are zero based, + * with (0,0) being the upper left cell. + +The methods of TableFixture are: + +|Comment| +|{{{protected abstract void DoStaticTable(int rows)}}}|!-TableFixture-! is an abstract class that you must derive from. You must override ''!-DoStaticTable-!'' to perform the functions of the fixture. The number of rows in the table is passed in ''rows''.| +|{{{protected Parse GetCell(int row, int column)}}}|Returns the addressed table cell as a ''Parse''.| +|{{{protected String GetText(int row, int column)}}}|Returns the text within the addressed table cell.| +|{{{protected int GetInt(int row, int column)}}}|Converts the text within the addressed cell to an int and returns it.| +|{{{protected boolean Blank(int row, int column)}}}|Returns ''true'' if the addressed table cell is blank.| +|{{{protected void Right(int row, int column)}}}|Turns the addressed table cell green.| +|{{{protected void Wrong(int row, int column)}}}|Turns the addressed table cell red.| +|{{{protected void Wrong(int row, int column, string actual)}}}|Turns the addressed table cell red, and annotates it with the ''actual'' value.| +|{{{protected void Ignore(int row, int column)}}}|Turns the addressed cell gray.| +---- +|Bowling Game Fixture| +|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||0| +|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|5|150| + +|Bowling Game Fixture| +|10|10|10|10|10|10|10|10|10|10|10|10||||||||||300| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/properties.xml new file mode 100644 index 0000000000..a32993b90e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/properties.xml @@ -0,0 +1,11 @@ + + + + 20081020135118 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/content.txt new file mode 100644 index 0000000000..3ac692a075 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/content.txt @@ -0,0 +1,12 @@ +!3 If you want a string value to include leading or trailing whitespace, use the syntax for escaping literals: + +precede it with !-!--! +follow it with !--!-! + +for example, " value" would be represented as !-!--! value!--!-! + +|string| +|field|field?|| +|value|!-value-!|"value"| +|!- value-!|!- value-!|" value"| +|!- value-!|fail[value]|" value" fails against "value"| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/properties.xml new file mode 100644 index 0000000000..a2788b7ca6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205906 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml new file mode 100644 index 0000000000..e859e7aa33 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205903 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/content.txt new file mode 100644 index 0000000000..1ea00cd49d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/content.txt @@ -0,0 +1,9 @@ +!2 ''Classpaths'' +!path c:\views\iig\iigweb\pr\iig\bin\BusinessObjects.dll +!path C:\Views\IIG\IIGWeb\BusinessObjects\bin\BusinessObjects.dll.config + +!|AllianzLife.IIGWeb.BusinessObjects.Test.FitTests.FormPacketServiceFitTest| +|TestCaseId |StateCode |ProductCode |PremiumSubmitted |EFT |Replacement |Transfer |HighFaceAmount |Insured65OrOlder |LTCRider |RequiredDocuments? |RequestedDocuments? |OtherDocuments? | +|1|CA |182194|false |false |false |false |false |false |false |CA-NB2240;NB3046-WS;NB5026-WS; NB5051-SR;NB5056-R;NB5057-R; |None |NB2012;NB4019;NB5003-CA;NB5018-WS;NB5023-L;NB5028;S2056-WS;| +|2|CA |182194|true |true |true |true |true |true |true |CA-NB2240;NB3046-WS;NB5026-WS; NB5051-SR;NB5056-R;NB5057-R; |None |NB2012;NB4019;NB5003-CA;NB5018-WS;NB5023-L;NB5028;S2056-WS;| +|3|CA |182194|false |false |false |true |false |FALSE|false |CA-NB2240;NB3046-WS;NB5026-WS; NB5051-SR;NB5056-R;NB5057-R; |None|NB2012;NB4019;NB5003-CA;NB5018-WS;NB5023-L;NB5028;S2056-WS;| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/properties.xml new file mode 100644 index 0000000000..6b2bd2e2a6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205912 + + + + + + + 1122481075599 + -4212423751142652375 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/properties.xml new file mode 100644 index 0000000000..23770ec712 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205912 + + + + + + + + 1122562599232 + 4035305450827321590 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/properties.xml new file mode 100644 index 0000000000..a72f566629 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205906 + + + + + + + + 1122562607872 + 2751259974356054059 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/content.txt new file mode 100644 index 0000000000..7b91d943c0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/content.txt @@ -0,0 +1,23 @@ +!3 The [[.NET][.FitNesse.DotNet]] Fit server will handle arrays of primitive and custom types +---- +|array of ints| +|field|field?|property|property?|set|get?| +|1,2,3|1,2,3|4,5,6,7|4,5,6,7|9,0|9,0| + +|array of strings| +|field|field?|property|property?|set|get?| +|1,2,3|1,2,3|4,5,6,7|4,5,6,7|9,0|9,0| +|this, is, an, array, of, strings|this, is, an, array, of, strings|this, is, an, array, of, strings|this, is, an, array, of, strings|this, is, an, array, of, strings|this, is, an, array, of, strings| + +|array of bools| +|field|field?|property|property?|set|get?| +|true|true|false|false|true|true| +|false, true, false|false, true, false|false, true, false|false, true, false|false, true, false|false, true, false| + +!see TestPrimitiveTypeConversion + +|array of people| +|field|field?|property|property?|set|get?| +|john doe, jane roe|john doe, jane roe|first last, first last|first last, first last|c sharp, dot net|c sharp, dot net| + +!see TestCustomTypeConversion \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/properties.xml new file mode 100644 index 0000000000..8fba7543eb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205913 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/content.txt new file mode 100644 index 0000000000..d88ed75423 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/content.txt @@ -0,0 +1,49 @@ +!3 The [[.NET][.FitNesse.DotNet]] Fit server will instantiate an instance of any class that exports a static Parse method that accepts a string and overrides !-ToString()-!. +---- +|person fixture| +|field|field?|property|property?|set|get?| +|john doe|john doe|jane roe|jane roe|do remi|do remi| +---- +{{{ +public class PeopleFixture : ColumnFixture +{ + public Person Field; + + public Person Property + { + get { return Field; } + set { Field = value; } + } + + public Person Get() { + return Field; + } + + public void Set(Person value) { + Field = value; + } +} + +public class Person +{ + private string firstName; + private string lastName; + + public static Person Parse(string name) + { + string[] names = name.Split(' '); + return new Person(names[0], names[1]); + } + + public Person(string firstName, string lastName) + { + this.firstName = firstName; + this.lastName = lastName; + } + + public override string ToString() + { + return firstName + " " + lastName; + } +} +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/properties.xml new file mode 100644 index 0000000000..8fba7543eb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205913 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/content.txt new file mode 100644 index 0000000000..7a419a79af --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/content.txt @@ -0,0 +1,27 @@ +!Row Fixtures can correctly handle the values in an enum. + +!|color inspector| +|ToString()| +|Red| +|Blue| + +{{{public enum Color +{ + Red, + Blue +} + +public class ColorInspectorFixture : RowFixture +{ + public override object[] Query() + { + Array colorsArray = Enum.GetValues(typeof(Color)); + ArrayList colorsList = new ArrayList(colorsArray); + return colorsList.ToArray(); + } + + public override Type GetTargetClass() + { + return typeof(Color); + } +}}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/properties.xml new file mode 100644 index 0000000000..8fba7543eb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205913 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/content.txt new file mode 100644 index 0000000000..27a1bac410 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/content.txt @@ -0,0 +1,32 @@ +!3 The [[.NET][.FitNesse.DotNet]] Fit server will handle any numeric or boolean primitive types. +---- +|int fixture| +|field|field?|property|property?|set|get?| +||0||0||0| +|123|123|456|456|789|789| + +|long fixture| +|field|field?|property|property?|set|get?| +||0||0||0| +|123|123|456|456|789|789| + +|double fixture| +|field|field?|property|property?|set|get?| +||0.0||0.0||0.0| +|12.3|12.3|37.42|37.42|98.452|98.452| + +|float fixture| +|field|field?|property|property?|set|get?| +||0.0||0.0||0.0| +|12.3|12.3|37.42|37.42|98.452|98.452| + +|decimal fixture| +|field|field?|property|property?|set|get?| +||0.0||0.0||0.0| +|12.3|12.3|37.42|37.42|98.452|98.452| + +|bool fixture| +|field|field?|property|property?|set|get?| +||false||false||false| +|false|false|true|true|false|false| +|true|true|false|false|true|true| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/properties.xml new file mode 100644 index 0000000000..523334fa79 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205914 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/content.txt new file mode 100644 index 0000000000..fcfee41907 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/content.txt @@ -0,0 +1,2 @@ +The [[.NET][.FitNesse.DotNet]] Fit server can handle all primitive types as well as arrays and custom types. +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/properties.xml new file mode 100644 index 0000000000..0882d04771 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205913 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/content.txt new file mode 100644 index 0000000000..19c4855e92 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/content.txt @@ -0,0 +1 @@ +!|fitnesse.acceptanceTests.ResetNamespacesFixture| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/properties.xml new file mode 100644 index 0000000000..d16050c4c3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/properties.xml @@ -0,0 +1,10 @@ + + + + 20060717205914 + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/content.txt new file mode 100644 index 0000000000..1233472949 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/content.txt @@ -0,0 +1,64 @@ +!3 !-FitNesse-! will handle any type that implements a static Parse(string) method and overrides !-ToString()-!. + +Parse(string) should construct and return an instance of the Type. The trick is that the !-ToString()-! method must produce the same string that was used to create the instance. + +{{{ +string str = "some meaningful string representation of a domain object"; +DomainObject instance = DomainObject.Parse(str); +Assert.AreEqual(str, instance.ToString()); +}}} +---- +!|person fixture|three amigos| +|field|field?|property|property?|set|get?| +|Grady Booch|Grady Booch|Ivar Jacobson|Ivar Jacobson|Jim Rumbaugh|Jim Rumbaugh| + +{{{public class Person +{ + private string firstName; + private string lastName; + + public static Person Parse(string name) + { + string[] names = name.Split(' '); + return new Person(names[0], names[1]); + } + + public Person(string firstName, string lastName) + { + this.firstName = firstName; + this.lastName = lastName; + } + + public override string ToString() + { + StringBuilder builder = new StringBuilder(firstName); + if (builder.Length > 0 && lastName != null && lastName.Length > 0) + { + builder.Append(" "); + } + return builder.Append(lastName).ToString(); + } +} + +public class PersonFixture : ColumnFixture +{ + public Person Field; + private Person propertyValue; + private Person methodValue; + + public Person Property + { + set { propertyValue = value; } + get { return propertyValue; } + } + + public void Set(Person value) + { + methodValue = value; + } + + public Person Get() + { + return methodValue; + } +}}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/properties.xml new file mode 100644 index 0000000000..523334fa79 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205914 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/content.txt new file mode 100644 index 0000000000..4c027203fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/content.txt @@ -0,0 +1,31 @@ +!3 The !-DotNet FitServer-! allows you to assign values to public fields, properties or setter methods (methods that accept one argument and return void), and retrieve values from public fields, properties or getter methods (methods that return a non-void value and accept no arguments). + +This way the business owners (who write the tables) need not concern themselves with implementation details, while developers (who write the fixtures) need not code to inadvertantly imposed business rules like whether a public member should be exposed through a method or a property. +---- +!|string fixture| +|field|field?|property|property?|set|get?| +|field value|field value|property value|property value|method value|method value| + +{{{public class StringFixture : ColumnFixture +{ + public string Field; + + public string Property + { + get { return propertyValue; } + set { propertyValue = value; } + } + + public void Set(string value) + { + methodValue = value; + } + + public string Get() + { + return methodValue; + } + + private string propertyValue; + private string methodValue; +}}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/properties.xml new file mode 100644 index 0000000000..523334fa79 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205914 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/content.txt new file mode 100644 index 0000000000..18b771e95c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/content.txt @@ -0,0 +1,47 @@ +!3 The !-DotNet FitServer-! allows you to name fixtures gracefully, so you can type "add employee" rather than "namespace.!-AddEmployeeFixture-!". +---- +All of the following tables access the !-fitnesse.acceptanceTests.NamespaceInspector-! which reports all the namespaces that are currently loaded. + +!|fit.NamespaceInspector| +|namespace| +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +!|NamespaceInspector| +|namespace| +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +!|Namespace Inspector| +|namespace| +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +!|namespace inspector| +|namespace| +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +!|Namespace Inspector.| +|namespace| +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +!|Namespace-Inspector| +|namespace| +|fit| +|fitnesse.acceptanceTests| +|fitnesse.handlers| + +This one will find "!-ActionFixture-!" and "!-CountFixture-!" (looking for classes whose names end with "Fixture") + +!|action| +|start|count| +|check|counter|0| +|press|count| +|check|counter|1| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/properties.xml new file mode 100644 index 0000000000..c1773a3468 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205915 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/content.txt new file mode 100644 index 0000000000..87a57e9cb2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/content.txt @@ -0,0 +1,14 @@ +!3 The !-DotNet FitServer-! allows you to name class members (fields, properties and methods) gracefully ("calculate tax!" rather than "!-CalculateTax!-!") +---- + +!|member finder test| +|the field|the field?|the property|the property?|the setter method|the getter method?| +|first value|first value|second value|second value|third value|third value| + +!|member finder test fixture| +|The Field|The Field?|The Property|The Property?|The Setter Method|The Getter Method?| +|first value|first value|second value|second value|third value|third value| + +!|MemberFinderTestFixture| +|THE-FIELD|THE-FIELD?|THE?&#PROPERTY|THE+-=PROPERTY?|The*Setter*Method|The*Getter*Method?| +|first value|first value|second value|second value|third value|third value| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/properties.xml new file mode 100644 index 0000000000..c1773a3468 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/properties.xml @@ -0,0 +1,11 @@ + + + + 20060717205915 + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/content.txt new file mode 100644 index 0000000000..fcece7e16b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/content.txt @@ -0,0 +1,7 @@ +This suite executes acceptance tests for the .NET !-FitServer-!. +---- +!define COMMAND_PATTERN {%m %p} +!define TEST_RUNNER {dotnet\FitServer.exe} +!define PATH_SEPARATOR {;} +!path dotnet\*.dll +----!contents -R diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/properties.xml new file mode 100644 index 0000000000..4567a6975f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/properties.xml @@ -0,0 +1,14 @@ + + + + 20061020065944 + docs + + + + + + + 1153351541881 + -5401674843613009715 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/content.txt new file mode 100644 index 0000000000..bef23b3d32 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/content.txt @@ -0,0 +1,18 @@ +.NET !-FitServer-! and !-FitLibrary-! have been merged into a single project on sourceforge. You can now browse and/or check out source for .NET !-FitServer-! and !-FitLibrary-!: + +https://sourceforge.net/svn/?group_id=167811 +http://svn.sourceforge.net/viewcvs.cgi/fitnessedotnet/ +svn co https://svn.sourceforge.net/svnroot/fitnessedotnet/trunk fitnessedotnet + +As of today (10/11/2006) .NET 1.1 and 2.0 binaries can be found in the following locations as well: + +https://svn.sourceforge.net/svnroot/fitnessedotnet/tags/20060530/bin/Framework.1.1/ +https://svn.sourceforge.net/svnroot/fitnessedotnet/tags/20060530/bin/Framework.2.0/ + +---- +|^SuiteAcceptanceTests| + +Although the FitNesse web server and wiki are built into a java application, the tests are run in a separate process invoked via the command line by FitNesse. Because of this, FitNesse supports !-FitServers-! in virtually any language. The '''.NET !-FitServer-!''', which ships with FitNesse, can be invoked as follows: + * [[From within !-FitNesse-!][^DotNetFitServer]] + * [[From the command line !-TestRunner-!][^DotNetTestRunner]] + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/properties.xml new file mode 100644 index 0000000000..e329d4ef54 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DotNet/properties.xml @@ -0,0 +1,12 @@ + + + + 20090326162852 + + + + + + 1238102932160 + -1905961084893128011 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/content.txt new file mode 100644 index 0000000000..bc03f6753f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/content.txt @@ -0,0 +1,30 @@ +!2 Downloading and Installing FitNesse +It really takes very little time and effort to get FitNesse running on your machine. + 1 Go to !style_code(http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad) and click on the most recent !style_code(fitnesse.jar) file. + * If this is a brand new installation, just put it in some convenient empty directory. + * If this is an update, then copy it on top of the old fitnesse.jar in your current installation. + 2 Type !style_code(java -jar fitnesse.jar) + * It will ask you to be patient as it installs or updates. + * When it's done, it will ask you to reload fitnesse. Type !style_code(java -jar fitnesse.jar) again. + * Your shell should respond with something like this: + !img http://files/images/fitnessestarted.png + 3 Start up a browser and go to !style_code(http://localhost) + 4 The main FitNesse screen should come up. That's it. You're ready to start using FitNesse. + +!3 It didn't work! +Most likely you have another web server running. Web servers default to port 80, so if another one is running on your machine you'll have to specify another port via a CommandLineOption. Try this command: + !style_code(java -jar fitnesse.jar -p 8080) + +Then point your browser to !style_code(http://localhost:8080) + +Still no? Check out FitNesseWontStart for some more tips. + +!2 Learning More +If you have not yet done so, check out the TwoMinuteExample. To learn more about what FitNesse acceptance testing is all about, see AcceptanceTests. If you are ready to start creating FitNesse pages and test tables, check out EditingFitNessePages and CreatingTestTables. + +!2 Memory Issues. +With the 20090320 release, some operations in !-FitNesse-! take more than the default memory allocated to the JVM. This can cause tests to fail for ''out of heap space'' reasons. You can fix this by adding the !style_code(!--Xmx100M-!) JVM argument to the java command line when you start !-FitNesse-!. !style_code(!-java -Xmx100M -jar fitnesse.jar-!). + +!3 Memory issues and the build. +If you build !-FitNesse-! from source, the ant script may fail for ''out of heap space'' reasons. You can fix this by setting the !style_code(ANT_OPTS) environment variable to !style_code(!--Xmx100M-!). + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/properties.xml new file mode 100644 index 0000000000..642b8ac701 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1237473507730 + -8390780236878065853 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/content.txt new file mode 100644 index 0000000000..e76dcf3bdf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/content.txt @@ -0,0 +1,42 @@ +!2 Editing and Creating Pages in FitNesse + +FitNesse is a [[wiki web server][http://wiki.org/wiki.cgi?WhatIsWiki]]. Before you can begin CreatingTestTables, you need to know a bit about how a wiki works. + +A wiki allows any authorized user to make changes to any edit-enabled page, or to create new pages, simply by using their Web browser. If you are working with a copy of FitNesse on your own machine, you are probably authorized to make such changes. (If you have not yet installed FitNesse on your own machine, it's easy do to. You can read about it on DownloadingAndInstallingFitNesse.) + +!3 Editing a Page +Once you are on a page your want to change, hit the '''Edit''' button in the upper left. (If the button does not appear, then the page is not edit-enabled.) + +A new window will pop up with an edit frame containing the markup language of the current page. You specify formatting using a simple markup language. Simply make your changes to the page and hit the '''Save''' button. ''Voila!'' Your changes appear on the page. + +!3 Creating New Pages +Every FitNesse page has a name in so-called camel-case format, in which the first letter is upper-case, and at least one other letter in the word is upper-case. The name of this page, EditingFitNessePages, is an example. This convention makes it truly easy to create new pages and links to those pages. + +When you edit an existing page and insert a new camel-case word, such as !-ThisHereNewPage-!, and then click the Save button, FitNesse interprets that to be a link to a new, as-yet-uncreated page. It indicates this to you by putting a question mark at the end of the name. + +If you then click on that question mark, FitNesse displays an edit frame, enabling you to put something on that new page. If you type anything at all in there and click Save, your new page is created, and the link to it is enabled on the originating page. + +!3 Try Creating a New Page with a Link Back to This One +Try it yourself. Click on the question mark at the end of this word: ThisHereNewPageExample Put something on the page, click the Save button, and then return here. A good thing to put on the new page is the word EditingFitNessePages, so that you can return to this page easily! + +!2 A Few Formatting Examples +The wiki markup language is fairly powerful. Two see how we accomplished each of the formatting examples below, you can simply click the Edit button and check it out for yourself. + +You can '''make text bold''' by putting three single quotes (ticks) on each side of it (e.g., !-'''make text bold'''-!). + +You can ''make text itallic'' by putting two ticks on each side of it (e.g., !-''make text itallic''-!). + +You can center a line by prefixing it with !-!c-! + +!c This line is centered. + +You can make a horizontal rule by using four or more dashes. +So !- ---- -! becomes +---- +For more examples of wiki markup language formatting widgets (as they are called), see MarkupLanguageReference. +!3 Page Properties +Each FitNesse page has several properties (Test, Suite, Edit, etc). You can read about setting them on PageProperties. + +!2 Learning More +Now that you know a bit about creadting and editing FitNesse pages, the next thing to learn might be CreatingTestTables. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/properties.xml new file mode 100644 index 0000000000..4f2e86ee56 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326163025 + + + 1238103025877 + 6855924077953894968 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/content.txt new file mode 100644 index 0000000000..15fc5c4bb0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/content.txt @@ -0,0 +1,28 @@ +If something goes wrong when you push the ''test'' button, the most likely cause is that you haven't specified the classpath. Edit the test page and add a !path directive for every classpath that you want included. See BuildingClassPaths for more information. + +Another common problem is a mispelling of the test fixture, or one of the column names. The symptom is an exception appearing in the table cell that contains the mispelling. + +Hit the ''Test'' button to see what these errors look like. + +!|eg.thisTestFixtureDoesNotExist| +|just some data| + +!|eg.Division| +|dividend|divisor|quotient()| +|5|1|5| + +Another odd problem can occurr if the name of the fixture is a WikiWord. If the corresponding wiki page does not exist, then a ? is appended to it. Fit sees this ? and thinks it's part of the classname. Hit the ''Test'' button and then look at the table below. You should see a ? in the table at the end of the fixture name. You should also see that ? in the exception report that follows it. Look closely. + +!|somePackage.ClassThatLooksLikeWikiWordButIsntOne| +|a|b|c| + +If you have a problem like this, then what you need to do is surround the name of the fixture in !-!- -! and !- -!-! (see MarkupLiteralText). +{{{|! -somePackage.ClassThatLooksLikeWikiWordButIsntOne- !| +|a|b|c|}}} +Or you can also use the literal tables like this: +{{{!|somePackage.ClassThatLooksLikeWikiWordButIsntOne| +|a|b|c|}}} +'''Tip for viewing exceptions in small font''' +If you have a scroll-wheel mouse, hold the ctrl key and scroll the wheel. It increases/decreases the font size quickly in most browsers. + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/properties.xml new file mode 100644 index 0000000000..a3d1d2307f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/properties.xml @@ -0,0 +1,9 @@ + + + + 20090326163101 + true + + 1238103061084 + 5671685757323426249 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/content.txt new file mode 100644 index 0000000000..c1c7165603 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/content.txt @@ -0,0 +1,8 @@ +In order to support automation and contionuous integration efforts, FitNesse allows test execution from outside the wiki. + +There are several ways of doing this: + +|''Method'' |''Benefits'' | +|[[Test execution on the command line][ControllingFitnesseFromTheCommandLine]]|[[Ant/Maven support][ControllingFitnesseFromTheCommandLine#antIntegration]] | +|[[Test execution through JUnit][RunningFromJunit]] |IDE integration, [[Maven support][RunningFromMaven]], fixture debugging, JUnit XML result generation| +|[[!-FitNesse-! Automation with REST commands][RestfulServices]] |Can be used with any program that can send HTTP requests | diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/content.txt new file mode 100644 index 0000000000..429434a800 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/content.txt @@ -0,0 +1,20 @@ +You can include external HTML pages as sub-wikis within the !-FitNesse-! wiki. If you have a set of tests that were written in HTML before you started to use !-FitNesse-!, you can include these in your current test suites without converting them to !-FitNesse-! wiki pages. If you prefer not to use the !-FitNesse-! wiki syntax and !-FitNesse-! editor to maintain your tests, you can still use !-FitNesse-! to execute your tests, both interactively and in batch, view test results and track test history. + +To include a folder of HTML files in the !-FitNesse-! wiki, simply place the folder somewhere beneath the !-FitNesseRoot-! folder that holds all the !-FitNesse-! wiki files. Each folder containing HTML files will appear as a page and the HTML files will appear as child pages. + +Here's an example: + + * We create a static wiki page called !-MyExternalPages-! and put the !contents widget in it. This creates a folder called !-MyExternalPages-! with some wiki files in it (content.txt, properties.xml and maybe some zip files). + * We create a folder called !-HtmlPages-! as a sub-folder of !-MyExternalPages-! and create several HTML files in !-HTMLPages-!: !-TestA.html-!, !-TestB.html-! and !-TestC.html-!. + * !-FitNesse-! now shows a page called !-HtmlPages-! as a child of !-MyExternalPages-! and three child pages of !-HtmlPages-! called !-TestA-!, !-TestB-! and !-TestC-!. + +The external HTML pages appear as read-only pages - you cannot edit them from !-FitNesse-! or change their properties (yet!). The folder pages are always marked with the Suite property and the HTML pages are marked with the Test property if they contain at least one HTML table. You can create !-SuiteSetup.html-! and !-SetUp.html-! files and !-FitNesse-! will treat these as special test pages, the same as wiki pages. + +This is a first version of this feature and so there are a few caveats: + * If you use the ?edit or ?properties URL syntax, you can get to the edit and properties pages, but they will fail if you try to save. + * The contents of the HTML files are placed as is inside a !-FitNesse-! page, and may break the page display if there are unbalanced tags or other HTML problems that may not be apparent when the HTML is displayed on its own. + * Hyperlinks, images, Javascript files and other external references in the HTML may not behave as expected when placed inside a !-FitNesse-! page. + * Wiki page names are generated from the HTML file names, but there is no check to avoid potential name collisions. For example, !-TestA.html-! and testa.html will both generate !-TestA-! as a wiki page name. + +If you can avoid these issues, this feature should work well for you: it has been successfully used on a large suite of hundreds of HTML files. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FilesSection/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FilesSection/content.txt new file mode 100644 index 0000000000..5e44aca483 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FilesSection/content.txt @@ -0,0 +1,22 @@ +'''What is the 'files' section?''' +The 'files' section is a directory where FitNesse keeps all of its non-wiki files such as images and other static files. + +'''How do I access the FilesSection?''' +Simply add "/files/" on the end of the URL used to visit the FitNesse installation. To get to the 'files' section of fitnesse.org the following url is used. +http://www.fitnesse.org/files/ + +Notice that this looks like a directory listing. That is because the root of the FilesSection is a directory. By clicking on a directory or file you will be redirected to that selection. If it is a directory you will see a listing of its contents and if it is a file you will see the contents of the file. + +In general FitNesse will serve files from the FilesSection like any other web server would. + +'''How can I link to files in the FilesSection?''' +Any file located in the FilesSection can be linked to from any Wiki page. For example the link to the images directory would look like this: +http://files/images/ +Notice that there is no domain name in the URL. You could have put the domain name in like this: +http://www.fitnesse.org/files/images/ +But that would not be taking advantage of the shortcut we have provided. + +'''Modifying the FilesSection?''' +When you view a directory in the FilesSection you will see several controls at the bottom of the page. They allows you to upload files from your hard drive to the current directory, add a new directory to the currrent directory, rename or delete an existing file. + +This allows you to upload and manage special documents that may be related to your FitNesseTests and link to them from the appropriate page. You could also upload your most recent build to run tests against. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FilesSection/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FilesSection/properties.xml new file mode 100644 index 0000000000..97f959ec5e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FilesSection/properties.xml @@ -0,0 +1,9 @@ + + + + 20081020135131 + + + 1213646204336 + 2918076654716302964 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitFramework/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitFramework/content.txt new file mode 100644 index 0000000000..f116d21860 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitFramework/content.txt @@ -0,0 +1,9 @@ +!1 The Fit Acceptance Testing Framework + +Fit ("Framework for Integrated Testing"), also often spelled [[FIT][http://fit.c2.com/]] is the engine that actually processes each FitNesse test table, using the FixtureCode referred to by that table. The idea of test tables, and the set of TestTableStyles, come from Fit. + +FitNesse is an HTML and [[wiki][http://wiki.org/wiki.cgi?WhatIsWiki]] "front-end" to Fit. While Fit makes it possible to run test tables, it does not itself provide an easy means of creating those tables or displaying the results of those tests. This is where FitNesse comes in. FitNesse makes it ''really easy'' to create, run, organize, annotate, and share Fit tests throughout a software development team. + +Interestingly both the wiki and Fit were developed by Ward Cunningham, and you can read about them both on Ward's [[c2 wiki][http://fit.c2.com/]]. + +Throughout this [[User Guide][ + + + 20090326163153 + + + 1238103113455 + 7644526656102173911 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/content.txt new file mode 100644 index 0000000000..afe94d70d3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/content.txt @@ -0,0 +1,3 @@ +!|ChatSuiteFixture| + +|''select or''|skipped| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/properties.xml new file mode 100644 index 0000000000..e564d937f5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205917 + + + + + + + 1136439720040 + -4033394350151603973 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/content.txt new file mode 100644 index 0000000000..7f02d3ff4d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/content.txt @@ -0,0 +1,8 @@ +This defines another suite + * This page includes a symbolic link to + + + 20090326163609 + + + + + + + <UserGuide.FitLibraryUserGuide.SuiteFixtureExample + + + + 1238103269017 + + .FitNesse.FitLibraryUserGuide.SuiteFixtureExample + TheTests + + -7242569881866889589 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/content.txt new file mode 100644 index 0000000000..2eda0cb7f1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/content.txt @@ -0,0 +1,30 @@ +ArrayFixture tables look almost the same as !-RowFixture-! tables. However, the order of the elements in the list has to be the same as the order of the rows in an ArrayFixture table. + * This passes: +|!-StartListing-!| +|list is|1,2,3,4| + +|''ordered list''| +|''item''| +|1| +|2| +|3| +|4| + * But this fails: +|''ordered list''| +|''item''| +|3| +|4| +|1| +|2| + * Compare this to using a !-RowFixture-!, where the order doesn't matter: +|''row list''| +|''item''| +|3| +|4| +|1| +|2| +Let's look at WritingListFixtures for ''!-ArrayFixture-!''s (and others). + +The header labels of ArrayFixture tables can contain any characters, such as "$". +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/properties.xml new file mode 100644 index 0000000000..f802db3b83 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205918 + + + + + + + 1134697892718 + 9186329389092808261 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/content.txt new file mode 100644 index 0000000000..bb4318be1e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/content.txt @@ -0,0 +1,24 @@ +Let's start by looking at the fixture code for the previous example, shown in part again: + +|!-CalculatedDiscount-!| +|''$''||''discount''| +|2000.00||100.00| + +The fixture code is as follows: +----{{{public class CalculatedDiscount extends fitlibrary.CalculateFixture{ + private Discount application = new Discount(); + + public double discountDollar(double amount) { + return application.getDiscount(amount); + } +} }}}----The method ''discountDollar()'' is called for each of the rows. The ''given'' value is supplied as an argument to the method and the result is compared to the ''expected'' value. + +The header labels are used to determine the method name, being the ''expected'' column label followed by each of the ''given'' column labels ("discount" + "$"). This name is converted into a valid Java method name based on [[''extended camel''][.FitLibrary.FitLibraryUserGuide.ExtendedCamelCase]]. While this can result in some weird method names, it does given the Fit test writer considerable freedom of expression. +!3 In General + * For each ''expected'' column in a ''!-CalculateFixture-!'' table, there is a distinct method. The name of the method is created from the ''expected'' column label followed by each of the ''given'' column labels. The method has a parameter for each of the ''given'' columns and returns a result which is compared against the ''expected'' value. + * As with [[''!-DoFixture-!''][.FitLibrary.FitLibraryUserGuide.DoFixture.FixtureDetails]], a ''!-SystemUnderTest-!'' object may be associated with a ''!-CalculateFixture-!''. If the fixture itself doesn't have a required method, the one in the ''!-SystemUnderTest-!'' is called instead. This means that the fixture acts as an adapter only when necessary, to map actions in the table into methods in the ''!-SystemUnderTest-!''. + * To enable a specific string to signify repeating of the previous ''given'' value (" " is used in ''!-ColumnFixture-!''), call the ''!-CalculateFixture-!'' method ''setRepeatString()''. + * To enable a specific string to signify an exception is ''expected ''("error" is used in ''!-ColumnFixture-!''), call the ''!-CalculateFixture-!'' method ''setExceptionString()''. +In ''!-ColumnFixture-!'', " " as an ''expected'' value means that the actual value is displayed in the report. There is currently nothing directly equivalent to this in ''!-CalculateFixture-!''. The closest is a ''show'' special action in [[''!-DoFixture-!''][.FitLibraryUserGuide.DoFixture]] +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/properties.xml new file mode 100644 index 0000000000..8d22593817 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135115 + + + + + + + 1134697971546 + 3377252390456526520 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/content.txt new file mode 100644 index 0000000000..a60cf7cd0f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/content.txt @@ -0,0 +1,16 @@ +CalculateFixture is for testing calculations, like ''!-ColumnFixture-!''. CalculateFixture was introduced to explore a few ideas. + * It's minimalistic, in the sense that there are no (default) special values, such as " " and "error", as used in ''!-ColumnFixture-!''. Such special values can be explicitly defined in the fixture code. + * It distinguishes between the ''given'' values and the ''expected'' values by using a blank column to separate the ''givens'' on the left side and the ''expecteds'' on the right. + * It allows any characters in the second (header) row, including unicode. + * It can simplify ^WritingFixtures in some cases. +|!-CalculatedDiscount-!| +|''$''||''discount''| +|0.00||0.00| +|1000.00||0.00| +|1010.00||50.50| +|1100.00||55.00| +|1200.00||60.00| +|2000.00||100.00| + +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/properties.xml new file mode 100644 index 0000000000..fc1c5e20a0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205918 + + + + + + + 1134697959640 + -4110177341350322640 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/content.txt new file mode 100644 index 0000000000..6bb92f3212 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/content.txt @@ -0,0 +1,37 @@ +CombinationFixture is a specialised fixture for showing how pairs of values are expected to be combined. For example, here's a times table: + +!|fitlibrary.specify.TimesCombination| +| |1 |2 |3| +|1 |1 |2 |3| +|2 |2 |4 |6| +|3 |3 |6 |9| + +The fixture for this is as follows: +----{{{public class TimesCombination extends CombinationFixture { + public int combine(int x, int y) { + return x * y; + } +} +}}}---- +The method ''combine()'' is called for each pair of values, and the result checked. For example, for the cell in the last row above containing an expected value of 6, the method is called with the arguments ''combine(3,2)''. + +In general, as usual: + * The given and expected values can be of any types + * A ''!-SystemUnderTest-!'' object (of any type) can be supplied to the CombinationFixture , so that the method ''combine()'' in that object is called instead. See the next example. + +!|fitlibrary.specify.DirectCombination| +| |1 |2 |3| +|100 |100 |200 |300| +|220 |220 |440 |660| +|330 |330 |660 |990| + +The fixture for this class is as follows: +----{{{public class DirectCombination extends CombinationFixture { + public DirectCombination() { + super(new TimesCombination()); + } +} +}}}---- +It just happens to refer to an object that is also a fixture. +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/properties.xml new file mode 100644 index 0000000000..780a0a9313 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205919 + + + + + + + + 1134697997125 + 5170949850829972846 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/content.txt new file mode 100644 index 0000000000..f102f8fd1f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/content.txt @@ -0,0 +1,17 @@ +The contents of a CommentFixture table are not considered: + +!|fitlibrary.CommentFixture| +|any old|stuff| +|is|completely|ignored| +|and|not even|coloured as|ignored| + +This is also supported directly in flow. + +If we want the table to be ignored and that to be reported, we can instead use: + +!|fit.Fixture| +|any old|stuff| +|is|ignored| +|but|it's|coloured as|ignored| +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/properties.xml new file mode 100644 index 0000000000..259174eb08 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205919 + + + + + + + + 1134698042375 + -5544581331750592466 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/content.txt new file mode 100644 index 0000000000..5419f934b5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/content.txt @@ -0,0 +1,38 @@ +ConstraintFixture is a variation of CalculateFixture that has an implied expected value of true (or false). + +For example, the following ConstraintFixture table just has given columns and is checking the constraint that the ''a'' value is less than the ''b'' value: + +|!-fitlibrary.specify.SucceedConstraint-!| +|a|b| +|1|2| +|2|5| + +The two rows are colored green because the constraint is satisfied. For each value row, the method ''aB()'' is called in the class ''!-SucceedConstraint-!'', as follows: +----{{{public class SucceedConstraint extends ConstraintFixture { + public boolean aB(int a, int b) { + return a < b; + } +} +}}}---- +If the method returns ''true'' the row passes, otherwise it is colored red. + +We can also have a fixture that expects the result to be false, such that a is '''not''' less than ''b'': + +|!-fitlibrary.specify.FailConstraint-!| +|b|a| +|1|2| +|2|5| + +The fixture class is as follow: +----{{{public class FailConstraint extends ConstraintFixture { + public FailConstraint() { + super(false); + } + public boolean bA(int b, int a) { + return a < b; + } +} +}}}---- +Notice how it passes the expected value of ''false'' to the superclass. +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/properties.xml new file mode 100644 index 0000000000..9de018be1c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205920 + + + + + + + + 1134697986703 + -5542244720411796300 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/content.txt new file mode 100644 index 0000000000..33cd891cbe --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/content.txt @@ -0,0 +1,28 @@ +!2 !-DoFixture-!: +!3 ''keywords'' + * Actions start with a ''keyword'' and appear in every second cell. + * A ''keyword'' cell can be empty. + * The last ''keyword'' is optional. + * A ''keyword'' can contain any characters, such as "+" +!3 Special actions +!-DoFixture-! has several special actions, which apply to the rest of their row: + * ''check'' checks whether the result of the action in the rest of the row matches the value in the last cell of the row. That last cell is colored green, red, etc accordingly. + * ''reject'' checks that the action fails, as expected. + * ''not'' acts the same as ''reject''. + * ''ensure'' checks that the action succeeds. + * ''show'' displays the result of the action in the rest of the row by adding an extra cell in the report. + * ''show dot'' displays the result of the action in the rest of the row by adding an extra cell in the report. This is shown as a Dot graph. + * ''note'' ignores the rest of the row, allowing notes to be included in tables + * ''comment'' ignores the rest of the table + * ''ignored'' ignores the rest of the table, but colours it as ignored in the report + * ''abandon storytest'' to ignore the rest of the storytest (without colouring it as ignored) +!3 Flow Style +To be in "flow", the first table must be a ''!-DoFixture-!'' (or ''!-SequenceFixture-!''). The actions in all following tables are carried out with that fixture. However, as we saw before, an action may provide a different fixture, such as a ''!-RowFixture-!'', which will be used with the rest of the table. +!3 More Examples +Lots more examples of using !-DoFixture-! and the other flow fixtures are provided in ''Fit for Developing Software'' by Rick Mugridge and Ward Cunningham, Prentice-Hall, 2005. The tables and fixture code for these examples will be made available on the [[Fit website][http://fit.w2.com]]. +!3 Fixture Code +Let's now look at WritingFixtures for !-DoFixture-! tables. +!3 More Technical Issues +SpecialisedIssues +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/properties.xml new file mode 100644 index 0000000000..14f8ec22a7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717205921 + + + + + + 1137296758249 + -5080729138014492085 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/content.txt new file mode 100644 index 0000000000..a1961bc934 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/content.txt @@ -0,0 +1,55 @@ +!3 Calling a method from an action +The keywords of an action are concatentated together, with spaces between and converted into a valid Java identifier. This is done using [[''extended camel casing''][.FitLibraryUserGuide.ExtendedCamelCase]]. +!3 Rules for coloring + * If an action returns a boolean value, the 'keywords' of that action are colored green if the returns true. If it returns false or throws an exception, it colors it red. + * A 'check'' special action colors the last cell, containing the expected value, just like ''!-ActionFixture-!'' + * A 'reject' or 'not' special action color the action green if the action returns false or throws an exception. Otherwise it colors it red. + * An 'ensure' special action colors the action red if the action returns false or throws an exception. Otherwise it colors it green. +!3 Auto-Wrapping +The value returned by the method corresponding to an action may be auto-wrapped with a fixture, as follows: + * A ''Set'' object is auto-wrapped with a ''!-SetFixture-!''. + * An ''Object[]'', ''Collection'' or ''Iterator'' is wrapped with an ''!-ArrayFixture-!''. + * An 'Object' is wrapped with a ''!-DoFixture-!''. But only if it's not one of the above, nor a ''Fixture'', and doesn't have a ''static Object parse(String)'' method. +This fixture object, or the one returned explicitly, is used to interpret the rest of the table. +!3 Fixture as Adapter +An object may be associated with a ''!-DoFixture-!'' (by calling the method ''setSystemUnderTest(Object)'' or through the ''super()'' constructor). If there is no method in the ''!-DoFixture-!'' corresponding to an action, ''!-DoFixture-!'' tries to call that method on the ''!-SystemUnderTest-!'' object instead (if it's been defined). (This approach is also used in [[''!-CalculateFixture-!''][.FitLibraryUserGuide.CalculateFixture]] and [[''!-SetUpFixture-!''][.FitLibraryUserGuide.SetUpFixture]].) + +This means that a subclass of ''!-DoFixture-!'' is only needed as an adapter, when actions don't map directly onto methods of the ''!-SystemUnderTest-!'' object. +!3 Domain Objects +If an action corresponds to a property, the value of that property is returned. The value may be an ''Object''. + +Because some ''Object''s are auto-wrapped with ''!-DoFixture-!'', it's possible to access and test domain objects directly, without the need to write fixtures. +!3 Tests without Fixture +Because of auto-wrapping and Domain objects, it's possible to use Fit for testing without the need to write any fixtures at all (inspired by [[''Naked Objects''][http://www.nakedobjects.org]]).My original aim in introducing these facilities was to enable the use of Fit in teaching beginner programmers, but I found them generally useful. + +This approach depends on two experimental special actions in ''!-DoFixture-!'': + * A ''start'' special action creates an object of the specified class as the ''!-SystemUnderTest-!'' object. This can be an object of any class that has a public nullary constructor. + * A ''calculate'' special action in ''!-DoFixture-!'' returns a ''!-CalculateFixture-!'' that refers to the ''!-SystemUnderTest-!'' object of the ''!-DoFixture-!''. This means that the rest of the table is interpreted by that ''!-CalculateFixture-!'', without needing a subclass of that fixture. + +This may need more work to make it general enough... + +Here's a trivial example: + +|!-fitlibrary.DoFixture-!| +|start|java.awt.Rectangle| + +|check|''x''|0| +|check|''y''|0| + +|set location|100||200| +|check|''x''|100| +|check|''y''|200| + * ''location'' gives a copy of the ''Point'' of the (x,y) position of the Rectangle: +|location| +|''move''|12||14| +|check|''x''|12| +|check|''y''|14| + * The original location is unchanged +|check|''x''|100| +|check|''y''|200| + +|''set size''|20||30| +|check|''width''|20| +|check|''height''|30| +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/properties.xml new file mode 100644 index 0000000000..e846c756c1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135113 + + + + + + + 1134697865046 + -8649785760059887851 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/content.txt new file mode 100644 index 0000000000..b23dfa0e27 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/content.txt @@ -0,0 +1,10 @@ +!3 Doing your own processing before and/or after a fixture has done its work +Rather than overriding implementation-specific methods (such as ''doTable()'') in ''Fit'' or ''!-FitLibrary-!'', use the methods ''setUp()'' and ''tearDown()''. + +Fixture objects of class ''!-DoFixture-!'' (and subclasses) call these two methods. Consider first a ''!-DoFixture-!'' that's running a single table. Such a fixture could be introduced in the middle of flow-style, or it could be introduced with an explicit fixture class name in core-style. In this case: + * ''setUp()'' is called before the fixture object processes the table + * ''tearDown()'' is called after the fixture object has finished processing the table +Now let's consider a ''!-DoFixture-!'' that's a ''flow fixture object'' -- the first ''!-DoFixture-!'' of a storytest that runs the whole storytest. This is responsible for running all of the tables in a storytest, passing control to other fixtures as needed. In this case: + * ''setUp()'' is called before the fixture object processes any of the tables + * ''tearDown()'' is called after the fixture object has finished processing all of the tables (or after it is prematurely stopped) + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/properties.xml new file mode 100644 index 0000000000..26fc8ff7f5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205922 + + + + + + + 1137294742451 + -4171209258708067812 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/content.txt new file mode 100644 index 0000000000..909832d0ef --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/content.txt @@ -0,0 +1,8 @@ +!3 Core fixtures in flow +A fixture may be named in later tables in a sequence of tables, and is handled in the usual way for core fixtures. +!3 Flow fixtures not in flow +If the fixture named in the first table is not a !-DoFixture-!, the tables are handled in the usual way for core tables. ''!-DoFixture-!''s can still be used in this case. +!3 Stopping !-DoFixture-! +There are two ways of stopping a !-DoFixture-! from continuing to run a storytest when there is an error (or whatever): + * Call ''setStopOnError(true)'' -- on the next unexpected exception, !-DoFixture-! will stop running + * Use the !-DoFixture-! action ''abandon storytest'' or call ''abandonStorytest(null)'' -- and !-DoFixture-! will stop running the rest of the storytest \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/properties.xml new file mode 100644 index 0000000000..339d22debc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717205923 + + + + + + 1136769451129 + -31445960469589645 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/content.txt new file mode 100644 index 0000000000..f2104f511a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/content.txt @@ -0,0 +1,33 @@ +Let's look at what happens when an action fails. + +| !-ChatStart-! | + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| + +There should be no occupants in the "fitNesse" room: + +|check|''occupants''|fit|0| + +Sarah can't enter an unknown room: + +|''user''|sarah|''enters''|unfit|''room''| + +We can expect that, by putting ''reject'' in the first cell: + +|reject|''user''|sarah|''enters''|unfit|''room''| + +and an unknown user can't create a room: + +|reject|''user''|george|''creates''|unfit|''room''| + +Sarah hasn't entered the room, so she can't be in there: + +|''users in room''|fit| +|''name''| +|sarah| + +Here's a ''DoFixtureSummary''. +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/properties.xml new file mode 100644 index 0000000000..8b1fd239c7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205923 + + + + + + + 1134697817546 + 7578330394792144592 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/content.txt new file mode 100644 index 0000000000..c3f927d372 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/content.txt @@ -0,0 +1,53 @@ +!3 Actions and Methods +Each action in a ''!-DoFixture-!'' table is mapped directly to a method in the fixture (we'll expand this model in FixtureDetails). + +Eg, consider the first few tables: + * The fixture of the first table is a ''!-DoFixture-!'', so the created ''flow fixture object'' handles the rest of the tables: +| !-ChatStart-! | + * The second table contains an action, which is mapped into the method ''connectUser()'' of the (initial) ''flow fixture object'', as shown below. +|''connect user''|sarah| + * The third table contains two actions which are also applied to the ''flow fixture object''. +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +!3 Some Example Code +----{{{public class ChatStart extends fitlibrary.DoFixture { + private ChatRoom chat = new ChatRoom(); + + public ChatStart() { + setSystemUnderTest(chat); + } + public boolean connectUser(String userName) { + return chat.connectUser(userName); + } + public boolean userCreatesRoom(String userName, String roomName) { + return chat.userCreatesRoom(userName,roomName); + } + public boolean userEntersRoom(String userName, String roomName) { + return chat.userEntersRoom(userName,roomName); + } + ... +}}}---- +The next table checks a list. + +|''users in room''|fit| +|''name''| +|sarah| + +The first row is an action, which corresponds to the method ''usersInRoom()'' which returns a [[''!-ParamRowFixture-!''][.FitLibraryUserGuide.ParamRowFixture]]. This fixture object interprets the rest of the table. +----{{{ ... + public Fixture usersInRoom(String roomName) { + return new ParamRowFixture(chat.usersInRoom(roomName).toArray(),User.class); + } + ... +}}}---- +Each following table is handled by the initial ''!-DoFixture-!'': + +|''connect user''|rick| + +This means that each table doesn't need an explicit fixture, so actions can be split up easily. Because actions may return a fixture object for the rest of the table, that object can be created with all the appropriate information. This avoids the needs for global variables for communication between fixtures. + +FixtureDetails +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/properties.xml new file mode 100644 index 0000000000..700004fb79 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135113 + + + + + + + 1134697852609 + -3293930598124449402 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/content.txt new file mode 100644 index 0000000000..fe6fe0244c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/content.txt @@ -0,0 +1,49 @@ +!3 Contents + * Introduction + * ^WhenActionsFail + * ^DoFixtureSummary + * ^WritingFixtures + * ^FixtureDetails + * ^SetUpTearDown +!3 Introduction +DoFixture tables are used to define/test workflow, a sequence of actions. The aim is to make the tests easily readable. + +Let's look at a simple example test (which you can run). + +| !-ChatStart-! | + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +|''users in room''|fit| +|''name''| +|sarah| + +The tables define/test the following sequence: + * Start the System Under Test, a chat server + * Anna connects to the chat server + * Anna creates a new room and enters it + * Check that Sara is the only occupant of that room +Unlike with the core fixtures, the first row of each table (other than the first) doesn't usually name a fixture. + +Each row of the second and third tables define actions. Eg consider the following table: + +|''user''|sarah|''enters''|fit|''room''| + +The first, third and fifth cells contain ''keywords'', which give information about the role of the data that's in the second and fourth cells ("anna" and "lotr"). The ''keywords'' are shown in ''italics'' and are often colored when the tst is run (try it now). The keywords all joined together give the name of the action, ''user enters room''. + +The fourth table is a little different, as it's checking the list of users in the given room: + +|''users in room''|fit| +|''name''| +|sarah| + +The first row is an action, as before, with ''keywords'' and data alternating. This serves a similar purpose to a fixture name, but is an action which provides an appropriate fixture. + +The rest of the table is like a !-RowFixture-! table. The second row gives the ''header labels'' and there is a single element expected in the list. + +Let's look at what happens ''^WhenActionsFail''. +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/properties.xml new file mode 100644 index 0000000000..b393ebb0f2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135113 + + + + + + + 1136934669259 + 6198618722003249033 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/content.txt new file mode 100644 index 0000000000..a3edbe6955 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/content.txt @@ -0,0 +1,27 @@ +DotGraphics allows graph images to be used in tests in any of the ''!-FitLibrary-!'' fixture. For example, graphs are used in the following ''!-DoFixture-!'' example: + +!|fitlibrary.specify.DoGraphics| + +|check|graph|!img http://files/dots/ChatGraph.gif | + +This requires that ''Dot'', an open-source graph visualization system, is installed. ''Dot'' is available at http://www.graphviz.org. + +The corresponding fixture is as follows: +----{{{public class DoGraphics extends DoFixture { + public DotGraphic graph() { + return new DotGraphic("digraph G {\n"+ + "lotr->luke;\n"+ + "lotr->Anna;\n"+ + "shrek->luke;\n"+ + "shrek->anna;\n"+ + "shrek->madelin;\n"+ + "}\n"); + } +} +}}}----Because of the special type ''!-DotGraphic -!'', ''!-FitLibrary-!'' expects that the cell contains a IMAGE link to an image file, which has an associated text file. ''!-DotGraphic -!'' compares the text of the associated text file with the text supplied by the ''graph()'' method. If it's the same, the cell is colored green; otherwise, Dot is run on the actual text and the resulting image is displayed as the actual value. + +See Chapters 11 and 29 of the FitBook for other examples. + +A ''!-DotGraphic -!'' is a MetaTypeAdapter. +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/properties.xml new file mode 100644 index 0000000000..74de454e33 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205923 + + + + + + + 1137297226923 + 5937901038877871532 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/content.txt new file mode 100644 index 0000000000..4c756001ea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/content.txt @@ -0,0 +1,38 @@ + * The following are additions to ''!-FitLibrary-!'' that are somewhat experimental in nature. + * Or they may simply be incomplete + * There is no guarantee that these features will remain unaltered, or that they will even remain in ''!-FitLibrary-!''. +!3 ''!-SuiteFixtures-!'' in ''!-FitNesse-!'' + * Fit pages/files (''storytests'') no longer need to mention fixture class names. This means that the same storytests can easily be used with different fixtures for testing at different levels, such as directly into the domain layer and through a GUI or web interface. + * Storytests can be filtered for a particular test run. For example, when only the completed storytests should be run on the build machine. + * The fixtures for the storytests in a suite can easily share resources, such as database connections. + * Each suite can provide different configuration information, such as selecting a DB or Spring configurations + * See ''SuiteFixtures'' and .FitNesse.FitLibrarySpecifications.SuiteFixtureSpecifications for further details +!3 ''!-DomainObjectCheckFixture-!'' and ''!-DomainObjectSetUpFixture-!'' + * These check and set up domain objects, respectively. + * See .FitNesse.FitLibrarySpecifications.DomainObjectCheckFixture and .FitNesse.FitLibrarySpecifications.DomainObjectSetUpFixture + * This approach may change +!3 Entity References + * Provide a way to refer to Entities in storytests + * As an alternative to having to pass around generated database keys + * See .FitNesse.FitLibrarySpecifications.SpecifyReferences + * This approach is likely to change +!3 Nested tables + * Nested table are available for setup and checking of domain objects and lists + * Sets to be provided later + * See .FitNesse.FitLibrarySpecifications.EmbeddedTables + * Some of this is likely to change +!3 State-based extension of ''!-DoFixture-!'' (State pattern) + * Allows exactly the same table to be used in workflow storytests for setup or checking (ie, initial state or final state) + * When a setup fixture is installed in a ''!-DoFixture-!'', all actions are delegated to it until the setup state is completed. + * See .FitNesse.FitLibrarySpecifications.StatefulDoFixture + * This approach is likely to change +!3 Fixture SUT chains + * All the ''!-FitLibrary-!'' fixtures may have a SUT (System Under Test) associated with them + * If then fixture doesn't declare a required method, the method in the SUT is called instead + * Chains of SUTs are permitted + * This approach may change +!3 Optional logging of ''!-FitLibrary-!'' executing, to aid in debugging + * This remains to be completed + +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/properties.xml new file mode 100644 index 0000000000..741571476c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205924 + + + + + + + 1137297779057 + -6719048185863006781 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/content.txt new file mode 100644 index 0000000000..55aa02b8ca --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/content.txt @@ -0,0 +1,30 @@ +Consider the names of ''enter'', ''press'' and ''check'' "fields" in ''!-ActionFixture-!'', and the column header labels in ''!-ColumnFixture-!'' and ''!-RowFixture-!''. In the original Fit, these needed to conform to the lexical form of programming language identifiers. In some cases, camel casing was used to provide some flexibility. + +Camel casing takes a string like "the first one" and converts it into a camel form of identifier, "theFirstOne". + +But this had some problems when non-programmers are creating Fit tables: + * A valid identifier in one language would not be in another + * Certain identifiers can't be used, such as "case", "for", "do", etc in Java. +In addition, unicode can't be used for such names, because in general there is little support for unicode in development tools. + +Extended camel is used with all the !-FitLibrary-! fixtures and takes camel casing one step further. It converts a name into a valid identifier in the language concerned. For example, in Java the name "% discount" is translated into "percent discount", which is then camel-cased into "percentDiscount". + +This can result in some weird and/or long identifiers. There's no need to work out such identifiers, however, as an unknown identifier is displayed in a error messages in a Fit table. These weird identifiers don't need to "pollute" the application, as they only need to appear in fixture code. + +Here's some examples: + +|!-fitlibrary.specify.TestCamelCase-!| +|name || identifier | +|" hi " || quoteHiQuote | +|^`{}~ || caretBackquoteLeftBraceRightBraceTilde | +|two words || twoWords | +|2 words || twoWords | +|cost $ || costDollar | +|!! || bangBang | +|meet @ || meetAt | +|rick@rimuResearch.com || rickAtRimuResearchDotCom | +| || blank | +|case || case_ | + +---- * ''Copyright (c) 2004 Rick Mugridge, University of Auckland, New Zealand.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/properties.xml new file mode 100644 index 0000000000..d72b3867bd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135115 + + + + + + + 1113532973433 + 3160712118101825804 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/content.txt new file mode 100644 index 0000000000..29d84e465c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/content.txt @@ -0,0 +1,25 @@ +!3 Sometimes, the HTML tags used within a table cell are important to the test. + * But they get stripped off automatically by Fit. + * So, instead use a ''!-TaggedString-!'' in the declaration of the corresponding method: either/or for the result type and the argument type(s). + * Eg, +|!-fitlibrary.specify.DoWithTags-!| + * The next 4 tables pass because the strings, including tags, are consistent: +|check|tagged text|!-bold-!| + +|check|tag text|!-bold-!|!-bold-!| + +|check|tag text|!-
        one
        -!|!-
        one
        -!| + +|check|tag text|!-
        • one
        • two
        -!|!-
        • one
        • two
        -!| + * But this fails because the tags aren't consistent +|check|tag text|!-bold-!|bold| + +----{{{public class DoWithTags extends DoFixture { + public TaggedString taggedText() { + return new TaggedString("bold"); + } + public TaggedString tagText(TaggedString s) { + return s; + } +} +}}}---- diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/properties.xml new file mode 100644 index 0000000000..468dabd3e4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205926 + + + + + + + + 1132628063963 + -9017250064851681614 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/content.txt new file mode 100644 index 0000000000..7183acf64d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/content.txt @@ -0,0 +1,26 @@ +!2 FAQ for Programmers + +----!3 How to do some processing before and/or after a fixture does its work: + * See DoFixture.SetUpTearDown +----!3 How to keep the HTML tags within a table cell, as they're important to the test: + * See ^KeepTags +----!3 Flow style with ''!-DoFixture-!'' doesn't work when I use an Import table + * That's because the fixture of the first table of a storytest has to be a ''!-DoFixture-!'' for flow to be used. + * However, there's no need for the Import table in flow style, because there's no need to mention fixture names after the first one with ''!-DoFixture-!'' +----!3 What's the point of removing fixture names? + * They add technical complexity to the storytests that are best hidden away from customers who read/write storytests + * It's then possible to substitute different fixtures without having to change the storytests +----!3 What's the point of substituting fixtures? + * The same storytests can be used to test a system at different levels + * Some fixtures are used to test the system under test directly at the domain layer + * Other fixtures could have some extra code to instead test the system through a UI or some other interface + * Some fixtures could generates user documentation from some of the storytests + +----!3 My tests used to pass, but they fail with the latest ''!-FitLibrary-!'' + * Here's one possibility, if you've been using ''parse delegates'': + * In the latest version, all registered ''parse delegates'' are cleared at the end of a test, to avoid potentially confusing interactions between tests (''test indepedence'' is a fundamental principle of storytesting). + * Perhaps your tests previously depended on this interaction? + * If so, you'll need to ensure that ''parse delegates'' are registered for each test. + * That's easy if you use the same (''!-DoFixture-!'') class to start all your tests: simply register the ''parse delegates'' in the constructor of the class. That is, don't do it in a ''static { ... }'' block. +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/properties.xml new file mode 100644 index 0000000000..455eda0629 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205925 + + + + + + + 1137295776798 + 4076182021124697052 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/content.txt new file mode 100644 index 0000000000..db569b3c75 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/content.txt @@ -0,0 +1,11 @@ +FileCompareFixture takes two files or two directories and compares them. The differences is presented as an HTML list, showing the structure (but only enough to show differences). This list includes links to the files concerned. + +!|fitlibrary.CompareFilesFixture| +!2 Differing file contents +|check|''file''|testFiles/threeLines.txt|''same as''|testFiles/differingThreeLines.txt|!-threeLines.txt
        • Files differ at byte position 9
        • differingThreeLines.txt
        -!| +!2 The two directories are equal +!|check|directory|testFiles/diry1|same as|testFiles/diry2|diry1| +!2 Differing directories due to different files +!|check|directory|testFiles/diry3|same as|testFiles/diry4|!-diry3
        • threeLines.txt
          • Missing
        • empty.txt
          • Surplus
        -!| +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/properties.xml new file mode 100644 index 0000000000..834e292857 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205926 + + + + + + + 1134698077687 + 1434035760180710645 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/content.txt new file mode 100644 index 0000000000..fdfc0bc153 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/content.txt @@ -0,0 +1 @@ +Rick Mugridge and Ward Cunningham, ''Fit for Developing Software'', Prentice Hall, July 2005 diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/properties.xml new file mode 100644 index 0000000000..0572b1c1d9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205927 + + + + + + + 1127091100046 + -8795088106056646916 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/content.txt new file mode 100644 index 0000000000..a4c6b0d2ef --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/content.txt @@ -0,0 +1,23 @@ +!3 Fixture for business processes (workflow): + * DoFixture +!3 Fixtures for lists: + * ArrayFixture for ordered lists + * SetFixture for unordered lists + * SubsetFixture for parts of unordered lists + * ParamRowFixture to simplify the use of Fit's ''!-RowFixture-!'' with other ''!-FitLibrary-!'' fixtures + * ToStringArrayFixture for ordered lists of Strings +!3 Fixture for calculations and constraints: + * CalculateFixture + * ConstraintFixture + * CombinationFixture +!3 Fixture for set up: + * SetUpFixture +!3 Fixture for comments + * CommentFixture +!3 Fixture for testing grids + * GridFixture + * ImageFixture is a subclass of GridFixture +!3 Fixture for comparing files and directories + * FileCompareFixture +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/properties.xml new file mode 100644 index 0000000000..284f716858 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205927 + + + + + + + 1137295946282 + 6526758282321752600 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/content.txt new file mode 100644 index 0000000000..0feece26fa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/content.txt @@ -0,0 +1,42 @@ +FolderRunner: + * Handles test suites, organised in directories (folders) + * Handles both HTML and XLS spreadsheet files + * Now works with the ''!-FitNesse-!'' version of Java Fit instead of ''!-FitJava1.1-!''. + * Uses CSS for reports, and automatically includes the appropriate links in the html header for those +Run FolderRunner as follows: +{{{ java -cp fitlibraryRunner.jar fitlibrary.runner.FolderRunner testDiry reportDiry +}}} * You will need to add to the classpath (''cp'') for any application code that you're testing. +If you want feedback on progress of FolderRunner, instead run ''!-FolderRunnerUI-!'' as follows: +{{{ java -cp fitlibraryRunner.jar fitlibrary.runner.FolderRunnerUI testDiry reportDiry +}}} * This shows the current counts of passed tests, etc as it runs the tests + * It also shows any program output (to ''out'' or ''err'') + * It allows you to quit partway through +!3 FolderRunner + * FolderRunner runs ''Fit'' on every file in the ''testDiry'' and sub-directories and writes a report file into the corresponding place in the ''reportDiry'' (creating any sub-directories, as needed). + * However, it ignores files that start with "." or "CVS" and any ''files'' directories + * You can have relative references to images, etc, in your test files in a local ''files'' directory. Before running Fit on the files in a directory, FolderRunner copies any ''files'' directory in that directory into the corresponding place in the ''reportDiry'', so that they're available for access from the reports. + * It creates a file ''reportIndex.html'' in the ''reportDiry'' that gives the results of all the tests. It provides links into all of the reports, as well as to the directories holding the reports in a (sub-)suite. + * FolderRunner handles both HTML and XLS spreadsheet files. + * FolderRunner inserts CCS links, etc in the generated reports so that the colors show (and writes a suitable CSS file so it can be accessed). + * If you wish to change the CSS file used (eg, to alter the colors of the reports), run FolderRunner once and it will add several files into ''testDiry/files''. Edit the CSS file (''testDiry/files/css/fitnesse.css'') to suit. FolderRunner won't replace them. +!3 Spreadsheet files + * FolderRunner uses ''!-SpreadsheetRunner-!'' which in turn uses ''Poi'' to read XLS files. + * ''!-SpreadsheetRunner-!'' uses spreadsheet borders to work out where the tables are in the spreadsheet (just the first sheet). + * See the directory ''testFolders'' in the distribution of ''!-FitLibrayForFit-!'' for examples of the use of spreadsheet files (these are used in my Fit tests for FolderRunner itself). + * Add the poi jar in the classpath when using such files. (Download poi from http://jakarta.apache.org/poi) +!3 ''!-SetUp-!'' and ''!-TearDown-!'' +The following special files may be in the ''testDiry'' or any of its sub-directories, and are used as follows: + * A ''!-SetUp-!'' file is effectively added to the start of each test in the directory (including sub-directories). The file may be ''!-SetUp.htm-!'', ''!-SetUp.html-!'' or ''!-SetUp.xls-!'' (in any mixture of uppercase and lower case). + * A ''!-TearDown-!'' file is effectively added to the endof each test in the directory (including sub-directories). The file may be ''!-TearDown.htm-!'', ''!-TearDown.html-!'' or ''!-TearDown.xls-!'' (in any mixture of uppercase and lower case). +Before running a test, all ''!-SetUp-!'' files that appear in the current directory and all those above it (up to the level of the ''testDiry'') are (effectively) added to the start of the test. They are added with the top-most first. + +All ''!-TearDown-!'' files that appear in the current directory and all those above it (up to the level of the ''testDiry'') are (effectively) added to the end of the test. They are added with the top-most last. + +NB: this differs from the ''!-FitNesse-!'' approach, which only takes the closest ''!-SetUp-!'' or ''!-TearDown-!''. +!3 Possible future changes + * ''!-SuiteSetUp-!'' and ''!-SuiteTearDown-!'' + * Suite fixtures (currently experimental with ''!-FitNesse-!'') + * Provide details to help in the use of spreadsheets, including pitfalls due to limitations of ''Poi'' +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/properties.xml new file mode 100644 index 0000000000..98ee7a7286 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717205927 + + + + + + 1137297129754 + 7059219032053850303 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/content.txt new file mode 100644 index 0000000000..e8740b31af --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/content.txt @@ -0,0 +1,38 @@ +GridFixture checks that a grid of values in the table matches the values in a 2D array. + +!|fitlibrary.specify.GridFixtureUnderTest| + +|strings| +|a|b| +|c|d| + +The method ''string()'' in class ''!-GridFixtureUnderTest-!'' is as follows: + +----{{{... + public Fixture strings() { + return new GridFixture(new String[][] { + {"a", "b"}, {"c", "d"} }); + } +}}}---- +The grid can contain graphics: +|images| +|!img http://files/gameImages/wall.jpg |!img http://files/gameImages/space.jpg |!img http://files/gameImages/box.jpg |!img http://files/gameImages/space.jpg |!img http://files/gameImages/wall.jpg | + +The image file names in the table are compared against the File names supplied by the fixture. + +The method ''images()'' in class ''!-GridFixtureUnderTest-!'' is as follows: + +----{{{... + public Fixture images() { + return new GridFixture(new ImageNameGraphic[][] { + { new ImageNameGraphic("gameImages/wall.jpg"), + new ImageNameGraphic("gameImages/space.jpg"), + new ImageNameGraphic("gameImages/box.jpg"), + new ImageNameGraphic("gameImages/space.jpg"), + new ImageNameGraphic("gameImages/wall.jpg") }}); + } +}}}---- + +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/properties.xml new file mode 100644 index 0000000000..f51360f405 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205928 + + + + + + + 1134698056953 + -6328072905422972661 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/content.txt new file mode 100644 index 0000000000..7453243ca3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/content.txt @@ -0,0 +1,27 @@ +!2 Tables in a workflow storytest (ie, ''!-DoFixture-!''-based) can be ignored in several ways: +---- +!3 The table has nothing to do with Fit, so it shouldn't treat it as a part of the storytest + * Add a first row to the table with ''comment''. + * The rest of the table is ignored, but it's not coloured as being ignored. Eg. +!|fitlibrary.DoFixture| + +|comment| +|This is ignored| +---- +!3 The table is a part of the storytest but we want to hide it for now, while we get other things done. However, we want to be reminded that it needs to be dealt with later + * Add a first row to the table with ''ignored'' + * The rest of the table is ignored, and it's coloured as being ignored. Eg. +|ignored| +|This is ignored|and it's coloured as being ignored| +---- +!3 The rest of the storytest is ignored, but the following tables should be coloured as ignored. + * There's no capability for this at the moment. Would it be useful? +---- +!3 The rest of the storytest is to be ignored + * Insert a single table with ''abandon storytest'' + * Or call the method ''abandonStorytests()'' in the DoFixture concerned + * The rest of the tables are ignored (they're not coloured) and are not shown in the !-FitNesse-! report. Eg. +|abandon storytest| + +|This is ignored|and is not even shown in the !-FitNesse-! report| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/properties.xml new file mode 100644 index 0000000000..25f6949f9b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205928 + + + + + + + + 1134257441140 + -1588234406950451095 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/content.txt new file mode 100644 index 0000000000..458562d4c7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/content.txt @@ -0,0 +1,5 @@ +!2 How to, in storytests + * Ignore some tables in a page/file: ^IgnoreTables + * Avoid lots of similar workflow storytests, which are boring, difficult to change, and rather verbose: ^ExtractCalculations +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/properties.xml new file mode 100644 index 0000000000..7a9d31fd5c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205928 + + + + + + + 1137295763479 + -4012689623381706597 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/content.txt new file mode 100644 index 0000000000..b9a450263b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/content.txt @@ -0,0 +1,22 @@ +ImageFixture just needs the names of the image files: + +!|fitlibrary.specify.GridFixtureUnderTest| + +|images for image fixture| +|!img http://files/gameImages/wall.jpg|!img http://files/gameImages/space.jpg |!img http://files/gameImages/box.jpg |!img http://files/gameImages/space.jpg |!img http://files/gameImages/wall.jpg | + +The method ''imagesForImageFixture()'' in class ''!-GridFixtureUnderTest-!'' is as follows: + +----{{{... + public Fixture imagesForImageFixture() { + return new ImageFixture(new String[][] { + { "gameImages/wall.jpg", + "gameImages/space.jpg", + "gameImages/box.jpg", + "gameImages/space.jpg", + "gameImages/wall.jpg" }}); + } +}}}---- + +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/properties.xml new file mode 100644 index 0000000000..165e4cc21d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205928 + + + + + + + 1134698068156 + 6757745741367536590 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/content.txt new file mode 100644 index 0000000000..102d5c52ab --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/content.txt @@ -0,0 +1,21 @@ +Here we use images in a GridFixture; they can be used as a value with any of the FitLibrary fixtures. +!|fitlibrary.specify.GridFixtureUnderTest| + +|images| +|!img http://files/gameImages/wall.jpg |!img http://files/gameImages/space.jpg |!img http://files/gameImages/box.jpg |!img http://files/gameImages/space.jpg |!img http://files/gameImages/wall.jpg | +The corresponding code: +----{{{public class GridFixtureUnderTest extends DoFixture { + public Fixture images() { + return new GridFixture(new ImageNameGraphic[][] { + { new ImageNameGraphic("images/wall.jpg"), + new ImageNameGraphic("gameImages/space.jpg"), + new ImageNameGraphic("gameImages/box.jpg"), + new ImageNameGraphic("gameImages/space.jpg"), + new ImageNameGraphic("gameImages/wall.jpg") }}); + } + +}}}---- +Because the type is ''!-ImageNameGraphic-!'', the values in the grid are treated specially. The file name for the image is compared against the file name in the ''!-ImageNameGraphic-!''. An ''!-ImageNameGraphic-!'' is a MetaTypeAdapter. + +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/properties.xml new file mode 100644 index 0000000000..fb7c6d48ca --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205929 + + + + + + + 1137297209929 + -33160499710216321 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/content.txt new file mode 100644 index 0000000000..80f0905df6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/content.txt @@ -0,0 +1,11 @@ +!3 20060116 +fitlibrary20060116.jar and fitlibraryRunner20060116.jar + * DoFixture.SetUpTearDown extended + * setUp() and tearDown() added to CalculateFixture, ConstraintFixture and CombinationFixture + * This user guide reorganised, splitting out experimental parts +!3 20060111 +fitlibrary20060111.jar + * DoFixture.SetUpTearDown: ''!-DoFixture-!'' methods ''setUp()'' and ''tearDown()'' + * ''!-FolderRunner-!'' now allows for BODY tags with extra information in them, as generated by MS-Word (it adds extra information to a report for CSS to show colored tags) +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/properties.xml new file mode 100644 index 0000000000..beaf937601 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205929 + + + + + + + 1137377545280 + -3199354582057250033 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/content.txt new file mode 100644 index 0000000000..ccaf062fe3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/content.txt @@ -0,0 +1,23 @@ +(This is an advanced topic that concerns few people.) +!3 ''!-TypeAdapter-!'' +Core Fit assumes that each cell of a table contains text. This text is converted into a Java object (or primitive value) by a ''!-TypeAdapter-!'' so that the value can be used in the test (eg, assigned to an instance variable or used to check whether the right value was returned from the fixture). The ''!-TypeAdapter-!'' chosen depends on the type of the corresponding method argument, method return type, public instance variable type, etc. + +A ''!-TypeAdapter-!'' is actually responsible for: + * Parsing a string into a value + * Displaying a value as a string - usually by calling the ''toString()'' method on the value, if it's an Object + * Checking that two values are the same - usually by calling the ''equals()'' method on the value, if it's an Object +Any tags in the text of a cell are removed before it is parsed into a value. + +See Chapter 37 of the FitBook for further discussion. + +!3 ''!-LibraryTypeAdapter-!'' +!-FitLibrary-! extends this idea so that it can treat the text inside a cell in a special way (such as to treat the contents as a list, or table, etc). !-FitLibrary-! does this if there is a ''!-MetaTypeAdapter-!'' associated with the type of a method argument (or whatever), in which case it passes all of the contents of the cell (including tags) to the ''!-MetaTypeAdapter-!''. + +Here is a simplified account of ''!-MetaTypeAdapter-!''s: + * If the argument is of type ''Tree'', a ''!-TreeTypeAdapter-!'' is used. It expects to find an HTML list in the string; it converts it into a ''!-TreeList-!'' object, which is a ''Tree''. A ''!-TreeList-!'' will compare itself to another ''Tree''. + * If the argument is of type ''!-GraphicInterface-!'', a ''!-GraphicTypeAdapter-!'' is used. It expects to find a IMAGE graphics link in the string; it converts it into a ''!-DotGraphic-!'' object, which is a ''GraphicInterface''. A ''!-DotGraphic-!'' will compare itself to another ''DotGraphic''. + * If the argument is of type ''!-TaggedString-!'', a ''!-TaggedTypeAdapter-!'' is used. It simply stores the whole string (including tags) in a ''!-TaggedString-!''. A ''!-TaggedString-!'' will compare itself to another ''!-TaggedString-!''. + * If the argument is of type ''TableInterface'', a ''!-TableTypeAdapter-!'' is used. It expects to find an embedded table in the cell; it converts it into a ''!-Table-!'' object, which is a ''TableInterface''. A ''!-Table-!'' will compare itself to another ''Table''. +In fact, ''!-MetaTypeAdapter-!''s are more general than this. Most ''!-MetaTypeAdapter-!''s actually pass responsibility for parsing to the type concerned, through that type's ''static Object parse(String)'' method. This can result in quite different parsing and testing for equality. Eg, ''!-GraphicTypeAdapter-!'' may pass responsbility to a ''!-ImageNameGraphic-!'' (which simply compare the file names), ''!-DotGraphic-!'' (which compares the underlying text in a Dot file), or a ''!-ObjectDotGraphic-!'' (which builds Dot graphs automatically out of graphs of objects). + +You can provide your own subclasses to handle parsing and equality however you like. For example, you might choose to compare the pixels within two images that are referenced through a IMAGE. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/properties.xml new file mode 100644 index 0000000000..22f78971a8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205929 + + + + + + + 1127090965656 + 2196076537720886761 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/content.txt new file mode 100644 index 0000000000..68ecd10104 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/content.txt @@ -0,0 +1,21 @@ +An HTML cell can contain a table, and such tables can be treated as values. For example: + +!|fitlibrary.specify.DoTable| + +|check|first cell string value|!-
        embedded1
        embedded2
        -!|embedded1| + +In the table above, we check that the action ''first cell string value'' extracts a string from the nested table. + +The fixture code is as follows: +----{{{public class DoTable extends DoFixture { + public String firstCellStringValue(Table table) { + return table.stringAt(0,0,0); + } +} +}}}---- + +The type ''Table'' provides access to the cells of the embedded table. + +A ''!-TableTypeAdapter-!'' is used whenever an argument or return type is of type ''Table''. ''!-TableTypeAdapter-!'' is a MetaTypeAdapter. +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/properties.xml new file mode 100644 index 0000000000..d8e83a703f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205929 + + + + + + + + 1137297252470 + 6723473979834689009 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/content.txt new file mode 100644 index 0000000000..2c19231715 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/content.txt @@ -0,0 +1,9 @@ +!3 Support in Java + * The Java ''!-FitLibrary-!'' now only works with the !-FitNesse-!-supported Java version of Fit + * It does '''not''' work with the core Fit version from http://fit.c2.com). + * Java ''!-FitLibrary-!'' will be ported to Fit 2.0 as soon as that's available. +!3 Support in Python, C# and other programming languages + * John Roth has added ''!-FitLibrary-!'' to the Python version of Fit (for both core Fit and ''!-FitNesse-!''). This is available at www.python.org/pypi + * Mike Stockdale has released a C# port for much of ''!-FitLibrary-!'' at https://sourceforge.net/projects/fitlibrary/ + * Randy Coulman has almost finished a port for Smalltalk + * Work is underway on ports for Ruby, J# and C++. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/properties.xml new file mode 100644 index 0000000000..5d0beb4d77 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205930 + + + + + + + 1137295890622 + -713641925190813270 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/content.txt new file mode 100644 index 0000000000..3b46add06e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/content.txt @@ -0,0 +1,15 @@ +Tables for this fixture are exactly the same as ''!-RowFixture-!'', but are purely for the convenience of programmers writing fixture code. + +|!-StartListing-!| +|list is|1,2,3,4| + +|''param row list''| +|''item''| +|3| +|4| +|1| +|2| + +For details of the code, see ''WritingListFixtures''. +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/properties.xml new file mode 100644 index 0000000000..55ea40c90b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135115 + + + + + + + 1134697949515 + -8167775631088787500 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/content.txt new file mode 100644 index 0000000000..ff322d96e4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/content.txt @@ -0,0 +1,16 @@ +A SequenceFixture is exactly the same as a DoFixture, except that ''keywords'' aren't used. + +For example, the following SequenceFixture table (and its associated fixture) is a slight reformulation of the first example given in DoFixture: + +| !-ChatStartSequence-! | + +|''connect user''|sarah| + +|''user creates room''|sarah|fit| +|''user enters room''|sarah|fit| + +|''users in room''|fit| +|''name''| +|sarah| +---- * ''Copyright (c) 2004 Rick Mugridge, University of Auckland, New Zealand.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/properties.xml new file mode 100644 index 0000000000..3248a3daea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717205930 + + + + + + 1104540572659 + 6632684705262038733 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/content.txt new file mode 100644 index 0000000000..529ea8d977 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/content.txt @@ -0,0 +1,19 @@ +SetFixture tables look almost the same as !-RowFixture-! tables. The only difference is that the header labels of SetFixture tables can contain any characters, such as "$". + +!|StartListing| +|list is|1,2,3| + +|''set''| +|''item''| +|3| +|1| +|2| + * Compare this to using a !-RowFixture-!: +|''row list''| +|''item''| +|3| +|1| +|2| +So why bother having SetFixture? There are several differences that affect the fixture code, as we see in ''WritingListFixtures''. +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/properties.xml new file mode 100644 index 0000000000..e505a85d3f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205930 + + + + + + + 1134697926843 + 900149828394867922 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/content.txt new file mode 100644 index 0000000000..f94124fef2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/content.txt @@ -0,0 +1,23 @@ +Here's the code for the example table: +|!-DiscountGroupsSetUp-!| +|future value|max balance|min purchase|discount %| +|low|0.00|0.00|0| +|medium|0.00|500.00|5| +----{{{public class DiscountGroupsSetUp extends fitlibrary.SetUpFixture { + DiscountApplication app = new DiscountApplication(); + public void futureValueMaxBalanceMinPurchaseDiscountPercent( + String futureValue, double maxBalance, double minPurchase, + double discountPercent) { + app.addDiscountGroup(futureValue,maxBalance, + minPurchase,discountPercent); + } +} }}}---- +For each row of the table, the method ''futureValueMaxBalanceMinPurchaseDiscountPercent()'' is called with each of the values. +!3 In General + * The method name is derived from concatenating all of the ''given'' labels and converting into a valid identifier using [[''extended camel casing''][.FitLibraryUserGuide.ExtendedCamelCase]]. + * The method ''setUp()'' may be overridden in a subclass; this is called before the rows are processed. + * The method ''setUp()'' may also be overridden; this is called after all the rows have been processed. + * As with [[''!-CalculateFixture-!''][.FitLibraryUserGuide.CalculateFixture.WritingFixtures]] and [[''!-DoFixture-!''][.FitLibraryUserGuide.DoFixture.FixtureDetails]], a ''!-SystemUnderTest-!'' object may be associated with a ''!-SetUpFixture-!''. If the fixture itself doesn't have a required method, the one in the ''!-SystemUnderTest-!'' is called instead. This means that the fixture acts as an adapter only when necessary, to map actions in the table into methods in the ''!-SystemUnderTest-!''. +---- * ''Copyright (c) 2004 Rick Mugridge, University of Auckland, New Zealand.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/properties.xml new file mode 100644 index 0000000000..fa34883ead --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135115 + + + + + + + 1112155906964 + -1221658030623137281 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/content.txt new file mode 100644 index 0000000000..b80aa0fd21 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/content.txt @@ -0,0 +1,14 @@ +SetUpFixture tables allow data to be entered, usually for the initial setup phase of a test. + +For example: + +|!-DiscountGroupsSetUp-!| +|future value|max balance|min purchase|discount %| +|low|0.00|0.00|0| +|medium|0.00|500.00|5| + +When this is tested, the table is only colored if something goes wrong. + +^WritingFixtures +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/properties.xml new file mode 100644 index 0000000000..f7c9177fa0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205931 + + + + + + + 1134698012359 + -1395630648696854048 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/content.txt new file mode 100644 index 0000000000..c25ccd40a5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/content.txt @@ -0,0 +1,19 @@ +SubsetFixture tables look the same as !-SetFixture-! tables. The only difference is that we can expect a subset of the actual elements. + +!|StartListing| +|list is|1,2,3| + * Some: +|''subset''| +|''item''| +|3| + * All: +|''subset''| +|''item''| +|3| +|1| +|2| + * None: +|''subset''| +|''item''| +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/properties.xml new file mode 100644 index 0000000000..d23dccb649 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205931 + + + + + + + 1134697939359 + 8041090998532286372 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/content.txt new file mode 100644 index 0000000000..2492ba95b8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/content.txt @@ -0,0 +1,3 @@ +!|ChatSuiteFixture| + +|''select or''|complete| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/properties.xml new file mode 100644 index 0000000000..471082978d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205931 + + + + + + + 1136432564440 + -3671686053911023276 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/content.txt new file mode 100644 index 0000000000..8f442dad92 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/content.txt @@ -0,0 +1,12 @@ + * As this has no keywords, the storytest is run +|''chat''| + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +|''users in room''|fit| +|''name''| +|sarah| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/properties.xml new file mode 100644 index 0000000000..faffd0a8d2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205932 + + + + + + + + 1136436731482 + -1566229058538549562 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/content.txt new file mode 100644 index 0000000000..e1d25d268d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/content.txt @@ -0,0 +1,13 @@ + * This also has no keywords and so is run + * It has a different name in the first table, which happens to return the same type of fixture object +|''another chat''| + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +|''users in room''|fit| +|''name''| +|sarah| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/properties.xml new file mode 100644 index 0000000000..b134382dfd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205932 + + + + + + + + 1136438851651 + -3121705319889061792 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/content.txt new file mode 100644 index 0000000000..dc0868e3db --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/content.txt @@ -0,0 +1,14 @@ + * This has keywords, and it's selected to be run +|''keywords''|complete,connect| + +|''chat''| + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +|''users in room''|fit| +|''name''| +|sarah| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/properties.xml new file mode 100644 index 0000000000..a1831b15ec --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205932 + + + + + + + + 1136436757650 + -4664683075222676065 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/content.txt new file mode 100644 index 0000000000..2bb87efd6e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/content.txt @@ -0,0 +1,14 @@ + * This has keywords but it's not selected. Notice that only the first table is shown in the report and it's marked as ignored +|''keywords''|skipped| + +|''chat''| + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +|''users in room''|fit| +|''name''| +|sarah| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/properties.xml new file mode 100644 index 0000000000..c199ca83e8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205932 + + + + + + + + 1136436809545 + 446742281499907373 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/content.txt new file mode 100644 index 0000000000..cc4e235828 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/content.txt @@ -0,0 +1,21 @@ +We have a ^SuiteSetUp page that contains the only reference to a fixture class name + * The fixture concerned is ''!-ChatSuiteFixture-!'', a subclass of ''!-SuiteFixture-!'' + * So it is used to run each the storytests in the suite +The ^SuiteSetUp page also defines the keywords for the storytests that are to be selected, in the table with the action ''select or''. + * This action corresponds to a method in class ''!-SuiteFixture-!'' + * It can be overridden in class ''!-ChatSuiteFixture-!'' to handle storytest filtering in a different way +^SuiteSetUp + * Each storytest optionally has a keywords table and then a table with an action that returns the fixture to be used to run the rest of the storytest. + * The action ''chat' here corresponds to a method in the class ''!-ChatSuiteFixture-!''; this method returns a ''!-DoFixture-!'' object that runs the rest of the storytest +^TestChat +^TestChatWithDifferentName +^TestChatWithKeywords +^TestChatWithSkippedKeywords + * Unfortunately, at the moment it's not possible to run a test by itself, as !-FitNesse-! doesn't run the ^SuiteSetUp in that case + * Hopefully, Micah Martin will be convinced that it would be a good idea for this to happen + +Here's AnotherSuiteFixtureExample, that symbolically links to the storytests here. + +To use suite fixtures, we need to specify a different way to run Fit: + +!define TEST_RUNNER {fitlibrary.suiteFixture.FitLibraryServer} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/properties.xml new file mode 100644 index 0000000000..4b6bfd09aa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205931 + + + + + + + + 1136937310758 + -8715070474715420000 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/content.txt new file mode 100644 index 0000000000..6b36ca7e87 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/content.txt @@ -0,0 +1,6 @@ +Here's an explanation for a Customer or other storytest writer: + * The first table of a storytest can contain a list of keywords, which determine whether or not that storytest will be run, depending on the type of testing being carried out + * For example, we only want to run completed storytests on the build machine + * The second table is a name for the sort of storytest. For example, this may name a sub-system of the application, such as the part concerned with customer support. +Many Customers probably won't have a lot of interest in what's in the ''!-SuiteSetUp-!'' page, as that's concerned with testing, rather than expressing things about the business domain. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/properties.xml new file mode 100644 index 0000000000..2e8b10ec93 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205933 + + + + + + + 1137302123596 + 3427902972480291205 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/content.txt new file mode 100644 index 0000000000..eddba659b6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/content.txt @@ -0,0 +1,49 @@ +Here's a programmer's view of what happens, using the example. As it happens, you can run it. + +To use a suite fixture, change the TEST_RUNNER (you'll need to press Edit to see the textual form of this): + +!define TEST_RUNNER {fitlibrary.suiteFixture.FitLibraryServer} + +Now include a table in the ''!-SuiteSetUp-!'' page. Eg + +!|ChatSuiteFixture| + +|''select or''|complete| + +''!-FitNesse-!'' runs this first for a suite. As ''!-ChatSuiteFixture-!'' is a subclass of ''!-SuiteFixture-!'', it automatically registers itself with ''!-FitLibraryServer-!'' as the suite fixture. + +The second table above results in a call to a method in ''!-SuiteFixture-!'', which records the keywords to be selected in the storytests. + +Then for each storytest, ''!-FitLibraryServer-!'' passes control to the suite fixture. As it is a subclass of ''!-DoFixture-!'', it runs it in flow. So it runs the storytest until it finds that it's filtered out, or when it finds a ''!-DoFixture-!'' to run the rest. Eg, with: + +|''keywords''|complete,connect| + +|''chat''| + +|''connect user''|sarah| + +''etc'' + +Now the first table above results in a call to keywords(), a method that's defined in ''!-SuiteFixture-!''. If the keywords hadn't matched, the storytest would be abandoned at this point and the first table marked as ignored. + +Then the second table results in a call to chat(), a method defined in ''!-ChatSuiteFixture-!''. This creates a specific ''!-DoFixture-!'' object and returns it (having passed any shared resources to it). + +Because that's a ''!-DoFixture-!'', the suite fixture passes control to it to execute the rest of the storytest, as usual. In the eg above, it runs the ''connect user'' table and those that follow, in the usual way. + +Extra comments: + * This is analogous to the approach that ''!-DoFixture-!'' takes to go into flow + * The ''!-SuiteSetUp-!'' is used to get the suite fixture going at the start + * ''!-FitLibraryServer-!'' acts the same as ''!-FitServer-!'' when there is no suite fixture registered, so it's backwards compatible (and so ''!-FitServer-!'' could have the new code included so that it happens by default) + * A suite fixture can override ''keywords()'' and do whatever keyword processing it wants + * Other tables can be used in the ''!-SuiteSetUp-!'' to configure the suite fixture concerned (eg, with Spring or db info). As it's a ''!-DoFixture-!'', it's trivial to add capability. + * As a ''!-DoFixture-!'' subclass, a ''!-SuiteFixture-!'' has ''setUp()'' and ''tearDown()'' methods called. So resources can be allocated and destroyed appropriately. + * Suite fixtures don't mix with fixture class names. When a fixture class name appears at the start of a storytest that use suite fixtures, it is simply treated as a ''!-DoFixture-!'' action. So ''!-|fit.ColumnFixture|-!'' will result in a call to ''fitDotColumnFixture()'', if it exists. + * Suite fixtures could be easily nested by stacking their registration/deregistration + * This approach suffers from being added to an existing execution model, as with ''!-DoFixture-!'' flow. And so it can be confusing to people who are used to the current system (as happens initially with ''!-DoFixture-!''). But in time, I'm sure that it can be incorporated cleanly. +Once it's clear that suite fixtures are going ahead, I'll put together a tutorial on getting started with them, as well as the steps involved in taking existing storytests and moving to this approach. + +It's easy to switch over if you: + * Use ''!-SetUp-!'' pages for at least the first table of a set of storytests; and + * Don't mention fixture class names elsewhere + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/properties.xml new file mode 100644 index 0000000000..5a298b37f9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205933 + + + + + + + + 1137303159876 + -985403909147454419 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/content.txt new file mode 100644 index 0000000000..1c79c37d0d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/content.txt @@ -0,0 +1,48 @@ +With ''suite fixtures'': + * Fit pages/files (''storytests'') no longer need to mention fixture class names. This means that the same storytests can easily be used with different fixtures for testing at different levels, such as directly into the domain layer and through a GUI or web interface. + * Storytests can be filtered for a particular test run. For example, when only the '''completed''' storytests should be run on the build machine. + * The fixtures for the storytests in a suite can easily share resources, such as database connections. + * Each suite can provide different configuration information, such as selecting a DB or Spring configurations +These capabilities are added to ''!-FitLibrary-!'' while assuring complete backwards compatibility with ''!-FitNesse-!'' and ''!-FolderRunner-!''. It's possible to use suite fixtures with a subset of your storytest suites, so you can gradually introduce their use over time. + +We now look at the rationale for each of these capabilities. Please note that the description that follows assumes an understanding of the execution model of Fit. I plan to include a customer-friendly description later. + +!2 Multi-purpose Storytests +There is a temptation to write different storytests when testing different levels of a system. For example, when explicitly testing through the UI, the storytests will be expressed very differently than when explicitly testing through the domain layer or directly into a subsystem. But this leads to redundancy between the storytests. In addition, the storytests for the UI will be verbose, it will hard to see the essence of the domain in those storytests, and they will be hard to change. + +As we have argued elsewhere, a more powerful approach is to express the storytests once in terms of the business domain. The same storytests can then be run with different fixtures so that the testing can be carried out at different levels. + +The simplest approach to handling this is to change the fixture class names in the first table of each of the storytests. But this is a boring and error-prone approach. Of course, the change process could be automated, but there are better ways. + +Another approach is to have distinct sets of fixtures with the same names, which are switched in according to the classpath in Java that is being used (or the equivalent in other languages). But this can be confusing and makes it difficult to share code between distinct sets of fixtures. + +The approach we take is to remove fixture class names entirely from storytests (just as ''!-DoFixture-!'' made it possible to eliminate all fixture class names except in the first table). Instead, a table near the start of the storytest identifies the fixture class indirectly, with a name that is unrelated to the fixture class name. The suite fixture object interprets the tables in the storytest until it carries out an action that results in a ''!-DoFixture-!'' object. It then passes repsonsibility for interpreting the rest of the storytest to that fixture object. + +This is similar to the approach already used in ''!-DoFixture-!''. (Actually, ''!-SuiteFixture-!'' is a subclass of ''!-DoFixture-!'', so there is little extra mechanism to permit this.) + +!2 Filtering Storytests +Often, you don't want to run all of the storytests in a suite: + * Only completed storytests should be run on the build machine, as storytests that are in development progress will fail. However, it's a pain to have to organise suites around whether storytests are completed or not. It makes much more sense to organise the storytests around the modules and etc of the domain model. + * When altering a part of a large system, faster progress can be made by running more often those storytests that are most relevant. However, some changes will have an impact on several parts of the domain. Likewise, some storytests will impact on several parts, such as related to two Entities. + * When testing through the UI, which is slow, only some storytests may be used. + +So, in general, it's not possible to organise the storytests into a single hierarchy to serve all purpose. + +Now FitNesse permits symbolic links and so multiple overlapping suites can be defined. However, a separate suite needs to be defined for each of the combinations of use. Once the number of combinations grow, the suites become harder to manage. + +The approach we take with suite fixtures is to allow for each storytest to be classified as being in multiple categories, through the use of keyword. For example, all storytests that are completed can have the keyword "completed", and the build machine only selects those ones. + +The filtering is carried out by having a table of keywords at the start of the storytest. The suite fixture interprets this table and determines whether to continue running this storytest, based on the keywords. + +A default approach is provided for doing this filtering, but it is very simple to extend or alter the filtering mechanism, as it is based on a ''!-DoFixture-!'' approach to table intepretation. For example, one company has keywords for the subsystems, such as "a.b.c". Their filtering mechanism takes account of this naming convention, so that if the selected keywords include "a", or "a.b", or "a.b.c", then a storytest with a keyword of "a.b.c" will be selected and run. + +As well as associating a list of keywords with a storytest, a mechanism is needed to specify which keywords are used for selection when a suite is run. The mechanism of specifying these selected keywords differs between ''!-FitNesse-!'' and ''!-FolderRunner-!'', as we discuss below. + +!2 Shared Resources +Suite fixtures allow for the sharing of resources between all the fixtures for the storytests in a suite. + +We may like a suite of tests to make use of a resource that's expensive (or annoying) to acquire afresh with each storytest, such as a database connection or Spring configuration. Of course, the resource can't be changed in important ways between the storytests because we want to retain test independence. + +Usually, each storytest is started with a fresh fixture object. To share a resource that's already allocated, that fixture object needs to explicitly access the resource through a static (class) variable. + +Instead, such a resource can be created by the suite fixture and shared between the fixture objects. As it is the responsibility of the suite fixture to create the fixture object for each storytest, it can pass any such resources as parameters to the created fixture object. This is very similar to the way in which the first ''!-DoFixture-!'' object for a storytest is responsible for creating the fixture objects for subsequent tables in that storytest. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/properties.xml new file mode 100644 index 0000000000..477a0f6cbf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205934 + + + + + + + + 1136940524699 + -5587493024905440015 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/content.txt new file mode 100644 index 0000000000..6937ce9de1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/content.txt @@ -0,0 +1,22 @@ +For a full description of ''suite fixtures'' and their rationale, see ^SuiteFixtureDetailsAndRationale + +Consider the following simple example that we used in introducing ''!-DoFixture-!'': + +| !-ChatStart-! | + +|''connect user''|sarah| + +|''user''|sarah|''creates''|fit|''room''| +|''user''|sarah|''enters''|fit|''room''| + +|''users in room''|fit| +|''name''| +|sarah| + +The first table includes the name of a fixture class, ''!-ChatStart-!''. This ties this storytest to this particular fixture. If we wanted to run this storytest by testing the chat system through a web interface, we could introduce a different fixture that instead uses Selenium to do the testing. This would mean changing the fixture class name in the first table whenever we switched between the two sorts of tests. + +By using suite fixtures, we can use the storytest for testing either way, without having to change the storytest. Let's see how that's done with SuiteFixtureExample. + +For a programmer's view of ''suite fixtures'', see ^ProgrammerSuiteFixture + +For a Customer's view of ''suite fixtures'', see ^CustomerSuiteFixture diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/properties.xml new file mode 100644 index 0000000000..540aca7c65 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205933 + + + + + + + + 1137301951629 + -3927309675093282727 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/content.txt new file mode 100644 index 0000000000..31cd9ac897 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/content.txt @@ -0,0 +1,11 @@ +!3 Support for "Graphics" +Core Fit handles textual values in the cells of a table. These values are converted automatically into primitive values, such as 12, and into objects, such as a ''Date''. + +The ''!-FitLibrary-!'' fixtures also support "graphical" values in table cells: + * TreeList uses HTML lists + * ImageNameGraphic uses HTML image names + * DotGraphics uses HTML images and associated Dot files + * TaggedStrings retains the tags from within a table cell (the tags are usually discarded) + * NestedTables provide support for embedded tables as values. +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/properties.xml new file mode 100644 index 0000000000..ea96b62a73 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205934 + + + + + + + 1137297271267 + 1698719572685408090 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/content.txt new file mode 100644 index 0000000000..7864c0026b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/content.txt @@ -0,0 +1,28 @@ +TaggedStrings allow you retain tags (HTML or XML) in Fit table cells. + +For example, in the following tests, the tags are included in the comparison between the expected and actual values: + +!|fitlibrary.specify.DoWithTags| + +|check|tag text|!-bold-!|!-bold-!| + +|check|tag text|!-
        one
        -!|!-
        one
        -!| + +|check|tag text|!-
        • one
        • two
        -!|!-
        • one
        • two
        -!| + +These fail because the tags differ: + +|check|tag text|!-bold-!|bold| +|check|tag text|bold|!-bold-!| + +In order for the tags to be retained, the underlying type needs to be a ''!-TaggedString-!'', as shown in the following fixture class: +----{{{public class DoWithTags extends DoFixture { + public TaggedString tagText(TaggedString s) { + return s; + } +} +}}}---- +Because the argument to the method ''tagText()'' is a ''!-TaggedString-!'', the ''!-FitLibrary-!'' fixtures retain the tags in the string. The same applies to the return type of the method. +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/properties.xml new file mode 100644 index 0000000000..6b5b596055 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205934 + + + + + + + + 1137297239802 + 7469677350366088319 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/content.txt new file mode 100644 index 0000000000..0fa0465813 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/content.txt @@ -0,0 +1,12 @@ +ToStringArrayFixture was developed by Jeff Nielsen. + +ToStringArrayFixture is similar to ''!-ArrayFixture-!'' except that: + * There is no header row (the second row) + * There is a single column, containing the ''toString()'' value of the elements + * The elements of the collection (List, array, etc) are compared aginst the values in the table by using the result of their ''toString()'' methods +Eg: + +!|fitlibrary.specify.ToStringArrayFixtureUnderTest| +|one| +|two| +|three| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/properties.xml new file mode 100644 index 0000000000..8eeb134d96 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/properties.xml @@ -0,0 +1,14 @@ + + + + 20060717205934 + + + + + + + + 1137295968985 + -2057619313181883829 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/content.txt new file mode 100644 index 0000000000..73f8f49710 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/content.txt @@ -0,0 +1,12 @@ +|!-fitlibrary.specify.CalculateFixtureUnderTest-!| +|1|2||+| +|a|b||!-
        • a
        • b
        -!| +|!-A
        • a
        -!|!-B
        • b
        -!||!-
        • A
          • a
        • B
          • b
        -!| + +Here's the relevant code: +----{{{public class CalculateFixtureUnderTest extends fit.CalculateFixture { + public ListTree plus12(ListTree t1, ListTree t2) { + return new ListTree("", new ListTree[]{ t1, t2 }); + } +} }}}---- + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/properties.xml new file mode 100644 index 0000000000..bca8080d1f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205935 + + + + + + + 1113536368828 + 1825322080142012106 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/content.txt new file mode 100644 index 0000000000..93856c56af --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/content.txt @@ -0,0 +1,35 @@ +Table cells may contain HTML lists. Consider the following tests: + +!|fitlibrary.specify.DoTree| + +|check|tree|!-
        • a
        • BB
        -!| + +|check|tree|!-Top
        • a
        • BB
        -!| + +|show|tree| + +|show|tree|
        • A
        • B
        | + +For such lists to be handled correctly, the corresponding types (method arguments and return types) have to be subtypes of the special !-FitLibrary-! type ''Tree''. This, in turn is a MetaTypeAdapter. + +The methods of ''!-DoTree-!'' are as follows: +----{{{public class DoTree extends fitlibrary.DoFixture { + public ListTree tree() { + ListTree tree = new ListTree(""); + tree.addChild(new ListTree("a")); + tree.addChild(new ListTree("BB")); + return tree; + } + public ListTree tree(String s) { + return ListTree.parse(s); + } +... +}}}---- +This works because class ''!-ListTree-!'' is a subtype of ''Tree''. The fixture treats the HTML list as a tree structure. Here's ^AnotherTreeExample. + +It's easy to define new subtypes of ''Tree''. How to do this will be documented later. +!2 Planned Changes + * Allow lists that drop end tags (at the moment, all tags have to be properly formed) + * Handle spaces, etc better in text when comparing lists +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/properties.xml new file mode 100644 index 0000000000..4db2522257 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717205935 + + + + + + + 1137297198963 + -8696927387487264523 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/content.txt new file mode 100644 index 0000000000..a235cbdbab --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/content.txt @@ -0,0 +1,65 @@ +Here's the fixture code for all of the examples given for the various list-based fixtures. You'll need to understand about fixture code for ''DoFixture'' in ''flow'' first. + +Notice that ''ParamRowFixture'' avoids the need to write a subclass for ''!-RowFixture-!'' when it's used with ''DoFixture''. + +''ArrayFixture'', ''SetFixture'' and ''SubsetFixture'' can all take the following collections as arguments to their constructors: + * ''Object[]'' + * ''java.util.Collection'' + * ''java.util.Iterator'' + * ''java.util.Map[]'', in which case each element of the collection is a ''Map'' instead of an ''Object''. This is handy with dynamic collections, such as provided by ''!-javax.swing.TableModel-!''. +These three fixtures also treat a header label as referring to either an instance variable or a property (through a getter method) when an element is an ''Object'' (ie, not a ''Map''). All header labels are converted to a Java identifier using [[''extended camel casing''][.FitLibraryUserGuide.ExtendedCamelCase]]. + +These fixtures can also be used "stand-alone" (ie, not in ''flow'', where the first table is interpreted by a ''!-DoFixture-!''). In that case it's necessary to subclass them, as with ''!-RowFixture-!''. +----{{{public class StartListing extends fitlibrary.DoFixture { + private int[] ints; + + public void listIs(int[] ints) { + this.ints = ints; + } + public Fixture orderedList() { + return new ArrayFixture(itemList()); + } + public Fixture rowList() { + return new ItemRowFixture(); + } + public Fixture set() { + return new SetFixture(itemList()); + } + public Fixture subset() { + return new SubsetFixture(itemList()); + } + public Fixture paramRowList() { + return new ParamRowFixture(itemArray(),Item.class); + } + private List itemList() { + return Arrays.asList(itemArray()); + } + private Object[] itemArray() { + Object[] result = new Object[ints.length]; + for (int i = 0; i < ints.length; i++) + result[i] = new Item(ints[i]); + return result; + } + public static class Item { + public int item; + public Item(int item) { + this.item = item; + } + } + public class ItemRowFixture extends fit.RowFixture { + public Object[] query() throws Exception { + return itemArray(); + } + public Class getTargetClass() { + return Item.class; + } + } +} +}}}---- +With [[''auto-wrapping''][.FitLibraryUserGuide.DoFixture.FixtureDetails]] in DoFixture, the method ''orderedList()'' could be written as: +----{{{ public List orderedList() { + return itemList(); + } +}}}---- +---- * ''Copyright (c) 2004, 2005 Rick Mugridge, Rimu Research.'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/properties.xml new file mode 100644 index 0000000000..0093d8ee4d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/properties.xml @@ -0,0 +1,12 @@ + + + + 20081020135115 + + + + + + 1134697905765 + -6500179923276335 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/content.txt new file mode 100644 index 0000000000..ba31255341 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/content.txt @@ -0,0 +1,32 @@ +!3 Announcements + * The ''!-FitLibrary-!'' jar for ''!-FitNesse-!'' is now called ''fitlibrary.jar''. + * Version ''20070225'' of ''fitlibrary.jar'' is included with this release of !-FitNesse-!. + * The ''!-FitLibrary-!'' jar for batch processing with ^FolderRunner is now called ''fitlibraryRunner.jar''. +!3 Introduction to ''!-FitLibrary-!'' + * This user guide assumes familiarity with ''Fit'' and ''!-FitNesse-!''. + * ''!-FitLibrary-!'' consists of several fixtures that work well together and build on ''Fit''. There are alternatives in ''!-FitLibrary-!'' for each of the core Fit fixtures. + * Many examples of the development of Fit tables using the core and the ''!-FitLibrary-!'' fixtures, etc are covered in: + * ''Fit for Developing Software'', Rick Mugridge and Ward Cunningham, Prentice-Hall, 2005. +!3 The ''!-FitLibrary-!'' Fixtures, by example + * ^FitLibraryFixtures +!3 ''!-FitLibrary-!'' supports more than text in table cells + * ^SupportForGraphics +!3 ''!-FolderRunner-!'' + * ''^FolderRunner'' runs Fit tests in batch, as an alternative to ''!-FitNesse-!''. +!3 How to achieve various tasks with ''!-FitLibrary-!'' +This is just a beginning... + * ^HowTo for storytest writers + * ^FaQ4Programmers +!3 Changes in latest version + * ^LatestChanges +!3 Some parts of ''!-FitLibrary-!'' are experimental + * ^ExperimentalExtensions +!3 ''!-FitLibrary-!'' in other programming languages + * ^OtherLanguages +!3 Further Information + * Join the fitlibrary-user email group at https://sourceforge.net/projects/fitlibrary/ + +!path fitlibrary.jar +!path bookExamples.jar +---- * ''Copyright (c) 2004, 2005, 2006 Rick Mugridge, http://www.rimuresearch.com'' + * ''Released under the terms of the GNU General Public License version 2 or later.'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/properties.xml new file mode 100644 index 0000000000..455437e467 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/properties.xml @@ -0,0 +1,12 @@ + + + + 20090326163350 + + + + + + 1238103230812 + 5779610326350186914 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesse/content.txt new file mode 100644 index 0000000000..3699b8fdb9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesse/content.txt @@ -0,0 +1,3 @@ +!1 What is FitNesse? + +To find out, start with the [[One Minute Description][ + + + 20090326095205 + true + + 1238079125321 + -9077190957595262727 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseTests/content.txt new file mode 100644 index 0000000000..a33d9e61bd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseTests/content.txt @@ -0,0 +1 @@ +AcceptanceTests written in the FitNesse framework \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseTests/properties.xml new file mode 100644 index 0000000000..038816f886 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseTests/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205936 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/content.txt new file mode 100644 index 0000000000..69d1e82402 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/content.txt @@ -0,0 +1,26 @@ +!2 What to Do If You Have the Wrong Java Runtime Environment +FitNesse requires version 1.5 or later of the Java Runtime Environment (JRE). +If you see the messages: + +''!-C:\fitnesse>java -jar fitnesse.jar-! +!-Exception in thread "main" java.lang.NoClassDefFoundError:-! +!-java/lang/CharSequence-! +!- at fitnesse.FitNesse.parseCommandLine(Unknown Source)-! +!- at fitnesse.FitNesse.main(Unknown Source)-! + +!-C:\fitnesse>pause-! +!-Press any key to continue . . .-!'' + +Then you need to download and install version 1.5 or later of the JRE. Follow these steps: + * Press a key to close the command window + * Go to [[this download link][https://jsecom15a.sun.com:443/ECom/EComActionServlet;jsessionid=jsecom15a.sun.com-9752%3A415dafbe%3A147685f2fbcc1de1]]. + * Accept the terms of agreement (if you are permitted), and click Continue. + * Download the right JRE installer for your machine and operating system. + * Launch the installer, and follow its instructions to install JRE 1.5 or later. + * Change the PATH environment variable so that it points to the new JRE. + * Go to the /bin folder that contains java.exe, and copy the pathname (for example, ''C:\Program Files\Java\j2re1.5.0_13'') + * Go to Settings>Control Panel>System>Advanced>Environment Variables>PATH>Edit + * Paste in that same complete pathname + * Save the PATH environment variable, and close the System control panel + * Double-click run.bat again. + * Return to DownloadingAndInstallingFitNesse. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/properties.xml new file mode 100644 index 0000000000..bef4fb57bc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/properties.xml @@ -0,0 +1,9 @@ + + + + 20090315141112 + + + 1237144272538 + 3374330756985795038 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitProtocol/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitProtocol/content.txt new file mode 100644 index 0000000000..a028d811d4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitProtocol/content.txt @@ -0,0 +1,16 @@ + * ''INTEGER'' : A integer value in the form of a 10 byte string + * !-0000000000 = 0-! + * !-0000000005 = 5-! + * !-0000000123 = 123-! + * ''READ'' : Reading a value involves two step. + 1 read an ''INTEGER'' value, n + 2 read n bytes. + * ''WRITE'' : Writing a value involves two steps + 1 count the bytes in value and write the size as an ''INTEGER'' + 2 write the value as bytes + * ''WRITE COUNTS'' : Write the counts as 4 ''INTEGER''s + 1 right + 2 wrong + 3 ignores + 4 exceptions + * ''STATUS'' : Length of Error Message. If it is zero, the connection has been established. If not, it is followed by the Error Message. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitProtocol/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitProtocol/properties.xml new file mode 100644 index 0000000000..f6ec2b362b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitProtocol/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205945 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServer/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServer/content.txt new file mode 100644 index 0000000000..168c9b5609 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServer/content.txt @@ -0,0 +1,4 @@ +A program that is required for each implementation of FIT that couples FIT to FitNesse. + +FitServer is executed by FitNesse and will communicate through a socket with FitNesse. The protocol used is described in FitServerProtocol. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServer/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServer/properties.xml new file mode 100644 index 0000000000..f6ec2b362b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServer/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205945 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/content.txt new file mode 100644 index 0000000000..1be05c0899 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/content.txt @@ -0,0 +1,31 @@ +!c !3 A description of the FitServer component that is required for each FIT. +!c !3 This is the protocol of communication between FIT and FitNesse. +'''Invocation:''' +FitServer is invoked by a simple console command. +''!-java fit.FitServer-!'' + +'''Command Line Arguments:''' +Java usage: !-java fit.FitServer [-v]-! ''host port socketTicket'' + +'''Execution:''' + * '''Connecting''' + 1 Use the ''socketTicket'' to build an HTTP request of the form: + * !-GET /?responder=socketCatcher&ticket=-!''socketTicket'' !-HTTP/1.1\r\n\r\n-! + 1 open socket connection to the given ''host'' and ''port''. + 2 write the http request over the socket (do not precede with size) + 5 receive ''STATUS'' as ''INTEGER''. + * '''Transactions''' - loops until a 0 ''INTEGER'' is read as the size of a document. + 1 ''READ'' document from socket + 2 process document and ''WRITE'' processed document to socket. + * the processes document may be written in 1 to many chunks. + 3 write 0 to socket an an ''INTEGER''. + 4 ''WRITE COUNTS'' for document to socket + * '''Closing''' - invoked by reading a document size of 0. + 1 close the socket. + 2 exit execution with a value of (wrongs + exceptions) +!include FitProtocol + + +'''Errors and Exceptions:''' + - ''Connection Error'': If the ''STATUS'' recieved at connection is not zero, then somehitng has gone wrong. The value of ''STATUS'' is the length of the error message the FitNesse will send. Before exiting FitServer should read the error message and print it to standard error. + - ''Transaction Error'': If an exception is thrown during the processing of transactions then the exception should be wrapped in an HTML table and written back over the socket as though it were the test results. An exception thrown at any other point is considered fatal and may invoke abnormal termination. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/properties.xml new file mode 100644 index 0000000000..30877f2f89 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113822 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitTableStyles/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitTableStyles/content.txt new file mode 100644 index 0000000000..29a48927d3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitTableStyles/content.txt @@ -0,0 +1,36 @@ +As we've seen, every FitNesse test table begins with a row that contains the classname of the FixtureCode that will interpret the rest of the table. The rest of the rows in a test table depend on which style of table and fixture we are using (each style of test table has its own style of FixtureCode). + +Here we point you to pages that describe each of the styles of FitNesse test table, and the fixture code used to interpret and run them as tests. + +!2 The Most Common Table/Fixture Styles +|ColumnFixture|''This is the style you may end up using most: rows of data represent inputs and expected outputs.''| +|RowFixture|''This is good for testing queries that should return an exact set of values (order-independently).''| +|ActionFixture|''This style allows you write a script that emulates a series of events (such as controls manipulated on a user interface).''| +|[[Comment Tables][CommentTables]]|''Sometimes you want a tablular comment that is not executed as a test.''| + +!2 Less Frequently-Used Table/Fixture Styles +|RowEntryFixture|''A special case of ColumnFixture for processing rows of data.''| +|TableFixture|''A fixture style that lets you create completely custom test table formats, and process them however you like.''| +|!-SummaryFixture-!|''A fixture that generates a report of all the tests on a page.''| + +!2 Some Table and Fixture Examples +|[[Payroll Example][PayrollTests]]|''An example using ColumnFixture''| + +!2 Some extra things about Fit Tables that vary from port to port. +|SymbolsInTestTables|''Some ports of FIT allow symbols to be passed in Column and Row fixtures. This is very inconsistent amongst the different FIT ports.''| +|KeywordsInTestTables|''Some ports of FIT allow keywords blank, null, and error. This is very inconsistent between FIT ports.''| +|ComparisonExpressionsInFixtures|''You can put comparison expressions in the cells of your test tables.''| +|ParametersInFixtures|''Allows you to pass arguments into a fixture.''| +|DataTypesInFixtures|''Which data types FitNesse and Fit can handle in test tables.''| +|TroubleShootingAcceptanceTests|''How to investigate problems when running test tables.''| + +!2 Rick Mugridge's !-FitLibrary-! +This is Rick's writeup on !-DoFixture-! and all the other fixtures in his library. +|[[!-FitLibrary-!][FitLibraryUserGuide]]|''A quick walk through.''| + +!2 !-FitDecorator-! +Quick overview of !-FitDecorators-! +|[[!-FitDecorator-!][FitDecoratorUserGuide]]|''A quick overview with examples''| + +!2 Writing Fit Tables +|WritingFitTables|''How to write tests.''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitTableStyles/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitTableStyles/properties.xml new file mode 100644 index 0000000000..ff3f160a5d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FitTableStyles/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20081102091411 + true + true + true + true + true + true + 1225638851855 + -7252112341624248203 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FiveMinuteIntroduction/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FiveMinuteIntroduction/content.txt new file mode 100644 index 0000000000..a1b403cfa0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FiveMinuteIntroduction/content.txt @@ -0,0 +1,3 @@ +[[A One-Minute Description][ + + + 20090326095339 + + + 1238079219424 + 8988823815572648162 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureCode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureCode/content.txt new file mode 100644 index 0000000000..a45408289d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureCode/content.txt @@ -0,0 +1,196 @@ +!*< hidden +!define TEST_SYSTEM {slim} +*! +[[A One-Minute Description][ + + + + 20090327094631 + true + + + + 1238165191090 + 4545566180239902012 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ActionFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ActionFixture/content.txt new file mode 100644 index 0000000000..a1294997a7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ActionFixture/content.txt @@ -0,0 +1,109 @@ + +''Previous page: [[!-ColumnFixture-!][ -!!-
      2. -!'''!- check -!'''!- — executes a method and verifies its value. -!!-
      3. -!!-
      4. -!'''!- press -!'''!- — executes a -!'''!- void -!'''!- method without testing anything. -!!-
      5. -!!-
      6. -!'''!- enter -!'''!- — executes a method and passes an argument to it. -!!-
      7. -!!-
    -!!- You can imagine an -!'''!- ActionFixture -!'''!- as an automation tool to populate UI forms and click on buttons that are connected to methods. -! + +{{{ +!-!-!|ActionFixture| +|start|ActionFixtureTest| +|enter|firstPart|Hello| +|enter|secondPart|World| +|press|join| +|check|together|Hello, World| +}}} +# section Fixture class +!3 !-Fixture class-! +!- An important difference between -!'''!- ActionFixture -!'''!- and all other fixtures is that you should not extend the -!'''!- ActionFixture -!'''!- class in order to use it. Instead, you should extend the -!'''!- fit.Fixture -!'''!- class directly for your fixture and then pass it on to the -!'''!- ActionFixture -!'''!- using the -!'''!- start -!'''!- command. -! + +# section Java Source Code +!3 !-Java Source Code-! +{{{ +package info.fitnesse.fixturegallery; + +public class ActionFixtureTest extends fit.Fixture{ + private String first, second, both; + public void firstPart(String s){ + first=s; + } + public void secondPart(String s){ + second=s; + } + public void join(){ + both=first+ ", "+second; + } + public String together(){ + return both; + } +} +}}} +# section .NET Source Code +!3 !-.NET Source Code-! +{{{ +using System; + +namespace info.fitnesse.fixturegallery +{ + public class ActionFixtureTest: fit.Fixture + { + public String firstPart, secondPart, together; + public void join() + { + together=firstPart+ ", "+secondPart; + } + } +} +}}} +# section Python Source Code +!3 !-Python Source Code-! +{{{ + +from fit.Fixture import Fixture + +class ActionFixtureTest(Fixture): + _typeDict = {} + + def __init__(self): + Fixture.__init__(self) + self.__first = "" #< Private attributes (Python convention). + self.__second = "" + self.__both = "" + + # JAVA: void firstPart(String s) + _typeDict["firstPart"] = "String" + def firstPart(self, s): + self.__first = s + + # JAVA: void secondPart(String s) + _typeDict["secondPart"] = "String" + def secondPart(self, s): + self.__second = s + + # JAVA: void join() + _typeDict["join"] = "Default" #< AUTO-DETECT: None = void + def join(self): + self.__both = "%s, %s" % (self.__first, self.__second) + + # JAVA: String together() + _typeDict["together"] = "String" + def together(self): + return self.__both + +}}} +# section Notes +!3 !-Notes-! +!- In the Java version, -!'''!- ActionFixture -!'''!- only works on methods. in the .NET version, -!'''!- enter -!'''!- and -!'''!- check -!'''!- can get and set fields and properties as well. -! + +# section Usage +!3 !-Usage-! +!-You can use the -!'''!- ActionFixture -!'''!- to describe UI-style verifications.-! + +!- In general, -!'''!- ActionFixture -!'''!- has been replaced by -!'''!- DoFixture -!'''!- (see -![[!-DoFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ColumnFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ColumnFixture/content.txt new file mode 100644 index 0000000000..9eeb9165cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ColumnFixture/content.txt @@ -0,0 +1,113 @@ + +''Next page: [[!-ActionFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ImportFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ImportFixture/content.txt new file mode 100644 index 0000000000..7b67bc3fda --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ImportFixture/content.txt @@ -0,0 +1,25 @@ + +''Previous page: [[!-TableFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/RowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/RowFixture/content.txt new file mode 100644 index 0000000000..77b2b4435b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/RowFixture/content.txt @@ -0,0 +1,93 @@ + +''Previous page: [[!-ActionFixture-!][ -!!-
  • -!'''!- getTargetClass -!'''!- — returns the -!'''!- Type -!'''!- or -!'''!- Class -!'''!- object representing the type of objects contained in the array. -!!-
  • -!!-
  • -!'''!- query -!'''!- — returns the actual array of objects to be verified.-!!-
  • -!!- -!# section Java Source Code +!3 !-Java Source Code-! +{{{ +package info.fitnesse.fixturegallery; + +import info.fitnesse.fixturegallery.domain.Player; +import fit.RowFixture; + +public class RowFixtureTest extends RowFixture{ + public Class getTargetClass() { + return Player.class; + } + public Object[] query() throws Exception { + return Player.players.toArray(); + } +} +}}} +# section .NET Source Code +!3 !-.NET Source Code-! +{{{ +using System; +using System.Collections.Generic; +using System.Text; + +namespace info.fitnesse.fixturegallery +{ + public class RowFixtureTest: fit.RowFixture + { + public override Type GetTargetClass() + { + return typeof(Player); + } + public override object[] Query() + { + return Player.players.ToArray(); + } + } +} +}}} +# section Python Source Code +!3 !-Python Source Code-! +{{{ +from fit.RowFixture import RowFixture +from info.fitnesse.fixturegallery.domain.Player import Player + +class RowFixtureTest(RowFixture): + def getTargetClass(self): + return Player + + def query(self): + return list(Player.players) #< Return copy of players +}}} +# section Notes +!3 !-Notes-! +!-If the object has some properties that can be considered part of the identity (such as a primary key), list those properties to the left, before auxiliary properties. This will make error reports easier to read. Consider the -![[!-Figure 1-!][ + + false + false + 20081020135110 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/SummaryFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/SummaryFixture/content.txt new file mode 100644 index 0000000000..1fd20316a6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/SummaryFixture/content.txt @@ -0,0 +1,7 @@ + +''Previous page: [[!-Import-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/TableFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/TableFixture/content.txt new file mode 100644 index 0000000000..28afca6f7a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/TableFixture/content.txt @@ -0,0 +1,113 @@ + +''Previous page: [[!-RowFixture-!][ + + false + false + 20081020135110 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/content.txt new file mode 100644 index 0000000000..19ff5f8fcc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/content.txt @@ -0,0 +1,18 @@ +''Previous page: [[!-Source code-!][ColumnFixture]] +# section ActionFixture +[[!-ActionFixture-!][>ActionFixture]] +# section RowFixture +[[!-RowFixture-!][>RowFixture]] +# section TableFixture +[[!-TableFixture-!][>TableFixture]] +# section Import +[[!-Import-!][>ImportFixture]] +# section SummaryFixture +[[!-SummaryFixture-!][>SummaryFixture]] + +''Previous page: [[!-Source code-!][ + + false + false + 20090327095617 + false + false + false + true + false + true + 1238165777288 + -4400225550586654500 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ArrayFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ArrayFixture/content.txt new file mode 100644 index 0000000000..5eca81b081 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ArrayFixture/content.txt @@ -0,0 +1,85 @@ + +''Previous page: [[!-SequenceFixture-!][ -!!-
  • -!!-Element order is important for -!'''!- ArrayFixture -!'''!-.-!!-
  • -!!-
  • -!'''!- ArrayFixture -!'''!- can work with generic collections as well as with arrays.-!!-
  • -!!- -!# section Table Format +!3 !-Table Format-! +!- The first row of the table should list the fixture class name. The second row lists the structure of collection elements — names of fields, properties and methods. -! + +{{{ +!-!-!include -seamless SetUpFixture + +!-!-!|ArrayFixtureTest| +|name|post code|credit limit| +|John Smith|SW4 66Z|10| +|Michael Jordan|NE1 8AT|12| +}}} +# section Fixture class +!3 !-Fixture class-! +!-The fixture class should extend -!'''!- fitlibrary.ArrayFixture -!'''!-. Instead of a query method, -!'''!- ArrayFixture -!'''!- works with an internal property called -!'''!- actualCollection -!'''!- in the Java version. Initialise that collection in the constructor of your fixture to the actual results that should be compared to the table. In the .NET version, this has to be done by passing the collection to the base class constructor. -! + +# section Java Source Code +!3 !-Java Source Code-! +{{{ +package info.fitnesse.fixturegallery; +import info.fitnesse.fixturegallery.domain.Player; +import fitlibrary.ArrayFixture; + +public class ArrayFixtureTest extends ArrayFixture{ + public ArrayFixtureTest() { + setActualCollection(Player.players); + } +} +}}} +# section .NET Source Code +!3 !-.NET Source Code-! +{{{ +using System; +using System.Collections.Generic; +using System.Text; + +namespace info.fitnesse.fixturegallery +{ + public class ArrayFixtureTest: fitlibrary.ArrayFixture + { + public ArrayFixtureTest():base(Player.players) + { + } + } +} +}}} +# section Python Source Code +!3 !-Python Source Code-! +{{{ +from fitLib.ArrayFixture import ArrayFixture +from info.fitnesse.fixturegallery.domain.Player import Player + +class ArrayFixtureTest(ArrayFixture): + def __init__(self): + ArrayFixture.__init__(self) + self.paramCollection = Player.players + self.setActualCollection() + + def getTargetClass(self): + return Player #< TYPE-HINT: For ValueObject class. + +}}} +# section Notes +!3 !-Notes-! +!- In the Java version, -!'''!- ArrayFixture -!'''!- can work correctly with JavaBeans properties as well (so if you have a getter such as -!'''!- getCreditLimit -!'''!-, you can name the column -!'''!- credit limit -!'''!-. -! + +!- In the .NET version, properties, fields and methods are treated equally, you can use any one of them in the fixture table -! + +!- FitLibrary also has a -!'''!- SetFixture -!'''!- that ignores element order and a -!'''!- SubSetFixture -!'''!- that will ignore additional elements in the actual results. Those two fixtures are very similar to the -!'''!- ArrayFixture -!'''!- in the table format and fixture class structure. -! + +# section Usage +!3 !-Usage-! +!- You can use the -!'''!- ArrayFixture -!'''!- instead of -!'''!- RowFixture -!'''!- when the element order is important or to avoid conversion of an object list into an array. -! + +'''!- DoFixture -!'''!- will automatically wrap methods that return a list or an array into an -!'''!- ArrayFixture -!'''!-, so you can use this class implicitly with -!'''!- DoFixture -!'''!- to test lists of objects without having to write an additional -!'''!- RowFixture -!'''!- class. For an example, see -![[!-Flow Mode-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CalculateFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CalculateFixture/content.txt new file mode 100644 index 0000000000..b522831cd0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CalculateFixture/content.txt @@ -0,0 +1,73 @@ + +''Previous page: [[!-SetUpFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CombinationFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CombinationFixture/content.txt new file mode 100644 index 0000000000..de6c9fec0b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CombinationFixture/content.txt @@ -0,0 +1,65 @@ + +''Previous page: [[!-ArrayFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ConstraintFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ConstraintFixture/content.txt new file mode 100644 index 0000000000..8c9da1c16e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ConstraintFixture/content.txt @@ -0,0 +1,66 @@ + +''Previous page: [[!-CombinationFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/DoFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/DoFixture/content.txt new file mode 100644 index 0000000000..66eb618781 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/DoFixture/content.txt @@ -0,0 +1,148 @@ + +''Previous page: [[!-CalculateFixture-!][ -!!-
  • -!'''!- reject -!'''!- will invert the logic of a test, returning -!'''!- TRUE -!'''!- will make the test fail if the row is prefixed with -!'''!- reject -!'''!-. -!!-
  • -!!-
  • -!'''!- show -!'''!- will print out the value of a calculation in the test results (similar to an empty cell in -!'''!- ColumnFixture -!'''!-). -!!-
  • -!!-
  • -!'''!- check -!'''!- allows you to verify results of non-boolean calculations. Prefix the row with -!'''!- check -!'''!- and put the expected value of the calculation on the end of the row, in a new cell. -!!-
  • -!!- -!!- In the Java implementation of FIT, -!'''!- check -!'''!- and -!'''!- show -!'''!- map directly to JavaBean properties, so you do not need to write the -!'''!- get -!'''!- prefix. However, these keywords cannot be used on public fields. In the .NET implementation, you can use them on fields, properties and methods equally. In addition, you can use the -!'''!- set -!'''!- keyword in .NET to set a field or property value. -! + +{{{ +!-!-!|DoFixtureTest| +|fill|10|times with|x| +|check|char at|4|x| +|set list|A,B,C,D| +|show|char at|2| +}}} +# section Usage +!3 !-Usage-! +!- Use -!'''!- DoFixture -!'''!- to describe workflow tests or tests that do not follow any particular repetitive structure. -!'''!- DoFixture -!'''!- is very good for coordinating other fixtures (see -![[!-Flow Mode-!][ + + false + false + 20081020135110 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SequenceFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SequenceFixture/content.txt new file mode 100644 index 0000000000..5c65e5e6db --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SequenceFixture/content.txt @@ -0,0 +1,108 @@ + +''Previous page: [[!-DoFixture-!][ + + false + false + 20081020135110 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetFixture/content.txt new file mode 100644 index 0000000000..5a93b6c10d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetFixture/content.txt @@ -0,0 +1,15 @@ + +''Previous page: [[!-ConstraintFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetUpFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetUpFixture/content.txt new file mode 100644 index 0000000000..43514c87db --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetUpFixture/content.txt @@ -0,0 +1,92 @@ + +''Next page: [[!-CalculateFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SubsetFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SubsetFixture/content.txt new file mode 100644 index 0000000000..02a5f79dad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SubsetFixture/content.txt @@ -0,0 +1,11 @@ + +''Previous page: [[!-SetFixture-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/content.txt new file mode 100644 index 0000000000..880d36cdcf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/content.txt @@ -0,0 +1,24 @@ +''Previous page: [[!-Basic FIT fixtures-!][SetUpFixture]] +# section CalculateFixture +[[!-CalculateFixture-!][>CalculateFixture]] +# section DoFixture +[[!-DoFixture-!][>DoFixture]] +# section SequenceFixture +[[!-SequenceFixture-!][>SequenceFixture]] +# section ArrayFixture +[[!-ArrayFixture-!][>ArrayFixture]] +# section CombinationFixture +[[!-CombinationFixture-!][>CombinationFixture]] +# section ConstraintFixture +[[!-ConstraintFixture-!][>ConstraintFixture]] +# section SetFixture +[[!-SetFixture-!][>SetFixture]] +# section SubsetFixture +[[!-SubsetFixture-!][>SubsetFixture]] + +''Previous page: [[!-Basic FIT fixtures-!][ + + false + false + 20090327095715 + false + false + false + true + false + true + 1238165835856 + -5960900649398816063 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/GalleryIntroduction/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/GalleryIntroduction/content.txt new file mode 100644 index 0000000000..f26eecc9f8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/GalleryIntroduction/content.txt @@ -0,0 +1,22 @@ +''Next page: [[!-Source code-!][ + + false + false + 20090327095204 + false + false + false + true + false + true + 1238165524529 + 4832168186272978064 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureArguments/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureArguments/content.txt new file mode 100644 index 0000000000..daed85cf8c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureArguments/content.txt @@ -0,0 +1,116 @@ + +''Next page: [[!-Flow Mode-!][ set=new HashSet(); + for(String s: args){ + for (String word: s.split(" ")) set.add(new Word(word)); + } + this.setActualCollection(set); + super.doTable(arg0); + } +} +}}} +# section .NET Source Code +!3 !-.NET Source Code-! +{{{ +using System; +using System.Collections.Generic; +using System.Text; + +namespace info.fitnesse.fixturegallery +{ + + public class ArgumentsTest: fit.RowFixture + { + public override Type GetTargetClass() + { + return typeof(Text); + } + public override object[] Query() + { + List t = new List(); + foreach (String s in Args) + { + foreach (String w in s.Split(new char[] { ' ' })) + { + t.Add(new Text(w)); + } + + } + return t.ToArray(); + } + } +} +}}} +# section Python Source Code +!3 !-Python Source Code-! +{{{ +# REQUIRE: Python >= 2.4, due to set() usage + +from fitLib.SetFixture import SetFixture +import types + +class Word(object): + """Simple ValueObject class to store a word as string.""" + _typeDict = { "word": "String" } + + def __init__(self, word): + assert isinstance(word, types.StringTypes) + self.word = word + +class ArgumentsTest(SetFixture): + + def getTargetClass(self): + return Word #< CLASS-HINT: For _typeDict lookup. + + def doTable(self, table): + wordSet = set() + for s in self.args: + for word in s.split(" "): + wordSet.add( Word(word) ) + # -- WEIRD: setActualCollection() takes no arg -> Preassign first. + self.paramCollection = wordSet + self.setActualCollection() + SetFixture.doTable(self, table) +}}} +!- Note that arguments are just plain strings. Symbols do not work automatically with arguments, so trying to pass -!'''!- < + + false + false + 20081020135109 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureSymbols/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureSymbols/content.txt new file mode 100644 index 0000000000..2ddd3b3b01 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureSymbols/content.txt @@ -0,0 +1,110 @@ + +''Previous page: [[!-System under test-!][>name -!'''!- to store a cell value into a symbol, or -!'''!- <>houston| + + +!-!-!|ColumnFixtureTest| +|firstpart|secondpart|together?| +|< + + false + false + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FlowMode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FlowMode/content.txt new file mode 100644 index 0000000000..1f16646282 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FlowMode/content.txt @@ -0,0 +1,105 @@ + +''Previous page: [[!-Fixture Arguments-!][ listPlayers(){ + return Player.players; + } +} +}}} +# section .NET Source Code +!3 !-.NET Source Code-! +{{{ +using System; +using System.Collections.Generic; +using System.Text; +using fit; +namespace info.fitnesse.fixturegallery +{ + public class DoFixtureFlowTest : fitlibrary.DoFixture + { + public Fixture PreparePlayers() + { + return new SetUpFixtureTest(); + } + public List ListPlayers() + { + return Player.players; + } + } +} +}}} +# section Python Source Code +!3 !-Python Source Code-! +{{{ +from fitLib.DoFixture import DoFixture +from fit.RowFixture import RowFixture +from info.fitnesse.fixturegallery.SetUpFixtureTest import SetUpFixtureTest +from info.fitnesse.fixturegallery.domain.Player import Player +import types + +class DoFixtureFlowTest(DoFixture): + _typeDict = {} + + _typeDict["preparePlayers.types"] = [ SetUpFixtureTest ] + def preparePlayers(self): + return SetUpFixtureTest() + + _typeDict["listPlayers.types"] = [ "$Array" ] #< ACTUALLY: List of Players + def listPlayers(self): + # -- DESIRED: return Player.players + # But need to add type hints for list.scalarType . + return ( Player.players, Player._typeDict ) + # ALTERNATIVES: + # return RowFixture(Player.players, Player._typeDict) + # return ArrayFixture(Player.players, Player._typeDict) +}}} + +''Previous page: [[!-Fixture Arguments-!][ + + false + false + 20080104120005 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/MarkupVariables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/MarkupVariables/content.txt new file mode 100644 index 0000000000..0d756f883b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/MarkupVariables/content.txt @@ -0,0 +1,19 @@ +''Previous page: [[!-Symbols-!][ + + false + false + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/SystemUnderTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/SystemUnderTest/content.txt new file mode 100644 index 0000000000..1d6a5739c7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/SystemUnderTest/content.txt @@ -0,0 +1,84 @@ + +''Previous page: [[!-Target objects-!][ queue = new Queue(); + public SystemUnderTest() + { + this.mySystemUnderTest = queue; + } + public void GenerateMessages(int howmuch) + { + for (int i = 0; i < howmuch; i++) + queue.Enqueue("M" + i); + } + } +} +}}} +# section Python Source Code +!3 !-Python Source Code-! +{{{ +from fitLib.DoFixture import DoFixture +from info.fitnesse.fixturegallery.domain.Queue import Queue + +class SystemUnderTest(DoFixture): + _typeDict = { + # -- NEEDED-FOR: SystemUnderTestExample + "GenerateMessages.RenameTo": "generateMessages" + } + + def __init__(self): + self.queue = Queue() + self.setSystemUnderTest(self.queue) + + _typeDict["generateMessages.types"] = [ None, "Integer" ] + def generateMessages(self, i): + for dummy in xrange(i): + self.queue.enqueue("M%d" % i) +}}} + +''Previous page: [[!-Target objects-!][ + + false + false + 20081020135109 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/TargetObject/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/TargetObject/content.txt new file mode 100644 index 0000000000..d90872e70c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/TargetObject/content.txt @@ -0,0 +1,33 @@ + +''Previous page: [[!-Flow Mode-!][ + + false + false + 20081020135109 + false + false + false + true + false + true + 1199448005533 + 2681058637493722228 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/content.txt new file mode 100644 index 0000000000..98ffdd6305 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/content.txt @@ -0,0 +1,16 @@ +''Previous page: [[!-FitLibrary Fixtures-!][FixtureArguments]] +# section Flow Mode +[[!-Flow Mode-!][>FlowMode]] +# section Target objects +[[!-Target objects-!][>TargetObject]] +# section System under test +[[!-System under test-!][>SystemUnderTest]] +# section Symbols +[[!-Symbols-!][>FixtureSymbols]] +# section Markup Variables +[[!-Markup Variables-!][>MarkupVariables]] + +''Previous page: [[!-FitLibrary Fixtures-!][ + + false + false + 20090327095828 + false + false + false + true + false + true + 1238165908548 + 7957552217624650543 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/PageFooter/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/PageFooter/content.txt new file mode 100644 index 0000000000..c06111d715 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/PageFooter/content.txt @@ -0,0 +1 @@ +[[Table of contents][ + + true + true + true + true + true + true + true + true + 1212872364255 + -4013179935543297587 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/SourceCode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/SourceCode/content.txt new file mode 100644 index 0000000000..0644b9b38e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/SourceCode/content.txt @@ -0,0 +1,239 @@ +''Previous page: [[!-Introduction-!][ players=new ArrayList(); + public static void addPlayer(String name, String postCode, double balance){ + players.add(new Player(name,postCode,balance)); + } +} +}}} +{{{ +package info.fitnesse.fixturegallery.domain; + +import java.util.LinkedList; + +public class Queue { + private LinkedList ll=new java.util.LinkedList(); + public String dequeue(){ + return ll.poll(); + } + public void enqueue(String s){ + ll.add(s); + } + public int getCount(){ + return ll.size(); + } +} +}}} +{{{ +package info.fitnesse.fixturegallery.domain; + +public class TaxCalculator +{ + public double GetTax(String code, double price) + { + if (code.startsWith("B")) return 0; + return 0.1 * price; + } +} +}}} +{{{ +package info.fitnesse.fixturegallery.domain; + +public class Words { + public String firstPart; + public String secondPart; + public String together(){ + return firstPart+", "+secondPart; + } + public String getSentence(){ + return together(); + } + public static Words[] firstExample(){ + Words[] someWords=new Words[2]; + someWords[0]=new Words(); + someWords[0].firstPart="Hello"; + someWords[0].secondPart="World"; + someWords[1]=new Words(); + someWords[1].firstPart="Houston"; + someWords[1].secondPart="We Have a Problem"; + return someWords; + } +} +}}} +# section .NET domain code +!3 !-.NET domain code-! +{{{ +using System; +using System.Collections.Generic; +using System.Text; + +namespace info.fitnesse.fixturegallery +{ + + public class Player + { + public static List players=new List(); + + private string _name; + + public string Name + { + get { return _name; } + set { _name = value; } + } + private string _postCode; + + public string PostCode + { + get { return _postCode; } + set { _postCode= value; } + } + private decimal _balance; + + public decimal Balance + { + get { return _balance; } + set { _balance = value; } + } + public decimal CreditLimit() + { + return _balance; + } + } + public class Text + { + public String word; + public Text(String w) + { + word = w; + } + public int TotalLength + { + get { return word.Length; } + } + } + public class TaxCalculator + { + public decimal GetTax(String code, decimal price) + { + if (code.StartsWith("B")) return 0; + return 0.1m * price; + } + } + + +} +}}} +# section Python domain code +!3 !-Python domain code-! +{{{ +class Player(object): + _typeDict = { + "name": "String", + "postCode": "String", + "balance": "Float" + } + + def __init__(self, name="", postCode="", balance=0.0): + self.name = name + self.postCode = postCode + self.balance = balance + + def getCreditLimit(self): + return self.balance + + _typeDict["creditLimit"] = "Float" + creditLimit = property(getCreditLimit) + + # -- DATA STORE: Players object store, simplistic database. + players = [] #< CLASS-ATTRIBUTE + @classmethod + def addPlayer(cls, name, postCode, balance): + cls.players.append(Player(name, postCode, balance)) +}}} +{{{ +class Queue(object): + _typeDict = { + "Enqueue.RenameTo": "enqueue" #< NEEDED-FOR: SystemUnderTestExample + } + + def __init__(self): + self.ll = [] + + _typeDict["dequeue"] = "String" + _typeDict["dequeue.types"] = [ "String" ] + def dequeue(self): + return self.ll.pop(0) + + _typeDict["enqueue"] = "String" + _typeDict["enqueue.types"] = [ None, "String" ] + def enqueue(self, s): + return self.ll.append(s) + + def getCount(self): + return len(self.ll) + _typeDict["count"] = "Integer" + count = property(getCount) +}}} +{{{ +import types + +class TaxCalculator(object): + + def getTax(self, code, price): + assert isinstance(code, types.StringTypes) + assert type(price) == types.FloatType + if code.startswith("B"): + return 0 + return 0.1 * price +}}} +{{{ +class Words(object): + _typeDict = { + "firstPart": "String", + "secondPart": "String" + } + + def __init__(self, firstPart="", secondPart=""): + self.firstPart = firstPart + self.secondPart = secondPart + + _typeDict["together"] = "String" + def together(self): + return "%s, %s" % (self.firstPart, self.secondPart) + + _typeDict["getSentence"] = "String" + def getSentence(self): + return self.together() + + @staticmethod + def firstExample(): + someWords = [ None, None ] + someWords[0] = Words(firstPart="Hello", secondPart="World") + someWords[1] = Words(firstPart="Houston", secondPart="We Have a Problem") + return someWords +}}} + +''Previous page: [[!-Introduction-!][ + + false + false + 20090327095310 + false + false + false + true + false + true + 1238165590538 + 3763817529343837430 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/content.txt new file mode 100644 index 0000000000..9cd0178ff1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/content.txt @@ -0,0 +1,2 @@ +!2 !-Table of contents-! +!-
      -!!-
    • -![[!-Introduction-!][-!!-
    • -![[!-Source code-!][-!!-
    • -![[!-Basic FIT fixtures-!][-!!-
    • -![[!-ColumnFixture-!][-!!-
    • -![[!-ActionFixture-!][-!!-
    • -![[!-RowFixture-!][-!!-
    • -![[!-TableFixture-!][-!!-
    • -![[!-Import-!][-!!-
    • -![[!-SummaryFixture-!][-!!-
    -!!--!!-
  • -![[!-FitLibrary Fixtures-!][-!!-
  • -![[!-SetUpFixture-!][-!!-
  • -![[!-CalculateFixture-!][-!!-
  • -![[!-DoFixture-!][-!!-
  • -![[!-SequenceFixture-!][-!!-
  • -![[!-ArrayFixture-!][-!!-
  • -![[!-CombinationFixture-!][-!!-
  • -![[!-ConstraintFixture-!][-!!-
  • -![[!-SetFixture-!][-!!-
  • -![[!-SubsetFixture-!][-!!--!!-
  • -!!-
  • -![[!-Important concepts-!][-!!-
  • -![[!-Fixture Arguments-!][-!!-
  • -![[!-Flow Mode-!][-!!-
  • -![[!-Target objects-!][-!!-
  • -![[!-System under test-!][-!!-
  • -![[!-Symbols-!][-!!-
  • -![[!-Markup Variables-!][-!!--!!-
  • -!!--! \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/properties.xml new file mode 100644 index 0000000000..01033af6b4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/properties.xml @@ -0,0 +1,14 @@ + + + false + false + 20090327095125 + false + false + false + true + false + true + 1238165485766 + -6216930893620074344 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/content.txt new file mode 100644 index 0000000000..164fcca419 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/content.txt @@ -0,0 +1,11 @@ +!c !3 !-FitNesse-! Fixture Gallery + +!c version 2.0, 2008-06-09 + +!c [[Gojko Adzic][http://gojko.net]] +!c [[Mike Stockdale][http://www.syterra.com]] +!c Jens Engel + +Fixture Gallery is a cookbook for !-FIT/FitNesse-! tests. It provides developers with a quick overview of the most important fixture types and concepts for agile acceptance testing using the FIT framework. For each fixture type, this document explains the table format and fixture class structure and provides advice when to use and when not to use it. Each example is accompanied by the source code for Java, .NET and Python FIT implementations, in a form that can be easily copied and used as a template for similar fixtures. This document is available in three forms: a FitNesse wiki site that you are viewing at the moment, a [[live wiki site][http://www.fitnesse.info/fixturegallery]] and a [[print-ready PDF][http://sourceforge.net/project/showfiles.php?group_id=216871]]. + +!include -seamless >TableOfContents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/properties.xml new file mode 100644 index 0000000000..95aad65d64 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FixtureGallery/properties.xml @@ -0,0 +1,12 @@ + + + + + 20081020135109 + + + + + 1212872478633 + -935198529820793595 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FormattingOption/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FormattingOption/content.txt new file mode 100644 index 0000000000..9e3df981e8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FormattingOption/content.txt @@ -0,0 +1,14 @@ +!3 !-FormattingOption-! class +The formatting is accomplished through a separate java class called '''!-fitnesse.runner.FormattingOption-!'''. The '''!-FormattingOption-!''' class takes the raw ''Result'' format data and sends it back to FitNesse along with a few parameters. FitNesse will perform the formatting return the formatted data. The data is then stored in a file. HTML and XML are the supported formats. + +This architectures was chosen to reduce the amount of rework needed in alternate implementations of FIT. A TestRunner need only run the tests and save the results in a ''Result'' format. The !-FormattingOption-! program can be invoked alone to perform the additional formatting. +Also, it allow one to archive results in the ''Result'' format and decide at a later time which format should be used if any. +{{{ +Usage: java fitnesse.runner.FormattingOption + resultFilename: the name of the file containing test results + format: raw|html|xml|... + outputfilename: stdout|a filename where the formatted results are to be stored + host: the domain name of the hosting FitNesse server + port: the port on which the hosting FitNesse server is running + rootPath: name of the test page or suite page +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/FormattingOption/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FormattingOption/properties.xml new file mode 100644 index 0000000000..48df617034 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/FormattingOption/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135108 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/content.txt new file mode 100644 index 0000000000..90e325f7ab --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/content.txt @@ -0,0 +1,46 @@ +!3 A step by step example to create an run a simple acceptance test. + + 1 Edit the !-FrontPage-! and add the link !->ExampleAcceptanceTest-!.  Click save. + * You should see !-^ExampleAcceptanceTest?-! appear on the screen. + 1 Click on the '''[?]''' to open the page. + * This will open an edit window on the page !-FrontPage.ExampleAcceptanceTest-!. + 1 Add the following to the page: + * !-|myFixtures.rightTriangle|-! + * !-|a|b|c|right()|-! + * !-|3|4|5|true|-! + * !-|6|8|10|true|-! + * !-|3|5|9|false|-! + * !------! + * !-ClassPath-! + * and hit ''save''. + * beware: if you copy and past the lines above, be sure to remove any white space at the end of the rows. !-FitNesse-! will otherwise not be able to parse the rows. + 1 Click on ''properties''. + * click the ''test'' check box + * hit ''save''. + 1 Click on the '''[?]''' after !-ClassPath-! + * Add the following to the !-ClassPath-! page: + * !-!path fitnesse.jar-! + * !-!path FitNesseRoot/files/examples-! + * and hit save. + 1 Click on !-[.FrontPage]-! and then on !-^ExampleAcceptanceTest-! to get back to the test page. + 1 Create the following java program: + * package myFixtures; + * import fit.!-ColumnFixture-!; + * + * public class rightTriangle extends !-ColumnFixture-! + * { + *   public double a; + *   public double b; + *   public double c; + *   public boolean right() + *   { + *     return (a*a+b*b)==(c*c); + *   } + * } + 1 Save this program in ''root''/!-FitNesseRoot-!/files/examples/myFixtures + 1 Compile this program. + * You can do this by going to the ''root''/!-FitNesseRoot-!/files/examples directory and typing the following command: + * javac -classpath ../../../fitnesse.jar myFixtures/rightTriangle.java + * Or perhaps you have a better way... + 1 Hit the ''test'' button on the !-ExampleAcceptanceTest-! screen.   + * The cells in the right() column should all turn green. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/properties.xml new file mode 100644 index 0000000000..0a0ea7e2ad --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327101204 + + + 1238166724254 + 5283946929880763067 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/content.txt new file mode 100644 index 0000000000..987b8b6818 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/content.txt @@ -0,0 +1,13 @@ + * If you see the message: + * !-FitNesse-! cannot be started... + * Port 80 is already in use. + * Use the -p command line argument to use a different port. + * Fitnesse (''date code'') Started... + * on port 80 + * using path '.' + * using dir '!-FitNesseRoot-!' + * Not logging. + * Then you probably have some web server running on your machine. + * You must edit the run.bat command to look like this: + * java -jar fitnesse.jar -p 8080 %1 %2 %3 %4 %5 + * Then double click run.bat again. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/properties.xml new file mode 100644 index 0000000000..b3fab13361 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205948 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/content.txt new file mode 100644 index 0000000000..e1c9819039 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/content.txt @@ -0,0 +1,26 @@ +!3 A step by step procedure for getting started with FitNesse + + 1 Download fitnesse.zip and put it into some directory. Let's call that directory ''root''. + 2 Unzip fitnesse.zip. + * This should create a ''fitnesse'' directory below ''root'' with the following files. + * !-FitNesseRoot-!, README.txt, dotnet, fitnesse.jar, run.bat, run.sh + 3 Now go to the ''root''/fitnesse folder and double-click run.bat + * You should see the following message: + * Fitnesse (''date code'') Started... + * on port 80 + * using path '.' + * using dir '!-FitNesseRoot-!' + * Not logging. + * If you don't see this, then click [[here][^FitNesseWontStart]]. + 4 Start up a browser and go to http://localhost + * ''or if you had to edit run.bat in step 3 then go to http://localhost:8080.'' + 5 The main FitNesse screen should come up. + * ---- + 6 What do you want to do next? + * Click [[here][^CreateExampleAcceptanceTest]] to create an example acceptance test. + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/properties.xml new file mode 100644 index 0000000000..d38baac757 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GettingStarted/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205947 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GracefulName/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GracefulName/content.txt new file mode 100644 index 0000000000..508d839880 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GracefulName/content.txt @@ -0,0 +1,27 @@ +!1 Improving Readability using ''Graceful Names'' +If you are not yet accustomed to it, you can make your test tables much more pleasant to read by using ''graceful name'' notation. + +Say you have a fixture class named ''!-payroll.fixtures.PaycheckInspector-!'' you can references in your fixture tables as ''Paycheck inspector''. Both Fit and Slim will manipulate that name back into ''!-PaycheckInspector-!'' by removing punctuation and using camel case. They will then hunt through a list of known packages for the fixture. + +A similar transformation happens with variable and method names too. + +Therefore instead of this: + +!|payroll.fixtures.PaycheckInspector| +|employeeId|employeeName|payAmount()| +|24|Bob|1500| + +You can have this: + +!|Paycheck inspector.| +|employee id|employee name|pay amount?| +|24|Bob|1500| + +You can add to the list of packages by using the ''Import'' fixture as follows. + +|Import| +|payroll.fixtures| + +This table should appear ''above'' the tables that use the ''!-PaycheckInspector-!'' fixture. It's a good idea to put your ''Import'' fixtures in a !-SetUp-! page. + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/GracefulName/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GracefulName/properties.xml new file mode 100644 index 0000000000..cc24f01d79 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/GracefulName/properties.xml @@ -0,0 +1,9 @@ + + + + 20090228113828 + true + + 1225603612907 + -1576090897176335033 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/content.txt new file mode 100644 index 0000000000..084db9b26b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/content.txt @@ -0,0 +1,7 @@ +There are three keywords that can appear in a test table. + +|null|''is replaced with a true null when used in a string column''| +|blank|''is replaced with an empty string when used in a string column''| +|error|''Turns the cell red if there were no errors. Turns the cell green if there was an exception.''| + +Click [[here][.FitNesse.SuiteAcceptanceTests.SuiteFixtureTests.SuiteGeneralFixtureSpec.TestBlankAndNullCells]] to see the acceptance tests for null and blank. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/properties.xml new file mode 100644 index 0000000000..b3fab13361 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205948 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/LastModificationTime/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LastModificationTime/content.txt new file mode 100644 index 0000000000..f80ddb9fa5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LastModificationTime/content.txt @@ -0,0 +1,7 @@ +You may see the time that a wiki page was last modified by using the ''!-!lastmodified-!'' widget. It should be placed at the beggining of a line in the wiki text. + +!-!lastmodified-! + +The result of this widget is this: + +!lastmodified diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/LastModificationTime/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LastModificationTime/properties.xml new file mode 100644 index 0000000000..0cab763b0c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LastModificationTime/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205949 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/content.txt new file mode 100644 index 0000000000..911cb0c9c4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/content.txt @@ -0,0 +1,96 @@ +When you have really longs pages it is convenient to list a bunch of links at the top of the page that will take you to sections further down in the page. With a combination of a couple of wiki widgets, you can achieve this usefulness in FitNesse. + +The first component is called an '''Anchor'''. Use anchors to designate locations in a page that you want to link to. Create anchors like this: +'''!-!anchor anchorName-!''' +When saved, you wont see the anchors but they'll be there in the document. + +Now you just need to create a link to them. You do that with the following syntax: +'''!-.#pageBottom-!''' +When saved this will turn into a link to the anchor named '''pageBottom''' in this case. + +.#pageBottom + +At the very bottom of this page, there is an anchor named '''pageBottom'''. When you click in the link above, you will be taken to that hidden anchor. + +---- +And now, a little poem by '''William Butler Yeats''' to fill the space: + +That civilisation may not sink, + +Its great battle lost, + +Quiet the dog, tether the pony + +To a distant post; + +Our master Caesar is in the tent + +Where the maps ate spread, + +His eyes fixed upon nothing, + +A hand under his head. + +(Like a long-legged fly upon the stream + +His mind moves upon silence.) + +That the topless towers be burnt + +And men recall that face, + +Move most gently if move you must + +In this lonely place. + +She thinks, part woman, three parts a child, + +That nobody looks; her feet + +Practise a tinker shuffle + +Picked up on a street. + +(Like a long-legged fly upon the stream + +Her mind moves upon silence.) + +That girls at puberty may find + +The first Adam in their thought, + +Shut the door of the Pope's chapel, + +Keep those children out. + +There on that scaffolding reclines + +Michael Angelo. + +With no more sound than the mice make + +His hand moves to and fro. + +(Like a long-legged fly upon the stream + +His mind moves upon silence.) + +---- + +!anchor pageBottom + +!c !1 You've hit the bottom of the page! + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/properties.xml new file mode 100644 index 0000000000..b024bce208 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113827 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/LogFiles/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LogFiles/content.txt new file mode 100644 index 0000000000..bb6365af81 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LogFiles/content.txt @@ -0,0 +1,17 @@ +If File logging is turned on (with the -l command line argument) then FitNesse will record all accesses in log files. + +A new log file is created every day. + +Log files are named fitnesseyyyymmddhhmmss.log, where yyyymmddhhmmss is the time of the first log entry in the file. + +Each line in the log file records a separate access. They are written in standard (common) web log format. They look like this: +{{{ +65.194.52.68 - - [06/Mar/2003:16:33:48 -0600] "GET /FitNesse.UserGuide HTTP/1.1" 200 1965 +65.194.52.68 - - [06/Mar/2003:16:33:49 -0600] "GET /files/images/FitNesseLogoIcon.jpg HTTP/1.1" 200 15026 +65.194.52.68 - - [06/Mar/2003:16:33:54 -0600] "GET /files HTTP/1.1" 404 380 +65.194.52.68 - - [06/Mar/2003:16:34:00 -0600] "GET /files/ HTTP/1.1" 200 650 +65.194.52.68 - - [06/Mar/2003:16:34:00 -0600] "GET /files/images/FitNesseLogoIcon.jpg HTTP/1.1" 200 15026 +65.194.52.68 - - [06/Mar/2003:16:34:04 -0600] "GET /files/logs/ HTTP/1.1" 200 414 +65.194.52.68 - - [06/Mar/2003:16:34:04 -0600] "GET /files/images/FitNesseLogoIcon.jpg HTTP/1.1" 200 15026 +65.194.52.68 - - [06/Mar/2003:16:34:05 -0600] "GET /files/logs/fitnesse20030306163348.log HTTP/1.1" 200 650 +}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/LogFiles/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LogFiles/properties.xml new file mode 100644 index 0000000000..0cab763b0c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/LogFiles/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205949 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/content.txt new file mode 100644 index 0000000000..11afc4dbca --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/content.txt @@ -0,0 +1,22 @@ +You can take any word, phrase, or image and turn it into a link using the following syntax:{{{ +[[word or phrase][wikiPage]]}}}Here are some examples: + +|!c Markup Text|!c Displayed as:| +|!-click [[here][.FrontPage]].-!|click [[here][.FrontPage]].| +|!-[[!img http://www.objectmentor.com/images/omLogo][http://www.objectmentor.com]]-!|[[!img http://www.objectmentor.com/images/omlogo][http://www.objectmentor.com]]| +|!-[[''Recent Changes''][RecentChanges]]-!|[[''Recent Changes''][.RecentChanges]]| + + * When the text is a wiki word, the link to the wiki word takes precedence, so you cannot override one wiki word to link to another. + +|!c Markup Text|!c Displayed as:| +|!-click [[.RecentChanges][.FrontPage]].-!|click [[.RecentChanges][.FrontPage]].| + + * When the link is a wiki word then, as usual, it may include a relative or an absolute path with respect to the parent page using < . > characters, or is a sibling if no path is specified. (See SubWiki for more details.) + +|!c Markup Text|!c Displayed as:| +|!-click [[here][.FrontPage]].-!|click [[here][.FrontPage]].| +|!-click [[here][MarkupAliasLink]].-!|click [[here][MarkupAliasLink]].| + + * When the link is to an anchor on a different page, append the anchor's name. (See LinksWithinPages) +|!c Markup Text|!c Displayed as:| +|!-click [[Bottom of Page][LinksWithinPages#pageBottom]].-!|click [[Bottom of Page][LinksWithinPages#pageBottom]].| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/properties.xml new file mode 100644 index 0000000000..e22c6960a1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327101750 + + + 1238167070532 + -7119519436873449038 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupBold/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupBold/content.txt new file mode 100644 index 0000000000..5354b7a28a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupBold/content.txt @@ -0,0 +1,4 @@ +To set a word or phrase in '''bold''' simply enclose the section of text in three single quotes like this: + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-I want '''this''' in bold.-!|I want '''this''' in bold.| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupBold/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupBold/properties.xml new file mode 100644 index 0000000000..305a7f3551 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupBold/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205950 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCenter/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCenter/content.txt new file mode 100644 index 0000000000..908913f79d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCenter/content.txt @@ -0,0 +1,7 @@ +You can center a line by prefixing it with !c + +!c This line is centered. + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-this line is not centered-!|this line is not centered| +|!-!c this text is centered-!|!c this text is centered| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCenter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCenter/properties.xml new file mode 100644 index 0000000000..305a7f3551 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCenter/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205950 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/content.txt new file mode 100644 index 0000000000..8be2946ea2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/content.txt @@ -0,0 +1,52 @@ +Often a page include lots of meta text that tends to get in the way. With collapsable sections you can easily delimit, collapse, or completely hide sections of content. Delimited content may be collapsed to hide its content and later expand it to make the content visible again. Hidden sections (as opposed to collapsed sections) are completely inaccessible. + +A collapsable section starts with an ! and at least one star followed by a space and title for the section. The following lines will contain the content of the section. The section ends by a line with at least one star and an !. + +!3 Collapsible Sections that Start Opened +{{{!******** Section Title +This is the content of the section. +The section may be as long as needed. +To end a collapsable section, +use at least one * followed by an !. +**************! +}}} +When rendered looks like: (Click the arrow! It's fun!) +!* Section Title +This is the content of the section. +The section may be as long as needed. +To end a collapsable section, +use at least one * followed by an !. +**************! + +You'll notice that the section is expanded by default. + +!3 Collapsible Sections that Start Closed +You may designate a section to be closed by default by following the stars on the first line with a right arrow ('''>'''). +{{{!*****> Collapsed Section +section body +**********! +}}} +When rendered: + +!*****> Collapsed Section +section body +**********! + +!3 Collapsible Sections that Are Completely Hidden +Additionally, a section may be hidden completely using the "less than" (<) character after the asterisks: +{{{!*****< This is HIDDEN, but is ACTIVE +!define VarIsStillDEFINED {23} +******! +}}} +This feature requires the following addition to the fitnesse_base.css file if upgrading the .jar files: +{{{.invisible +{ + line-height: 0px; + visibility:hidden; +} +}}} +The actual section is after this line...really! We'll check it with a variable expansion: +!*****< This is HIDDEN, but is ACTIVE +!define VarIsStillDEFINED {23} +******! +!-$-!VarIsStillDEFINED = ${VarIsStillDEFINED} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/properties.xml new file mode 100644 index 0000000000..3dfb797a5d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/properties.xml @@ -0,0 +1,9 @@ + + + + 20081020135106 + + + 1201730908252 + 3310084361753212410 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupComments/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupComments/content.txt new file mode 100644 index 0000000000..9bf24345b7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupComments/content.txt @@ -0,0 +1,11 @@ +!2 Comments. +# +# This is a comment +# +You can add a comment to the wiki markup text by simply putting the '#' sign as the first character of a line. The entire line, including the line end, will be ignored. +{{{# +# This is a comment +#}}} +There is a slightly different behaviour when you put the '#' sign in front of the first row of a MarkupTable. + +See the [[Comment Acceptance Test][.FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.TestComment]] \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupComments/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupComments/properties.xml new file mode 100644 index 0000000000..305a7f3551 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupComments/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205950 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupContents/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupContents/content.txt new file mode 100644 index 0000000000..8dcec68db9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupContents/content.txt @@ -0,0 +1,44 @@ +!include -seamless | Symbolic Link | The page is a symbolic link of the current page | +| !3 !c - |Skipped | The skip property box is checked; this page and all its chidlren are excluded from suite tests | + +The character set for properties may be changed via the PROPERTY_CHARACTERS variable; this variable is positional in the order specified above. + +!3 Global Variables that Modify TOC +|''' NAME ''' |''' Default '''|''' Values ''' |''' Notes '''| +| FILTER_TOC | false |true!-|-!false |'' Append suite fiters to TOC (-f flag) ''| +| HELP_PREFIX_TOC | :<''space''> |''any string'' |'' Define prefix for help text suffix ''| +| HELP_TOC | false |true!-|-!false |'' Append help text to TOC (-h flag) ''| +| MORE_SUFFIX_TOC | <''space''>...|''any string'' |'' Define sequence to show more TOC levels ''| +| PROPERTY_CHARACTERS |!- *+@>- -! |''any characters''|'' Define property icons for TOC ''| +| PROPERTY_TOC | false |true!-|-!false |'' Append property icons to TOC (-p flag) ''| +| REGRACE_TOC | false |true!-|-!false |'' Makes !contents list graceful (-g flag) ''| +!note (See the ''root'' page for overrides) + +!3 AcceptanceTests for the ''' !contents ''' widget + * SuiteAcceptanceTests.SuiteWidgetTests.TestContents + * SuiteAcceptanceTests.SuiteWidgetTests.TestContentsWithRecursion + * SuiteAcceptanceTests.SuiteWidgetTests.TestContentsRegraced + * SuiteAcceptanceTests.SuiteWidgetTests.TestContentsProperties + * SuiteAcceptanceTests.SuiteWidgetTests.TestContentsFilters + * SuiteAcceptanceTests.SuiteWidgetTests.TestContentsHelp diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupContents/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupContents/properties.xml new file mode 100644 index 0000000000..6cf1ca0f3a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupContents/properties.xml @@ -0,0 +1,8 @@ + + + + true + + 1238100626155 + 1323665309233349617 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/content.txt new file mode 100644 index 0000000000..1e9e76f8c5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/content.txt @@ -0,0 +1,9 @@ +You can add a ''Cross Reference'' to another page with the !-!see-! statement. + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-!see .FrontPage-!|!see .FrontPage| + +Aside from being a nice syntax for cross references, this widget is also used in [[test suites][TestSuites]]. If a test suite page refers to test pages with !-!see-! statements, then when the suite is executed, the cross referenced tests will be added to the suite. If a test page has a !-!see-! markup, it is ignored completely even if the page is part of a suite or sub-suite. + +The path to the referenced page may be an absolute or a relative path. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/properties.xml new file mode 100644 index 0000000000..827fe63edc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/properties.xml @@ -0,0 +1,9 @@ + + + + 20090228113825 + true + + 1201723540114 + 8020665261681511200 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/content.txt new file mode 100644 index 0000000000..a6e31ec585 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/content.txt @@ -0,0 +1,17 @@ + * You create a new wiki page by clicking on the '''[?]''' at the end of a new WikiWord. + * You edit an existing wiki page by clicking on the '''Edit''' button (or typing ''alt-e'', then ''Enter''). + +Both of these operations take you to the edit page, in which the current markup text of the wiki page is shown. You can edit the markup using standard text editing operations. + +When you click the '''Save''' button (or push ALT+S) ''!-FitNesse-!'' saves the wiki text and redisplays the page. +---- +!3 Editing Accessories + * '''Paste From Excel''' + * The edit page contains a PasteFromExcel button, which will allow you to paste a table copied from a Microsoft Excel spreadsheet into the text window. The table will be reformatted to the standard Fitnesse [[table][MarkupTable]] conventions. + * '''Setting Page Attributes.''' + * Hitting the '''Properties''' button (or typing ''alt-p'') will bring up a form that shows the attributes for this page. + * Some attributes are associated with a button on the wiki page. You can hide or show these buttons by clearing of setting their check boxes and hitting '''Save'''. + * The virtual wiki attribute determines whether or not this page is symbolically linked to another system. See MarkupVirtualWiki. + +See [[Page Attributes][PageProperties]]. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/properties.xml new file mode 100644 index 0000000000..e9c901701a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135106 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExpressions/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExpressions/content.txt new file mode 100644 index 0000000000..5f9fa76445 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExpressions/content.txt @@ -0,0 +1,46 @@ +Expressions calculate a result and substitute the result in place of the expression much like variable references. + * Are enclosed in ''' '' !-${=-! '' ''' and ''' '' !-=}-! '' ''' delimiters. + * May appear anywhere a variable is allowed. + * May contain the following operators: + * + - * / ^ + * unary - + * cos sin tan + * ( ) + * E notation, e.g., 12E+3 + +Given: +{{{!define X {1} +!define Y {2} +!define Z {3} }}} + +The following expressions yields 10: {{{ !-${= ${X} + ${Y} + ${Z} + 4 =}-! }}} + +!3 Actual Markup +!define X {1} +!define Y {2} +!define Z {3} + +The result is 10?: ${= ${X} + ${Y} + ${Z} + 4 =} yes! + +!3 Advanced Notation + +'''Complete Syntax''' +'''!-${=-!''' ['''%''' ''format'' ''':'''] ''expression'' '''!-=}-!''' + +Where format is a single numeric or boolean format specifier defined by the Java Formatter class conversions. + +'''Examples''' +|''' Mark Up '''|''' Result '''| +|!-${=1+2+3=}-! | ${=1+2+3=} | +|!-${=12E+2 + 34=}-! | ${=12E+2 + 34=} | +|!-${=%03d:1+2+3=}-! | ${=%03d:1+2+3=} | +|!-${=%02X:10+1=}-! | ${=%02X:8+1=} | +|!-${= %02x : 10 + 1 =}-! | ${= %02x : 8 + 1 =} | +|!-${= %03.2f : 10.12345678 =}-! | ${= %03.2f : 10.12345678 =} | +|!-${=%b: 1 =}-! | ${=%b:1=} | +|!-${=%b: 0 =}-! | ${=%b:0=} | +|!-${=%B: 6 =}-! | ${=%B:6=} | +|!-${=%B: -2 =}-! | ${=%B:-2=} | + +!see + + true + true + 20090327101940 + true + true + true + true + true + true + 1238167180400 + 7251473079430893688 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/content.txt new file mode 100644 index 0000000000..5914633157 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/content.txt @@ -0,0 +1,9 @@ +A link to an external web page is created by typing the URL. + +|!c '''Markup Text'''|!c '''Displayed as:'''| +|!-http://www.objectmentor.com-!|http://www.objectmentor.com| + +If you would like to create a link to the '''files''' section of the local FitNesse installation, you may omit the domain name. + +|!c '''Markup Text'''|!c '''Displayed as:'''| +|!-http://files/images/-!|http://files/images/| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/properties.xml new file mode 100644 index 0000000000..ded158c085 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205951 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/content.txt new file mode 100644 index 0000000000..08169becc9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/content.txt @@ -0,0 +1,26 @@ +Hash Tables are collections of name-value pairs that can be passed as arguments into test fixtures. They render as tables. !-DoFixture-! will decode a name-value pair table into a true hashtable. + +Any text enclosed in '''!-!{-!''' and '''}''' will be treated as a Hash Table. + +|!c '''Markup Text'''|!c '''Displays as'''| +|!-!{fname:Bob, lname:Martin, dob:5-Dec-1952}-!|!{fname:Bob, lname:Martin, dob:5-Dec-1952}| + +The key name must be plain text, but the value can be any reasonable wiki construct. + +|!c '''Markup Text'''|!c '''Displays as'''| +|!-!{fname:''Bob'', lname:''Martin'', today:!today}-!|!{fname:''Bob'', lname:''Martin'', today:!today}| + + +!3 Syntax issues. + + * A colon, comma and closing brace simply cannot be placed in either the name or the value. + * The comma is optional. This is valid: !-!{name:bob dob:19521205}-! + * The hash widget can be written on many lines as follows: +{{{ + !{ + Name:Bob + Address:There + Time:Now + }! }}} +!3 CSS +You can change their appearance using the css classes !style_code(hash_table), !style_code(hash_row), !style_code(hash_key), !style_code(and hash_value) diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/content.txt new file mode 100644 index 0000000000..0f1b6e4807 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/content.txt @@ -0,0 +1,3 @@ + * If there is a wiki page named PageHeader its contents will be displayed at the top of every wiki page. + * If there is a wiki page named PageFooter its contents will be displayed at the bottom of every wiki page. + * PageHeader and PageFooter are inherited by a SubWiki diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/properties.xml new file mode 100644 index 0000000000..6a188b47f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135131 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/content.txt new file mode 100644 index 0000000000..73fb469d5f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/content.txt @@ -0,0 +1,10 @@ +Headers are created by prefixing a line with !1 or !2 or !3 + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!- !1 Title -!|!1 Title| +|!- !2 Header -!|!2 Header| +|!- !3 Second Header -!|!3 Second Header| + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/properties.xml new file mode 100644 index 0000000000..346a634b14 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113826 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/content.txt new file mode 100644 index 0000000000..587f5e4450 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/content.txt @@ -0,0 +1,6 @@ +You can draw a horizontal rule by using four or more dashes. The more dashes, the thicker the line: + +|!c '''Markup Text'''|!c '''Displayed as:'''| +|!-above----below-!|!c above----!c below| +|!-above------below-!|!c above------!c below| +|!-above--------below-!|!c above--------!c below| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/properties.xml new file mode 100644 index 0000000000..ede6d5218a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205952 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/content.txt new file mode 100644 index 0000000000..2cd078a3bc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/content.txt @@ -0,0 +1,20 @@ +You can make a link to another wiki page simply by stating the name of the wiki page. For example, the name of this page is MarkupInternalLink. + +The name of a page has a special syntax known as a WikiWord. A WikiWord starts with a capital letter and has at least one more capital letter in it. Between the capitals there must be lower case letters or numbers. There cannot be two capitals in a row. + +Thus: + +|!c '''Wiki Words'''|!c '''Non-Wiki Words'''| +|!-BobMartin-!|Bob| +|!-RobertCecilMartin-!|hello| +|!-ObjecT-!|Object| +|!-NumbersLike123AreAllowedNow-!|Butnotlikethis123| + +If you place a WikiWord in the markup text, but no such page exists, then you will see something like this on the page: + +NoSuchWikiWord + +If you click on the question mark it will create that page for you, and allow you to edit it. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/properties.xml new file mode 100644 index 0000000000..4762479df8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327102140 + + + 1238167300381 + -5797473787600939218 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupItalics/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupItalics/content.txt new file mode 100644 index 0000000000..73b4763725 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupItalics/content.txt @@ -0,0 +1,4 @@ +To set a word or phrase in ''italics'' simply enclose the section of text in two single quotes like this: + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-I want ''this'' in italics.-!|I want ''this'' in italics.| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupItalics/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupItalics/properties.xml new file mode 100644 index 0000000000..fd045a52b3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupItalics/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205953 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/content.txt new file mode 100644 index 0000000000..3284a2e2ea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/content.txt @@ -0,0 +1,33 @@ +!1 Wiki Markup Language Reference + +The FitNesse markup language is straightforward to learn, and powerful enough to enable you to create richly-formatted and customized wiki pages. Below is a reference of so-called "widgets" for formatting text and accomplishing other things on wiki pages. + +|!c '''Markup Syntax'''| +|[[Italics][MarkupItalics]]|''Setting a word or phrase in italics.''| +|[[Bold][MarkupBold]]|''Setting a word or phrase in bold.''| +|[[Strike][MarkupStrike]]|''Putting a strike through a word or phrase.''| +|[[Style][MarkupStyle]]|''Setting the style of some text.''| +|[[Cross Reference][MarkupCrossReference]]|''Add a cross reference to another page.''| +|[[Headers][MarkupHeaders]]|''Setting a line as a title or section header.''| +|[[Centering][MarkupCenter]]|''Centering a line.''| +|[[Notes][MarkupNote]]|''Making a note.''| +|[[Horizontal Rules][MarkupHorizontalRule]]|''Drawing a horizontal separator.''| +|[[Images][MarkupPicture]]|''Placing a picture or image.''| +|[[External links][MarkupExternalLink]]|''Creating a hyperlink to an external webpage.''| +|[[Links Within Pages][LinksWithinPages]]|''Creating links to anchors within the same page.''| +|[[Wiki page links][MarkupInternalLink]]|''Creating a hyperlink to an internal wiki page.''| +|[[Alias links][MarkupAliasLink]]|''Turning reqular words or images into links''| +|[[Lists][MarkupLists]]|''Creating bullet lists and numbered lists''| +|[[Literal Text][MarkupLiteralText]]|''Preventing text from being interpreted.''| +|[[Preformatted text][MarkupPreformatted]]|''Setting text as preformatted monofont''| +|[[Comments][MarkupComments]]|''Putting comments in markup text.''| +|[[Variables][MarkupVariables]]|''Defining and expressing variables''| +|[[Classpaths][MarkupPath]]|''Marking a line as a directory path.''| +|[[Tables][MarkupTable]]|''Creating tables.''| +|[[Hash Tables][MarkupHashTable]]|''Creating lookup tables.''| +|[[Plain Text Tables][PlainTextTable]]|''Creating tables from plain text without vertical strokes''| +|[[Table of Contents][MarkupContents]]|''Generate a table of contents for a SubWiki.''| +|[[Including][MarkupPageInclude]]|''Pulling the content from one page into another.''| +|[[Last Modification Time][LastModificationTime]]|''Showing the time that a page was last modified.''| +|[[Collapsable Sections][MarkupCollapsableSection]]|''Making a section of content collapsable and expandable''| +|[[Today's Date][TodaysDate]]|''Showing todays date in various formats and styles.''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/properties.xml new file mode 100644 index 0000000000..a3439e55a1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1237146606658 + -1006255556384496467 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLists/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLists/content.txt new file mode 100644 index 0000000000..48175d66ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLists/content.txt @@ -0,0 +1,27 @@ + * Bullet lists are created by prefixing a space and an asterisk to a line. + * You can create sublists by adding more spaces on the front. + 1 Numbered lists are created by prefixing a space and a number to a line. + +---- '''Markup Text'''{{{ + * Item one + * sub item one + * sub item two + + * Item two. + 1 sub item 2 + 2 sub item 3 + * sub sub item one + 1 sub sub sub item one. +}}}----'''Displays as:''' + * Item one + * sub item one + * sub item two + + * Item two. + 1 sub item 2 + 2 sub item 3 + * sub sub item one + 1 sub sub sub item one. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLists/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLists/properties.xml new file mode 100644 index 0000000000..d8da37fa38 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLists/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135117 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/content.txt new file mode 100644 index 0000000000..40ae95c3dd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/content.txt @@ -0,0 +1,18 @@ +Sometimes you want to show a !-WikiWord-! without having it turn into a link. Or sometimes you might want to show some wiki markup text such as !-'''bold'''-! without having the markup take effect. To do this you use the ''literal'' markup text. + +Any text enclosed in '''!-!--!''' and '''-!''' will be treated as a literal and will not be processed for wiki words or other markup widgets. This is also a "cool" way to add HTML to a wiki page. + +|!c '''Markup Text'''|!c '''Displays as'''| +|!-!-WikiWord-!-!|!-WikiWord-!| +|!-!-'''bold'''-!-!|!-'''bold'''-!| +|!-!-<i>hello</i>-!-!|!-hello-!| + +If you want to show HTML rather than have it rendered you can surround it in &bang;< and >&bang; + +|!c '''Markup Text'''|!c '''Displays as'''| +|&bang;<hello>&bang;|!-<i>hello</i>-!| + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/properties.xml new file mode 100644 index 0000000000..44457093de --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1225603481926 + -5671299916402952716 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupNote/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupNote/content.txt new file mode 100644 index 0000000000..27df81a09a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupNote/content.txt @@ -0,0 +1,6 @@ +You can make a note by starting a line with '''!note''' + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-!note this text is a note-!|!note this text is a note| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupNote/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupNote/properties.xml new file mode 100644 index 0000000000..96aeba49de --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupNote/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327102259 + + + 1238167379384 + 6044718649644820583 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPageInclude/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPageInclude/content.txt new file mode 100644 index 0000000000..b80acc0f92 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPageInclude/content.txt @@ -0,0 +1,23 @@ +To include the content from one page into another you may use the !-!include-! widget + +Usage: +'''!-!include PageName-!''' + +For example if you wanted to all the content from .FrontPage to be displayed here you would simply type: + +!-!include .FrontPage-! + +As a result you will see .FrontPage below: +----- +!include .FrontPage +----- +|'''Parameters:'''| +|!style_code(-seamless)|''causes the included page to be rendered without an enclosing box.''| +|!style_code(-c)|''causes the included page to be collapsed.''| + +!3 '''Watch out for !include cycles''' +Don't include a page that already includes the page that you are including from. ;-) + +!3 Including Test snippets +It is often useful to include portions of test tables into your tests. You do this to bring in common setup data or common test sequences (possibly modified with variables). A convenient way to do this is to use the Backwards Search notation as follows:{{{!include + + + 20090228113826 + true + + 1232747484629 + -5093174657906389793 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPath/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPath/content.txt new file mode 100644 index 0000000000..23010bd825 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPath/content.txt @@ -0,0 +1,15 @@ +There are some special functions in FitNesse that require you to name a directory path. You do this with the !path directive. + +|!c '''Markup Text'''|!c '''Displays as'''| +|!-!path c:\directory-!|!path c:\directory| + +You can also specify all the .jar files in a directory by using a wildcard: +{{{!-!path /usr/javalib/*.jar-!}}} + +Or you can specify all .jar files in a directory ''and all subdirectories'' by using the ** wildcard. +{{{!-!path /usr/javalib/**.jar-!}}} + +Paths such as these will be used when you press the ''test'' or ''suite'' buttons on a page. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPath/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPath/properties.xml new file mode 100644 index 0000000000..ff43047b76 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPath/properties.xml @@ -0,0 +1,9 @@ + + + + 20090228113824 + true + + 1213127675393 + 7889220604288275533 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPicture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPicture/content.txt new file mode 100644 index 0000000000..ebe99ffb7c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPicture/content.txt @@ -0,0 +1,11 @@ +Picture can be added by using the '''!img''' marker followed by a URL +As a shortcut, any URL ending in '''.gif''' or '''.jpg''' will also be included as an image. + +|!c '''Markup Text'''|!c '''Displayed as:'''| +|{{{!img http://files/images/FitNesseLogo.gif}}}|!img http://files/images/FitNesseLogo.gif| +|{{{http://files/images/FitNesseLogo.gif}}}|!img http://files/images/FitNesseLogo.gif| + +You may align images to the left or right and wrap following text around the images by using '''!img-l''' and '''!img-r''' respectively. + +|{{{!img-l (Gettysburg address)}}}|!img-l http://files/images/FitNesseLogo.gif Fourscore and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war, testing whether that nation or any nation so conceived and so dedicated can long endure. We are met on a great battlefield of that war. We have come to dedicate a portion of that field as a final resting-place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. But in a larger sense, we cannot dedicate, we cannot consecrate, we cannot hallow this ground. The brave men, living and dead who struggled here have consecrated it far above our poor power to add or detract. The world will little note nor long remember what we say here, but it can never forget what they did here. It is for us the living rather to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion that we here highly resolve that these dead shall not have died in vain, that this nation under God shall have a new birth of freedom, and that government of the people, by the people, for the people shall not perish from the earth.| +|{{{!img-r (Gettysburg address)}}}|!img-r http://files/images/FitNesseLogo.gif Fourscore and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war, testing whether that nation or any nation so conceived and so dedicated can long endure. We are met on a great battlefield of that war. We have come to dedicate a portion of that field as a final resting-place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. But in a larger sense, we cannot dedicate, we cannot consecrate, we cannot hallow this ground. The brave men, living and dead who struggled here have consecrated it far above our poor power to add or detract. The world will little note nor long remember what we say here, but it can never forget what they did here. It is for us the living rather to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion that we here highly resolve that these dead shall not have died in vain, that this nation under God shall have a new birth of freedom, and that government of the people, by the people, for the people shall not perish from the earth.| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPicture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPicture/properties.xml new file mode 100644 index 0000000000..b024bce208 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPicture/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113827 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/content.txt new file mode 100644 index 0000000000..5cbc5893c8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/content.txt @@ -0,0 +1,23 @@ +If you want a stretch of text that should be left alone then you can enclose that text in three braces as follows: +!-{{{-!{{{Text to be left alone}}}!-}}}-! +Between the braces no wiki words will be identified, no markup syntax will be decoded. The text will be displayed in mono font exactly as it was typed. We use this technique a lot for showing samples of fixture code: +{{{ +import fit.ColumnFixture; + +public class AddRemovePlayerFixture extends ColumnFixture { + public String playerName; + private Game theGame; + + public boolean addPlayer() { + theGame = StaticGame.getInstance(); + Player thePlayer = theGame.addPlayer(playerName); + return theGame.playerIsPlaying(thePlayer); + } + + public int countPlayers() { + return theGame.getNumberOfPlayers(); + } +} }}} + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/properties.xml new file mode 100644 index 0000000000..6279719663 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113824 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStrike/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStrike/content.txt new file mode 100644 index 0000000000..5c42bb09c6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStrike/content.txt @@ -0,0 +1,4 @@ +To put a --strike-- through word or phrase simply surround the text with two dashes. + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-I want --this-- to be struck.-!|I want --this-- to be struck.| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStrike/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStrike/properties.xml new file mode 100644 index 0000000000..847f8f6121 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStrike/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205955 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStyle/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStyle/content.txt new file mode 100644 index 0000000000..4095c21d1c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStyle/content.txt @@ -0,0 +1,34 @@ +To set the style of a word or phrase use the !-!style_(text)-! widget. +This widget has three forms. !style_code[!-!style_(text)-!], !style_code(!-!style_{text}-!), and !style_code{!-!style_[text]-!} +!note Yes, that means that you cannot put a style around a single string that has all three closing terminators. I'm sure you can figure out the workaround. + +Here are some of the available classes you can use. Remember you can (should) add more classes to: !style_code(!-FitNesseRoot/files/fitnesse.css-!) + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!-!style_error(an error)-!|!style_error(an error)| +|!-!style_pass(pass)-!|!style_pass(pass)| +|!-!style_fail(fail)-!|!style_fail(fail)| +|!-!style_ignore(ignore)-!|!style_ignore(ignore)| +|!-!style_caps{Caps}-!|!style_caps{Caps}| +|!-!style_code[code]-!|!style_code[code]| +|!-!style_red[red]-! and other colors...|!style_red[red], !style_orange[orange], !style_yellow[yellow], !style_green[green], !style_blue[blue], !style_indigo[indigo], !style_violet[violet]| +||!style_pink[pink], !style_lightYellow[lightYellow], !style_lightGreen[lightGreen], !style_lightBlue[lightBlue]| +||!style_chocolate[chocolate], !style_darkOrange[darkOrange], !style_darkRed[darkRed], !style_olive[olive], !style_darkBlue[darkBlue], !style_darkGreen[darkGreen]| +|!-!style_code(!style_red[code red])-!|!style_code(!style_red[code red])| +|!-!style_note[note]-!|!style_note[note]| +|!-!style_page_title[page_title]-!|!style_page_title[page_title]| +|!-!style_right[right]-!|!style_right[right]| +|!-!style_strike[strike]-!|!style_strike[strike]| +|!-!style_meta[meta]-!|!style_meta[meta]| +|!-!style_included[included]-!|!style_included[included]| +|!-!style_setup[setup]-!|!style_setup[setup]| +|!-!style_collapse_rim[collapse_rim]-!|!style_collapse_rim[collapse_rim]| +|!-!style_pageHelp[pageHelp]-!|!style_pageHelp[pageHelp]| +|!-x !style_hidden[hidden] x-!|x !style_hidden[hidden] x| +|!-!style_test_output_name[test_output_name]-!|!style_test_output_name[test_output_name]| +|!-!style_fit_label[fit_label]-!|!style_fit_label[fit_label]| +|!-!style_fit_stacktrace[fit_stacktrace]-!|!style_fit_stacktrace[fit_stacktrace]| +|!-!style_fit_grey[fit_grey]-!|!style_fit_grey[fit_grey]| + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStyle/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStyle/properties.xml new file mode 100644 index 0000000000..b55c844286 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupStyle/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090116122637 + true + true + true + true + true + true + 1232130397426 + 2924400028923341443 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupTable/content.txt new file mode 100644 index 0000000000..f0cb16920e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupTable/content.txt @@ -0,0 +1,41 @@ +Tables can be created very easily. Use the vertical stroke as the first character of the line, and separate each table cell with it: + +'''Markup Text''' +{{{|Alpha| +|Beta|gamma|Delta| +|1|2|3|}}}---- +'''Displays as:''' +|Alpha| +|Beta|gamma|Delta| +|1|2|3| +---- +You can use most wiki markup directives in table cells, including !c, !1, !2, !3, bold, and italic. +!2 Literal tables. +If you don't want any markup directives interpreted in the table, then you can use a special form that is preceded with a ! and like this: + +'''Markup Text''' +{{{!|ThisTableWillNotInterpret|!c any directives|'''it is treated'''| +|!1 like a literal|--and is especially useful--|''for test tables.''| +|^SinceTheyTend| * to have WikiWord symbols in them.|}}} +'''Displays as:''' +!|ThisTableWillNotInterpret|!c any directives|'''it is treated'''| +|!1 like a literal|--and is especially useful--|''for test tables.''| +|^SinceTheyTend| * to have WikiWord symbols in them.| + +!2 Hidden table heads +You can hide the first row of a table. This allows you to write comment tables that just look like ordinary HTML tables. +The complete table still gets executed, the first row is just hidden by a CSS rule. +Precede the first row with a '-'. This also works for literal tables. + +'''Markup Text''' +{{{-!|Comment| +|Beta|gamma|Delta| +|1|2|3|}}} +'''Displays as:''' +-!|Comment| +|Beta|gamma|Delta| +|1|2|3| + +!2 Plain Text Tables +!see + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVariables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVariables/content.txt new file mode 100644 index 0000000000..c9445ba6c5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVariables/content.txt @@ -0,0 +1,30 @@ +!2 Defining and Expressing Variables. +You can define a variable to represent any amount of text. The text in a variable is never interpreted as wiki markup. It is always raw literal text. + * Variable names may contain letters, numbers, and periods; e.g., MYTEST.someVar or user.name + * You can define a variable in any of these three ways: + * !style_code(!-!define var {text}-!) + * !style_code[!-!define var (text)-!] + * !style_code(!-!define var [text]-!) + * The reason there are three forms is so that you can include braces, brackets, or parenthesis in your variables. + * The variable text can span many lines as shown below: +{{{ +!define myVariable { +This is the +text of my +variable +} }}} +!define myVariable { +this is the +text of my +variable +} +You express the value of a variable like this: !-${myVariable}-!. This expression is replaced with the value of the variable. + +''The value of the variable is: ${myVariable}.'' + +If a variable is expressed on a page, but is not found, then its parent pages are searched in order. +If the variable is not found in any ancestor pages, FitNesse will inspect System.properties. + +There are several [[pre-defined variables][ + + + + + + + + + + + + + 1238167551817 + 6509577387506798141 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/content.txt new file mode 100644 index 0000000000..a37431b3cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/content.txt @@ -0,0 +1,31 @@ +{{{java.io.StreamCorruptedException: invalid stream header + java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:764) + java.io.ObjectInputStream.(ObjectInputStream.java:277) + fitnesse.wiki.ProxyPage.getObjectFromUrl(ProxyPage.java:142) + fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:52) + fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:45) + fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:40) + fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:33) + fitnesse.wikitext.widgets.TOCWidget.buildListOfChildPages(TOCWidget.java:269) + fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:164) + fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:150) + fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:190) + fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:165) + fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:150) + fitnesse.wikitext.widgets.TOCWidget.render(TOCWidget.java:111) + fitnesse.wikitext.widgets.ParentWidget.childHtml(ParentWidget.java:70) + fitnesse.wikitext.widgets.WidgetRoot.render(WidgetRoot.java:92) + fitnesse.wiki.PageData.processHTMLWidgets(PageData.java:196) + fitnesse.wiki.PageData.getHtml(PageData.java:166) + fitnesse.responders.WikiPageResponder.generateHtml(WikiPageResponder.java:95) + fitnesse.responders.WikiPageResponder.makeHtml(WikiPageResponder.java:87) + fitnesse.responders.WikiPageResponder.makePageResponse(WikiPageResponder.java:70) + fitnesse.responders.WikiPageResponder.makeResponse(WikiPageResponder.java:45) + fitnesse.FitNesseExpediter.createGoodResponse(FitNesseExpediter.java:122) + fitnesse.FitNesseExpediter.makeResponse(FitNesseExpediter.java:105) + fitnesse.FitNesseExpediter.start(FitNesseExpediter.java:47) + fitnesse.FitNesseServer.serve(FitNesseServer.java:24) + fitnesse.FitNesseServer.serve(FitNesseServer.java:17) + fitnesse.socketservice.SocketService$ServerRunner.run(SocketService.java:88) + java.lang.Thread.run(Thread.java:613) +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/properties.xml new file mode 100644 index 0000000000..10a9935529 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/properties.xml @@ -0,0 +1,13 @@ + + + true + true + 20090327171601 + true + true + true + true + true + true + -9007199047140889011 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/content.txt new file mode 100644 index 0000000000..faad952800 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/content.txt @@ -0,0 +1,27 @@ +!2 The Virtual Wiki Features is deprecated altogether. Don't use it. It will be removed soon. Probably before 2010. +See WikiImport and SymbolicLinks as alternative to Virtual Wiki + +!***> Description of the deprecated Virtual Wiki feature +'''!virtual wiki has been deprecated and this page describes the new method to set up a virtual wiki.''' + +Sometimes you want to attach the pages of a remote sub-wiki to a page in your local wiki. You do this by setting the ''!-VirtualWiki-!'' property in a page's property window. The value to should be the URL of the remote page whose children you would like to appear as subpages. + +''See TestDevelopmentEnvironment for a justification of this feature.'' + +For example: if on page !-MyWiki.MyPage-! you set ''!-VirtualWiki-!'' to ''!-http://fitnesse.org/FitNesse-!'' then all the children of !-fitnesse.org/FitNesse-! would become children of !-MyWiki.MyPage-!. + +Try it out. + 1 Make this page a virtual parent by putting the following URL in the ''Virtual Wiki'' property in the property window. !-http://fitnesse.org/FitNesse.SuiteAcceptanceTests-! + 2 Add a !contents to the bottom of this page. Without this the virtual wiki will still work, but you won't see a convenient list of virtual sub pages. + 3 If you are using the newest version of !-FitNesse-! and your installtion has internet access, then you should see the children of !-fitnesse.org/FitNesse.SuiteAcceptanceTests-! shown as links below. If you click on one of those links you will note that the page background changes to blue. This is a hint that you are looking at a remote page. + + * If you edit a remote page, the changes will be made remotely. Note that a new edit window will pop up, and the url will be to the remote system, not the local system. Note also that the background will be white. This is your clue that this window is directly connected to the remote system. After you hit save, this window will show the edited page on the ''remote'' system, and the background will be white. Remember to dismiss this window and return to the blue window before you try to run a test! + * If you test a remote page, the test is run locally, and the !path directives from the !-ClassPath-! pages in your local environment will be used to establish the execution classpath. + * If you test a remote suite, all the tests will be run locally, using the the local classpath. + * Note: If there are !-ClassPath-! pages in the remote hierarchy below the , they will still be used. + +If FitNesse has a problem connecting to a remote server it will create a page beneath the local page called !-VirtualWikiNetworkError-!. In this page you will find a stack trace of the exception received. As an example: MarkupVirtualWiki.VirtualWikiNetworkError + +The previous implentation of VirtualWiki made use of the special !virtualwiki widget. If you try to use it you will get the follwing message. +!virtualwiki http://fitnesse.org/FitNesse.SuiteAcceptanceTests +**********! diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/properties.xml new file mode 100644 index 0000000000..6edd3aa009 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/properties.xml @@ -0,0 +1,10 @@ + + + + 20090327102725 + + http://fitnesse.org/FitNesse.SuiteAcceptanceTests + + 1238167645133 + 7990255477344717059 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/content.txt new file mode 100644 index 0000000000..1fa756bd78 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/content.txt @@ -0,0 +1,12 @@ +It is possible to set up a FitNesse page the will run all tests in a different language. + +The languages currently supported are: + * Java - ''of course'' + * DotNet + +There are few componenets needed to support other languages: + 1 An implementation of FIT for the desired language. + 2 An implementation of FitServer - a program that couples FIT to FitNesse. + 3 The variables listed in CustomizingTestExecution should be set accordingly. + +When ever you run a test where the [[special variables][CustomizingTestExecution]] are [[in scope][VariableScope]], the execution will be performed in the designated language. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/properties.xml new file mode 100644 index 0000000000..ff053c2263 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205956 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/content.txt new file mode 100644 index 0000000000..5f55021043 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/content.txt @@ -0,0 +1,25 @@ +[[A Two-Minute Example][TwoMinuteExample]] +!1 What is !-FitNesse-!? +!3 !-FitNesse-! is a software development collaboration tool +Great software requires collaboration and communication. !-FitNesse-! is a tool for enhancing collaboration in software development. + +!-FitNesse-! enables customers, testers, and programmers to '''learn what their software should do''', and to automatically compare that to '''what it actually does do'''. It compares customers' expectations to actual results. + +It's an invaluable way to collaborate on complicated problems (and get them right) early in development. + +(''The above description is adapted from James Shore's description of Ward Cunningham's [[Fit Framework][FitFramework]], which is one of the test systems upon which !-FitNesse-! depends.'') +!3 !-FitNesse-! is a software testing tool. +From another perspective, !-FitNesse-! is a lightweight, open-source framework that makes it easy for software teams to: + * Collaboratively define [[Acceptance Tests][AcceptanceTests]] -- web pages containing simple tables of inputs and expected outputs. + * Run those tests and see the results (see [[Two Minute Example][TwoMinuteExample]]). +!3 !-FitNesse-! is a wiki. + * You can ''easily'' create and edit pages. (See [[Editing Pages][EditingFitNessePages]].) +!3 !-FitNesse-! is a web server. + * It requires '''no configuration or setup'''. + * Just run it and then direct your browser to the machine where it is running (see [[Downloading and Installing][DownloadingAndInstallingFitNesse]]). +!3 --> Want a quick introduction? Check out the [[Two Minute Example][TwoMinuteExample]]. +---- +!img http://files/images/fitnesse_architecture.jpg + + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/properties.xml new file mode 100644 index 0000000000..4b0c7e1c64 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/properties.xml @@ -0,0 +1,13 @@ + + + + 20090326103114 + + + + + + + 1238081474974 + -6498438470935250089 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageFooter/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageFooter/content.txt new file mode 100644 index 0000000000..91be95e3f8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageFooter/content.txt @@ -0,0 +1,3 @@ +!c User Guide Contents + +[[What is !-FitNesse-!?][OneMinuteDescription]] - [[A Two-Minute Example][TwoMinuteExample]] - [[Writing Acceptance Tests][AcceptanceTests]] - [[Editing !-FitNesse-! Pages][EditingFitNessePages]] - [[Creating Fixtures][FixtureCode]] - [[Administration][AdministeringFitnesse]] - [[Quick Reference Guide][QuickReferenceGuide]] diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageFooter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageFooter/properties.xml new file mode 100644 index 0000000000..e9c901701a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageFooter/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135106 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageHeader/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageHeader/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageHeader/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageHeader/properties.xml new file mode 100644 index 0000000000..3c785719b0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageHeader/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205957 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageProperties/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageProperties/content.txt new file mode 100644 index 0000000000..ea2e4e0c85 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PageProperties/content.txt @@ -0,0 +1,21 @@ +FitNesse pages can have attributes that alter the way the pages are displayed, and how they behave. These can be enabled or disabled for a page by hitting the Properties button. + +The properties are: + * '''Edit''': When set, this property causes the '''Edit''' button to be displayed. This is a poor man's read-only switch. If you clear this checkbox then users will not have a convenient way to edit the page. Of course they can always edit it by typing the ''page?edit'' URL -- but we don't have to tell them how to do that, do we? + * '''Search''': This property enables or disables the '''Search''' button. There's no real good reason to disable this button, but we put the ability in just for symmetry. + * '''Test''': This property instructs ''!-FitNesse-!'' to treat the page as a fitnesse test page: + * It enables the '''Test''' button, which submits the page to Fit to process all of the page's test tables. + * Pages with the Test property enabled will have the '''!-SetUp-!''' and '''!-TearDown-!''' text applied to them. See + + + + + 1238171805702 + 8555069348586341028 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/content.txt new file mode 100644 index 0000000000..93673cdc04 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/content.txt @@ -0,0 +1,16 @@ +When using the CommonIncludes pattern you may come across duplicated content that varies with only one or two values. This can make using includes difficult but when combined with variables, includes become even more powerful. You can parameterize included pages by declaring variables in the test page and referencing them in the included page. + +First we'll include a paraterized include page without defining any varaibles. +!include SampleParameterizedPage + +Now we define the required variables. +!define NUMERATOR {100} +!define DENOMINATOR {10} +!define QUOTIENT {10} +!include SampleParameterizedPage + +We can redefine the variables and use the parameterized include again. +!define NUMERATOR {555} +!define DENOMINATOR {5} +!define QUOTIENT {111} +!include SampleParameterizedPage diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/properties.xml new file mode 100644 index 0000000000..3c785719b0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717205957 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/content.txt new file mode 100644 index 0000000000..8828556724 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/content.txt @@ -0,0 +1,60 @@ +!3 You are allowed to pass arguments into any fixture. + +Arguments are in cells that are to the right of the cell with the fixture name. The protected field ''args'' in Fixture holds a String array with the arguments. + +Below you can see a simple RowFixture that takes a single integer argument and produces the prime factors of that argument. + +|!-fitnesse.fixtures.PrimeFactorsFixture-!|6| +|factor| +|2| +|3| + +The code for this fixture is shown below. Note that the ''query'' method uses the ''args'' field. +(Note the "6" that follows the fixture name above.) You can put as many arguments there as you like. +{{{ +public class PrimeFactorsFixture extends RowFixture +{ + public static class Factor + { + public Factor(int factor) + { + this.factor = factor; + } + + public int factor; + } + + public Object[] query() + { + int n = Integer.parseInt(args[0]); + ArrayList factors = new ArrayList(); + for(int f = 2; n > 1; f++) + for(; n % f == 0; n /= f) + factors.add(new Factor(f)); + return (Factor[]) factors.toArray(new Factor[0]); + } + + public Class getTargetClass() // get expected type of row + { + return Factor.class; + } +} +}}} +Because this is a RowFixture, the order of the rows is unimportant. As shown below the rows will be matched and found regardless of their order. +|!-fitnesse.fixtures.PrimeFactorsFixture-!|1000| +|factor| +|2| +|5| +|2| +|5| +|5| +|2| + +And of course any cells that are missing, or extra will be marked in red. +|!-fitnesse.fixtures.PrimeFactorsFixture-!|63| +|factor| +|7| +|3| +|5| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/properties.xml new file mode 100644 index 0000000000..db4e8d5ae2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135109 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/content.txt new file mode 100644 index 0000000000..102c5154ff --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/content.txt @@ -0,0 +1,58 @@ +!3 This fixture is just like a RowFixture except that it allows you to pass arguments into the fixture. + +Below you can see a simple ParametricRowFixture that takes a single integer argument and produces the prime factors of that argument. + +|!-fitnesse.fixtures.PrimeFactorsFixture-!|6| +|factor| +|2| +|3| + +The code for this fixture is shown below. Note that the ''query'' method takes a ''String args[]'' argument. The arguments to the fixture are passed in through this array. The arguments are all the table cells that follow the fixture name. (Note the "6" that follows the fixture name above.) You can put as many arguments there as you like. +{{{ +public class PrimeFactorsFixture extends ParametricRowFixture +{ + public static class Factor + { + public Factor(int factor) + { + this.factor = factor; + } + + public int factor; + } + + public Object[] query(String[] args) + { + int n = Integer.parseInt(args[0]); + ArrayList factors = new ArrayList(); + for(int f = 2; n > 1; f++) + for(; n % f == 0; n /= f) + factors.add(new Factor(f)); + return (Factor[]) factors.toArray(new Factor[0]); + } + + public Class getTargetClass() // get expected type of row + { + return Factor.class; + } +} + +}}} +As in RowFixture, the order of the rows is unimportant. As shown below the rows will be matched and found regardless of their order. +|!-fitnesse.fixtures.PrimeFactorsFixture-!|1000| +|factor| +|2| +|5| +|2| +|5| +|5| +|2| + +As in RowFixture, and as shown below, any cells that are missing, or extra will be marked in red. +|!-fitnesse.fixtures.PrimeFactorsFixture-!|63| +|factor| +|7| +|3| +|5| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/properties.xml new file mode 100644 index 0000000000..a80fb55089 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135111 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordCipher/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordCipher/content.txt new file mode 100644 index 0000000000..be89b67eaa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordCipher/content.txt @@ -0,0 +1,9 @@ +A class used to encrypt password that will be written to a PasswordFile. Here is the interface. +{{{ +package fitnesse.authentication; + +public interface PasswordCipher +{ + public String encrypt(String password) throws Exception; +} +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordCipher/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordCipher/properties.xml new file mode 100644 index 0000000000..6279719663 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordCipher/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113824 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordFile/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordFile/content.txt new file mode 100644 index 0000000000..a0c58ad30a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordFile/content.txt @@ -0,0 +1,25 @@ +When starting FitNesse you may specify a PasswordFile by using the ''-a'' command line argument. A PasswordFile consists of one username and password per line in the form of '''username:password'''. + +!3 Human Readable Passwords +This simple way to create a password file is to list each username:password pair as plain text in the PasswordFile. However this is not very secure in that anyone who is able to read the PasswordFile will have access to everyones password. Here's an example: +{{{Leonardo:katana +Donatello:bo +Rafael:sai +Michaelangelo:nunchaku}}} +4 users are defined here. Leonardo who's password is Katana, Donatello who's password is bo, Rafael who's password is sai, and Michaelangelo who's password is nunchaka. + +!3 Hashed Passwords +A password hashing program, similar to unix's '''passwd''' command, is provided with FitNesse. The Password program has the follwoing usage: +{{{Usage: java fitnesse.authentication.Password [-f ] [-c ] + -f {passwords.txt} + -c {fitnesse.authentication.HashingCipher} }}} +By using the Password program with default setting and using the same usernames and passwords as above, the file ''passwords.txt'' will be generated with the following content: +{{{!fitnesse.authentication.HashingCipher +Leonardo:VEN4CfBvGCSafZDZNIKh +Donatello:VvkqQdgBBfCCZHzBUo6J +Michaelangelo:VBZ1TiB7HMptQsz3d3do +Rafael:YHVFNHr1fHaIGkLHMTSP}}} +You can see that the passwords have been hashed and are not humanly readable. You may also notice a new line. +!-!fitnesse.authentication.HashingCipher-! +This should be left as is in the file. It tells the program with PasswordCipher to use when hashing the passwords. You may create your own PasswordCipher by implementing the ''!-fitnesse.authentication.PasswordCipher-!'' interface and use it for creating password files using the -c command line argument. + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordFile/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordFile/properties.xml new file mode 100644 index 0000000000..a80fb55089 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasswordFile/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135111 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/content.txt new file mode 100644 index 0000000000..104d335c4b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/content.txt @@ -0,0 +1,10 @@ +There are now 2 buttons on every edit window that have to do with spreadsheets like Excel. The first '''Spreadsheet to FitNesse''' will convert copied spreadsheep content in to FitNesse tables. Unlike the previous verion of this button, you must paste the spreadsheet content into the edit window and then click. + +The second button.'''FitNesse to Spreadsheet''' is new and just as useful. When clicked it will convert all the tables in the edit window into a format that can be copied and pasted into a spreadsheet. + +This new way of handling spreadsheet editing is better for several reasons: + 1 It works in all major browsers; not just IE. + 2 You no longer need to maintain two sets of tests; one in FitNesse and one in Excel. Just keep the tests in FitNesse and when you need to edit them in Excel, just click '''FitNesse to Spreadsheet''' and copy them over. + +!c !3 Thanks go out to Alain Bienvenue for this contribution. + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/properties.xml new file mode 100644 index 0000000000..403307dac9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135112 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollExample/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollExample/content.txt new file mode 100644 index 0000000000..b7c178694f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollExample/content.txt @@ -0,0 +1,12 @@ +Imagine that we are writing a payroll system. This system has a number of functions. + + * We can add employees to the payroll database. + * We can change existing employees. + * We can request that paychecks be created for a given payday. + +Paychecks are output to a file in a simple text format. + +We'd like to test this system. Here are a few acceptance tests to think about: + +|PayrollTests.PayrollChequePrintingTest|''This test checks that paychecks for a few employees are printed correctly.''| +|PayrollTests.ChangeBetweenTwoPaydays|''This test adds some employees, pays them, then adds one more and changes an existing on. then pays again and checks to make sure the paychecks are correct.''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollExample/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollExample/properties.xml new file mode 100644 index 0000000000..67c0954194 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollExample/properties.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/content.txt new file mode 100644 index 0000000000..2bbe7e4bac --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/content.txt @@ -0,0 +1,49 @@ +!c !1 Change an employee between two paydays + +!c (''To see the results see: http://files/PayrollTestResults/PayrollTestTwoResults.html''.) +---- +First we add two employees. + +|Employees| +|id|name|address|salary| +|1400|June Languid|10 Adamant St; Laurel, MD 20707|1005| +|1401|Kelp Holland|12B Baker St; Cottonmouth, IL 60066|2000| + +Then we pay them. + +|Pay Day| +|pay date|check number| +|1/31/2001|3000| + +Make sure their paychecks are OK. + +|Paycheck Inspector| +|id|amount|name|number| +|1400|1005||| +|1401|2000||| + +Add a new employee. + +|Employees| +|id|name|address|salary| +|1500|Jane Blow|1 Sixth St; Ratus, IA 45250|1500.00| + +Change an existing employee. + +|Change Employees| +|id|name|address|salary| +|1400|June Bride|10 Adamant St; Laurel, MD 20707|1005.00| + +Pay them again. + +|Pay Day| +|pay date|check number| +|2/28/2001|4000| + +Make sure the paychecks are still being generated properly. + +|Paycheck Inspector| +|id|amount|name|number|date| +|1400|1005|June Bride||| +|1401|2000|Kelp Holland||| +|1500|1500|Jane Blow||| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/properties.xml new file mode 100644 index 0000000000..bf08730dd5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210000 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/content.txt new file mode 100644 index 0000000000..60b734aab8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/content.txt @@ -0,0 +1,34 @@ +!1 !c Simple Acceptance Test for Social Security +!2 We want to test that social securithy deductions are being made from the paycheck. +Social Security is 5% up to $80,000 +---- +|!-payrollTest.FicaValues-!| +|rate|limit| +|0.05|80000| + +Add a few employees. + +|payrollTest.Employees| +|id|name|address|salary|valid?| +|1|Jeff Languid|10 Adamant St; Laurel, MD 20707|1005.00|true| +|2|Kelp Holland|12B Baker St; Cottonmouth, IL 60066|2000.00|true| + +Next we pay them. + +|!-payrollTest.PayDay-!| +|payDate|checkNumber|valid?| +|1/31/2001|1000|true| + +We make sure their paychecks are correct. The blank cells will be filled in by the !-PaycheckInspector-!ß fixture. The cells with data in them already will be checked. + +|!-payrollTest.PaycheckInspector-!| +|id|amount|fica|number|name|date| +|1|954.75|50.25|||| +|2|1900|100|||| + +Finally we make sure that the output contained two, and only two paychecks, and that they had the right check numbers. + +|!-payrollTest.PaycheckInspector-!| +|number| +|1000| +|1001| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/properties.xml new file mode 100644 index 0000000000..09ff6879ac --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327114131 + + + 1238172091237 + -4164052427749097466 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/content.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/properties.xml new file mode 100644 index 0000000000..bf08730dd5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210000 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/content.txt new file mode 100644 index 0000000000..88de83a2d9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/content.txt @@ -0,0 +1,25 @@ +!1 Payroll Cheque Printing + +The system will automatically print payroll cheques: + * one cheque per employee, with employee's name, address and salary on the cheque + * using the payroll date + * the cheque numbers will be unique + * starting from the next available cheque number in ascending order + * in the alphabetic order based on employee name + +!* Payroll context +!|Payroll date|1/31/2001| + +!|Next available cheque number|1000| + +!|Employees in the system | +|name |address |salary | +|Jeff Languid|10 Adamant St; Laurel, MD 20707 |1005.00| +|Kelp Holland|12B Baker St; Cottonmouth, IL 60066|2000.00| + +*! + +!|All cheques printed in the payroll run | +|cheque number|cheque date|payee |address |amount | +|1000 |1/31/2001 |Jeff Languid|10 Adamant St; Laurel, MD 20707 |1005.00| +|1001 |1/31/2001 |Kelp Holland|12B Baker St; Cottonmouth, IL 60066|2000.00| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/properties.xml new file mode 100644 index 0000000000..b32407ba48 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/properties.xml @@ -0,0 +1,8 @@ + + + + + + 1238172027403 + 3572423500400566544 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/content.txt new file mode 100644 index 0000000000..8c200d418f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/content.txt @@ -0,0 +1,2 @@ +|Import| +|eg.payroll| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/properties.xml new file mode 100644 index 0000000000..35c3133f5a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210001 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/TearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/TearDown/content.txt new file mode 100644 index 0000000000..e6ca02f149 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/TearDown/content.txt @@ -0,0 +1,3 @@ +Then we delete the test database so that other tests won't be confused by our test data. (This table is in the + + + 20090327114215 + + + 1238172135594 + 5587550980626837311 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/content.txt new file mode 100644 index 0000000000..ca20928ed0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/content.txt @@ -0,0 +1,20 @@ +Imagine that we are writing a payroll system. This system has a number of functions. + + * We can add employees to the payroll database. + * We can change existing employees. + * We can request that paychecks be created for a given payday. + +Paychecks are output to a file in a simple text format. + +We'd like to test this system. Here are a few acceptance tests to think about: + +|>PayrollChequePrintingTest|''This test checks that paychecks for a few employees are printed correctly.''| +|^ChangeBetweenTwoPaydays|''This test adds some employees, pays them, then adds one more and changes an existing on. then pays again and checks to make sure the paychecks are correct.''| + +---- +^SetUp + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/properties.xml new file mode 100644 index 0000000000..67c0954194 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PayrollTests/properties.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PlainTextTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PlainTextTable/content.txt new file mode 100644 index 0000000000..c1b80f1250 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PlainTextTable/content.txt @@ -0,0 +1,66 @@ +Tables can be created very easily from plain text. + +'''Markup Text''' +{{{![ +simple plain +text pasted +from somewhere +]!}}}---- +'''Displays as:''' +![ +simple plain +text pasted +from somewhere +]! +---- +These are ''literalized'' tables, so most wiki markup does not work inside them. + +You can create cells by declaring a delimiter as the first character after the '''['''. Only punctuation characters will work.: +{{{![: +Name:Bob +Address:Here +Street:Cranbrook:Zip:60048 +]!}}} +'''Displays as:''' +![: +Name:Bob +Address:Here +Street:Cranbrook:Zip:60048 +]! +---- +If you want to hide the first row of the table, you can put it right after the delimiter following a space. The first row is still there, it's just hidden. +{{{![: Location +Name:Bob +Address:Here +Street:Cranbrook:Zip:60048 +]!}}} +'''Displays as:''' +![: Location +Name:Bob +Address:Here +Street:Cranbrook:Zip:60048 +]! +---- +If you want to hide the first row but don't want a delimiter, you still need the space right after the '''['''. +---- + +Example: +{{{![ BDD:JukeBoxDriver +Given a jukebox with price set to $1.00 +When a customer deposits $2.00 +And presses B5 +And presses C21 +Then Stairway to Heaven will play. +And Comforably Numb will play. +]!}}} +'''Displays as:''' +![ BDD:JukeBoxDriver +Given a jukebox with price set to $1.00 +When a customer deposits $2.00 +And presses B5 +And presses C21 +Then Stairway to Heaven will play. +And Comforably Numb will play. +]! + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PlainTextTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PlainTextTable/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PlainTextTable/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PluginUsage/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PluginUsage/content.txt new file mode 100644 index 0000000000..50c70fb972 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PluginUsage/content.txt @@ -0,0 +1,49 @@ +Various plugins are supported by FitNesse. + +!3 Overview +Below are a list of customizations you can make via this plugin architecture. Each plugin will require an entry in the ''plugins.properties'' file. This should be located in the working directory of FitNesse. If the file does not exist FitNesse will run normally. To enable a plugin, create this file, and add the specified entries. All plugins will require complied Java code so make sure that the classpath contains an entry to locate your plugins. + +!3 Wiki Page +''required property:'' '''!-WikiPage-! = ''' +''motivation:'' By default, wiki pages are stored as files on a file system (using the !-FileSystemWikiPage-! class). Providing a custom wiki page plugin allows pages to be stored using other means such as a database. Alternatively, !-FileSystemWikiPage-! can be extended to provide custom behavior when pages are create, saved, deleted, etc. + +The class specified must implement the ''fitnesse.wiki.!-WikiPage-!'' interface. It must provide a public constructor of the form: +''public !-MyWikiPage-!(String rootPath, String rootPageName, !-ComponentFactory-! componentFactory)'' +The rootPath parameter is the path to the root page (by default, "."). The rootPageName parameter is the name of the root wiki page (by default, "!-FitNesseRoot-!"). The !-ComponentFactory-! parameter can be used to locate other loaded components and properties entries in plugins.properties. + +!3 Html Page Factory +''required property:'' '''!-HtmlPageFactory-! = ''' +''motivation:'' Full customization of look and feel. + +The class specified must extend the ''fitnesse.html.!-HtmlPageFactory-!'' class and it must also provide a constructor that accept a Properties object. The custom !-HtmlPageFactory-! will over ride the newPage() method to return a derivative of ''fitnesse.html.!-HtmlPage-!''. The custom !-HtmlPage-! class should make use of any of the public !-HtmlTag-! member variables. + +!3 Responders +''required property:'' '''!-Responders-! = [,]''' +''motivation:'' Allows functional customization. With this plugin you can customize the way FitNesse responds to HTTP requests. + +The property provided should be a comma separated list of key:value pairs, where value is the name of a class that implements ''fitnesse.Responder''. The key is used in the URL to designate which responder to invoke. An example responder plugin might be an !-RssResponder-! that would generate RSS feeds for wiki page updates. To do this you would first create the !-RssResponder-! to gerenate the RSS. Then add the plugin property !style_code[''!-Responders=rss:your.package.RssResponder-!'']. Then to invoke it you would use a URL like !style_code(''!-http://fitnesse.org/RecentChanges?responder=rss-!'') to get a feed on all the changes made to the .RecentChanges page. + +!3 Authenticator +''required property:'' '''!-Authenticator-! = ''' +''motivation:'' Custom security scheme. +The class provided must extend the fitnesse.authentication.Authenticator class. The class will be instantiated and asked ''isAuthenticated(String username, String password)'' when ever authentication is required. See SecurityDescription for more information on security. + +!3 !-WikiWidgets-! +''required property:'' '''!-WikiWidgets-! = [,''' +''motivation:'' Restrict the content that is saved on wiki pages. (Damn spammers!) + +The classes supplied must extend ''!-fitnesse.responders.editing.ContentFilter-!''. !-ContentFilter-! is an interface that declares one method: '''!-boolean isContentAcceptable(String content, String pageName)-!'''. When ever user attempts to save a page, ''!-isContentAcceptable()-!'' is invoked and the content is saved only if ''true'' is returned. + +!3 !-Plugins-! +''required property:'' '''!-Plugins-! = [,]''' +''motivation:'' Register multiple Responders, !-WikiWidgets-!, and !-WikiPage-! components in a single Java class, instead of multiple entries in plugins.properties. + +Plugins classes can provide one or more of the following methods to register components: + * '''registerResponders(!-ResponderFactory-! responderFactory)''' - register responders using ''!-ResponderFactory.addResponder(String key, Class responderClass)-!'' + * '''registerWikiWidgets(!-WidgetBuilder-! widgetBuilder)''' - register wiki widgets using ''!-WidgetBuilder.addWidgetClass(Class widgetClass)-!'' + * '''registerWikiPage(!-WikiPageFactory-! wikiPageFactory)''' - override the default wiki page implementation using ''!-WikiPageFactory.setWikiPageClass(Class wikiPageClass)-!'' diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/PluginUsage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PluginUsage/properties.xml new file mode 100644 index 0000000000..579f06a45b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/PluginUsage/properties.xml @@ -0,0 +1,8 @@ + + + + + + 1238527780309 + -4188313721410542901 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/content.txt new file mode 100644 index 0000000000..381e73ba71 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/content.txt @@ -0,0 +1,33 @@ +!1 How to Kill a Software Project +There are many ways to kill a software project, but this is one of the most common. If you have been in software development for awhile, you may have seen the following scenario before: +!3 A Project Launches + * With the world's best intentions, a talented development team launches a project, full of gusto and high hopes. + * They articulate their requirements for the system to each other using a natural language such as English, in formal or informal documents. Included are some diagrams, charts, user interface mockups and screenshots, and/or other artifacts. + * Design and programming take place. + * Weeks and months go by. + * Some black-box functional testing takes place. + * Wait a minute. Something is wrong here... +!3 Problems! +At some point, usually late in the project, the team discovers that among other problems, they are finding one or more of the following problems with the features being delivered: + * They are '''not''' exactly what the customers/analysts/product managers think they '''asked for'''. + * They are '''not''' exactly what those folks '''wanted or needed'''. + * They are '''not useable''' by the system's eventual users. + * Subsystems '''cannot be integrated''' with one another, because their interfaces are incompatible. + * There is increasing dissention and mutual recrimination between team members about these issues. ("I did it the way you told me to!" "No you didn't! You never do!") People are getting angrier; morale is on the way down. +Management steps in and takes action: + * Emergency meetings are scheduled. Even longer than normal, these affairs are particularly acrimonious. + * Everybody works longer and longer hours. We must save the deadline and the system! +Despite heroic efforts, problems are not resolved as well as were hoped. The deadline and system remain under threat. + +And so on. What went wrong? How did we get in this boat together? +!2 What Went Wrong +Many of these problems boil down to the following: + * Natural languages are necessary to specify requirements, but '''they are not sufficient'''. The team misinterpreted the natural language requirements descriptions (despite all the charts, UI mockups, etc). + * Throughout the project, the team received '''too little feedback''' about features being built. + * The team did not begin receiving feature feedback '''early enough'''. + * Throughout the project, the team received feature feedback '''too infrequently'''. + * Post-facto, manual, GUI-based functional testing (despite its enormous costs) does a lousy job of exercising all the paths through a system's business logic. It's easy for such testing to miss parts of the system. So the team got poor feedback about whether all the right features were being delivered as required. + * The combination of natural language requirements descriptions and executable AcceptanceTests is '''necessary and sufficient''' to describe requirements '''completely, precisely, and deterministically'''. + +!2 With FitNesse AcceptanceTests, You Can Avoid These Problems +[[Check it out!][AcceptanceTests]] diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/properties.xml new file mode 100644 index 0000000000..d8da37fa38 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135117 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/content.txt new file mode 100644 index 0000000000..f02a7f6596 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/content.txt @@ -0,0 +1,287 @@ +!*****< HIDDEN! +###### TEMPLATE +#!anchor ? +#|${HDR} ? ${HDRend}| +#| ? |${CODE} ? ${CODEend}| + +!define TopFONT {!--!} +!define FONTend {!--!} +!define TopOfPAGE (${TopFONT}${SPC}${SPC}${SPC}${SPC}${SPC}${SPC}${SPC}${SPC}[[${LPAREN}to top${RPAREN}][#TopOfPAGE]]${FONTend}) + +!define FitNESSE {!-FitNesse-!} +|!define OPT {''[''} |!define OPTend {'']''} |!define OR {''!- |-!''} | +|!define DOT {'''.'''} |!define LT {'''<'''} |!define GT {'''>'''} | +|!define BAR {'''!- |-!'''} |!define LBRACE ('''{''')|!define RBRACE ('''}''')| +|!define DIVend {!--!} |!define LPAREN {'''('''}|!define RPAREN {''')'''} | +|!define BANG {'''!-!-!'''} |!define SPC {!- -!}|!define NL {!-
    -!} | +|!define TEXT {''text''} | |!define SLASH {'''/'''} |!define NUL {} | +|!define PageNAME {''!-PageName-!''} |!define PagePATH {''!-PagePath-!''} | +|!define LabelNAME {''label-name''} |!define AnyPagePATH {''!-AnyPagePath-!''} | +|!define CODE {!--!} |!define CODEend (${FONTend}) | + +!define HDR {!-
    -!} +!define HDRend (${TopOfPAGE}${DIVend}) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define TOC (|${HDR} Sections ${DIVend}| +|!c '''[[ ${FitNESSE} Command Line ][#FitNesseCommandLINE]] ''' | +|!c '''[[ Character Formatting ][#CharacterFORMATTING]] ''' | +|!c '''[[ Line & Block Formatting ][#LineBlockFORMATTING]] ''' | +|!c '''[[ Links & References ][#LinksAndREFERENCES]] ''' | +|!c '''[[ Includes & Informational ][#IncludesINFORMATIONAL]] '''| +|!c '''[[ Variable Usage ][#VARIABLES]] ''' | +|!c '''[[ Global Variables ][#GlobalVARIABLES]] ''' | +|!c '''[[ Global Properties ][#GlobalPROPERTIES]] ''' | +|!c '''[[ Testable Tables ][#TestTABLES]] ''' | +|!c '''[[ Wiki Page Actions ][#FitNesseACTIONS]] ''' | +) +!define GLOSSARY (|${HDR} Glossary ${DIVend}| +|${PagePATH} |${CODE} ${PageNAME}${DOT}${OPT}${PageNAME}${OPTend} ${CODEend} | +|${AnyPagePATH}|${CODE} ${OPT}${LT}${OR}${DOT}${OR}${GT}${OPTend}${PagePATH} ${CODEend} | +|Symbolic Link |A locally-defined alias to any accessible page.${NL}Symbolic links are created by clicking ${BUTTON}Properties${BUTTONend}${NL}and entering information in the bottom section${NL}titled "Symbolic Links".| +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define BUTTON {!- -!} +!define BUTTONend {!- -!} +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define FitNesseOptCLASSPATH ('''-cp fitnesse.jar'''${OPT}''';'''${NUL}''other.jar.or.path''${OPTend}...) +!define FitNesseOptEXPIRE ('''-e''' ''days'') +!define FitNesseOptOMIT ('''-o''') +!define FitNesseOptPORT ('''-p''' ''port#'') +!define FitNesseOptROOT ('''-r''' ''N${NUL}ameOfRootPage'') +!define FitNesseOptDIR ('''-d''' ''/path/to/fitnesse/root'') +!define FitNesseOptLOG ('''-l''' ''/log/file/path/and/name'') +!define FitNesseOptOneAUTH (''username''${NUL}''':'''${NUL}''password'') +!define FitNesseOptFileAUTH (''/auth/file/path/and/name'') +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define HorizontalLINES (|${CODE}''over-text''${NUL}'''!------!'''${NUL}''under-text''${CODEend}|thinnest| +|${CODE}''over-text''${NUL}'''!-------!'''${NUL}''under-text''${CODEend} |safest - no conflict with workflow phase separators| +|${CODE}''over-text''${NUL}'''!-----------!'''${NUL}''under-text''${CODEend}|thicker | +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define HEADINGS (${BANG}'''1''' ''largest heading text'' +${BANG}'''2''' ''middle heading text'' +${BANG}'''3''' ''smaller heading text'' +and so on up to &bang;6 +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define CollapsibleEXPANDED (${BANG}'''*''' ${OPT}''title''${OPTend} +${SPC}${SPC}'' multi-line wiki text '' +${SPC}${SPC}'' N.B.: Multiple asterisks are allowed, e.g.,'' ${BANG}'''****''' ${TEXT} +'''*'''${BANG} +) +!define CollapsibleCOLLAPSED (${BANG}'''*'''${GT} ${OPT}''title''${OPTend} +${SPC}${SPC}'' multi-line wiki text '' +${SPC}${SPC}'' N.B.: Multiple asterisks are allowed, e.g.,'' '''${BANG}****'''${GT} ${TEXT} +'''*'''${BANG} +) +!define CollapsibleINVISIBLE (${BANG}'''*'''${LT} ${OPT}''title''${OPTend} +${SPC}${SPC}'' multi-line wiki text '' +${SPC}${SPC}'' N.B.: Multiple asterisks are allowed, e.g.,'' ${BANG}'''****'''${LT} ${TEXT} +'''*'''${BANG} +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define PageLINKS (|${CODE} ${DOT}R${NUL}ootPage${OPT}${DOT}C${NUL}hildPage${OPTend} ${CODEend}| from root | +|${CODE} S${NUL}ameLevelPage${OPT}${DOT}C${NUL}hildPage${OPTend} ${CODEend}|sibling | +|${CODE} ${GT}C${NUL}hildPage${OPT}${DOT}C${NUL}hildPage${OPTend} ${CODEend}|child or symbolic| +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define CollapSIBLE (|${CODE} ${CollapsibleEXPANDED} ${CODEend}| expanded | | +|${CODE} ${CollapsibleCOLLAPSED} ${CODEend}|collapsed| | +|${CODE} ${CollapsibleINVISIBLE} ${CODEend}|invisible|''useful for hidding define's, etc.''| +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define HASH {'''!-#-!'''} +!define LSQUARE {'''['''} +!define RSQUARE {''']'''} + +!define JumpTO ( +|${CODE} ${TEXT} ${HASH}${LabelNAME} ${TEXT} ${CODEend} |in-line | +|${CODE} ${DOT}${HASH}${LabelNAME} ${CODEend} |left-justified| +|${CODE} ${LSQUARE}${LSQUARE}${TEXT}${RSQUARE}${LSQUARE}${HASH}${LabelNAME}${RSQUARE}${RSQUARE} ${CODEend}|in an alias | +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define ExternalLINKS (|${CODE} '''http:'''${SLASH}${SLASH}''url-path'' ${NL} ${CODEend}| Web | +|${CODE} '''http:'''${SLASH}${SLASH}'''files'''${SLASH}''localPath'' ${CODEend} |Local | +|${CODE} ${LSQUARE}${LSQUARE}${TEXT}${RSQUARE}${LSQUARE}/files'''${SLASH}''localPath''${NUL}${RSQUARE}${RSQUARE} ${CODEend}|Alias | +|${CODE} ${LSQUARE}${LSQUARE}${TEXT}${RSQUARE}${LSQUARE}${AnyPagePATH}${HASH}${LabelNAME}${RSQUARE}${RSQUARE} ${CODEend} |Alias | +|${CODE} ${TEXT}'''@'''${TEXT}${DOT}${TEXT} ${CODEend} |mailto| +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define IncludePAGE (|${CODE} ${BANG}'''include''' ${AnyPagePATH} ${CODEend}| expanded border | +|${CODE} ${BANG}'''include -c''' ${AnyPagePATH} ${CODEend} |collapsed border | +|${CODE} ${BANG}'''include -seamless''' ${AnyPagePATH} ${CODEend} |no border | +|${CODE} ${BANG}'''include -setup''' ${AnyPagePATH} ${CODEend} |appears like S${NUL}etUp | +|${CODE} ${BANG}'''include -teardown''' ${AnyPagePATH} ${CODEend} |appears like T${NUL}earDown| +|${CODE} ${BAR}${SPC}${BANG}'''include ''' ${AnyPagePATH}${SPC}${BAR} ${CODEend}|in a table cell | +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define PictureINSERT (|${CODE} ${BANG}'''img''' ''url-to-image-file'' ${CODEend}| in-line | +|${CODE} ${BANG}'''img-l''' ''url-to-image-file'' ${CODEend} |image left-justified, text wraps on right | +|${CODE} ${BANG}'''img-r''' ''url-to-image-file'' ${CODEend} |image right-justified, text wraps on the left| +|${CODE} '''[['''${BANG}'''img'''${OPT}'''-l'''${OR}'''-r'''${OPTend} ''url-to-image-file''${NUL}''']['''${NUL}''some-link''${NUL}''']]''' ${CODEend}|as a clickable link | +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define FixtureTABLE (${BANG}${BAR} ''fixture specification'' ${BAR} +${OPT}${BAR} ''optional table row'' ${BAR}${OPT} ''optional 2nd column'' ${BAR}${OPTend}'''...'''${OPTend} +${OPT}${BAR} ''optional table row'' ${BAR}${OPT} ''optional 2nd column'' ${BAR}${OPTend}'''...'''${OPTend} +${SPC}${SPC}${SPC}${SPC}${SPC}${SPC}${SPC}''':''' +) +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +!define SearchForFIXTURE (G${NUL}raceFullName${NL}'''fit.'''G${NUL}raceFullName${NL}G${NUL}raceFullName'''Fixture'''${NL}'''fit.'''G${NUL}raceFullName'''Fixture''') + +!define SearchForMETHOD (graceFullMethod${LPAREN}${RPAREN}${NL}'''get'''G${NUL}raceFullMethod${LPAREN}${RPAREN}${NL}'''set'''G${NUL}raceFullMethod${LPAREN}${RPAREN} ${LPAREN}if setter context${RPAREN}) + +!define SearchForARG1 (methodName${LPAREN}''p1''${RPAREN}${NL}'''get'''M${NUL}ethodName(''p1''${RPAREN}${NL} '''set'''M${NUL}ethodName(''p1''${RPAREN}) + +!define SearchForARG1TOO (methodNameToo${LPAREN}''p1''${RPAREN}${NL}'''get'''M${NUL}ethodNameToo${LPAREN}''p1''${RPAREN}${NL}'''set'''M${NUL}ethodNameToo${LPAREN}''p1''${RPAREN}) + +!define SearchForARG2 (methodName${LPAREN}''p1'',''p2''${RPAREN}${NL}'''get'''M${NUL}ethodName${LPAREN}''p1'',''p2''${RPAREN}${NL}'''set'''M${NUL}ethodName${LPAREN}''p1'',''p2''${RPAREN}) + +!define SearchForARG2TOO (methodNameToo${LPAREN}''p1'',''p2''${RPAREN}${NL}'''get'''M${NUL}ethodNameToo${LPAREN}''p1'',''p2''${RPAREN}${NL}'''set'''M${NUL}ethodNameToo${LPAREN}''p1'',''p2''${RPAREN}) + +!define FixtureNAMING (|!note The cells below are on one line regardless of word-wrapping | +|'''table spec''' |'''Searches for:'''| +|${CODE} ${BANG}${BAR} Grace Full Name ${BAR} ${CODEend} |${SearchForFIXTURE}| +|${CODE} ${BANG}${BAR} grace full method ${BAR} ${CODEend} |${SearchForMETHOD} | +|${CODE} ${BANG}${BAR} method name ${BAR}''p1''${BAR} ${CODEend} |${SearchForARG1} | +|${CODE} ${BANG}${BAR} method name ${BAR}''p1''${BAR} too ${BAR} ${CODEend} |${SearchForARG1TOO}| +|${CODE} ${BANG}${BAR} method name ${BAR}''p1''${BAR} also ${BAR}''p2''${BAR} ${CODEend} |${SearchForARG2} | +|${CODE} ${BANG}${BAR} method name ${BAR}''p1''${BAR}''' also ${BAR}''p2''${BAR} too ${BAR} ${CODEend}|${SearchForARG2TOO}| +) +*! +#******************************************************************************************* +#******************************************************************************************* +#******************************************************************************************* +!3 ${FitNESSE} Cheat Sheet +!anchor TopOfPAGE +|${TOC}|${GLOSSARY}| +#------------------------------------------------------------------------------------------- +!anchor FitNesseCommandLINE +-----!note See ''run.sh'' and ''run.bat'' for examples of default start-up scripts. +|${HDR} !-FitNesse-! Command Line and Options ${DIVend} | +|${CODE} ${OPT}''path/to/java/''${OPTend}'''java''' ${FitNesseOptCLASSPATH} '''fitnesse.${FitNESSE}''' ${OPT}${FitNesseOptOMIT}${OPTend} ${OPT}${FitNesseOptPORT}${OPTend} ${OPT}${FitNesseOptDIR}${OPTend} ${OPT}${FitNesseOptROOT}${OPTend} ${OPT}${FitNesseOptEXPIRE}${OPTend} ${OPT}${FitNesseOptLOG}${OPTend} ${OPT}'''-a''' ''{''${FitNesseOptOneAUTH} ${OR} ${FitNesseOptFileAUTH}''}''${OPTend} ${OPT}''other arguments''${OPTend} ${CODEend}| +|''' ''option'' ''' |''' ''default'' ''' |''' ''description'' ''' | +|${CODE}'''-a''' ${FitNesseOptOneAUTH}${CODEend} |${CODE} ''no auth'' ${CODEend} |Enforces access for one user | +|${CODE}'''-a''' ${FitNesseOptFileAUTH}${CODEend} |${CODE} ''no auth'' ${CODEend} |Enforces access for a file of users with encrypted passwords | +|${CODE}${FitNesseOptDIR}${CODEend} |${CODE} ${DOT} ${CODEend} |Path to the fitnesse ''wiki'' home where ${FitNESSE}Root or ''-r name'' resides | +|${CODE}${FitNesseOptEXPIRE}${CODEend} |${CODE} '''14''' ${CODEend} |Number of days to retain older versions (.zip files) | +|${CODE}${FitNesseOptLOG}${CODEend} |${CODE} ''off'' ${CODEend} |Where to put and what to call the run log | +|${CODE}${FitNesseOptOMIT}${CODEend} |${CODE} ''update'' ${CODEend} |Prevents (omits) updating from fitnesse.org | +|${CODE}${FitNesseOptPORT}${CODEend} |${CODE} '''80''' ${CODEend} |Port for ${FitNESSE} to listen on | +|${CODE}${FitNesseOptROOT}${CODEend} |${CODE} '''${FitNESSE}Root''' ${CODEend} |Name of root folder in the fitnesse ''wiki'' home or ''-d'' path | +#------------------------------------------------------------------------------------------- +!anchor FitNesseACTIONS +|${HDR} !-FitNesse-! Actions ${HDRend} | +|'''Edit''' this page |${CODE} ''url''${NUL}'''?edit''' ${CODEend} | +|'''Create''' a new page directly |${CODE}''current-url''${NUL}'''.'''!-NewPageName-!${NUL}${CODEend}${NL}'''or''' ${NL} ${CODE}''current-url''${NUL}'''.'''!-NewPageName-!${NUL}'''?edit'''${CODEend}| +|'''Test''' this page |${CODE} ''url''${NUL}'''?test''' ${CODEend} | +|'''Suite''' test this page |${CODE} ''url''${NUL}'''?suite''' ${CODEend} | +|Set '''properties''' of this page |${CODE} ''url''${NUL}'''?properties''' ${CODEend} | +|See '''versions''' of this page |${CODE} ''url''${NUL}'''?versions''' ${CODEend} | +|'''Refactor''' this page |${CODE} ''url''${NUL}'''?refactor''' ${CODEend} | +|'''Search''' pages from here |${CODE} ''url''${NUL}'''?searchForm''' ${CODEend} | +|'''Where''' is this page referenced? |${CODE} ''url''${NUL}'''?whereUsed''' ${CODEend} | +|'''Debug''' this test page |${CODE} ''url''${NUL}'''?debug''' ${CODEend} | +|'''Suite''' test this page with a suite filter "passing"|${CODE} ''url''${NUL}'''?responder=suite&suiteFilter=passing''' ${CODEend} | +#------------------------------------------------------------------------------------------- +!anchor CharacterFORMATTING +|${HDR} Character Formatting ${HDRend} | +|Comment |${CODE} '''!-#-!'''${TEXT} ${CODEend} |''Can also be used to comment-out markup'' | +|Italics |${CODE} '''!-''-!'''${TEXT}'''!-''-!''' ${CODEend} | | +|Bold |${CODE} '''!-'''-!'''${TEXT}'''!-'''-!''' ${CODEend} | | +|Style |${CODE} '''!-!style_(text)-!''' ${CODEend} |The style of ''text'' will be the CSS class ''''| +|Strike-through |${CODE} '''!----!'''${TEXT}'''!----!''' ${CODEend} | | +|"As-is"/escaping|${CODE} '''!-!-!-'''${TEXT}'''-!-!-!''' ${CODEend} |''Can also be used to insert HTML tags directly'' | +|"As-is" |${CODE} '''!-!-!<'''${TEXT}'''>!-!-!''' ${CODEend} |''Will escape HTML tags so they display in plain text.'' | +|Alias Link |${CODE} '''[['''${TEXT}''']['''${AnyPagePATH}''']]''' ${CODEend}| | +#------------------------------------------------------------------------------------------- +!anchor LineBlockFORMATTING +|${HDR} Line & Block Formatting ${HDRend} | +|workflow break |${CODE} '''!------!''' ${CODEend}...separates each "phase" | +|Horizontal Line |${HorizontalLINES} | +|Note |${CODE} ${BANG}'''note''' ${TEXT} ${CODEend} | +|Headings |${CODE} ${HEADINGS} ${CODEend} | +|Centered |${CODE} ${BANG}'''c''' ${TEXT} ${CODEend} | +|Formatted "as is"|${CODE} '''!-{{{-!'''${TEXT}'''!-}}}-!''' ${CODEend}|note: causes extra line afterward| +|Collapsible |${CollapSIBLE} | +#------------------------------------------------------------------------------------------- +!anchor LinksAndREFERENCES +|${HDR} Links & References ${HDRend} | +|Page links |${PageLINKS} | +|Cross-reference &${NL}Suite Include|${CODE} ${BANG}'''see''' ${AnyPagePATH} ${CODEend} | +|Define "in-page" label |${CODE} ${BANG}'''anchor''' ${LabelNAME} ${CODEend}|a.k.a. anchor| +|Jump to "in-page" label |${JumpTO} | +|External Links |${ExternalLINKS} | +#------------------------------------------------------------------------------------------- +!anchor IncludesINFORMATIONAL +|${HDR} Includes & Informational ${HDRend} | +|Timestamp |${CODE} ${BANG}'''lastmodified''' ${CODEend} | +|Timestamp |${CODE} ${BANG}'''today''' ${CODEend} | +|Help text |${CODE} ${BANG}'''help''' ${CODEend} | +|Contents List |${CODE} ${BANG}'''contents''' ${CODEend} | +|Contents Tree |${CODE} ${BANG}'''contents -R''' ${CODEend} | +|Contents Sub-tree |${CODE} ${BANG}'''contents -R'''${OPT}''nn''${OPTend}${CODEend}| +|Contents List - Graceful |${CODE} ${BANG}'''contents -g''' ${CODEend} | +|Contents List - Properties |${CODE} ${BANG}'''contents -p''' ${CODEend} | +|Contents List - Suite Filters|${CODE} ${BANG}'''contents -f''' ${CODEend} | +|Contents List - Help Text |${CODE} ${BANG}'''contents -h''' ${CODEend} | +|Include Page |${IncludePAGE} | +|Picture Insert |${PictureINSERT} | +#------------------------------------------------------------------------------------------- +!anchor VARIABLES +|${HDR} Variables ${HDRend} | +|Variable Definition |${CODE} ${BANG}'''define''' ''name'' ${LBRACE}''value''${RBRACE} ${NL}${BANG}'''define''' ''name'' '''('''${NUL}''value''${NUL}''')'''${NL}${BANG}'''define''' ''name'' '''['''${NUL}''value''${NUL}''']''' ${CODEend}${NL}| +|Variable Usage |${CODE} '''$'''${LBRACE}''name''${RBRACE} ${CODEend} | +|Expression Evaluation|${CODE} '''!-${=-!'''${NUL}''expression''${NUL}'''!-=}-!''' ${CODEend} |''expression'' may contain variables | +#------------------------------------------------------------------------------------------- +!anchor GlobalVARIABLES +|${HDR} Global Variables ${HDRend} | +|''' NAME ''' |''' Java Default ''' |'''!-FitLibrary (Unix) Default-!''' |''' .NET Default ''' | +|${CODE} COMMAND_PATTERN ${CODEend} |!- java -cp %p %m -! |!- java -cp %p %m -! |!- %m %p -! | +|${CODE} REMOTE_DEBUG_COMMAND${CODEend}|!- REMOTE DEBUG COMMAND, or java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -cp %p %m-!|!-java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -cp %p %m-!|!-java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -cp %p %m-!| +|${CODE} PATH_SEPARATOR ${CODEend} |${SPC} : ${SPC} ''!-(system-dependent)-!'' |${SPC} : ${SPC} ''!-(system-dependent)-!'' |${SPC} !-;-! ${SPC} | +|${CODE} TEST_RUNNER ${CODEend} |!-fit.FitServer-! |!-fitlibrary.suite.FitLibraryServer-! |!-dotnet\FitServer.exe-! | +|${CODE} REMOTE_DEBUG_RUNNER ${CODEend} |!-TEST_RUNNER -! |!-same as for java-! |!-dotnet\FitServer.exe-! | + +|''' NAME ''' |''' Default ''' |''' Values ''' |''' Notes ''' | +|${CODE} TEST_SYSTEM ${CODEend} |!c fit |!c fit&bar;slim |'' Selects the test system to use for this, and descendant pages.'' | +|${CODE} SLIM_PORT ${CODEend} |!c 8085 |!c integer |'' Selects the starting port number in a range of 10 for slim.'' | +|${CODE} SLIM_HOST ${CODEend} |!c localhost |!c string |'' The name of the host on which !-SlimServer-! is running.'' | +|${CODE} SLIM_VERSION ${CODEend} |!c nil |!c string |'' The minimum Slim Protocol Version required for this page. Used to turn off slim protocol error messages.'' | +|${CODE} MANUALLY_START_TEST_RUNNER_ON_DEBUG ${CODEend}| !c false | !c true${BAR}false |'' When set to true, and a page is run in debug mode then fitnesse will not create it's own slim runner, and will instead connect to an existing runner on port ${CODE} SLIM_PORT ${CODEend}.''| +|${CODE} CLASSPATH_PROPERTY ${CODEend} |!c nil |!c ''an environment variable''|'' If not nil, loads classpath (as gathered from !path) into the named environment variable. See CustomizingTestExecution.''| +|${CODE} CM_SYSTEM ${CODEend} |!c nil |!c java class |'' Selects the class that will handle CM system events.'' | +|${CODE} COLLAPSE_SETUP ${CODEend} |!c false |!c true${BAR}false |'' Collapses all !-SetUps-! '' | +|${CODE} COLLAPSE_TEARDOWN ${CODEend} |!c false |!c true${BAR}false |'' Collapses all !-TearDowns-! '' | +|${CODE} FILTER_TOC ${CODEend} |!c false |!c true${BAR}false |'' Append suite fiters to TOC '' | +|${CODE} HELP_PREFIX_TOC ${CODEend} |!c :<''space''> |!c ''any string'' |'' Define prefix for help text suffix '' | +|${CODE} HELP_TOC ${CODEend} |!c false |!c true${BAR}false |'' Append help text to TOC '' | +|${CODE} MORE_SUFFIX_TOC ${CODEend} |!c <''space''>...|!c ''any string'' |'' Define sequence to show more TOC levels '' | +|${CODE} PROPERTY_CHARACTERS ${CODEend} |!c !- *+@>- -! |!c ''any characters'' |'' Define property icons for TOC '' | +|${CODE} PROPERTY_TOC ${CODEend} |!c false |!c true${BAR}false |'' Append property icons to TOC '' | +|${CODE} REGRACE_LINK ${CODEend} |!c false |!c true${BAR}false |'' Makes links graceful '' | +|${CODE} REGRACE_TOC ${CODEend} |!c false |!c true${BAR}false |'' Makes !contents list graceful '' | +|${CODE} RSS_PREFIX ${CODEend} |!c |!c |'' Link prefix for [[RSS Feeds][RssFeed]] '' | +|${CODE} ''PAGE_NAME'' ${CODEend} |!c |!c Read Only |'' Name of current page'' | +|${CODE} ''PAGE_PATH '' ${CODEend} |!c |!c Read Only |'' Fully qualified name of parent. '' | +|${CODE} ''RUNNING_PAGE_NAME'' ${CODEend} |!c |!c Read Only |'' Name of current top level running page'' | +|${CODE} ''RUNNING_PAGE_PATH '' ${CODEend}|!c |!c Read Only |'' Fully qualified name of the current tope level running page's parent. '' | +|${CODE} ''FITNESSE_PORT'' ${CODEend} |!c |!c Read Only |'' Port number that fitnesse is using. '' | + +!note (See the ''root'' page for overrides) + +#------------------------------------------------------------------------------------------- +!anchor GlobalPROPERTIES +|${HDR} Global Properties ${HDRend} | +|${CODE} path.separator ${CODEend}|''!-(system-dependent)-!''| +!note (See the ''root'' page for overrides) +#------------------------------------------------------------------------------------------- +!anchor TestTABLES +|${HDR} Testable Tables ${HDRend} | +|Classpath include |${CODE} ${BANG}'''path''' ''java.path.spec'' ${CODEend} | +|"Insert Fixture Table"${NL}Edit List Include|${CODE} ${BANG}'''fixture''' ''path.fixture'' ${CODEend} | +|Prevent Wikification |${CODE} ${BANG}${BAR} ''"as is" or escaped content'' ${BAR} ${CODEend}| +|Smallest Table |${CODE} ${BAR} ${TEXT} ${BAR} ${CODEend} | +|Fixture Table |${CODE} ${FixtureTABLE} ${CODEend} | +|Graceful Naming |${FixtureNAMING} | + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/properties.xml new file mode 100644 index 0000000000..ead1e931fa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1237228032275 + -5542215261053372341 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/content.txt new file mode 100644 index 0000000000..519a923441 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/content.txt @@ -0,0 +1,5 @@ +The '''Refactor''' button on each page allows you to delete or rename that page in the wiki. + + * '''Delete''' - If you delete a page, all references to that page will become dead. You'll see them with '''[?]''' following them. + * '''Rename''' - If you rename a page, all references to that page will be renamed. + * '''Move''' - If you move a page, it will be moved with all it's children. Any references to it or its children will be appropriately modified. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/properties.xml new file mode 100644 index 0000000000..f0c12724b9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/properties.xml @@ -0,0 +1,9 @@ + + + + 20081020135112 + + + 1213643693631 + 1221131539155543533 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulPackets/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulPackets/content.txt new file mode 100644 index 0000000000..25033f957a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulPackets/content.txt @@ -0,0 +1,33 @@ +If you access a page with the ?packet responder as in !style_code(http://myFitNesseHost/MyPage?packet) you will get back a JSON packet that represents the tables on that page. Only the tables will be part of the packet, any other text is ignored. The JSON packet begins with an array named !style_code(tables). Each element of that array corresponds to a table on the page. The tables use an indentation style to represent the packets. For example: + +!|Customer| +||name|Bob Someone| +||id|8402| +||addr| +|||Street|555 Witherspoon st.| +|||city|Anyville| +|||state|IL| +|||zip|60083| +||phone|555-1212| + +If you get the packet for this page by accessing http://localhost:${FITNESSE_PORT}/FitNesse.UserGuide.RestfulPackets?packet you will get the following JSON packet: +{{{ +{"tables": [ + {"Customer": + { "addr": + { "Street": "555 Witherspoon st.", + "city": "Anyville", + "state": "IL", + "zip": "60083" + }, + "id": "8402", + "name": "Bob Someone", + "phone": "555-1212" + } + } +]} +}}} + +!3 JSONP +If you'd like to use ''JSONP'' to fetch the packets. (Or any kind of script injection tecnique). You can get fitnesse to return the appropriate format by adding !style_code(&jsonp=some_function) on the end of the url. This will wrap the JSON packet in a function call that looks like this !style_code[some_function({...})] So, for example, try this link: !style_code(http://localhost:${FITNESSE_PORT}/FitNesse.UserGuide.RestfulPackets?packet&jsonp=load_me). + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulPackets/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulPackets/properties.xml new file mode 100644 index 0000000000..5452987e81 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulPackets/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1235142473765 + -2501072354251645696 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/content.txt new file mode 100644 index 0000000000..bb60a49e08 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/content.txt @@ -0,0 +1,17 @@ +{{{ +{ + "Edit": true, + "Properties": true, + "Prune": false, + "RecentChanges": true, + "Refactor": true, + "Search": true, + "Suite": false, + "Test": false, + "Versions": true, + "WhereUsed": true, + "secure-read": false, + "secure-test": false, + "secure-write": false +} +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/content.txt new file mode 100644 index 0000000000..1be966a9ca --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/content.txt @@ -0,0 +1,19 @@ +{{{ + + + + FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteMoveResponder.TestSimpleMove + + + Tue Jul 07 11:08:34 CDT 2009 + + FitNesse.SuiteAcceptanceTests.SuiteResponderTests.SuiteMoveResponder.TestSimpleMove?pageHistory&resultDate=20090707110834&format=xml + + 6 + 0 + + ... + + ... + +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/content.txt new file mode 100644 index 0000000000..8eb0b776ca --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/content.txt @@ -0,0 +1,31 @@ +The format for a suite is similar to the format for a test as shown in + SuiteAcceptanceTests + + SuiteWidgetTests.TestBrokenWikiWordLink + critical,slow + + 24 + 0 + 0 + 0 + + + 1022 + + FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.SuiteWidgetTests.TestBrokenWikiWordLink?pageHistory&resultDate=20090820&format=xml + + ... + + + 182 + 0 + 0 + 0 + + + 6234 + + +}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/content.txt new file mode 100644 index 0000000000..9edd6f164c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/content.txt @@ -0,0 +1,13 @@ +{{{ + + + FitNesse.SuiteAcceptanceTests + FitNesse.SuiteAcceptanceTests?pageHistory&format=xml + 16 + 1 + Tue Jun 23 14:49:49 CDT 2009 + Tue Jul 07 13:08:07 CDT 2009 + +... + +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/content.txt new file mode 100644 index 0000000000..e0ecbfed19 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/content.txt @@ -0,0 +1,117 @@ +!-FitNesse-! is a web application, therefore all of it's functions can be accessed by passing it URLs. The structure of !-FitNesse-! urls is very simple. + * !style_code(http://)''host''!style_code(:)''port''!style_code(/)''resource''!style_code(?)''responder''!style_code(&)''inputs'' + * The ''host'' and ''port'' specify the location of the !-FitNesse-! server. + * ''resource'' is usually the name of the !-FitNesse-! wiki page being referenced. Sometimes it refers to a path below the ''files'' section. It is not used in all urls. + * ''responder'' is the name of the operation to be performed. This is typically something like !style_code(?edit) to edit a page, or !style_code(?properties) to bring up the properties dialog. A responder corresponds roughly to a servlet. + * ''inputs'' is the list of parameters to the operation. As in all URL query strings these are name-value pairs and will be things like !style_code(&format=xml) or !style_code(&dontCreatePage). + * A wiki page can be fetched by leaving the query string blank as in !style_code(http://myHost:myPort/MyWikiPage). + * A responder can be specified by using the ''responder'' input as in: !style_code(http://myHost:myPort/MyWikiPage?responder=edit) instead of !style_code(http://myHost:myPort/MyWikiPage?edit). The former is ''proper'', but the latter has become so idiomatic that it will not be deprecated any time soon. + * The files section of the wiki can be accessed by using the word ''files'' followed by a directory path as in !style_code(http://myHost:myPort/files/images/bob.gif) + * The root page can be accessed by using the word ''root'' instead of the ''page'' as in !style_code(http://myHost:myPort/root) + +!2 Responders + +|!meta name |!meta inputs |!meta description | +|addChild | |Creates a new child page beneath the selected page | +| |name |The name of the page to be created. | +| |content |The contents of the new page. | +| |pageType |If present must be {Test, Suite, Static} and sets the page type accordingly. Otherwise page type is set based on the name of the page as usual. | +|compareHistory | |Generates a report comparing two test results. | +| |TestResult_''yyyyMMddHHmmss_rr_ww_ii_xx''.xml|One of the files to be compared. Always two there are. | +|createDir | |Create a new directory in the ''files'' section. The directory will be created below the ''resource'' | +| |dirname |The name of the directory to create | +|deletePage | |Deletes the specified page. | +| |confirmed=yes |Bypasses the confirmation screen. | +|deleteFile | |Deletes a file in the ''files'' section. The ''resource'' is the directory in which the file exists. | +| |filename |the name of the file to be deleted. | +|edit | |returns the edit screen for a wiki page. The ''save'' button invokes the ''saveData'' responder. | +| |redirectToReferer |instructs the ''edit'' responder to pass the ''redirect'' input to the ''saveData'' responder. The input is constructed from the ''Referer'' header and the ''redirectAction'' input and has the form ''referer''?''action''. | +| |redirectAction=action |see above. | +| |nonExistent |Causes the ''edit'' responder to load the edit window with default page contents and changes some message from ''edit'' to ''create'' | +|executeSearchProperties| |Returns a list of pages that match the search criteria | +| |pageType |a list of page types to include in the search {Normal, Test, Suite} or the word "Any" | +| |Suites |a comma seperated list of tags (as used by the ''suite'' responder) to include in the search | +| |Action |a list of actions !-{Edit, Versions,Properties, Refactor, WhereUsed, RecentChanges, Files, Search}-! or the word "Any" to include in the search | +| |!-ExcludeSetUp-! |Exclude setup pages from the search. | +| |!-ExcludeTearDown-! |Exclude teardown pages from the search. | +| |!-ExcludeObsolete-! |Exclude pages with the "skipped" attribute selected from the search. | +|files | |Displays a directory in the ''files'' section. The ''resource'' is the directory to be displayed. | +|getPage | |View the selected page | +| |dontCreatePage |if present, will prevent the responder from attempting to create a page if it doesn't exist. | +|import | |Imports a page hierarchy from a foreign !-FitNesse-! | +| |remoteUsername |The user name to log in as (optional) | +| |remotePassword |The password to use (optional) | +| |remoteUrl |The url to the complete pathname of the parent page to be imported. | +| |autoUpdate |If present, will cause a re-import of changed pages whenever a test is run. | +|importAndView | |imports (if necessary) and views the selected page. | +|movePage | |moves the selected page below a different parent. | +| |newLocation |The full path name of the page that will be the new parent. | +|names | |Displays a list of the pages at the current level. If no page name is supplied, then the list is all the pages at the top level. Otherwise it is the list of direct children (not grandchildren) of the supplied page. | +| |format=json |returns the list as a JSON array | +| |!-ShowChildCount-! |adds the count of children to each page name after a space. | +|packet | |Returns a json packet containing all the tables on the page. See: RestfulPackets | +| |jsonp=function |Wraps the json packet into a function call for JSONP, see: RestfulPackets | +|pageData | |Returns the raw wiki-text of the page. | +|pageHistory | |Displays the test history of the specified page. | +| |resultDate |if present the date (yyyyMMddHHmmss) of the test to show, or the word "latest". Otherwise show a list of all dates for this page. | | +| |format=xml |Returns an XML report. See: >PageHistoryXml and RestfulTests | +|properties | |Displays the properties form for the selected page. | +| |format=json |shows the properties in JSON format See >JsonProperties | +|purgeHistory | |Purges old test history files | +| |days |The number of days of history to preserve | +|raw | |returns the raw wiki-text of the selected page | +|refactor | |Displays the refactoring screen. | +|renameFile | |Renames a file in the ''files'' section. The ''resource'' is the directory that contains the file. | +| |filename |the file to be renamed. | +| |newName |the new name of the file. | +|renamePage | |Renames the selected page. | +| |newName |The new name for the page. Must be a simple wiki word without any dots. You can't use this responder to move a page! | +|rollback | |Rollback the page to the selected version. | +| |version |The version identifier of the version to rollback to. See: ''viewVersion'' | +|rss | |Returns an rss feed for the current page and all it's children. See RestfulSuiteXmlFormat | +| |debug |See test | +| |remote_debug |See test | | +| |suiteFilter |A comma separated list of tags. If present only tests that one or more of these tags will be run. | +| |excludeSuiteFilter |a comma separated list of tags. If present only test that DO NOT have any of these tags will be run. | +| |firstTest |if present, only tests whose full path names are lexigraphically greater (later in alphabetical order) will be run. This is of questionable use since tests are not guaranteed to be run in any particular order. | +| |nohistory |Do not generate test history files when running the suite. Don't use this with format=xml since xml reports depend upon history. | +| |includehtml |If format=xml then this will cause the XML to contain a 'content' tag that holds the HTML of the tested page. Beware, this can lead to OutOfMemory errors for large suites. | +|symlink | |Creates a symbolic link between pages in the same !-FitNesse-! | +| |removal |If present is the name of a symbolic link to be removed. | +| |rename |If present is the name of a symbolic link to be renamed. | +| |newname |The new name of the symbolic link being renamed. | +| |linkName |If present is the name of a new symbolic link to be added to the page named by the ''resource''. | +| |linkPath |The path that the link refers to. | +|test | |runs a test on the specified page, returns result in html | +| |format=xml |Returns results in XML. See RestfulTests | +| |debug |(Only works for Java fixtures.) Attempts to run the test in the same JVM that !-FitNesse-! is running in. Allows you to attach a debugger to your fixtures before you run the test. | | +| |remote_debug |Causes the REMOTE_DEBUG_COMMAND and REMOTE_DEBUG_RUNNER variables to be used in place of COMMAND_PATTERN and TEST_RUNNER when creating the command to execute the test. See CustomizingTestExecution for defaults| +|testHistory | |Displays the current test history below the selected page, or all history if no page is selected. | +| |format=xml |Returns an XML report of test history. See >TestHistoryXml | +|upload | |Upload a new file into the files section. The ''resource'' is the directory into which the new file will be stored. | +| |file |An object of type !style_code(fitnesse.http.UploadedFile) | +|versions | |Returns the form that shows the saved versions of the wiki page | +|viewVersion | |Shows the selected version of the wiki page. | +| |version |The version identifier. The version identifier is just the name of the zip file (without the .zip) that holds the version. The format of this file name is (generally) ''user''-''id''-''yyyyMMddHHmmss'' where user might not be present. | +|whereUsed | |Returns a list of pages that contains references (links) to the selected page | + + * nochunk -- can be added to many urls to turn off chunking. This is most useful for test and suite urls when writing programs to parse the output. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/properties.xml new file mode 100644 index 0000000000..61a6bda996 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulServices/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1234653714415 + 2484226534369622367 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulTests/content.txt new file mode 100644 index 0000000000..bf19fd51e9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulTests/content.txt @@ -0,0 +1,68 @@ +The XML result for a test comes back in the following form: +{{{ + + SuiteAcceptanceTests + + SuiteWidgetTests.TestBrokenWikiWordLink + critical,slow + + 24 + 0 + 0 + 0 + + + 1022 + + + + + + decisionTable_0 + + cell_contents + ... + + ... +
    + ... +
    + + + [decisionTable_1_0, make, decisionTable_1, SetUp] + OK
    + + decisionTable_1_0 + right + 0 + 0 + ConstructionExpectation + OK + SetUp + pass(SetUp) + + ... + + ... + + +
    +}}} + + +The 'tables' and 'instructions' elements are only for Slim tests. + * The 'tables' element encodes the results of all the test tables. There is a !style_code() for each table on the test page. Each has a set of !style_code() elements, which each have a set of !style_code() elements, which old the contents of the tested table. + * The contents of the columns are encoded with !style_code[pass(xxx)], !style_code[fail(xxx)] etc. These show what parts of the cell contents would be colored red or green + * The name of the table is encoded in the !style_code() element. This is the name that slim gives to the table, and is used to prefix instruction tags in the expectations (see below). + * The instruction data documents the slim execution process. Each instruction represents a single slim command. You see the command as it was sent to slim, the result as it returned from slim, and the evaluation of the slim table expectation. This is pretty detailed information, so here are a few things you should know. + * !style_code(instructionId) is the id of a single slim instruction. It is constructed from the table name (see above), and the instruction number within that table. So an id of decisionTable_1_3 means that the instruction is for the third instruction in the table named decision table_1. + * Scenario tables, when executed, are turned into script tables with the same number. So !style_code(scenarioTable_22) will become !style_code(scriptTable_22). The third instruction in scenario table 18 called from the 4th instruction in decision table 8 will be !style_code(decisionTable_8_4_scriptTable_18_3). + * !style_code(col,row) are the column and row of the expectation. If scenario tables are involved it's the col,row of the ultimate scenario. + * !style_code(type) is the class name of the expectation. You can pretty much work out the intent. Here are a few of the more common ones + * !style_code(!-ReturnedValueExpectation-!) - This is the one that does almost all the comparisons that you are used to. Decision tables and script tables use them a lot. + * !style_code(!-VoidReturnExpectation-!) - We use this when we call a function (like 'setX') and expect a void return. + * !style_code(!-ConstructionExpectation-!) - used when we create a fixture class. + * !style_code(expected) - This is the value that the expectation expects to be returned from slim. Often this is ignored. Only some expectations actually use it. !style_code(!-ReturnedValueExpectation-!) uses it of course. + * !style_code(actual) - This is what was actually returned by slim. You also saw this in the !style_code(slimResult) tag, but we present it here because it may have been massaged by internal processing. + * !style_code(evaluationMessage) - This is the result of the expectation. It is a message littered with !style_code[pass()] and !style_code[fail()] markers that let you see the red/green results in symbolic form. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulTests/properties.xml new file mode 100644 index 0000000000..f677bed4e6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RestfulTests/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1238693962013 + -8421131222935524094 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RootPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RootPage/content.txt new file mode 100644 index 0000000000..8dd5d43106 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RootPage/content.txt @@ -0,0 +1 @@ +To access the root of the whole !-FitNesse-! wiki use the following URL:{{{http:///root}}} You can put variable definitions, and '''!path''' directives on this page. All pages in the wiki will inherit these attributes. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RootPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RootPage/properties.xml new file mode 100644 index 0000000000..d6745d1dd7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RootPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210007 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/content.txt new file mode 100644 index 0000000000..d1aca51b74 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/content.txt @@ -0,0 +1,37 @@ +!3 A Fixture for entering rows of data. + +Sometimes, as in the BuildOperateCheck pattern, we want to add a bunch of data to a database. Or sometimes we want to call a function over and over again with different arguments. This is often done in order to configure the system for a subsequent fixture that will run tests based upon the configured data. + +We have seen examples where this was done with the help of a ''valid()'' function. + +RowEntryFixture is a better option in many cases. + + * RowEntryFixture is an abstract class. You have to derive from it. + * It derives from ColumnFixture and works just the same way it does. + * You override the ''enterRow'' function to add your data to the database. + * If you have trouble adding your data, you throw an exception loaded with a message explaining the problem. + +|Comment| +|{{{public abstract void enterRow() throws Exception;}}}|Override this function to add your row of data. Throw an exception if there are any problems.| + +Here is an example of a very simple RowEntryFixture: +{{{public class RowEntryExample extends RowEntryFixture +{ + public int v; + public void enterRow() throws Exception + { + if (v == 0) + throw new Exception("Oh, no! Zero!"); + } +} }}} +And here you can see it running. + +|!-fitnesse.fixtures.RowEntryExample-!| +|v| +|1| +|0| + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/properties.xml new file mode 100644 index 0000000000..67c0954194 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/properties.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixture/content.txt new file mode 100644 index 0000000000..9a6fcb78f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixture/content.txt @@ -0,0 +1,125 @@ +!1 Checking Query Results Using !-RowFixture-! +This style of test table is best for checking the results of queries. For the sake of discussion, let's call each of the items that you get back from a query a '''record'''. A RowFixture lets you test that you get back '''exactly the set of records''' from a query that you expect to get. + +Here is a simplistic example. Let's say that we have asked our application for the first five prime numbers. We want to make sure we got them all. + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|3| +|2| +|5| +|7| +|11| + +This test table style does not read the way that a ColumnFixture style test table does. In this case, each cell in the ''prime'' column represents a '''key''' that identifies one of the records we expect to get back (in this case, a prime number). And '''the entire set of rows of data''' represent the output we expect to get back: no more and no less than that '''exact set of records''' (though they need not be in that exact order). + +Hit the test button to run this test. OK, we got them all. For an explanation of the fixture code for this RowFixture example, see RowFixtureCode. + +!2 Missing Records +The following table shows what happens when you ask for a record that doesn't exist. ''(Note the extra 12.'') + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| +|11| +|12| + +!2 Surplus Records +And this table shows what happens when you don't ask for a record that ''is'' in the query results. ''(Note the 11 is missing.)'' + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| + +!2 Testing Fields in Returned Records +Often you want to see that you got a specific set of records back, '''and''' you want to '''test certain fields in the returned records'''. For this you use the same question-mark syntax we saw used for output columns in ColumnFixture style tables. + +For example, lets say that we have a database of employee records. We want to test that the employees were paid correctly. The ''pay?'' column in the table below specifies the exact amount we expect to get back for the pay field of each returned employee record: + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay?| +|1|1000| +|2|2000| + +!3 Incorrect Output +Here's what it would look like if the pay was not correct for the employee whose id is 2. It looks just as it does for incorrect output values in a ColumnFixture table cell: + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay?| +|1|1000| +|2|3000| + +!3 Missing or Extra Records +And regardless whether you check aspects of queried records, FitNesse shows you whether any are missing or extra: + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay()| +|1|1000| +|5|5000| + +To see the fixture code for these tables, see RowFixtureCode. + +!2 Querying Using Multiple "Keys" +Sometimes we need more than one piece of data to uniquely identify a record. + +Suppose we have records for the last three months' worth of paychecks. Each paycheck is uniquely identified by the ''employeeId'' and the ''date''. We want to make sure that the checks were generated properly. We use a RowFixture table to ask for a set of checks identified by both ''employeeId'' '''and''' ''date'': + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|1||1000| +|3/1/03|2||2002| +|4/1/03|1||1015| +|4/1/03|2||2003| + +Notice, once again, that the order of the table rows doesn't matter. For example, this table also works fine for that same query: + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|4/1/03|1||1015| +|3/1/03|1||1000| +|4/1/03|2||2003| +|3/1/03|2||2002| + +!3 Blank Fields +Notice the ''name'' field. We provided the field name, knowing that it was part of each record, but we provided no expected values in that column. As a result, FitNesse did not make this field part of the key for finding records, but merely filled in the values found for that field in each record, so we could see them. Here's what would have happened if we filled in the ''name'' column correctly for some cells, and incorrectly for another. + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|1|Bob|1000| +|4/1/03|1|Bob|1015| +|3/1/03|2|Bill|2002| +|4/1/03|2|Biff|2003| + +And here's what would happen if a row were missing or surplus. + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|1||1000| +|4/1/03|1||1015| +|3/1/03|2||2002| +|4/1/03|3||2003| + +!2 Summary + * RowFixture tables are designed for checking that you get back exactly the set of records you want from a query. + * FitNesse will cause the test to fail if the query had any '''missing''' or '''surplus''' records. + * You can also test fields in the returned records. + * If you provide a field name column, but provide no expected values for it, then FitNesse will fill in the returned values so you can see them. + +!2 Learning More +To learn about the fixture code for the above examples, see RowFixtureCode. +Also check out the other TestTableStyles. + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixture/properties.xml new file mode 100644 index 0000000000..1649ea3b4b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixture/properties.xml @@ -0,0 +1,12 @@ + + + + + 20081020135116 + + + + + 1221210977814 + -6830312487753414061 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/content.txt new file mode 100644 index 0000000000..46ddc3d000 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/content.txt @@ -0,0 +1,93 @@ +!1 How RowFixture Fixture Code Works + +Here is our simplistic prime number test table again: + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| +|11| + +Hit the test button to run this test. OK, we got them all. How does the table tell the code what to expect? + +Each data column specifies a query '''key'''. Above, ''prime'' is our only key. We just want to see whether our set of primes contains each of these numbers. + +Now here is the code for the !-PrimeNumberRowFixture-!:{{{package fitnesse.fixtures; + +import fit.RowFixture; + +public class PrimeNumberRowFixture extends RowFixture { + public Object[] query() throws Exception { + PrimeData[] array = new PrimeData[5]; + array[0] = new PrimeData(11); + array[1] = new PrimeData(5); + array[2] = new PrimeData(3); + array[3] = new PrimeData(7); + array[4] = new PrimeData(2); + return array; + } + + public Class getTargetClass() { + return PrimeData.class; + } +} }}} All we are doing is assembling and returning an array of !-PrimeData-! objects: these are our ''records''. We also use the special ''getTargetClass()'' method to specify to Fit the type of the '''record''' objects we need it to inspect for us. In this case, ''!-PrimeData.class-!''. + +Notice that the '''key''' column name (''prime'') in the table corresponds to the public member variable ''prime'' in !-PrimeData-!. Fit inspects each of the !-PrimeData-! objects in the returned array, comparing the table cell values in the ''prime'' column with the contents of the ''prime'' variable in !-PrimeData-!. Here is the code for !-PrimeData-!: {{{package fitnesse.fixtures; + +public class PrimeData { + public int prime; + public PrimeData(int prime) { + this.prime = prime; + } +} }}} Notice also that the order of the records in our query array is not the same as the order of key values in the table. RowFixture does not care about the order of the records returned by a query, as long as they are all there, and as long as there are no extras. + +!2 Employee Pay Records Example: Testing Fields in Returned Records +Here is our sample table (from the RowFixture page) that checks that a company's employees were paid correctly: + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay()| +|1|1000| +|2|2000| + +And here is the corresponding fixture code:{{{package fitnesse.fixtures; + +import fit.RowFixture; + +public class EmployeePayRecordsRowFixture extends RowFixture { + public Object[] query() throws Exception { + EmployeePayRecord[] records = new EmployeePayRecord[2]; + records[0] = new EmployeePayRecord(1, 1000); + records[1] = new EmployeePayRecord(2,2000); + return records; + } + public Class getTargetClass() { + return EmployeePayRecord.class; + } +} }}} Again, we are merely assembling an array of records; in this case, employee payroll records. We also identify the class of the '''record''' type Fit must inspect: ''!-EmployeePayRecord.class-!''. Now here is !-EmployeePayRecord-!: {{{package fitnesse.fixtures; + +public class EmployeePayRecord { + public int id; + private double salary; + public EmployeePayRecord(int id, double salary) { + this.id = id; + this.salary = salary; + } + public double pay() { + return salary; + } +} }}} To identify each row in the table, Fit finds the corresponding !style_code(!-EmployeePayRecord-!) by matching the ''id'' value in the table with the contents of the ''id'' variable, and matching the ''salary'' value in the table with the contents of the ''salary'' variable. For each found record, Fit then checks the value in the ''pay?'' column against the amount returned by the ''pay()'' method. + +!3 Wait a Minute. We're Just Assembling The Query Results in the Fixture! +Yeah, you're right. We're cheating, in the interest of clarity and simplicity. These examples show the mechanics of RowFixtureCode, but not a realistic use. It will rarely make sense to be assembling the array you need within the fixture code, since that does not demonstrate that your production code correctly provides the query results you need. + +When you write application code in order to get tests like the above to pass, you will likely want to have an array of the right objects already handy, so that something like !-EmployeePayRecordsRowFixture-! can just grab it, instead of having to assemble it. Alternatively, you might have production code ready to grab the array of query results from a database. In either case, the fixture code would just ask the production code to return the array of records it needs. + +!2 Learning More +To learn more about the RowFixture style of test table, see RowFixture. +To learn more about how FitNesse fixture code works in general, check out FixtureCode. +Also check out the other TestTableStyles. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/properties.xml new file mode 100644 index 0000000000..d1f0a9371b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327115148 + true + + 1238172708803 + 7873739675907270557 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/content.txt new file mode 100644 index 0000000000..1368a9e19a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/content.txt @@ -0,0 +1,51 @@ +RowFixture also supports functions, so you can check on the objects that you query. For example, lets say that we have a database of employee objects. We want to test that the employees were paid correctly. + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay()| +|1|1000| +|2|2000| + +As you can see, we query the employees by ''id'', and then check to see that their pay was correct. Here's what it would look like if their pay was not correct. + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay()| +|1|1000| +|2|3000| + +And here is what it would look like if there were missing or extra employees + +|!-fitnesse.fixtures.EmployeePayRecordsRowFixture-!| +|id|pay()| +|1|1000| +|5|5000| + +Here is the code for the fixtures:{{{package fitnesse.fixtures; + +import fit.RowFixture; + +public class EmployeePayRecordsRowFixture extends RowFixture { + public Object[] query() throws Exception { + EmployeePayRecord[] records = new EmployeePayRecord[2]; + records[0] = new EmployeePayRecord(1, 1000); + records[1] = new EmployeePayRecord(2,2000); + return records; + } + public Class getTargetClass() { + return EmployeePayRecord.class; + } +} }}}----{{{package fitnesse.fixtures; + +public class EmployeePayRecord { + public int id; + private double salary; + public EmployeePayRecord(int id, double salary) { + this.id = id; + this.salary = salary; + } + public double pay() { + return salary; + } +} }}} + +!img http://files/images/runArrow.gif For more about RowFixture see RowFixtureMultipleKeys + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/properties.xml new file mode 100644 index 0000000000..9c7194a5cc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210010 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/content.txt new file mode 100644 index 0000000000..576a80b836 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/content.txt @@ -0,0 +1,31 @@ +{{{java.net.MalformedURLException: no protocol: null?responder=proxy&type=bones + java.net.URL.(URL.java:567) + java.net.URL.(URL.java:464) + java.net.URL.(URL.java:413) + fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:51) + fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:45) + fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:40) + fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:33) + fitnesse.wikitext.widgets.TOCWidget.buildListOfChildPages(TOCWidget.java:269) + fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:164) + fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:150) + fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:190) + fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:165) + fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:150) + fitnesse.wikitext.widgets.TOCWidget.render(TOCWidget.java:111) + fitnesse.wikitext.widgets.ParentWidget.childHtml(ParentWidget.java:70) + fitnesse.wikitext.widgets.WidgetRoot.render(WidgetRoot.java:92) + fitnesse.wiki.PageData.processHTMLWidgets(PageData.java:196) + fitnesse.wiki.PageData.getHtml(PageData.java:166) + fitnesse.responders.WikiPageResponder.generateHtml(WikiPageResponder.java:95) + fitnesse.responders.WikiPageResponder.makeHtml(WikiPageResponder.java:87) + fitnesse.responders.WikiPageResponder.makePageResponse(WikiPageResponder.java:70) + fitnesse.responders.WikiPageResponder.makeResponse(WikiPageResponder.java:45) + fitnesse.FitNesseExpediter.createGoodResponse(FitNesseExpediter.java:122) + fitnesse.FitNesseExpediter.makeResponse(FitNesseExpediter.java:105) + fitnesse.FitNesseExpediter.start(FitNesseExpediter.java:47) + fitnesse.FitNesseServer.serve(FitNesseServer.java:24) + fitnesse.FitNesseServer.serve(FitNesseServer.java:17) + fitnesse.socketservice.SocketService$ServerRunner.run(SocketService.java:88) + java.lang.Thread.run(Thread.java:613) +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/properties.xml new file mode 100644 index 0000000000..ca48995882 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/properties.xml @@ -0,0 +1,13 @@ + + + true + true + 20090327171601 + true + true + true + true + true + true + 691318166473579374 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/content.txt new file mode 100644 index 0000000000..9b77214ae4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/content.txt @@ -0,0 +1,42 @@ +The queries in a RowFixture can use more than one key. + +Suppose we have records of the last three months worth of paychecks. Each paycheck is uniquely identified by the ''employeeId'' and the ''date''. We want to make sure that the checks were generated properly. + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|1||1000| +|4/1/03|1||1015| +|3/1/03|2||2002| +|4/1/03|2||2003| + +Notice, once again, that the order of the table rows doesn't matter. For example: + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|2||2002| +|3/1/03|1||1000| +|4/1/03|1||1015| +|4/1/03|2||2003| + +Notice also that the blank cell was not used as part of the key. Rather it was just filled in for you so you could visually check things. Here's what would have happened if we had tried to fill in the ''name'' column. + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|1|Bob|1000| +|4/1/03|1|Bob|1015| +|3/1/03|2|Bill|2002| +|4/1/03|2|Biff|2003| + +And here's what would happen if a row were missing or surplus. + +|!-fitnesse.fixtures.PayCheckRecordFixture-!| +|date|employeeId|name|pay()| +|3/1/03|1||1000| +|4/1/03|1||1015| +|3/1/03|2||2002| +|4/1/03|3||2003| + +!img http://files/images/runArrow.gif Now check out DesigningWithRowFixture. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/properties.xml new file mode 100644 index 0000000000..83604dfd10 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/properties.xml @@ -0,0 +1,13 @@ + + + + 20060717210010 + + + + + + + + 1052243133945 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/content.txt new file mode 100644 index 0000000000..61c9da7db5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/content.txt @@ -0,0 +1,68 @@ +!3 !c This tutorial describes the RowFixture element of the [[FIT][http://fit.c2.com]] framework. It is composed of the following sections: +|!-fit.Fixture-!| +|RowFixture|''This page. Describes the basic functions of the fixture''| +|RowFixtureFunctions|''Describes using functions in a RowFixture''| +|RowFixtureMultipleKeys|''Describes how RowFixture deals with multiple keys.''| +|DesigningWithRowFixture|''Tips and philosophy for designing with RowFixture.''| +---- +!2 !c Basic Functionality of RowFixture +Each row of a RowFixture represents a query into an array of objects. The data columns specify the query criteria. The function columns specify the operations to be performed and the data to be checked. + +For example, let's say that we have calculated the first five prime numbers. Let's make sure we got them all. Hit the test button to run this test. + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| +|11| + +OK, we got them all. Now here is the code for the !-PrimeNumberRowFixture-!:{{{package fitnesse.fixtures; + +import fit.RowFixture; + +public class PrimeNumberRowFixture extends RowFixture { + public Object[] query() throws Exception { + PrimeData[] array = new PrimeData[5]; + array[0] = new PrimeData(11); + array[1] = new PrimeData(5); + array[2] = new PrimeData(3); + array[3] = new PrimeData(7); + array[4] = new PrimeData(2); + return array; + } + + public Class getTargetClass() { + return PrimeData.class; + } +} }}} And here is the code for !-PrimeData-! {{{package fitnesse.fixtures; + +public class PrimeData { + public int prime; + public PrimeData(int prime) { + this.prime = prime; + } +} }}} Notice that the column header in the table corresponds to the public member variable ''prime'' in !-PrimeData-!. Notice also that the order of the elements in the array is not the same as the order of elements in the table. That's what RowFixture does! It makes the order of the entries in the table independent of the order of the entries in the array. It ''querys'' the array for its elements. + +The following table shows what happens when you ask for an element that doesn't exist. ''(Note the extra 12.'') + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| +|11| +|12| + +And this table shows what happens when you don't ask for an element that exists. ''(Note the 11 is missing.)'' + +|!-fitnesse.fixtures.PrimeNumberRowFixture-!| +|prime| +|2| +|3| +|5| +|7| + +!img http://files/images/runArrow.gif For more on RowFixture see: RowFixtureFunctions. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/properties.xml new file mode 100644 index 0000000000..7a5f6608cb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113825 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RssFeed/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RssFeed/content.txt new file mode 100644 index 0000000000..f6d0b5b392 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RssFeed/content.txt @@ -0,0 +1,19 @@ +!img-r http://www.reallysimplesyndication.com/mainResponderResources/userlandIcons/xmlCoffeeMug +!c !2 FitNesse supports RSS 2.0 + +The RSS URL has the simple form: + * ''!-http://[myWikiAddress]/[somePage]?responder=rss-!'' + +This will send you a list of all the recent changes for ''[somePage]'' and all pages below. If you omit ''[somePage]'' then you'll get a list of all the recent changes in the whole wiki. + +There is one caveat. Without help FitNesse doesn't know how to build fully qulified URL to it's pages. This will result in bad links in the RSS feed. You can help out by defining the '''RSS_PREFIX''' variable. Here's how: + 1 Goto the root page of your FitNesse site + * use the '''root''' keyword in the URL. !-http://localhost/root-! + 2 Click the '''edit''' button (or add ?edit to the end of the URL) + 3 Define the '''RSS_PREFIX''' variable. + * !-!define RSS_PREFIX {http://www.mysite.com/}-! + + +Example:{{{http://fitnesse.org/FitNesse?responder=rss}}} + +!note !meta Make sure your !-RecentChanges-! page is well formed. If it's corrupted, then the RSS feed responder can crash. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RssFeed/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RssFeed/properties.xml new file mode 100644 index 0000000000..6a30bb3755 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RssFeed/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/content.txt new file mode 100644 index 0000000000..81363e1439 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/content.txt @@ -0,0 +1,20 @@ +Acceptance tests are run by hitting the '''Test''' button (or typing ''ALT-t''). This button appears on any page that has the '''Test''' attribute set. See [[Page Attributes][PageProperties]]. + +Any tables that are on the page are run through the Fit framework (See http://fit.c2.com ). + +So, for example, click the '''Test''' button (or type ''ALT-t'') and see what happens to the table below: + +|eg.Division| +|numerator|denominator|quotient?| +|10|2|5| +|12.6|3|4.2| +|-3|3|-1| +|100|0|0| +|33|3|11| + +TroubleshootingAcceptanceTests + +!note Hitting the '''Test''' button is equivalent to using the following command:{{{!r fitnesse.FitFilter}}}(See CustomizingTestExecution.) + +---- +You may also run FitNesseTests by using the CommandLineTestRunner! diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/properties.xml new file mode 100644 index 0000000000..ee924428b4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/properties.xml @@ -0,0 +1,12 @@ + + + + 20090228113827 + + true + + + + + 1052055454364 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/content.txt new file mode 100644 index 0000000000..f55a7319e4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/content.txt @@ -0,0 +1,25 @@ +You can run FitNesse Java (Fit and Slim) tests from a developer IDE without starting the FitNesse server. This is a developer-centric approach to running tests and is not suitable for collaboration with customers or testers, but it is very efficient for troubleshooting purposes. FitNesse includes a set of JUnit helpers that enable you to execute a test or a suite using JUnit. These helpers will execute FitNesse tests in-process, allowing you to debug and inspect the fixture or domain code during test execution. Test pass/failure reports are integrated with JUnit but the normal page output (tables etc) gets saved to the disk for later inspection, if required. + + - !style_code(!-import fitnesse.junit.JUnitHelper-!) + - instantiate the helper (eg in the setup method of the test class) + +!style_code{JUnitHelper helper=new JUnitHelper(FITNESSE_ROOT_PATH, DIRECTORY_FOR_OUTPUT_FILES);} + +FITNESSE_ROOT_PATH is the directory where the wiki pages are, the one which contains your !-FitNesseRoot-! directory. DIRECTORY_FOR_OUTPUT_FILES where HTML test results will be stored. The test result directory will be created if required. For example, the following command will instantiate a helper for a project that contains !-FitNesseRoot-! in the base directory and store the results in the fitnesse subfolder of the system-specific temporary folder. + +!style_code{JUnitHelper helper=new JUnitHelper(".", new File(System.getProperty("java.io.tmpdir"),"fitnesse").getAbsolutePath());} + + - you can now use helper.assertTestPasses(testName) or helper.assertSuitePasses(suiteName) in JUnit code to assert that a FitNesse test or suite pass. For example: +!style_code{!-helper.assertSuitePasses("FitNesse.SuiteAcceptanceTests.SuiteSlimTests");-!} [[Here's a full example][http://github.com/unclebob/fitnesse/blob/master/src/fitnesse/junit/JUnitHelperExampleTest.java]] + +!2 Integration with graphical runners + +For better reporting in JUnit graphical test runners, you can use the !style_code(!-fitnesse.junit.FitNesseSuite-!) JUnit 4 runner. This will list individual test pages in the JUnit report window and give you detailed statistics for individual tests in a suite. To use it, set the test or suite name to run using the @Name attribute, the root FitNesse path using !-@FitNesseDir-! attribute and the result directory using !-@OutputDir-! attribute. [[Here's a full example][http://github.com/unclebob/fitnesse/blob/master/src/fitnesse/junit/FitNesseSuiteExampleTest.java]] + +!2 Outputing JUnit XML files + +For integration with continous build systems test history statistics, override the default listener for the JUnitHelper and set it to a JUnitXMLTestListener instance. + +!style_code{JUnitHelper helper = new JUnitHelper(fitNesseRootDir,htmlOutputDir,new JUnitXMLTestListener(xmlOutputDir));} + +Then point your CI system to pick up JUnit XML files from the folder specified as xmlOutputDir. Remember to also archive the html files from the htmlOutputDir if you want to preserve them as a build artifact \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/content.txt new file mode 100644 index 0000000000..477541b173 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/content.txt @@ -0,0 +1,7 @@ +Trinidad is a Maven plugin that connects to the [[JUnit][RunningFromJunit]] helper which allows you to easily integrate FitNesse tests into a Maven build system. To use this plugin: + - Add http://maven.neuri.com/ as a plugin repository + - Add maven-trinidad-plugin to your project POM file, using the same version as the target FitNesse release + - Invoke the target directly from the command line by specifying all the arguments using -D definitions. Use -Dtrinidad.test.location to specify the test result location and trinidad.run.suite to specify a test suite to execute. For example: +{{{mvn -o trinidad:run-tests -Dtrinidad.test.location=../../fitnesse -Dtrinidad.run.suite=FitNesse.SuiteAcceptanceTests.SuiteSlimTests}}} +You can also bind the plugin to a build phase to automatically execute FitNesse suites as part of the test or integration-test phase, for example. For more information on that, see the [[plugin configuration details][http://neuri.co.uk/resources/projects/trinidad/maven-trinidad-plugin/]] and a [[full POM example][http://trinidad.googlecode.com/svn/trunk/trinidad/maven-trinidad-plugin-test/pom.xml]]. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/content.txt new file mode 100644 index 0000000000..9ecb4593fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/content.txt @@ -0,0 +1,5 @@ +This is the Opertation step of our sample test. + +It is common among multiple tests so it is saved in a separate page that can be included by test pages. + +!|A table the performs an operation that needs checking| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/properties.xml new file mode 100644 index 0000000000..08bf361423 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210014 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/content.txt new file mode 100644 index 0000000000..6f79afe0dc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/content.txt @@ -0,0 +1,8 @@ +This page requires that 3 varaibles be defined before it is included. + * NUMERATOR + * DENOMINATOR + * QUOTIENT + +!|eg.Division| +|numerator|denominator|quotient?| +|${NUMERATOR}|${DENOMINATOR}|${QUOTIENT}| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/properties.xml new file mode 100644 index 0000000000..87f3216999 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113823 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/content.txt new file mode 100644 index 0000000000..c9a4e1a18c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/content.txt @@ -0,0 +1,5 @@ +This is the Build step of our sample test. + +It is common among multiple tests so it is saved in a separate page that can be included by test pages. + +!|A table that sets up for a test| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/properties.xml new file mode 100644 index 0000000000..6b8bf916d0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210015 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/content.txt new file mode 100644 index 0000000000..6d71b02259 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/content.txt @@ -0,0 +1,31 @@ +!2 How to enable for Kerberos/Active Directory +!note Not tested as part of the normal build. Use at your own risk. + +Enable this plugin by editing !style_code(plugins.properties) and adding the line: +!style_code(!-Authenticator = fitnesse.authentication.NegotiateAuthenticator-!) + +If using Kerberos on Unix, create a !style_code(jaas-krb5.conf) file with these contents: +{{{ +com.sun.security.jgss.accept { + com.sun.security.auth.module.Krb5LoginModule required + storeKey=true + isInitiator=false + principal="HTTP/your.web.server@YOUR.REALM" + useKeyTab=true + keyTab="/path/to/your/http.keytab" + ; + }; +}}} +Next, define these system properties when running the FitNesse server: + +{{{ +-Djavax.security.auth.useSubjectCredsOnly=false +-Djava.security.auth.login.config=/path/to/jaas-krb5.conf +-Dsun.security.krb5.debug=true +}}} +You can remove the !style_code(krb5.debug) property later, when you know it's working. + +{{{ + * @author David Leonard Released into the Public domain, 2009. No warranty: + * Provided as-is. +}}} diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/content.txt new file mode 100644 index 0000000000..68bf7c7d67 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/content.txt @@ -0,0 +1,30 @@ +!3 Security Overview +Pages can be marked with three levels of security: + +|''secure-read''|Only authenticated users can read the page| +|''secure-write''|Only authenticated users can write the page.| +|''secure-test''|Only authenticated users can test the page.| + +These levels are not hierarchical. secure-write does not imply secure-read. Indeed, the three are completely independent flags that you can set on any page. + +!3 Setting Security +You set the security of a page by going to it's properties and clicking on the appropriate checkboxes. If none of the checkboxes are checked, then the page is completely insecure and anybody can do anything to it. This is the default. + +!3 Security Inheritance +Pages inherit their security from their parent pages. If a parent page has ''secure-read'' then all its children will be protected from reading, even though they don't have ''secure-read'' set themselves. There is no way to relax security in child pages. Where security is concerned, the parents rule. + +!3 Details + * If a unauthenticated user attempts to display a page that has ''secure-read'' set, he will be prompted for his username and password. If he survives this authentication then he will be redirected to the requested page. + * If an unauthenticated user attemptes to write a page that has ''secure-write'' set, he will be authenticated before the write is allowed to take place. + * If an unauthenticated user attemptes to test a page that has ''secure-test'' set, he will be authenticated before the test is allowed to take place. This works the same for both tests and suites. + * A user must be authenticated to do any kind of refactoring. + * A user must be authenticated to change the properties of a page. + * A user must be authenticated to inspect or change the /files directory structure. However, unauthenticated readers can read files from the /files directory. + * Searching, WhereUsed, Sisterhood, and other queries of that kind are not secure and do not require authentication. + +!3 Virtual Wiki +A virtual page inherits the security of its ''local'' parents, not its remote parents. This is a security hole for reading and testing. If the parent of a page has secure-read, but that page is accessed through a virtual wiki below the secure parent, then the security will be lost. Fortunately this is only true for reading and testing. Writing is never done over a virtual wiki, so it remains secure. At this point we're not sure whether this is a real problem or not. Let us know what you think. +!3 Authentication +The users and their passwords are supplied to FitNesse by using the -a as one of the CommandLineArguments. +!3 SPNEGO/GSSAPI Authentication +See >SpnegoAuthentication diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/properties.xml new file mode 100644 index 0000000000..67c0954194 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SecurityDescription/properties.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/content.txt new file mode 100644 index 0000000000..9903035310 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/content.txt @@ -0,0 +1,6 @@ +Some of the buttons on the wiki page have shortcut keys. These may or may not work in your browser! +|'''Edit'''|''ALT-e''| +|'''Properties'''|''ALT-p''| +|'''Test'''|''ALT-t''| +|'''Search'''|''ALT-s''| +|'''Versions'''|''ALT-v''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/properties.xml new file mode 100644 index 0000000000..a7fec95910 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/properties.xml @@ -0,0 +1,11 @@ + + + + 20090228113824 + + true + + + + 1052054924832 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SisterSites/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SisterSites/content.txt new file mode 100644 index 0000000000..82d6a52714 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SisterSites/content.txt @@ -0,0 +1,4 @@ +Ward Cunningham has come up with a scheme for wiki sites to cross reference each other. He calls this scheme '''Sister Sites'''. You can read his advice on this topic [[here][http://c2.com/doc/TipsForSisterSites/sisters.pdf]]. + +There are two parts to setting up a sister site. + 1 [[Being a Sister][BeingAsister]]. How one site requests references from another. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SisterSites/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SisterSites/properties.xml new file mode 100644 index 0000000000..0b7f4b43cf --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SisterSites/properties.xml @@ -0,0 +1,12 @@ + + + + 20090327101312 + + + + + + 1238166792608 + 417440476276072236 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/content.txt new file mode 100644 index 0000000000..6d64934a47 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/content.txt @@ -0,0 +1,4 @@ +|Comment| +|Comment tables are simply not executed| +|You|Can|Put|Anything|You|Want|Into|Them| +|The only requirement|is that the first|cell of the table|must be the word|comment| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/properties.xml new file mode 100644 index 0000000000..ec6b089200 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20081031170022 + + + + + + + + + 1225490422970 + -5059229174992629731 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/content.txt new file mode 100644 index 0000000000..0254b9e752 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/content.txt @@ -0,0 +1,5 @@ +Most tables use some kind of fixture class. That class will be constructed once for each table. You can pass constructor arguments simply by adding those arguments in table cells after the constructor name. + +|Decision:my decision table|constructor argument 1|constructor argument 2| +|...| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/properties.xml new file mode 100644 index 0000000000..c5ca4d9a0d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20081029101658 + true + true + true + true + true + true + 1225293418146 + 4034578242887246818 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/content.txt new file mode 100644 index 0000000000..db3146e3ac --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/content.txt @@ -0,0 +1,18 @@ +!2 Adding custom type converters to Slim (Java) +If you have a fixture whose methods take or return a class that is not one of the standard Slim types, you can add a customer type converter very easily. There are two different ways to do this. + +First, you can use the standard !style_code(!-PropertyEditor-!) mechanism. You can read about this in the Javadocs for !style_code(!-PropertyEditor-!). In short, if you have a class named !style_code(!-MyType-!) you can create a class named !style_code(!-MyTypeEditor-!) that implements the !style_code(!-PropertyEditor-!) interface (usually by extending !style_code[!-PropertyEditorSupport-!]). That's pretty much it. There are three different search paths for this class, but I'll let you read about that in the Javadocs. +!note There is an example of this in !-fitnesse.slim.test.ZorkEditor-! + +Or, you can use the lower level approach of registering a converter. +The converter must derive from !-fitnesse.slim.Converter-!. +{{{ +package fitnesse.slim; +public interface Converter { + public String toString(Object o); + Object fromString(String arg); +} }}} As you can see this is pretty simple. Your derivative must implement the toString method to convert your type to a string; and it must implement the fromString method to convert the string into your custom type. + +Then, in the constructor of first fixture to uses that type simply put the following line of code: {{{fitnesse.slim.Slim.addConverter(MyClass.class, new MyClassConverter())}}} + +The technique for other language platforms should be similar to this. Check the documentation of the Slim port for your platform. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/properties.xml new file mode 100644 index 0000000000..7df4bb45e3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090326094113 + true + true + true + true + true + true + 1232745959476 + 4415644922513391702 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/content.txt new file mode 100644 index 0000000000..a15330b125 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/content.txt @@ -0,0 +1,10 @@ + * For numerics, the Java format is used. e.g. Integer.parseInt() or Double,parseDouble() calls. + * Boolean maps to the strings "true" and "false". + * Dates convert in and out of a date format of the form dd-MMM-yyyy. (e.g. 10-Oct-1970) + * Lists of strings are mapped to simple strings of the form ''[a, b, c]''. Note the brackets and spaces. This is the standard ''toString'' format for Java Lists. + * Arrays of Booleans, Integers, Strings, and Doubles map to the form ''[x, y, z]''. + * !see CustomTypes + +!3 Maps. +The [[Hash Widget][ (or a hash in the case of Ruby). + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/properties.xml new file mode 100644 index 0000000000..ca161f8b47 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1225481584437 + 6085177871853100391 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/content.txt new file mode 100644 index 0000000000..4ad68f91c1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/content.txt @@ -0,0 +1,87 @@ +|should I buy milk| +|cash in wallet|credit card|pints of milk remaining|go to store?| +| 0 | no | 0 | no | +| 10 | no | 0 | yes | +| 0 | yes | 0 | yes | +| 10 | yes | 0 | yes | +| 0 | no | 1 | no | +| 10 | no | 1 | no | +| 0 | yes | 1 | no | +| 10 | yes | 1 | nope | + +This is a decision table; sometimes known as a truth table. This particular table has three inputs and one output. + +Here is the fixture code that it invokes:{{{ +package fitnesse.slim.test; + +public class ShouldIBuyMilk { + private int dollars; + private int pints; + private boolean creditCard; + + public void setCashInWallet(int dollars) { + this.dollars = dollars; + } + + public void setPintsOfMilkRemaining(int pints) { + this.pints = pints; + } + + public void setCreditCard(String valid) { + creditCard = "yes".equals(valid); + } + + public String goToStore() { + (pints == 0 && (dollars > 2 || creditCard)) ? "yes" : "no"; + } + + // The following functions are optional. If they aren't declared they'll be ignored. + public void execute() { + } + + public void reset() { + } + + public void table(List> table) { + } + + public void beginTable() { + } + + public void endTable() { + } +} }}} + +That pretty much explains it all. But let's look at the details a bit more closely. + +First of all, there's the name of the table: "should I buy milk". This is named for a decision to be made. That's good style. Decision tables should be named for decisions. However that name also translates to the fixture class !-ShouldIBuyMilk-!. If you run this test you'll notice that the name turns green. This means that Slim found the fixture class and was able to create an instance of it. + +The first cell could also have been ''Decision:should I buy milk'', or ''DT:should I buy milk'', or ''ShouldIBuyMilk'', etc.. The code ''Decision:'' or ''DT:'' tells Slim what kind of table this is. Decision table is the default. + +Next, there's the row of column headers. If you look carefully at them you'll see that they all correspond to functions in the fixture class. However, the first three correspond to ''set'' functions. That's because they don't have a ''?''. The Decision Table considers them to be inputs, and automatically calls the appropriately named ''set'' function. + +The last column header does have a ''?''. Decision Table considers it to be an output and so calls it as a function and expects a return value. That return value is compared to the contents of the column and turns the corresponding cell red or green depending whether it matches. Note that the cell that contains 'nope' does not match the 'no' that is returned. + +The flow is very simple. + 1 First the !style_code(ShouldIBuyMilk) fixture is constructed. + 1 Next the !style_code(table) method is called if it exists. (see below). + ! Next the !style_code(beginTable) method is called, if it exists. Use this for initializations if you want to. + 1 Then for each row in the table: + 1 First the !style_code(reset) function is called (if present), just in case you want to prepare or clean up. + 1 Then all the inputs are loaded by calling the appropriate !style_code(set) functions. Inputs are loaded in the left to right order of their appearance in the header. + 2 Then the !style_code(execute) function of the fixture is called (if present). + 3 Finally all the output functions are called, again in left to right order, and the return values compared to their table cells. + 1 Finally the !style_code(endTable) method is called, if it exists. Use this for closedown and cleanup if you want to. + +!4 Optional Functions + * !style_code(beginTable) - is called once, just after the !style_code(table) method, and just before the rows are processed. This is for setup and initialization stuff. + * !style_code(endTable) = is called once, just after the last row has been processed. It's the last function to be called by the table. Use it for cleanup and closedowns. + * !style_code(reset) - is called once for each row before any !style_code(set) or output functions are called. + * !style_code(execute) - is called once for each row just after all the !style_code(set) functions have been called, and just before the first output function (if any) are called. + * !style_code(table) - is called just after the constructor and before the first row is processed. It is passed a list of lists that contain all the cells of the table except for the very first row. The argument contains a list of rows, each row is a list of cells. This is the same format that is passed to the !style_code(doTable) method of the Table table. For the table above the argument would be: !-
    -!!style_code([[cash in wallet, credit card, pints of milk remaining, go to store?], [0, no, 0, no], [10, no, 0, yes], [0, yes, 0, yes], [10, yes, 0, yes], [0, no, 1, no], [10, no, 1, no], [0, yes, 1, no], [10, yes, 1, nope]]) + + +There's not much more to it than that. + +!4 Well, yes there is. +But for that you should look at SymbolsInTables and ValueComparisons \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/properties.xml new file mode 100644 index 0000000000..f22be061fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1237299094135 + -2949072239794021614 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/content.txt new file mode 100644 index 0000000000..3af3e1c8ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/content.txt @@ -0,0 +1,16 @@ +|Define table type | +|Bowling | as Table | + +The "Define table type" table is designed to help you write more readable tests. + +In the above example we have defined Bowling as a Table fixture. Once you have defined the type like this you can just use "Bowling" in your test table and don't need to write "Table: Bowling". + +For example, the following table will now work: +|Bowling| +|3|5|4|/|X||X||3|4|6|/|7|2|3|4|9|-|4|/|3| +||8 ||28||51||68||75||92||101||108||117|||127| + +Using this fixture makes your test pages easier to read, especially for project managers, BA's and Product owners who might not understand how Fitnesse works. (The "table:" or "query:" strings are just a test implementation detail and therefore it is good to leave them out where ever possible.) + +Hint: Try putting the "Define Table Type" fixtures in the same place as your "Import" fixtures. The setup pages are a good place for these! + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/properties.xml new file mode 100644 index 0000000000..3e87512357 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/content.txt new file mode 100644 index 0000000000..9cb8d370ab --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/content.txt @@ -0,0 +1,9 @@ +!2 Default Handling of exceptions. +The default way Slim handles exceptions is to indicate in the test table that an exception was thrown, and increment the exceptions count for the test. You will also find the full stack trace for the exception is listed at the top of the test. Slim will then try and continue on with the test. + +!2 Specifying a custom message +You can specify a custom message to be written into the test output instead of a stack trace. This is done by prefixing your message with {{{message:<<}}} and ending with {{{>>}}} For instance if you want the message to be "Can't create object" then the text for your exception should be {{{message:<>}}} +!2 Stopping the execution of the test. +If your exception indicates an error that cannot be recovered from, then you may want the test execution to stop at that point. You can do this by throwing an exception with "!-StopTest-!" in the class name. If the test is part of a suite, then this will cause the next test in the suite to be be started immediately. + +Be warned, that if you throw a "!-StopTest-!" exception then the tear down for your test will not run. A fix for this is to run the tear down procedure before you throw the exception. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/content.txt new file mode 100644 index 0000000000..26cd59cc74 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/content.txt @@ -0,0 +1,8 @@ +The names of fixtures, methods, inputs, and outputs can be expressed in two forms. They can match their corresponding names in the fixture classes, or they can be ''graceful''. + +A ''graceful name'' looks like it is written in human language rather than computer language. It has spaces that separate the words and may have a period at the end. Slim will convert ''graceful names'' into the names of the classes and methods they refer to. So for example: + +!|Graceful Name|Fixture Name|Method Name| +|slim test|SlimTest|slimTest| +|login user.|LoginUser|loginUser| +|Open connection and add user.|OpenConnectionAndAddUser|openConnectionAndAddUser| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/properties.xml new file mode 100644 index 0000000000..d10b62f745 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090326094116 + true + true + true + true + true + true + 1225639576805 + 7552149109911954771 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/content.txt new file mode 100644 index 0000000000..8feffdec32 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/content.txt @@ -0,0 +1,5 @@ +|Import| +|myPackage.subPackage.whatever| +|another.path.to.classes| + +The Import table tells the Slim Executor where the fixtures live. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/properties.xml new file mode 100644 index 0000000000..4e75c3a81b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20081031165833 + true + true + true + true + true + true + 1225490313404 + -3711766748557255495 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/content.txt new file mode 100644 index 0000000000..6c0397fa65 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/content.txt @@ -0,0 +1,46 @@ +A Library Table is a table that can be used to install support fixtures so they are available for all pages underneath. + +The format of the Library table is similar to the ImportTable. + +|Library| +|echo support| +|file support| + +The first row contains the word '''Library'''. This is a reserved word so slim knows which table is executed. All subsequent rows are fixtures. In this case !-SliM-! will expect two fixtures: !-EchoSupport-! and !-FileSupport-!. These fixtures will be located the same as "normal" fixtures, meaning it will use the ImportTable's paths to scan. + +Whenever a method is called that is '''not''' available on the fixture, then all installed libraries are scanned if that method is available and if so that one will be invoked. + +Usage example: + +'''File cleanup'''. +{{{ +public class FileSupport { + public void delete(String folder) { + // do stuff here + } +} + +public class MyFixture { + public void doBusinessLogic(String folder) { + myFileCreatingService.createFileInFolder(..); + } +} +}}} + +|Library| +|file support| + +|script|my fixture| +|do business logic|/tmp| +|delete|/tmp| + + +'''Order of method execution''' + +The order of method execution is as follows: + +1. Find method on fixture, if present execute +2. Find method on SystemUnderTest, if present execute +3. Find method on installed Library in '''reversed''' order of creation. So last one created takes precedence over the ones created earlier. + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/content.txt new file mode 100644 index 0000000000..6bb749b8b8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/content.txt @@ -0,0 +1,12 @@ +|Ordered query:employees hired before|10-Dec-1980 | +|employee number |first name|last name|hire date | +|8832 |James |Grenning |12-May-1999| +|1429 |Bob |Martin |10-Oct-1975| +|9924 |Bill |Mitchell |19-Dec-1966| + + +The first thing to notice is the ''Ordered query:'' in the first cell of the table. This tells the Slim table processor that this is an ordered query table. Ordered query tables are almost identical to [[Query tables][QueryTable]] except that order is important. The order of the rows in the table must be the same as the order of the rows returned by the query. + +The matching algorithm is ''relative'' which means that if the table rows have the following order !style_code({A, B, C}) and the query returns !style_code({B, C, A}) then rows !style_code(B) and !style_code(C) will be green, and only row !style_code[!style_red(A)] will be marked in red as ''out of order: row 3''. The row number in the error message is the ordinal position (based on 1) of that row in the query result. + +A little thought should convince you that this means that the first row in the ''table'' can never be out of order. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/properties.xml new file mode 100644 index 0000000000..cc008a42e6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/properties.xml @@ -0,0 +1,17 @@ + + + + + + 20090304135001 + + + + + + + + + 1236196201462 + 1130887675001640928 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/content.txt new file mode 100644 index 0000000000..3300a6a75b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/content.txt @@ -0,0 +1,60 @@ +The rows in a query table represent the expected results of a query. +You can specify them precisely if you like as in the following: + +|Query:employees hired before|10-Dec-1980 | +|employee number |first name|last name|hire date | +|1429 |Bob |Martin |10-Oct-1975| +|9924 |Bill |Mitchell |19-Dec-1966| + +Or you can leave cells blank and allow them to be filled in: + +|Query:employees hired before|10-Dec-1980 | +|employee number |first name|last name|hire date| +|1429 | | | | +|8832 | | | | + +The code for the fixture is: {{{ +package fitnesse.slim.test; + +import static fitnesse.util.ListUtility.list; + +import java.util.Date; +import java.util.List; + +public class EmployeesHiredBefore { + private Date date; + + public EmployeesHiredBefore(Date date) { + this.date = date; + } + + public void table(List> table) { + //optional function + } + + public List query() { + + return + list( + list( + list("employee number", "1429"), + list("first name", "Bob"), + list("last name", "Martin"), + list("hire date", "10-Oct-1974") + ), + list( + list("employee number", "8832"), + list("first name", "James"), + list("last name", "Grenning"), + list("hire date", "15-Dec-1979") + ) + ); + } +} }}} +Note the ''list'' function simply builds an !-ArrayList-! from it's arguments. It's in the !-ListUtility-! class + +The first thing to notice is the ''Query:'' in the first cell of the table. This tells the Slim table processor that this is a query table. Next notice the constructor argument. (See ConstructorArguments). The column headers are ''field names''. The fixture class must have a ''query'' method that returns a list of rows. Each row is a list of fields. Each field is a two-element list composed of the ''field name'' and it's string value. + +Each row in the table is checked to see if there is a match in the query response. The fields are matched left to right. If the leftmost field matches, then the row is considered to be "found". Fields that don't matche are marked in error as in the 10-Oct-1974 field above. A cell that is left blank in the table will be filled in from the result and counted as ignored. If the first cell of a row cannot be matched, then the row is considered ''missing''. If there is an unmatched row remaining in the query response, it is added to the table and marked ''surplus''. The order of the rows is irrelevant. + +If a !style_code(table) method is declared in the fixture it will be called before the !style_code(query) function is called. It will be passed a list of rows which are themselves lists of cells. The rows and cells represent the all but the first row of the table. This is the same format at the !style_code(doTable) method of Table table, and the !style_code(table) method of Decision table. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/properties.xml new file mode 100644 index 0000000000..bf93df270c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1234379903398 + 6607618891543149048 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScenarioTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScenarioTable/content.txt new file mode 100644 index 0000000000..4d24993d2a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScenarioTable/content.txt @@ -0,0 +1,95 @@ +!include -c .FitNesse.SuiteAcceptanceTests.SetUp +!*< classpath +!path classes +!path lib/*.jar +*! +---- +A Scenario table is a table that can be called from other tables; namely ScriptTable and DecisionTable. + +The format of a Scenario table is the same as the format of a ScriptTable, but with a few differences. You can see a Scenario table in action [[here][.FitNesse.SuiteAcceptanceTests.SuiteWidgetTests.SimpleWidgets]]. + +!4 Declaring Scenarios using ''Interposed'' style +The basic format looks like this: + +!|scenario|widget|wikiText|renders|htmlText| +|create page|WidgetPage|with content|@wikiText| +|check|request page|WidgetPage|200| +|ensure|content matches|@htmlText| +|show|content| + +!*> No Peeking +|script|page driver| + +*! + +The first word in the table is ''Scenario''. Following that is the signature of the scenario. This signature is a lot like a function declaration. The name of the scenario in the table above is ''!-WidgetRenders-!'', and it takes two arguments: ''wikiText'' and ''htmlText''. Notice how this looks a lot like a function call in a ScriptTable. The name is composed of every other table cell appropriately camel-cased. The arguments are the interposed cells, also appropriately camel-cased. Scenario names will be camel-cased with a leading upper-case letter. Arguments will be camel-cased with a leading ''lower-case'' letter. + +!4 Declaring Scenarios using ''Parameterized'' style. +You can also declare a scenario by embedding underscores within a string. Each underscore represents an argument. The arguments are named in a comma separated list in the following cell. + +!|scenario|widget _ renders _|wikiText,htmlText| +|create page|WidgetPage|with content|@wikiText| +|check|request page|WidgetPage|200| +|ensure|content matches|@htmlText| +|show|content| + +The body of the scenario uses the arguments by prefixing them with an '@' sign. The token that follows the '@' ''must be the camel-cased name of the argument.'' +Arguments that share a common root string can use optional braces to force the correct evaluation of the full name of the argument. Thus, if you have arguments ''job'' and ''job code'', you can use @{jobCode} to make sure you get the argument with the longer name. + +!4 Invoking a scenario from a DecisionTable +!|widget renders| +|wiki text|html text| +|this is ''italic'' text|this is italic text|italic widget| +|this is '''bold''' text|this is bold text|bold widget| + +Notice that the name of the decision table, once camel-cased, will be ''!-WidgetRenders-!''. Since this is the name of the above scenario, the scenario will be called rather than a fixture. This is important! Remember that if a scenario is on your page, or included into your page, then its name will override any fixture that has the same name. Scenarios come first! + +If you'd rather you can reference the scenario with parameters so long as you make sure the argument names in the reference exactly match the argument names in the declaration. For example the above test could have been written as: + +!|widget|wiki text|renders|html text| +|wiki text|html text| +|this is ''italic'' text|this is italic text|italic widget| +|this is '''bold''' text|this is bold text|bold widget| + +The column headers of the DecisionTable are named for the arguments of the scenario (again, once properly camel-cased). The scenario processor simply replaces the arguments in the scenario with the contents of the table cells below the corresponding header. + +Notice that there is no concept of an ''output'' header; i.e. there is no '?' in any of the column headers. A DecisionTable that calls a ScenarioTable does not make any assertions of its own. Rather it relies on the Scenario table to do the asserting. If you look at the ScenarioTable above, it uses the ''check'' keyword to make the assertion. Again, this is important. When you call a Scenario, you only pass data ''into'' it. You don't get data back out of it. Scenarios have no return value. + +If you hit the test button, you will see the scenario operate. It's pretty self-explanatory. If you look at the resulting DecisionTable you'll see that an extra column has been added to each row. That column contains a collapsed section with the entire scenario table with all the arguments replaced. You can expand it by clicking on the litte arrow. Try it. + +!4 Invoking a scenario from a script table using ''Interposed'' style +!|Script| +|widget|!3 hello|renders|

    hello

    | + +Notice how the scenario is called exactly the way a function is called. Remember though that scenarios do not have return values. So you can't call a scenario from within a 'check' or 'show' row in a script table. Also keep in mind that scenario names come first, so a scenario will override a function in the current fixture. + +By the way, what fixture was being used here? If you look inside the ''No Peeking'' section above, you'll see where I started the fixture. What's neat about this is that you can start any fixture you like, so long as it has appropriately named functions. So the scenario and script calls are ''polymorphic'' with respect to the fixture. (Let the reader understand and beware!) + +!4 Invoking a scenario using ''Parameterized'' style +!|Script| +|widget !3 hello renders

    hello

    | + +As you can see you can also drop the table cells and simply write the scenario name and arguments on a single line without any separators. The secenario with the ''most'' arguments that matches the statement will be selected. So given two scenarios: !style_code(widget _ renders _) and !style_code(widget _), both match the statement !style_code(widget foo renders bar), but the first will be invoked because it has more arguments than the second. + +!4 Nested Scenarios +Scenarios can also be nested! If you hit the test button, you'll see scenarios executing within other scenarios. + +!|scenario|make page|page name|with|wikiText| +|create page|@pageName|with content|@wikiText| +|check|request page|@pageName|200| + +!|scenario|page|wiki text|renders|html text| +|make page|MyPage|with|@wikiText| +|ensure|content matches|@htmlText| +|show|content| + +!|Script| +|page|!3 hello|renders|

    hello

    | + +!4 Philosophy +There are no ''if'' or ''while'' statements within scenarios. They are macros, not programs. They are constructed via text substitution. Their purpose is to help you eliminate redundancy in your tests. + +!4 Scenario Libraries +See + + + + + + + + + + + + + 1238174209178 + 1483156031156832784 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/content.txt new file mode 100644 index 0000000000..1b0eb67119 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/content.txt @@ -0,0 +1,74 @@ +|script|login dialog driver|Bob|xyzzy| +|login with username|Bob|and password|xyzzy| +|check|login message|Bob logged in.| +|reject|login with username|Bob|and password|bad password| +|check|login message|Bob not logged in.| +|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 { + private String userName; + private String password; + private String message; + private int loginAttempts; + + public LoginDialogDriver(String userName, String password) { + this.userName = userName; + this.password = password; + } + + public boolean loginWithUsernameAndPassword(String userName, String password) { + loginAttempts++; + boolean result = this.userName.equals(userName) && this.password.equals(password); + if (result) + message = String.format("%s logged in.", this.userName); + else + message = String.format("%s not logged in.", this.userName); + return result; + } + + public String loginMessage() { + return message; + } + + public int numberOfLoginAttempts() { + return loginAttempts; + } +} }}} + +This should be pretty clear. Each row is a single instruction in the script. + * The first row is simply the word "Script" followed by the name and constructor arguments of the fixture (known as the "actor") that will be used by the rest of the table. If there is no actor specified then the previous script table's actor on this test page will be used. + + * Most instructions involve some kind of function call. By default, the name of the function is assembled from tokens in ''every other'' cell. The arguments of the function are the intervening cells. Appending ";" to the end of a function name in a cell invokes sequential argument processing, which means that the arguments to the function are all subsequent cells. + +''Interposing Function Call (Default)'' +|login with username|Bob|and password|xyzzy| + +''Sequential Argument Processing Function Call'' +|login with username and password;|Bob|xyzzy| + + * A function alone in a row will turn red or green if it returns a boolean. Otherwise it will simply remain uncolored. + + * If the word ''check'' is in the first cell of a row, then a function call follows it. The last cell of the table is the expression we expect to be matched by what the function actually returns. + + * If the word ''check not'' is in the first cell of a row, then a function call follows it. The last cell of the table is the expression we expect !style_red(''not'') to be matched by what the function actually returns. + + * If the word ''ensure'' is in the first cell, then it should be followed by a function that should return a boolean true for green and false for red. + + * If the word ''reject'' is in the first cell, then it should be followed by a function that should return a boolean false for green and true for red. + + * If the word ''note'' is in the first cell, all other cells in that row will be ignored. + * Or if the first cell is blank. + * Or if the first cell begins with # or *. + + * 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. + + * If the word ''start'' appears in the first cell, then the rest of the row is the name and constructor arguments for a new actor, which replaces the existing actor. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/properties.xml new file mode 100644 index 0000000000..127571bb6c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1232649253653 + -7576501324773113274 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/content.txt new file mode 100644 index 0000000000..15340495d4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/content.txt @@ -0,0 +1,6 @@ +!*> setup +|import| +|fitnesse.slim.test| +|fitnesse.fixtures| + +*! diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/properties.xml new file mode 100644 index 0000000000..b4bc972964 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1231691120894 + 2877052885879097211 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/content.txt new file mode 100644 index 0000000000..43d069025f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/content.txt @@ -0,0 +1 @@ +The !-SlimServer-! opens and listens to a server socket. It gets the port number from !-FitNesse-! via the command line. The default is 8085 and it cycles through the next 10 ports to avoid collisions. If 8085 is not convenient for you, you can set the !style_code(SLIM_PORT) variable to any port you like. This variable can be defined on a page by page basis with !-!define-!, or it can be specified with !style_code(-DSLIM_PORT=xxxx) on the !style_code(java) command line, or it can be an environment variable. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/properties.xml new file mode 100644 index 0000000000..8729a5a643 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090316133402 + true + true + true + true + true + true + 1237228442617 + -1593763266452230916 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/content.txt new file mode 100644 index 0000000000..022284f909 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/content.txt @@ -0,0 +1,134 @@ +!2 The Slim Protocol +!note !4 (V0.3) +{{{ + instruction list + +----------+ o---> +------------+ +----------+ +-----+ + | FitNesse |---[socket]-->| SlimServer |----->| Fixtures |------>| SUT | + +----------+ <---o +------------+ +----------+ +-----+ + response list +}}} + +!-FitNesse-! communicates with Slim over a socket (see >PortManagement). When you hit the ''Test'' button, !-FitNesse-! starts up a !-SlimServer-! process by issuing the appropriate command line. !-FitNesse-! then sends a list of instructions to the !-SlimServer-!, and expects a list of responses back. The instructions are things like ''call function f(a,b,c)'' or ''make instance of class X with arguments p,q,r''. The responses are simply the values that are returned by the instructions. + +Each instruction in the list is itself a list of strings. Here is a typical instruction list: {{{ + [ + [id_0, make, instance, fixture, argument], + [id_1, call, instance, f, 3], + ]}}} +The first instruction in this list tells the !-SlimServer-! to create an instance of a class named ''fixture'' using the constructor argument ''argument'', and register the newly created instance under the name ''instance''. The next instruction causes the function ''f'' to be called on the instance ''instance'', passing the value ''3''. The first column in each instruction is simply an instruction id. + +The response to this instruction list might look like this: {{{ + [ + [id_0, OK], + [id_1, 9] + ] +}}} +Again, each element of the response list is itself a list of strings. The first string in each response is the id of the instruction being responded to. The second is the response value. In this case the construction in instruction ''id_0'' was successful, and the call to function ''f'' with value ''3'' in instruction ''id_1'' returned a ''9''. + +That's pretty much it. Lists of instructions go out. Lists of responses come back. Typically the instructions for an entire test page will be sent in one large list, yielding one large response list. + +There is no type information in the instructions. Each instruction is a list of strings. Each response is a list of strings. Strings and lists are the only two types in the entire protocol. It is up to the !-SlimExecutor-! to find the functions and constructors that match the instructions, and to do the necessary type conversion. + +!3 The Data +The !-SlimServer-! maintains five pieces of data that are operated on by the instructions that it processes. + * A list of class search path items. + * A dictionary of created objects. Each object is addressed by an instance name string. + * A dictionary of symbol values. Each symbol value is addressed by a symbol name string. + * ''[0.1]'' '''Library Instances:''' A stack of library objects. + * ''[0.3]'' '''Actors:''' A stack of actor objects. + +!3 The Instructions +There are four instructions in the Slim protocol. import, make, call, and callAndAssign. That's all. + +!4 Import +['''', import, ''''] + +This instruction causes the to be added to the list of class search path items. In java gets added to the ''CLASSPATH''. In ''.NET'', the is a namespace. You can send as many imports as you like. The Slim system will use all imported paths to find fixture classes. This instruction returns ''OK''. + +!4 Make +['''', make, '''', '''', ''...''] + +This instruction causes slim to search for a class named '''' using the list of class search path items. '''' can also be fully qualified. If found slim looks for a constructor with the right number of arguments. If found, the '''' strings are converted to the appropriate types, and the constructor is called. The newly created instance is added to the dictionary of created objects with the name '''', and the instruction returns ''OK''. + +''[0.1]'' '''Library Instances:''' If a ''make'' instruction creates an object with an instance name that begins with !style_code(library) then that instance is pushed on the stack of library objects. These objects endure for the entire duration of the !-SlimServer-! execution. + +''[0.2]'' '''Fixture Chaining:''' Symbols can be used in the ''Make'' command to represent a class name. If the '''' argument of the ''Make'' command contains '$' characters, then Slim should replace any symbols that have been created by previous ''callAndAssign'' commands. This allows !-FitNesse-! to compose fixture names from symbols set by fixtures, and therefore enables fixture chaining. + +''[0.3]'' '''Symbol Copy:''' If '''' consists entirely of a single symbol name prefixed with $, then the item from the dictionary of symbol values with the symbol name is added to the dictionary of created objects with the name ''''. The '''' strings are ignored and no constructor is called. + +!4 Call +['''', call,'''','''',''...''] + +This instruction causes slim to find a function named '''' in the class of the object from the dictionary of created objects with the name ''''. The function must have the same number of arguments as the instruction. If found, each argument in the instruction is converted to the appropriate type, and then the function is called on the instance. The '''' strings may contain symbols (see below) which will be substituted before the type conversion is done. If the function returns a value, it is converted to a string and returned. Otherwise the instruction returns the string: ''/__VOID__/''. + +''[0.1]'' '''System Under Test:''' Each fixture may have a way to declare a particular object to be the ''System Under Test''. In java this is done with the @SystemUnderTest attribute. In !-RubySlim-! the object is accessed using the ''sut'' method. In .NET, the fixture implements the !-DomainAdapter-! interface. Whatever mechanism is used, if a the method specified by a ''Call'' or ''!-CallAndAssign-!'' is not found on the specified instance, then if there is a ''System Under Test'' object specified, and the method exists on that object, then it will be called. + +''[0.1]'' '''Library Instances:''' If a method specified by a ''Call'' or ''!-CallAndAssign-!'' is not found on either the specified instance, or on the ''System Under Test'' then the stack of library objects is searched, starting at the top (latest). If the method is found, it is called. + +''[0.3]'' '''Symbol As Object:''' If an '''' consists entirely of a single symbol name prefixed with $, then the item from the dictionary of symbol values with the symbol name is used directly as an argument in the function call. + +!4 !-CallAndAssign-! +['''', callAndAssign, '''', '''', '''', ''...''] + +This instruction is identical to ''call'' except that the return value is saved in the dictionary of symbol values with the name ''''. Symbol names may only contain letters. + +!3 Symbols +That last one was probably puzzling. Symbol values are strings or objects (or null values) that are kept in a dictionary. The ''callAndAssign'' instruction is the only thing that can create a symbol. Symbols are used in in the '''' strings of the ''make'', ''call'', and ''callAndAssign'' instructions. If one of those '''' strings contains a $ followed by a symbol name (as in $V), and if the symbol has been assigned, then that string will be replaced by the value of the symbol. What this means is that the !-FitNesse-! side can tell Slim to remember a value in a symbol, and then to use that value later. + +''[0.3]'' '''Symbol As Object:''' If the symbol is replaced within a string context, it will be converted to a string. If only the $ followed by a symbol name is given and an object is stored for that symbol, then the object will be used. + +!3 Actors + +''[0.3]'' The stack of library objects should be initialized with an instance of a class with the following 3 methods: + * getFixture(): returns the object from the dictionary of created objects named "scriptTableActor". Throws an exception if no object exists. + * pushFixture(): pushes the object from the dictionary of created objects named "scriptTableActor" on to the stack of actor objects. Throws an exception if no object exists. + * popFixture(): pops an object from the stack of actor objects and adds it to the dictionary of created objects with the name "scriptTableActor". Throws an exception if the stack is empty. + +!3 Strings and Lists +As we will see, slim views a list as a special kind of string. Therefore functions can take and return lists as well as strings. The lists must be lists of strings, but since a list is a special kind of string, lists of lists of lists of ... are possible. The Slim executor will convert back and forth between these forms as needed. + +A string is encoded as six digits followed by a colon, followed by the characters of the string. The six digits are the number of characters in the string, not including the digits themselves. Thus, the empty string is "000000:". This length encoding scheme is used in other places so we'll use the token '''' to mean six digits followed by a colon. + +If a string is '''', then the four character string ''null'' will replace it. + +A list is encoded as a string that begins with a '[', followed by a '''' specifying the number of items in the list. This is followed by that many strings, each terminated by a colon, and then finally a ']' Thus, this list: ''[hello,world]'' is encoded as the following string: {{{000035:[000002:000005:hello:000005:world:]}}} Take careful note of all the colons and counts. Colons are terminators not separators. + +As you can see, each item of a list is a string. But since a string can encode a list, each item of a list can be another list. So we can have very deep recursive definitions. + +!5 !note You might think that 6 digits is plenty; but the last few decades have shown us that a megabyte isn't even close to infinite. So you'll want to keep that in mind. + +!3 Slim Server. +So when you send a list of instructions, what you are really sending is a string. When you receive a list of responses, what you are really receiving is a string. So the high level protocol of Slim is just strings. It looks like this: + + 1 !-FitNesse-! invokes the Slim Server via a command line. One of the command line arguments is the port number of the socket to listen on. !-FitNesse-! opens that socket. + 2 Slim Server responds with the string "Slim -- ''V''\n", where '''' is the version number of the slim ''protocol''. If this protocol ever changes, ''that'' version number will change. This is the only string that is ever sent without the '''' encoding. It is terminated by the '''\n''' instead. Every other message that slim sends will be prefixed by a '''' in ''!style_red(bytes)'', followed by a colon. !style_red(NOTE:) Every other length in this document is in UTF-8 ''characters''. This one length is in bytes. + 3 !-FitNesse-! sends a list of instructions encoded as a string of course. + 4 Slim Server sends a list of responses similarly encoded. + 5 3 and 4 repeat until !-FitNesse-! sends a ''bye'' directive. This is simply the string ''bye'' properly encoded with ''''. e.g. "000003:bye". + 6 Slim Server shuts down. + +!3 Exceptions +Sometimes a function or a constructor will throw an exception in response to a ''make'', ''call'', or ''callAndAssign'' instruction. When this happens, the response value for that instruction will be: "__EXCEPTION__:''''". The '''' ought to be a stack trace or some other relevant debugging information. If you want a nice yellow message to appear in one of the SLIM tables, then somewhere in the ''<>'' put ''message:<<'' in front of the message and ''>>'' after it. e.g. !style_code(message:<>) +!4 Standard exception messages +There are some standard exception messages that every Slim implementation should create. + +|COULD_NOT_INVOKE_CONSTRUCTOR ''''|Where '''' is the name of the class whose constructor cannot be invoked.| +|NO_METHOD_IN_CLASS '''' ''''|Where '''' is the name of the missing method.| +|NO_CONSTRUCTOR ''''|Where '''' is the name of the class that is missing the constructor.| +|NO_CONVERTER_FOR_ARGUMENT_NUMBER ''''|Where '''' is the class that has no corresponding converter.| +|NO_INSTANCE ''''|Where '''' is the name of the missing instance.| +|NO_CLASS ''''|Where '''' is the class that could not be found.| +|MALFORMED_INSTRUCTION [''instruction list'']|Where ''instruction list'' is a comma separated list of the instruction strings.| + +!4 Aborting a Test +If a fixture throws an exception with a ''class'' name that contains "!style_code(!-StopTest-!)", then Slim should stop executing the instructions in the current batch, and return immediately. The response for this type of exception should be "!style_code(__EXCEPTION__:ABORT_SLIM_TEST:)" which may have an optional suffix of: "!style_code(message:<<''reason''>>)". + +!3 Type Conversions +The only types in the instructions and responses are lists and strings, and since the leaves of the lists must eventually be strings, all we really have to worry about are strings. But we don't want to restrict our fixtures to use only Strings. So Slim comes with some standard type converters that allow fixtures to take more convenient data types. + +!see DataTypes. + +''[0.1]'' '''Hashes:''' !style_note(Optional) If one of the method arguments int a ''Make'', ''Call'', or ''!-CallAndAssign-!'' matches the "hash" format, then it should be converted into a dictionary, or a hash, or some convenient form for the fixture authors. In Java they are converted into Maps. In Ruby they are converted into Hashes. Other languages may use other structures. The "hash" format is the format produced by the [[Hash Widget][
    ...
    namevalue
    ). + +!3 Conclusion +That's pretty much it. If you want to port Slim to a new platform, I suggest you look at the code in the fitnesse.slim package. Pay special attention to the !-ListSerializer-! and !-ListDeserializer-! classes. Also check out the logic in Statement and !-StatementExecutor-! classes. The unit tests ought to be expecially educational. You should be able to build equivalent unit tests without much fuss. Finally, take a look at the unit tests in fitnesse.responders.run.slimResponder. These should all still run with your new port (although you'll have to replace the command line that invokes the Slim Server). diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/content.txt new file mode 100644 index 0000000000..6693c03fd8 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/content.txt @@ -0,0 +1,7 @@ +|Subset Query:employees hired before|10-Dec-1980 | +|employee number |first name|last name|hire date | +|1429 |Bob |Martin |10-Oct-1974| + +The first thing to notice is the ''Subset Query:'' in the first cell of the table. This tells the Slim table processor that this is a subset query table. Subset query tables are almost identical to [[Query tables][QueryTable]] except that we only need to put those rows into the table that we want to make sure to exist in the query response. + +Our definition of subset here is not ''proper'' subset. Thus the table may contain all the rows of the query response. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/properties.xml new file mode 100644 index 0000000000..afb3ad1eb1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/content.txt new file mode 100644 index 0000000000..ec9b6e8057 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/content.txt @@ -0,0 +1,20 @@ +|DT:some decision table| +|input|output?| +|3|$V=| +|$V|8| +|9|$V| + + +If a $'''' appears in an output cell (whether in a Decision Table, Script Table, or any other kind of table that can call functions) then that symbol will be loaded with that output. Both the slim server running in the SUT and !-FitNesse-! will remember that symbol. + +The first row above loads the return value of the ''output'' function into the symbol ''V''. The second row will load the previously stored value of ''V'' into the input. (If you think about this in the context of the SlimProtocol you'll realize that this means that the symbol must be stored on the SUT). The third row compares the output with the previously stored value of the symbol. + +You can combine symbols as follows: + +|$V and $X are symbols| + +The symbols V and X will be replaced with their values... + +----- +!4 $$ (Slim v0.2) +If you want to pass a $ from FitNesse into a slim fixture you can use $$ to do it. For example $$bob will get be interpreted as $bob and _not_ replaced with the symbol value of bob. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/properties.xml new file mode 100644 index 0000000000..b992db0eb6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1238174405669 + -5189210762337118063 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/content.txt new file mode 100644 index 0000000000..844293ef4c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/content.txt @@ -0,0 +1,51 @@ +!3 System Under Test + +'''Currently only available in Java''' + +!-Using SystemUnderTest allows you to let SliM directly invoke a method on your SystemUnderTest without having to create a method in a SliM fixture for it.-! + +!4 Example +{{{ +import fitnesse.slim.SystemUnderTest; + +/** + * The slim fixture. + */ +public class SlimDriver { + + // field MUST be declared PUBLIC + @SystemUnderTest + public Service service = new Service(); + + public void init() { + Database.clean(); + } + +} + +/** + * The service under test. + */ +public class Service { + + public void createPerson(String name) { + Database.persist(new Person("name")); + } + + public boolean exists(String name) { + return Database.get(name) != null; + } + +} + +}}} + +With the !-@SystemUnderTest-! annotation you can now say: + +!|script|SlimDriver| +|init| +|create person|Ben Vonk| +|ensure|exists|Ben Vonk| + +When a method that should be invoked on the !-SliM-! fixture is missing, it will try to invoke that method on a '''public''' field annotated with !-SystemUnderTest-!. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/properties.xml new file mode 100644 index 0000000000..4d714763f7 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/properties.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/content.txt new file mode 100644 index 0000000000..c4b30c53e6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/content.txt @@ -0,0 +1,16 @@ +!3 Generating reports inside pages using Table tables. + +Since you can pass back any size result to a Table table, and since you can create a Table table that has only one row, you can generate reports. + +For example: + +|table:counts| + +This table will execute the !style_code(doTable) method of the !style_code(counts) fixture. If that method returns a table like this:{{{[ + [report:Employees,pass:22], + [report:Managers,fail:21] +]}}} then the resulting table will be + +|!style_pass(table:counts)| +|Employees|!style_pass(22)| +|Managers|!style_fail(21)| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/properties.xml new file mode 100644 index 0000000000..1027b5d583 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090123113620 + true + true + true + true + true + true + 1232732180225 + -4574603253238332954 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/content.txt new file mode 100644 index 0000000000..c9c6e433af --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/content.txt @@ -0,0 +1,128 @@ +|Table:Bowling| +|3|5|4|/|X||X||3|4|6|/|7|2|3|4|9|-|4|/|3| +||8 ||28||51||68||75||92||101||108||117|||130| + +The "Table" table allows you to write a fixture that accepts an arbitrary table, and returns a table of results. The table of results has a similar geometry to the input table (without the first row). Each cell of the result table can be one of the following codes: + +|Comment| +|''pass''|The original contents will be colored green.| +|''pass:''|The original contents will be replaced with and colored green.| +|''fail''|The original contents will be colored red.| +|''fail:''|The original contents will be replaced with and colored red.| +|''ignore''|The original contents will be colored grey.| +|''ignore:''|The original contents will be replaced with and colored grey.| +|''report:''|The original contents will be replaced with .| +|'''' or ''no change''|The corresponding cell will be unchanged| +|''error:''|The corresponding cell will be colored yellow and its contents will be ''''| +|''''|The corresponding cell will be colored red, and its contents will be ''''| + +The fixture is written with a !style_code(doTable) method. This method takes a List argument and returns a List. The incomming list is a list of rows. Each row is a list of strings. The returned list has a similar structure except that it does not have the first row. If any row of the returned list is longer than the corresponding row of the incomming list, then the extra columns will be added to the colored table. If there are extra rows, then they will be added too. So the returned table can be larger, horizontally and vertically. It cannot be smaller! + +See [[Report Tables][>ReportTables]] to see how to use the different geometries to create reports. + +Here is the fixture for the above table.{{{ +package fitnesse.slim.test; + +import static fitnesse.util.ListUtility.*; + +import java.util.List; + +public class Bowling { + public List doTable(List> table) { + Game g = new Game(); + List rollResults = list("","","","","","","","","","","","","","","","","","","","",""); + List scoreResults = list("","","","","","","","","","","","","","","","","","","","",""); + rollBalls(table, g); + evaluateScores(g, table.get(1), scoreResults); + return list(rollResults, scoreResults); + } + + private void evaluateScores(Game g, List scoreRow, List scoreResults) { + for (int frame=0; frame<10; frame++) { + int actualScore = g.score(frame+1); + int expectedScore = Integer.parseInt(scoreRow.get(frameCoordinate(frame))); + if (expectedScore == actualScore) + scoreResults.set(frameCoordinate(frame), "pass"); + else + scoreResults.set(frameCoordinate(frame), String.format("Was:%d, expected:%s.", actualScore, expectedScore)); + } + } + + private int frameCoordinate(int frame) { + return frame < 9 ? frame*2+1 : frame*2+2; + } + + private void rollBalls(List> table, Game g) { + List rollRow = table.get(0); + for (int frame = 0; frame < 10; frame++) { + String firstRoll = rollRow.get(frame * 2); + String secondRoll = rollRow.get(frame * 2 + 1); + if (firstRoll.equalsIgnoreCase("X")) + g.roll(10); + else { + int firstRollInt = 0; + if (firstRoll.equals("-")) + g.roll(0); + else { + firstRollInt = Integer.parseInt(firstRoll); + g.roll(firstRollInt); + } + if (secondRoll.equals("/")) + g.roll(10 - firstRollInt); + else if (secondRoll.equals("-")) + g.roll(0); + else + g.roll(Integer.parseInt(secondRoll)); + } + } + } + + private class Game { + int rolls[] = new int[21]; + int currentRoll = 0; + + public void roll(int pins) { + rolls[currentRoll++] = pins; + } + + public int score(int frame) { + int score = 0; + int firstBall = 0; + for (int f=0; f + + + + + 20090326094114 + + + + + + + + + 1232732770570 + 6617471917833325753 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/content.txt new file mode 100644 index 0000000000..a0f2e94ab6 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/content.txt @@ -0,0 +1,25 @@ +!3 Numerical Comparisons +You can use relational comparisons for the numeric values in your table cells. + +|DT:Some Decision Table| +|input|output?| +|3|<5| +|5|>=3| +|8|3<_<9| + +You can use all the normal operators: <, >, <=, >=, !=. + +The ''~='' relational operator means ''approximately equal''. It applies to floating point numbers. So if ''~=3.0'' then the ''3.0'' sets the precision so that 2.95 or 3.049 will both show equality. It is the number of decimals on the right side of the operator that determines the precision. + +So 2.5~=3 but 2.5 is not ~= 3.0. + +!3 Regular Expression Comparisons +You can match regular expressions by using the syntax =~/''regex''/. For example: + +|check|echo|Bob|=~/Bob/| +|check|echo|My name is Bob."|=~/B.b/| + +The regular expression syntax is the '''Java''' standard. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/properties.xml new file mode 100644 index 0000000000..5ba6e8965d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1225294538423 + 4620953944571182425 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/content.txt new file mode 100644 index 0000000000..81f72457ee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/content.txt @@ -0,0 +1,45 @@ +!define TEST_SYSTEM {slim} +!2 The ''SLIM'' Test System + +Slim (Simple List Invocation Method) is an alternative to Fit. Rather than running all the HTML processing, comparisons, and colorizing in the System Under Test (SUT), Slim keeps all that behavior on in FitNesse. What executes in the SUT is a very tiny kernel that implements the [[''Slim Protocol''][>SlimProtocol]]. This protocol is a bare bones RPC system that allows FitNesse to call functions in the SUT. + +This strategy has a number of advantages: + * The Slim protocol is very easy to port. Getting new platforms to use SLIM is a matter of a few hours of work. + * All the features are on the FitNesse side, so test tables remain consistent regardless of the platform of the SUT. + * Since HTML is not an intrinsic part of SLIM, new test syntaxes can be explored. + +!3 Using the SLIM Test System +If you want a test page to be run under SLIM, you simply set the TEST_SYSTEM variable to "slim" instead of "fit". {{{&bang;define TEST_SYSTEM {slim} }}} If this variable is set on your page, (as it is on this page!) or on any parent page, then your page will be run with Slim. That's all there is to it. + +!3 The Slim Tables +The first cell of a slim table tells you what kind of table it is. Here are the table types so far: +|[[Decision Table][>DecisionTable]]|Supplies the inputs and outputs for decisions. This is similar to the Fit Column Fixture| +|[[Query Table][>QueryTable]]|Supplies the expected results of a query. This is similar to the Fit Row Fixture| +|[[Subset Query Table][>SubsetQueryTable]]|Supplies a subset of the expected results of a query.| +|[[Ordered query Table][>OrderedQueryTable]]|Supplies the expected results of a query. The rows are expected to be in order. This is similar to the Fit Row Fixture| +|[[Script Table][>ScriptTable]]|A series of actions and checks. Similar to Do Fixture.| +|[[Table Table][>TableTable]]|Whatever you want it to be!| +|[[Import][>ImportTable]]|Add a path to the fixture search path.| +|[[Comment][>CommentTable]]|A table that does nothing.| +|[[Scenario Table][>ScenarioTable]]|A table that can be called from other tables.| +|[[Library Table][>LibraryTable]]|A table that installs fixtures available for all test pages| +|[[Define Table Type][>DefineTableType]]|A helper table that defines the default table type for named fixtures.| + +!4 Data Types. +The data in your tables is all Strings. However your fixtures don't want to be constrained to Strings. So Slim comes with several standard data type converters that will automatically convert the strings in the tables into the data types expected by your fixtures. +!see >DataTypes. +You can also create your own custom type converters if you like. +!see >CustomTypes. + +!4 Extra Goodies that are consistent throughout all Slim tables and ports. +|[[''Exception Handling''][>ExceptionHandling]]| +|[[''Symbols in tables''][>SymbolsInTables]]| +|[[''Constructor arguments''][>ConstructorArguments]]| +|[[''Value comparisons''][>ValueComparisons]]| +|[[''Graceful names''][>GracefulNames]]| + +!4 New goodies + +|[[''System Under Test''][>SystemUnderTest]]| + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/properties.xml new file mode 100644 index 0000000000..7b2e712aa2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SliM/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1236195430393 + -797601756276826570 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/GitPlugin/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/GitPlugin/content.txt new file mode 100644 index 0000000000..92b48c8f43 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/GitPlugin/content.txt @@ -0,0 +1,7 @@ +You can marry !-FitNesse-! to !style_code(git) simply by using the git plugin that ships with !-FitNesse-!. See + + true + true + 20090203091311 + true + true + true + true + true + true + 1233673991403 + 3152267162296987845 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/content.txt new file mode 100644 index 0000000000..4a8f8fb78b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/content.txt @@ -0,0 +1,49 @@ +It is relatively simple to marry !-FitNesse-! to your source code control system. It's all handled through a !-FitNesse-! variable named CM_SYSTEM. As with all variables, if this variable is !-!define-!ed on a page, then it will apply to that page and all pages below it. Otherwise if either the CM_SYSTEM environment variable or java system property is set, it will apply to all pages. + +Let's say you want to marry !-FitNesse-! with git. You could start !-FitNesse-! this way: {{{java -DCM_SYSTEM=fitnesse.wiki.cmSystems.GitCmSystem -jar fitnesse.jar}}} Or, if you just wanted to put a sub-hierarchy of pages under git, then put {{{!define CM_SYSTEM {fitnesse.wiki.cmSystems.GitCmSystem} }}} in the top page of that hierarchy. If you want turn the CM marriage off below some point in the hierarhcy, just put a !style_code(!-!-!define CM_SYSTEM {}) just above that level. + +The value of this variable is the fully qualified name of a class that looks like !-GitCmSystem-! (see below). Make sure that class in in your classpath when you start fitnesse. + +Here's the plugin I use for git. This ships with !-FitNesse-! so you can [[use it][>GitPlugin]] if it works for you. + +{{{public class GitCmSystem { + public static void cmUpdate(String file, String payload) throws IOException { + Runtime.getRuntime().exec("/usr/local/bin/git add " + file); + } + + public static void cmEdit(String file, String payload) { + //git doesn't need this. + } + + public static void cmPreDelete(String file, String payload) throws IOException { + //git doesn't need this. + } + + public static void cmDelete(String file, String payload) throws IOException { + Runtime.getRuntime().exec("/usr/local/bin/git rm -rf --cached " + file); + } +} }}} + +The four functions: !style_code[cmUpdate], !style_code(cmEdit), !style_code(cmPreDelete), and !style_code(cmDelete) are called if: + 1 The name of the class is in the CM_SYSTEM variable, and + 2 that page is being created, modified, or deleted. + + * !style_code[cmEdit(file, payload)] is called just before file is about to be written + * !style_code[cmUpdate(file, payload)] is called just after file has been written + * !style_code[cmPreDelete(directory, payload)] is called just before the directory defining a page will be deleted. + * !style_code[cmDelete(directory, payload)] is called just after the directory defining a page has been deleted. + +Remember that each page is defined by a directory that bears it's name, and two files that contain it's content. +The first file is !style_code(content.txt) which holds the wiki text. The second is !style_code(properties.xml) which holds all the metatdata +for the page. The file operations !style_code(cmEdit) and !style_code(cmUpdate) are called for each file. The file argument is the relative +path of the file. The !style_code(cmDelete) function is called with the relative path of the directory that holds the content of +the deleted page. These paths are relative to the -d argument of !-FitNesse-! + +The 'payload' is there just in case you need it. It contains the complete definition of the !style_code(CM_SYSTEM) variable. You can +put whatever you like in this variable, so long as the fully qualified name of your plugin comes first. Use a space to separate the classname from whatever else you want. + +What would you put in this payload? You might put your username and password for the CM system... Or you might put the path +of the CM root. Anything you need to make the CM system work... + +So given: !style_code(!-!define CM_SYSTEM {fitnesse.wiki.cmSystems.MyCmSystem unclebob/password /cm/myResponsitory}-!) +Then the payload would be: !style_code(!-fitnesse.wiki.cmSystems.MyCmSystem unclebob/password /cm/myResponsitory-!) diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/properties.xml new file mode 100644 index 0000000000..8f30eb4fd0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1232134793876 + -8719944065822967118 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialPages/content.txt new file mode 100644 index 0000000000..29047e7291 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialPages/content.txt @@ -0,0 +1,41 @@ +The following pages are automatically included into other pages. Some are included at the stop, others are included at the bottom. Some may be included only into certain kinds of pages. However, they all follow one identical rule. A given page will be included only if it is a brother or uncle of the target page. + +Consider !-PageHeader-!. !-PageHeader-! is included at the top of all of it's sibling pages. If !-FitNesse-! did not have sub pages, this would make perfect sense. The page named !-PageHeader-! would simply be included into every other page. But !-FitNesse-! ''does'' have sub pages. So the rule is that if a page includes !-PageHeader-! then the children of that page will include it as well. This rule is recursive, so the childrens +children also include !-PageHeader-! etc. + +Now imagine that you have a hierarchy that looks like this: + * Bob + * !-PageHeader-! + * Angela + * Alexis + +Bob is at the top level and there is no !-PageHeader-! at the top level. So nothing is included into Bob. +Angela has a sibling page named !-PageHeader-! so !-Bob.PageHeader-! is included into Angela. And since Angela includes it, the children of Angela will include it too. So Alexis will also include !-Bob.PageHeader-!. + +Clear? Just remember brothers and uncles. + + +!3 !-PageHeader-! +Included at the top of a page. Often used for common titles, or links. + +!3 !-PageFooter-! +Included at the bottom of a page. Used for copyrights, footers, and common links. + +!3 !-SetUp-! +Included at the top of test pages only. Used to initialize the test and supply Import tables. + +!3 !-TearDown-! +Included at the bottom of test pages only. Used to decommission resources used in a test. + +!3 !-SuiteSetUp-! +Included at the top of a test page and before !-SetUp-!. When a suite is run, this page will only be included once at the top of the suite. + +!3 !-SuiteTearDown-! +Included at the bottom of a test page only, and after !-TearDown-!. When a suite is run this page will be included only once at the end of the suite. + +!3 !-ScenarioLibrary-! +These pages are intended for scenario tables. They are included just after the !-SetUp-! in any ''SLIM'' test. Unlike the other special pages, ''all'' brother and uncle !-ScenarioLibrary-! pages are included. The oldest (grandest uncle) is included first. The brother, if it exists, is included last. This allows younger !-ScenarioLibrary-! pages to override older ones. + + +!3 Suites. +A special word about suites. The !-SuiteSetUp-! and !-SuiteTearDown-! that are included in a suite run are the pages that are the nearest brothers or uncles of the ''Suite'' page. If the suite has a deep hierarchy, and there are !-SuiteSetUp-! and/or !-SuiteTearDown-! pages below the suite page, they will not be included. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialPages/properties.xml new file mode 100644 index 0000000000..95114733a1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialPages/properties.xml @@ -0,0 +1,13 @@ + + + true + true + true + true + true + true + true + true + 1238171723779 + 5784148408046429312 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/content.txt new file mode 100644 index 0000000000..ae0a68113f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/content.txt @@ -0,0 +1,8 @@ + * The page .RecentChanges contains a list of the pages that have been most recently changed. + * The '''[Search]''' button allows you to search the whole wiki for a regular expression. + * The '''[Refactoring]''' button allows to search & replace wiki subtrees with [[Regular Expressions][http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html]] + * SisterSites -- Cross Referencing with other wikis sites. + * RootPage -- Accessing the root page of the entire wiki so you can put variables, fixtures, and paths in. + * Run suites from the command line with the CommandLineTestRunner + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/properties.xml new file mode 100644 index 0000000000..32d3b67aee --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/properties.xml @@ -0,0 +1,9 @@ + + + + + + + + 1051298320823 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/content.txt new file mode 100644 index 0000000000..8f9c049528 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/content.txt @@ -0,0 +1,37 @@ +!2 Starting FitNesse + +To start Fitnesse, invoke the fitnesse.jar file like this: + +!style_code(java -jar fitnesse.jar) + +This will start a wiki server listening on port 80. You can modify this and other options using a CommandLineOption. + +See PasswordFile for a description of how to set up per user authentication. + +!2 Running Rest Commands using the -c option. +See CommandLineRestCommands + +!2 Stopping FitNesse + +Pressing ''ctrl-c'' generally works well for development use. However, it's not sufficient for automated control. + +There are now ''stop.bat'' and ''stop.sh'' scripts to stop a running server. Invoke them with the same '''-p port_number''' option used to start the server. + +Both scripts run java with a class to stop FitNesse. You can invoke this class directly, as well: +{{{Usage: java fitnesse.Shutdown [-pa] + -h {localhost} + -p {80} + -c Supply user credentials. Use when FitNesse has authentication activated. +}}} +This command will send an HTTP request to the designated server. If the server is using authentication then the '''-c''' option should be used with appropriate username and password. + +Alternatively you may manually type a URL to shutdown a server. +http://hostname:port/?responder=shutdown + +!2 Running from JUnit + +see RunningFromJunit + +!2 Running from Maven + +see RunningFromMaven \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/properties.xml new file mode 100644 index 0000000000..47d88f9948 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1213818998677 + 5252078302071996298 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SubWiki/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SubWiki/content.txt new file mode 100644 index 0000000000..71135f8cfd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SubWiki/content.txt @@ -0,0 +1,32 @@ +!1 The SubWiki: Organizing FitNesse Pages into Hierarchies +!2 Why Do We Need Page Hierachies? +FitNesse, you recall, is a [[wiki][EditingFitNessePages]], but more than a normal one! A normal wiki is a collection of pages with a flat structure. All the pages are peers. FitNesse, on the other hand, is meant to manage many projects. We'd like each project to have its own wiki hierarchy so that name collisions can be avoided, fixture code can be found easily, etc. We might even need hierarchies within those hierarchies. + +For example, project one and project two each have their own TestSuites. Some of the suites might in turn contain smaller suites. These projects probably also use completely different ClassPath definitions. We'd like each project to be able to run acceptance tests using their own ClassPath definitions. So we want a different ClassPath page for each. This is what the FitNesse SubWiki feature makes possible. + +!2 How SubWiki Works +A SubWiki is a whole new page hierarchy that lives beneath a single FitNesse page. In fact, such a SubWiki is an entirely separate wiki, with an entirely separate page namespace. Any FitNesse page can be the parent of such a SubWiki. For example the name of this page is SubPage-!'' markup language syntax. + +When a sub-page is displayed, any unqualified links are assumed to be at the current level. If you want to access a global page, you need to precede the link with a dot. For example, from where we are now on this page, the link !-RecentChanges-! is really a link to !-.FitNesse.RecentChanges-! (which does not exist), whereas the link .RecentChanges is a link to the global page that contains the list of most recently changed pages. + +!3 Navigating through Sub Wikis + * Absolute references look like this: !-.TopPage.MyPage.YourPage-! where !-TopPage-! is at the highest level. + * Relative references look like this: !-YourPage.MyPage.HisPage-! where !-YourPage-! is a sibling of the page that holds the reference. + * Sub page references look like this: !->ChildPage.GrandChildPage-! where !-ChildPage-! is a child of the page that holds the reference. + * Backwards Search References look like this: !-<AncestorPage.SomePage-! where !-AncestorPage-! is a parent, grandparent, or somewhere up the parent chain. You can use this to search backwards through the page hierarchy until you find the named page. + +!3 How Fit Locates ClassPath Definitions in !-SubWikis-! +The !r command searches back up the hierarchy of pages looking for pages named ClassPath or !-!Path-! definitions. It accumulates all the paths on the way up to the topmost level. Thus you can create global classpaths, project specific classpaths, and even module specific classpaths. + +!3 TestSuites: the Perfect Application of the SubWiki +When you organize a suite of test pages, you will naturally want to make each of the individual test pages a child page of the main suite page. + +!3 Page Headers and Footers in !-SubWikis-! +The PageHeader and PageFooter classes can be used to add specific headers and footers to sub wikis. For example, the headers and footers of this page are comming from + + + + + 1238174883665 + -2525399175413409353 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/content.txt new file mode 100644 index 0000000000..c3a8f80e39 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/content.txt @@ -0,0 +1,21 @@ +!img-r http://docs.fitnesse.org/files/images/symlinkDiagram.gif + +!3 What are SymbolicLinks? +Symbolic Links allow a user to easily create parent-child links between pages without permanently affecting the wiki structure. Refer to the diagram on the right. You will notice that the !-ApplicationTests-! page has a child page named !-SuiteTests-! which contains several other pages. The !-EnvironmentOne-! page has no static child pages but it does have a symbolic link to the !-SuiteTests-! page. This symbolic link acts like a child page in almost every way and give two full names to the !-SuiteTests-! page: + * !-.ApplicationTests.SuiteTests-! is the real name, + * !-.EnviromentOne.SymbolicLink-! is a symbolic name for the same page. + +SymbolicLinks may also be made to external FitNesse directories. See below. + +!3 Why Should I Use SymbolicLinks? +One common reason need for Symbolic Links is the the testing of a system on multiple environments. For example, imagine an application that site on top of an Oracle database. Hundreds of FitNesse tests have been written for this application using Oracle settings and then the team is confronted with the need to run the application on !-MySql-!. Getting both databases running under the same suite of tests can be very difficult and may result in duplicating all the tests. With Symbolic Links, the database configurations can be stored in high level pages along with appropriate path elements. Then the high-level pages may symbolically link to the test suite. In this manner one suite of tests can be executed in multiple environments. + +!3 How do I use SymbolicLinks? +Navigate to the page where you'd like to add a symbolic link. Click the '''Properties''' button to load the ''properties'' view. There is a section titled '''Symbolic Links'''. There is a form here where may create a new symbolic link by suppling a single WikiWord name for the link and relative or absolute path to the page to which you'd like to link. Once created, the symbolic link will be listed in the '''Symbolic Links''' section of the same ''properties'' view. You may remove or rename existing links by clicking the corresponding '''Unlink''' or '''Create/Replace''' link. + +!3 External SymbolicLinks +For various reasons, you may want to keep a branch of your FitNesse wiki in a different location on your disk, than the rest of the wiki. You may link external branches into the main wiki by using SymbolicLinks. To do so, simply provide the file path to the external FitNesse directory in URL format proceeded with '''file://'''. + * eg. !-file:///User/MicahMartin/fitnesse/ExternalFitNesseRoot-! + +SymbolicLinks can also use environment variables to find a branch to add to your wiki. + * eg. !-file://${HOME}/MicahMartin/fitnesse/ExternalFitNesseRoot-! diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/properties.xml new file mode 100644 index 0000000000..a56198506d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/properties.xml @@ -0,0 +1,9 @@ + + + + 20090228113828 + true + + 1201721251657 + -3379710537192929046 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/content.txt new file mode 100644 index 0000000000..38e0e311b5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/content.txt @@ -0,0 +1,19 @@ +!1 Symbols: Passing Data Between Test Tables +Sometimes you want to pass information between test tables. Let's say you added a record to a database, and the database automatically generated a key to that record. And lets say that in another table you wanted to use that key to fetch the record back. You can use ''symbols'' for this. + +!|SaveRecordInDatabase| +|name|date |=key? | +|Bob |today|bobKey | +|Bill|later|billKey| + +In this table two records are added to the database. The keys for each record are saved in symbols named ''bobKey'' and ''billKey''. The ''=key?'' header indicates that the output of the ''key()'' method of the fixture is to be stored in a symbol whose name is in the cell. + +!|FetchRecordsFromDatabase| +|key= |fetch()|name|date | +|billKey|true |Bill|later| +|bobKey |true |Bob |today| + +In this table the two keys are used to fetch the database records. The ''key='' header indicates that the value of the symbol whose name is in the cell should be stored in the ''key'' variable of the fixture. + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/properties.xml new file mode 100644 index 0000000000..0ae0b9cf8c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210201 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TableFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TableFixture/content.txt new file mode 100644 index 0000000000..f04d32ad93 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TableFixture/content.txt @@ -0,0 +1,75 @@ +!1 Custom Test Table Styles: !-TableFixture-! +Sometimes, none of the existing TestTableStyles is exactly what you need to represent your various inputs and outputs properly. In thise case, programmers can use the TableFixture style of FixtureCode to create custom test tables, by accessing and processing the cells in a table individually by row and column, and doing whatever needs doing with them. + +You can use TableFixture to devise any manner of custom tables, representing test inputs and outputs however you like. While this involves custom programming, it can be quite a powerful way to represent tests in a way that software development team members can all easily understand. + +!2 Using !-TableFixture-! +TableFixture provides some simple methods that allow exactly the arbitrary table cell access and processing that you need to make custom test tables. + * The (row,column) coordinates are zero based, + * with (0,0) being the upper left cell. + +The methods of TableFixture are: + +|Comment| +|{{{protected abstract void doStaticTable(int rows)}}}|TableFixture is an abstract class that you must derive from. You must override ''doStaticTable'' to perform the functions of the fixture. The number of rows in the table is passed in ''rows''.| +|{{{protected Parse getCell(int row, int column)}}}|Returns the addressed table cell as a ''Parse''.| +|{{{protected String getText(int row, int column)}}}|Returns the text within the addressed table cell.| +|{{{protected boolean blank(int row, int column)}}}|Returns ''true'' if the addressed table cell is blank.| +|{{{protected void wrong(int row, int column)}}}|Turns the addressed table cell red.| +|{{{protected void right(int row, int column)}}}|Turns the addressed table cell green.| +|{{{protected void wrong(int row, int column, String actual)}}}|Turns the addressed table cell red, and annotates it with the ''actuall'' value.| +|{{{protected void ignore(int row, int column)}}}|Turns the addressed cell gray.| +|{{{protected int getInt(int row, int column)}}}|Converts the addressed cell to an int, and returns it.| + +!2 An Example !-TableFixture-! Custom Test Table: Scoring a Bowling Game +Consider the custom test table below. It represents and scores an entire bowling game, showing the score for every frame. The rightmost cell represents what we expect the final score to be. Notice how closely this represents a real bowling game scoring card, or electronic game representation at a bowling alley? Let's first see the score for a perfect game: + +|!-eg.bowling.fixtures.FinalScore-!| +|10|10|10|10|10|10|10|10|10|10|10|10||||||||||300| + +Now how about a slightly flawed game: + +|!-eg.bowling.fixtures.FinalScore-!| +|10|10|4|10|10|10|10|10|10|10|10|10||||||||||262| + +And then finally, the sort of game you might ordinarily see. Well, I see it all the time, anyway: + +|!-eg.bowling.fixtures.FinalScore-!| +|5|7|9|10|4|3|0|8|10|6|7|9||||||||||91| + +!3 The FixtureCode for !-FinalScore-! +The fixture code for the above custom table style is as follows. It examines each of the input cells of the above table individually, as frame scores, and calculates the score for the game: {{{public class FinalScore extends TableFixture +{ + private BowlingGame game; + + protected void doStaticTable(int rows) + { + game = new BowlingGame(); + doRolls(); + doScore(); + } + + private void doRolls() + { + for(int i = 0; i < 21; i++) + { + if(!blank(0, i)) + { + int pins = getInt(0, i); + game.roll(pins); + } + } + } + + private void doScore() + { + int expected = getInt(1, 21); + int actual = game.score(10); + if(actual == expected) + right(1, 21); + else + wrong(1, 21, "" + actual); + } +} +}}} + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TableFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TableFixture/properties.xml new file mode 100644 index 0000000000..a80fb55089 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TableFixture/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135111 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/content.txt new file mode 100644 index 0000000000..a6b65d8b71 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/content.txt @@ -0,0 +1,14 @@ +We built !-FitNesse-! to help us write and execute acceptance tests. One of its uses was in the [[!-FitNesse-!][http://www.objectmentor.com/courses/xpImmersion]] classes that we teach. + +The first version of !-FitNesse-! was a great success in these classes. ''Customers'' were able to create acceptance tests that the ''Developers'' would use. However, there was a problem. !-FitNesse-! runs on a server, and so all of the acceptance tests had to be executed on that server too. On the other hand the ''Developers'' were writing and testing code on their local machines. In order to run acceptance tests on their local code they had to copy the executables to the !-FitNesse-! server. + +Two ad-hoc solutions to this problem were tried. The first was to create a simple tool for moving the java .class files of the application to the !-FitNesse-! server. The other was to copy the pages from the !-FitNesse-! server to each development machine, and to run a local copy of !-FitNesse-!. Neither of these approaches seemed ideal for two reasons: + 1 They were clunky and inconvenient. + 2 The !-ClassPath-! pages needed to be identical, or at least very carefully managed. +# +!3 Enter virtual wiki. +We wanted developers to be able run the tests on their local machines. We also wanted customers to write the tests on the global server. The solution to this dilemma was ''Virtual Wiki''. + +Virtual wiki (See the [[Virtual Wiki Instructions][MarkupVirtualWiki]]) allows a developer to start up a !-FitNesse-! server on his local machine, and then to point one of his local pages to a sub-wiki on the global !-FitNesse-! server. The entire sub-wiki from the global server then appears on the developer's local machine -- just as if the developer had written the pages there. But the pages are really still on the server. Pressing the '''Test''' button on such a page, causes the test to be executed ''locally''. The developer can create !-ClassPath-! pages on ''his'' machine that allow the acceptance tests to be run in his local environment. + +Thus, each developer can set up his own local environment and create a set of !-ClassPath-! pages that bind that environment to his wiki. Then he can use Virtual Wiki to merge the remote acceptance tests to his local !-ClassPath-! environment. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/properties.xml new file mode 100644 index 0000000000..c0c6aee004 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/properties.xml @@ -0,0 +1,12 @@ + + + + 20081020135119 + + + + + + + 1051902744361 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestHistory/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestHistory/content.txt new file mode 100644 index 0000000000..6833cd9443 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestHistory/content.txt @@ -0,0 +1,22 @@ +Every time you run a test or a suite, the results are recorded in the ''test history database''. You can view the history by clicking on the !style_code(Test History) button. The reports are pretty self-explanatory. + +When you click on !style_code(Test History) you will be shown the directory of all tests and suites that are in thie ''test history database''. This directory also shows you the status of the last 20 results from each test or suite. You can click on the name of the test or suite to get a detailed ''page history'', or you can click on any of the individual status elements to see the particular test result. + +The detailed ''page history'' shows you a directory of all the test results for that test or suite. The bar chart shows how how the number of tests (for suites) or assertions (for tests) has grown over time, and the pass/fail ratio. Clicking on an entry takes you to that specific test result. + +!4 Details. +The ''test history database'' is kept in !style_code(!-FitNesseRoot/files/testResults-!). Beneath this directory there is a subdirectory for each test or suite. These directories contain the ''page history'' and are named for the page that contains the test or suite. Beneath the page history directory is a file for each test result. + +The test result files are named using the following scheme !style_code(YYYYMMDDHHMMSS_R_W_I_E.xml) where YYYYMMDDHHMMSS is the date and time of the test run, and R, W, I, and E are integers representing the number of Right, Wrong, Ignored, and Exception counts for the test or suite. For tests they are assertion counts. For suites they are test counts. (Example: !style_code(20090513134259_12_20_4_2.xml)) + +The test files contain the XML that describes the test run. The format of this XML is identical to the XML packet returned by the format=xml flag when you run a test. (See 7 days'', or ''>30 days''. If you want to purge a different number of days, you can use the RESTful URL form. (See RestfulServices). + +!4 Comparing History +When viewing the history for a page, you can select any two test results by clicking in their checkboxes. Then, if you click the ''Compare'' button, you will be shown the two test results side-by-side along with an indicator that tells you if the results are identical or not. + +Only tests can be compared this way. Suites cannot. + +Notice that the comparison is pretty smart. It tries to line up the two tests on a table-by-table basis. It can detect if tables have been inserted or deleted. The % code that you see on the left is just the match score for the tables. diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestHistory/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestHistory/properties.xml new file mode 100644 index 0000000000..e13fdf40e5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestHistory/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/content.txt new file mode 100644 index 0000000000..8f72a7201c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/content.txt @@ -0,0 +1,37 @@ +The required format for use of the FormattingOption class. All TestRunner implementations should produce output of this format + + * A TEST RESULT consists of: + 1 name of test page + 2 \n + 3 counts ''(1 right, 0 wrong, 0 ignored, 0 exceptions)'' + 4 \n + 5 processed HTML + 6 \n + + *To build a results file acceptable by FormattingOption: + * For each document + * WRITE the TEST RESULT + * WRITE COUNTS (accumulated counts for all tests added) + +!include FitProtocol +!* Example Results +{{{0000004196TestCreatingSymbolicLink +7 right, 0 wrong, 0 ignored, 0 exceptions +
    +... HTML ... +
    + +0000005311TestRemovingSymbolicLink +10 right, 0 wrong, 0 ignored, 0 exceptions +
    +... HTML ... +
    + +0000004391TestSymbolicLinkBehavior +8 right, 0 wrong, 0 ignored, 0 exceptions +
    +... HTML ... +
    + +00000000000000000025000000000000000000000000000000}}} +****! \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/properties.xml new file mode 100644 index 0000000000..346a634b14 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113826 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestRunner/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestRunner/content.txt new file mode 100644 index 0000000000..126c025942 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestRunner/content.txt @@ -0,0 +1 @@ +see CommandLineTestRunner \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestRunner/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestRunner/properties.xml new file mode 100644 index 0000000000..d21b908051 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestRunner/properties.xml @@ -0,0 +1,12 @@ + + + + 20060717210229 + + + + + + + 1048531959004 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/CrossReferenceSuites/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/CrossReferenceSuites/content.txt new file mode 100644 index 0000000000..c770e0fc8b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/CrossReferenceSuites/content.txt @@ -0,0 +1,11 @@ +!3 Suite Cross References +Sometimes you want to compose a test suite from test pages that are in many different modules, subsystems, or features. For example you might want a test suite that lists all the test pages for the current iteration, or you might want a test suite that lists all the currently passing tests, or you may want to create a test suite for all the quickly executing tests, and another for all the slow tests. + +To do this you can use the [['''!-!see-!'''][ + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SubWikiSuites/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SubWikiSuites/content.txt new file mode 100644 index 0000000000..14a341f512 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SubWikiSuites/content.txt @@ -0,0 +1,22 @@ +!3 SubWiki: the Most Convenient Way to Organize TestSuites + +[[!-SubWikis-!][ + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/content.txt new file mode 100644 index 0000000000..896998245f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/content.txt @@ -0,0 +1,22 @@ +A Suite Query is a regular page with the ''Suite'' property set so that it has a ''Suite'' button. On that page are one or more tables that specify the query. The page you are looking at right now, is a suite query. Notice the two tables below. They specify the query. You can run the query (and the tests) by hitting the ''Suite'' button. + +!|Suite| +|Page|FitNesse.SuiteAcceptanceTests| +|Content|[Bb]ug| + +!|Suite| +|Page|FitNesse.SuiteAcceptanceTests| +|Title|Import| + +Each of these tables is called a ''Suite Specification''. A ''Suite Specification'' is always a table whose first cell is the word ''Suite'', capitalized as shown. The other rows must each have two cells, and the first cell in each row must be either ''Page'', ''Content'' or ''Title''. + * ''Page'' - The second cell in the ''Page'' row is the fully qualified page name that forms the root of the search. The search will proceed only with descendants of this page. + * ''Title'' - The second cell in the ''Title'' row specifies a regular expression to be used to match a page name. Every page in the search whose name matches that regular expression will be included in the suite. + * ''Content'' - The second cell in the ''Content'' row specifies a regular expression to be used to match the contents of a page. Every page in the search whose content contains a string that matches that regular expression will be included in the suite. + +Every ''Suite Specification'' table represents the ''Intersection'' of the ''Page'', ''Title'', and ''Content''. Thus, they form an ''AND'' operation. Only those pages that are descended from ''Page'' and match ''Title'' and match ''Content'' will be in the suite. Of course, if either ''Title'' or ''Content'' are omitted (as above) then they are ignored. + +If you have multiple ''Suite Specification'' tables, then the suite will be the ''disjuction'' (The logical OR) of all of them. + +!note The regular expressions conform to the Java library. + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/properties.xml new file mode 100644 index 0000000000..6e9e1e6e03 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/properties.xml @@ -0,0 +1,12 @@ + + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteSetUpAndSuiteTearDown/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteSetUpAndSuiteTearDown/content.txt new file mode 100644 index 0000000000..73f9f8168a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteSetUpAndSuiteTearDown/content.txt @@ -0,0 +1,6 @@ +!3 !-SetUp-! and !-TearDown-! +Sometimes you will need to delete a test database at the end of each test in a suite, or create an empty database at the beginning of each test. Operations like this can be performed by writing special fixtures that perform these functions in their constructors. These fixtures can then be invoked in the '''!-SetUp-!''' and '''!-TearDown-!''' pages of the suite. See + + true + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/content.txt new file mode 100644 index 0000000000..04e6b5a78d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/content.txt @@ -0,0 +1,26 @@ +!3 Suite Tags + +The properties page offers a field labeled ''Tags'' where you can enter a comma-separated list of keywords. These keywords can then be used as targets for searching and executing those tests. + +!3 Searching for tags +If you hit the !style_code(Search) button, You will see a form that allows you to search for pages that certain attributes or tags. For example, you can search for all subpages that have the !style_code(Suite) property set, or all pages that are read-only, or that have the !style_code(Edit) button displayed. Most importantly, you can search for pages marked with tags. + +If you put a comma separated list of tags into the !style_code(Tags) input box, and then search, you will be shows a list of pages that are marked with any of those tags. Notice that if the pages are tests or suites, they have a link next to them that allows you to execute them. Also, look at the bottom and see the useful text that can be copied and pasted onto other pages in order to repeat the search or test the resulting pages. + +Using these tools, you can easily tag some tests as "smoke" tests, or "critical", or "fast". You can find all the "smoke" tests and run them, etc. + +!3 Using tags to select which tests to run. +The easiest way to execute tagged tests is to search for the tags as described in the previous section. Sometimes, though, you'd like to execute the tests via a RESTful service, or from the command line (using TestRunner). +You can execute the tests that match a tag by using the !style_code(suiteFilter) query parameter with a suite url like this: +!style_code(!-http://<host>:<port>/<suite path and test name>?responder=suite&suiteFilter=smoke,critical-!) + +If you want to execute all the tests in a suite except those with a particular tag (eg !-NotRunningOnHudson-!) then you use the !style_code(excludeSuiteFilter) query parameter: For example: +!style_code(!-http://<host>:<port>/<suite path and test name>?responder=suite&excludeSuiteFilter=NotRunningOnHudson-!) + +Typically, you will need only a few of such filtered suites, so it is suggested to build a link on the front page or so which contains the respective suite filter parameters. (If you simply click on the ''Suites'' button to run a suite, the !-suiteFilter-! is not set, so all tests in the respective subwiki are run.) + +!3 Executing test starting with a certain test. +Sometimes half the suite will run okay, but after a point all tests will start failing. In that case you can save time re-running the tests by stating which test you would like to start with. For instance: +!style_code(!-http://<host>:<port>/<suite path and test name>?responder=suite&startTest=TestTwo-!) will run all tests coming after !-TestTwo-! + +Remember, that the order tests run is alphabetical. So in the above example, !-TestThree-! will not run because !-TestTwo-! actually comes after !-TestThree-! \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/content.txt new file mode 100644 index 0000000000..9b51844669 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSuites/content.txt @@ -0,0 +1,13 @@ +!1 Suites of Tests +A suite is a collection of test pages that can all be run together, and whose results are then collected for you on a single results page, and in [[Test History][ + + + + + + + + + + + + 1238174950604 + -8493028553090165617 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSystems/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSystems/content.txt new file mode 100644 index 0000000000..423767c9fb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSystems/content.txt @@ -0,0 +1,11 @@ +!1 FitNesse Test Systems. +!img http://files/images/fitnesse_architecture.jpg + +This diagram shows how FitNesse works with the two Test Systems, [[Slim][SliM]], and [[Fit][FitFramework]]. + +FIT is the older of the two, and uses HTML. The HTML parsing is done on the SUT just prior to the fixtures being called. This means that there is a lot of code on the SUT. Over the years many different ports of FIT have been attempted, but because FIT is large, and because programmers always have better ideas the second and third time they implement something, the various FIT ports are quite inconsistent. This means that tests written on one platform won't work on another. + +Slim is newer. As the diagram shows, there is very code on the SUT. This is because all the table processing is done inside FitNesse, within the Slim runners. The Slim Executor and the fixtures are the only code that lives on the SUT. The Slim Executor is very small and easy to port. The Test pages are broken down into simple instructions by the Slim Runners. Those instructions are passed to the Slim Executor which directs the fixtures to call the SUT. This means that new features added to Slim Runners will not require changes on the Slim Executor, and that all test pages written for a Slim Runner will work on any different Slim platform. + +You can read about Slim [[here][SliM]]. +You can read about Fit [[here][FitFramework]]. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSystems/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSystems/properties.xml new file mode 100644 index 0000000000..2c2f5cb38b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestSystems/properties.xml @@ -0,0 +1,15 @@ + + + true + true + 20090327123009 + true + true + true + true + true + true + true + 1238175009151 + -6940628553317529561 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestTableStyles/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestTableStyles/content.txt new file mode 100644 index 0000000000..913188b3f9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestTableStyles/content.txt @@ -0,0 +1,9 @@ +!2 Different Table Styles for Different Purposes + +Each Test System has it's own particular kinds of Test Page Styles. + +|'''Test System'''|'''Link to Table Styles'''| +|slim|[[Slim table Styles][SliM]]| +|fit|[[Fit Table Styles][FitTableStyles]]| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestTableStyles/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestTableStyles/properties.xml new file mode 100644 index 0000000000..6fc3633e18 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TestTableStyles/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327123032 + true + + 1238175032997 + -5675885244320277271 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/content.txt new file mode 100644 index 0000000000..576a80b836 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/content.txt @@ -0,0 +1,31 @@ +{{{java.net.MalformedURLException: no protocol: null?responder=proxy&type=bones + java.net.URL.(URL.java:567) + java.net.URL.(URL.java:464) + java.net.URL.(URL.java:413) + fitnesse.wiki.ProxyPage.retrievePage(ProxyPage.java:51) + fitnesse.wiki.VirtualCouplingExtension.loadVirtualChildren(VirtualCouplingExtension.java:45) + fitnesse.wiki.VirtualCouplingExtension.detectAndLoadVirtualChildren(VirtualCouplingExtension.java:40) + fitnesse.wiki.VirtualCouplingExtension.getVirtualCoupling(VirtualCouplingExtension.java:33) + fitnesse.wikitext.widgets.TOCWidget.buildListOfChildPages(TOCWidget.java:269) + fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:164) + fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:150) + fitnesse.wikitext.widgets.TOCWidget.buildListItem(TOCWidget.java:190) + fitnesse.wikitext.widgets.TOCWidget.buildList(TOCWidget.java:165) + fitnesse.wikitext.widgets.TOCWidget.buildContentsDiv(TOCWidget.java:150) + fitnesse.wikitext.widgets.TOCWidget.render(TOCWidget.java:111) + fitnesse.wikitext.widgets.ParentWidget.childHtml(ParentWidget.java:70) + fitnesse.wikitext.widgets.WidgetRoot.render(WidgetRoot.java:92) + fitnesse.wiki.PageData.processHTMLWidgets(PageData.java:196) + fitnesse.wiki.PageData.getHtml(PageData.java:166) + fitnesse.responders.WikiPageResponder.generateHtml(WikiPageResponder.java:95) + fitnesse.responders.WikiPageResponder.makeHtml(WikiPageResponder.java:87) + fitnesse.responders.WikiPageResponder.makePageResponse(WikiPageResponder.java:70) + fitnesse.responders.WikiPageResponder.makeResponse(WikiPageResponder.java:45) + fitnesse.FitNesseExpediter.createGoodResponse(FitNesseExpediter.java:122) + fitnesse.FitNesseExpediter.makeResponse(FitNesseExpediter.java:105) + fitnesse.FitNesseExpediter.start(FitNesseExpediter.java:47) + fitnesse.FitNesseServer.serve(FitNesseServer.java:24) + fitnesse.FitNesseServer.serve(FitNesseServer.java:17) + fitnesse.socketservice.SocketService$ServerRunner.run(SocketService.java:88) + java.lang.Thread.run(Thread.java:613) +}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/properties.xml new file mode 100644 index 0000000000..c7b3e0506e --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/properties.xml @@ -0,0 +1,13 @@ + + + true + true + 20090327171601 + true + true + true + true + true + true + 1336490504060957026 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/content.txt new file mode 100644 index 0000000000..0dd9b13c43 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/content.txt @@ -0,0 +1,23 @@ +!2 Seeing How Long ActionFixture Actions Take: !-TimedActionFixture-! + +You can used !-TimedActionFixture-! if you want to see visual feedback on how long certain functions take to execute. + +|!-fit.TimedActionFixture-!| +|start|!-fitnesse.fixtures.DelayedCountFixture-!| +|check|counter|0| +|press|count| +|check|counter|1| +|press|count| +|check|counter|2| +|enter|counter|5| +|press|count| +|check|counter|6| + +The !-DelayedCountFixture-! used above simply adds a random delay to the ''count'' function. + +The !-TimedActionFixture-! does not report any delays that are less than one second. I don't know why Ward decided to impose this lower limit. Perhaps he'll remove it one day. + +This fixture does not appear to give you access to the time or the ''split''. It just displays them for your edification. + +!img http://files/images/runArrow.gif For more on ActionFixture see: DesigningWithActionFixture. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/properties.xml new file mode 100644 index 0000000000..b48113978c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/properties.xml @@ -0,0 +1,13 @@ + + + + 20081020135106 + + + + + + + + 1052336927152 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TodaysDate/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TodaysDate/content.txt new file mode 100644 index 0000000000..68eac2b753 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TodaysDate/content.txt @@ -0,0 +1,12 @@ +To diplay todays date: + +|!c '''Markup Text'''|!c '''Displayed as'''| +|!style_code(!-Today is !today.-!)|Today is !today.| +|!style_code(!-XML is !today -xml.-!)|XML is !today -xml.| +|!style_code[!-Right now it is !today -t.-!]|Right now it is !today -t.| +|!style_code[!-Tomorrow is !today +1.-!]|Tomorrow is !today +1.| +|!style_code[!-Last week was !today -7.-!]|Last week was !today -7.| +|!style_code[!-The month is !today (MMM).-!]|The month is !today (MMM).| + +As you can see, you can add or subtract days. You can include the time tiwh -t. And you can use your own format for the time. (See !style_code(!-SimpleDataFormat-!) for the syntax.) + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TodaysDate/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TodaysDate/properties.xml new file mode 100644 index 0000000000..15e5ccc7cc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TodaysDate/properties.xml @@ -0,0 +1,14 @@ + + + true + true + 20090315150821 + true + true + true + true + true + true + 1237147701126 + -776073001262686991 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/content.txt new file mode 100644 index 0000000000..9c18d85f59 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/content.txt @@ -0,0 +1,21 @@ +!2 Story 10: The 12 regular places are each assigned one of the 4 "regular" categories, in cyclical order. The Penalty Box has no question category, and the Winning Place has a "Winning" category. + +We expect the game to be created with all of its 12 regular places, and its penalty box and winning place all initialized. So without any setup, we ought to be able to ask what question category each place has: + + +!|org.fitnesse.triviaGameExample.fitnesseFixtures.BoardFixture| +|place|questionCategory?| +|0 |POP| +|1 |SCIENCE| +|2 |SPORTS| +|3 |ROCK| +|4 |POP| +|5 |SCIENCE| +|6 |SPORTS| +|7 |ROCK| +|8 |POP| +|9 |SCIENCE| +|10 |SPORTS| +|11 |ROCK| +|PenaltyBox|NULL| +|WinningPlace|WINNING| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/properties.xml new file mode 100644 index 0000000000..042ad3d711 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210232 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/content.txt new file mode 100644 index 0000000000..e1f96eb007 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/content.txt @@ -0,0 +1,11 @@ +!path C:\workspace\TriviaGameFitNesseExample\ + +!3 Shared Game Instance +As we discussed in !-FixtureCode-!, the test tables on a single page are state-dependent. In the case of the trivia game test pages, the state of the game changes as test tables are run. This is typical of the [[BOC][./FitNesse.BuildOperateCheck]] pattern of multi-test pages. + +As part of the ''Build'' phase for each test page in our suite of trivia game tests, here is a table that adds our two players, Al and Bertha, to the game: + +!| org.fitnesse.triviaGameExample.fitnesseFixtures.AddRemovePlayerFixture| +| playerName | addPlayer? | countPlayers? | +| Al | true | 1 | +| Bertha | true | 2 | diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/properties.xml new file mode 100644 index 0000000000..e8e7604d6d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135107 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/content.txt new file mode 100644 index 0000000000..2661a8f428 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/content.txt @@ -0,0 +1,31 @@ +!1 Java Version of the TriviaGameUserStories + +|TriviaGameUserStories.SetUp| + +!1 A Suite of Test Pages for Trivia Game User Stories +This page is a suite of test pages, each of which covers one of the user stories for a trivia game example. + +|^EachRegularPlaceHasaCategory|''Story 10: The 12 regular places are each assigned one of the 4 regular categories, in cyclical order.''| +|^StartingTheGame|''Stories 11,12,13: Once the game has started, players cannot be added or removed.''| +|^PlayersTakeTurnsInOrderAdded|''Story 14: Players take turns in the order in which they were added to the game''| +|^PlayerRollsDie|''Story 15: A player takes a turn by rolling a single 6-sided die, and moving that many places''| +|^AskPlayerQuestion|''Story 16: When a player lands on a place, they are asked a trivia question from that place's category.'' | +|^PlayerGetsGoldCoin|''Story 17: If a player answers a question correctly, they get a Gold Coin.''| +|^PutPlayerInPenaltyBox|''Story 18: If a player answers a question incorrectly, they go to the Penalty Box.''| +|^PlayerInPenaltyBoxRollsAgain|''Story 19: When a player is in a Penalty Box and their turn comes around, they roll the die again.''| +|^PlayerLeavesPenaltyBoxOnOddRoll|''Story 20: If a player rolls an odd number, they leave the Penalty Box and go to the place from which they went to the Penalty Box, plus the odd number they rolled.''| +|^PlayerStaysInPenaltyBoxOnEvenRoll|'' Story 21: If a player in the Penalty Box rolls an even number, they stay in the Penalty Box for another turn.''| +|^ThreeEvenRollsInPenaltyBoxGetsOut|''Story 22: If a player in the Penalty Box rolls three even numbers in three turns, they get to return to the place from which they went to the Penalty Box.''| +|^SixGoldCoinsPutsYouInWinningPlace|''Story 23 & Story 24: When a player collects 6 Gold Coins, they go immediately to the Winning Place. ''| +|^PlayerAskedWinningQuestion|''Story 25: When a player’s turn comes around again in the Winning Place, they are asked a special Winning Category question.''| +|^PlayerWinsGame|''Story 26: If the player answers a Winning Question correctly, they win the game.''| +|^WrongWinningAnswerGoesToPenaltyBox|''Story 27: If the player answers a Winning Question incorrectly, they go to the Penalty Box as usual.''| + + + + + + + +|TriviaGameUserStories.TearDown| + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/properties.xml new file mode 100644 index 0000000000..e8e7604d6d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135107 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/content.txt new file mode 100644 index 0000000000..c0b5f8f67d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/content.txt @@ -0,0 +1,5 @@ +|''If you see exceptions in the tables.''|!c ExceptionsInFitTables| +|''If you see an ATTENTION message.'' |!c AttentionMessagesInTestResults| +|''If you want to debug a table.'' |!c DebuggingFitNesseTables| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/properties.xml new file mode 100644 index 0000000000..042ad3d711 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/properties.xml @@ -0,0 +1,7 @@ + + + + 20060717210232 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/TwoMinuteExample/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TwoMinuteExample/content.txt new file mode 100644 index 0000000000..39a6574452 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/TwoMinuteExample/content.txt @@ -0,0 +1,59 @@ +!*< Hidden +!define TEST_SYSTEM {slim} +*! +[[A One-Minute Description][OneMinuteDescription]] +!1 An Example !-FitNesse-! Test +If you were testing the division function of a calculator application, you might like to see some examples working. You might want to see what you get back if you ask it to divide 10 by 2. (You might be hoping for a 5!) + +In FitNesse, tests are expressed as tables of '''input''' data and '''expected output''' data. Here is one way to specify a few division tests in FitNesse: + +|eg.Division| +|numerator|denominator|quotient?| +|10 |2 |5.0 | +|12.6 |3 |4.2 | +|22 |7 |~=3.14 | +|9 |3 |<5 | +|11 |2 |4<_<6 | +|100 |4 |33 | + +This style of FitNesse test table is called a [[Decision Table][SliM.DecisionTable]], each row represents a complete scenario of example inputs and outputs. Here, the "numerator" and "denominator" columns are for inputs, and the question mark in the "quotient?" column tells FitNesse that this is our column of expected outputs. Notice our "10/2 = 5.0" scenario. Try reading it as a question: ''"If I give you a numerator of 10 and denominator of 2, do I get back a 5?"'' +!3 Running our test table: Click the Test button +Before we do another thing, let's run this test table. See the little blue and white '''Test''' button in the upper-left, just below the !-FitNesse-! logo? Click it and see what happens. + +Ah, color! In the green cells, we got back the expected values from our code. When we divided 10 by 2, we expected and got back 5. When we divided 12.6 by 3, we expected and got back 4.2. + +What about red? A cell turns red when we get back a different value than what we expected. We also see two values: the '''expected''' value and the '''actual''' value. Above we expected 33 back when we divided 100 by 4, but we got back 25. Ah, a flaw in our test table. That happens! + +Notice also the comparisons. 22/7 is approximately equal (~=) to 3.14. 9/3 is less than 5. 11/2 is between 4 and 6. + +!3 Creating the Table +How did we put that test table on this page in the first place? Well, we used FitNesse itself to do it! + +FitNesse is a [[wiki][http://wiki.org/wiki.cgi?WhatIsWiki]], which is a style of web server that allows any visitor to make any edits, including changing existing pages and creating new pages. A simple markup language lets you easily create headings, make text bold, underline, and italic, create bulleted lists, and do other kinds of simple formatting. You can read more about it on EditingFitNessePages. + +Once you download FitNesse to your own computer, you can edit any page simply by clicking on the Edit button on the left (just below the Test button). If you are reading this page on your own copy of FitNesse on your own machine, you can click the Edit button and see for yourself. (To learn more, see DownloadingAndInstallingFitNesse.) + +The wiki markup for our table above (with some omissions) looks like this: {{{ +|eg.Division| +|numerator|denominator|quotient?| +|10 |2 |5 | +|12.6 |3 |4.2 | +|100 |4 |33 | }}} +The vertical bars delimit table cells. For this table, there is not much more too it than that. You don't have to line up the vertical bars this way; we just do it to make it easier to read. + +Note that if you don't like mucking about with a markup language at all, you can create your test tables in a spreadsheet such as Excel, copy them to the clipboard, and use the '''Spreadsheet to Fitnesse''' button on the Edit page to have FitNesse format your table properly for you. + +'''Note''' also that if you change "eg.Division" to any other name, you may need to use a ! before the fixture to avoid confusing FitNesse with [[!-WikiWord-!][WikiWord]]s (see MarkupTable) + +!3 Organizing Tests +FitNesse test tables live on test pages (such as this one). There are several TestTableStyles. As your sets of test pages grows, you can organize them into hierarchical TestSuites. + +!2 Learning More +!3 You Have Choices! +How shall you spend the next few minutes? It's up to you. +!3 More Technical Detail... +If you are more interested in learning how to create the code that makes test tables work, see FixtureCode. If you want to start diving into installing and running FitNesse, check out DownloadingAndInstallingFitNesse. +!3 More Usage Detail... +If you are more interested in why and how to get teams to use FitNesse, see AcceptanceTests. If you want to learn how to create and run FitNesse tests, check out EditingFitNessePages, CreatingTestTables, and TestTableStyles. +!3 Or Take Your Own Path +Finally, if you want to zoom back out and look at all of the FitNesse topics, check out the table of contents on the + + + 20090326134049 + + true + + + + + + 1238092849129 + -8522914120834285308 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/VariableScope/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/VariableScope/content.txt new file mode 100644 index 0000000000..724ba2aef2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/VariableScope/content.txt @@ -0,0 +1,7 @@ +Variable are in scope if they are defined on the page in question or in somewhere in the parent hierarchy of the page in question. + +For example, lets say the variable we are interested in is X. + * If X is defined on this page then it is definately in scope. + * If X is not defined on this page but is defined in the page .FitNesse (this page's parent), then X is still in scope. + * If X is defined on .FitNesse.UserGuide then X is not in scope because .FitNesse.UserGuide is not a parent of this page. + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/VariableScope/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/VariableScope/properties.xml new file mode 100644 index 0000000000..b8f0ed77aa --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/VariableScope/properties.xml @@ -0,0 +1,11 @@ + + + + 20081020135105 + + + + + + 1050694178427 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/content.txt new file mode 100644 index 0000000000..573b4e6969 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/content.txt @@ -0,0 +1,17 @@ +!2 What Is FitNesse? + * FitNesse is a collaborative testing and documentation tool. + * It provides a ''very simple'' way for teams to: + * collaboratively create documents, + * specify tests, + * and run those tests. + + * FitNesse is a web server. + * It requires '''no configuration or setup'''. + * Just run it and then direct your browser to the machine where it is running. + + * FitNesse is a wiki. + * You can ''easily'' create: + * New Documents and pages. + * Hyperlinks + * Lists + * Tables diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/properties.xml new file mode 100644 index 0000000000..d8da37fa38 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135117 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhereUsed/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhereUsed/content.txt new file mode 100644 index 0000000000..6a8629962a --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhereUsed/content.txt @@ -0,0 +1 @@ +If you click on the name of the page, !-FitNesse-! will print a list of every page that references that page. Try it by clicking on !-WhereUsed-! above. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhereUsed/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhereUsed/properties.xml new file mode 100644 index 0000000000..b024bce208 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WhereUsed/properties.xml @@ -0,0 +1,7 @@ + + + + 20090228113827 + true + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiImport/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiImport/content.txt new file mode 100644 index 0000000000..976b94f4f4 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiImport/content.txt @@ -0,0 +1,16 @@ +!3 What is WikiImport? +WikiImport is a feature that allows you to import an entire wiki or subwiki from another FitNesse site. All of the pages from the remote wiki will be copied to your local FitNesse installation and become part of your local wiki. + +!3 Why should I use WikiImport? +In a development environment it is most practical to have a main FitNesse server where all the tests are maintained and new tests are added. However, it is not practical for all the developers to run the tests on one server. Therefore each developer should have a FitNesse installation in their development environment. The test pages from the main server get imported by each developer so they can execute the most recent tests against their current code base. + +!3 How do I use WikiImport? +Create a page or use an existing page that will contain the imported wiki. Open the ''properties'' view of this page. There is a form title Wiki Import. Supply the URL to the remote wiki that you'd like to import and submit the form. This will take you to an import view where you will see all the imported pages being listed. It may take a few moments for the import to complete. You will know it's complete when the bottom of the page is visible and ends with an imported page count. + +Once a wiki has been imported, it may be updated at any time. Simple open the ''properties'' view of the importing page or any imported page. There will be a button in the '''Import Wiki''' section. Clicking this button initiate an update of all the imported pages beneath the currently selected page. + +!3 New Edit Buttons +Once you have imported a wiki, the '''Edit''' button will be turned off and two new edit buttons will be added: '''Edit Locally''' and '''Edit Remotely'''. '''Edit Locally''' behaves just like the '''Edit''' button that you've used all along. '''Edit Remotely''' allows you to easily edit the page from where the content is being imported. + +!3 Automatic Update Option +In the WikiImport section of the ''properties'' page, you'll see a check box that says: "Automatically update imported content when executing tests". Enabling this option will kick off an update for any test page prior to execution. Child pages will inherit this option from parent pages, which means you need only set on the root of you test hierarchy. \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiImport/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiImport/properties.xml new file mode 100644 index 0000000000..640395d2de --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiImport/properties.xml @@ -0,0 +1,9 @@ + + + + 20080617162634 + + + 1213737994217 + -6982862784974797638 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiWord/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiWord/content.txt new file mode 100644 index 0000000000..b3109e89a5 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiWord/content.txt @@ -0,0 +1,10 @@ +The syntax of a wiki word is ''Camel Case'': an alternating pattern of upper and lower case letters. Strictly speaking a wiki word is a string of two more more capital letters with lower case letters or numbers between them. + + * '''!-BobMartin-!''' is a wiki word. + * '''!-SalesReport1972-!''' is a wiki word. + * '''!-USAforEver-!''' is not, because there are two capitals in a row. + * '''!-Usa1776-!''' is not because there is only one capital. + * '''!-RcM-!''' is a wiki word because it is two or more capitals separated by lower case letters. + * '''!-ItDoesNotMatterHowManyCapitalsThereAreYouCanHave1000IfYouLike-!''' is a wiki word with lots of capitals. +---- +!note The Java Regular expression that we are using to represent a wiki word is: {{{\b[A-Z](?:[a-z0-9]+[A-Z][a-z0-9]*)+}}} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiWord/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiWord/properties.xml new file mode 100644 index 0000000000..34ce5f2541 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WikiWord/properties.xml @@ -0,0 +1,9 @@ + + + + 20090327123919 + + + 1238175559465 + -419557567139808752 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/content.txt new file mode 100644 index 0000000000..258d3f7053 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/content.txt @@ -0,0 +1,7 @@ +!2 Working with Wiki Pages +|!c '''Operations'''| +|[[Page Properties][PageProperties]]|''Enabling and disabling page properties (also called attributes).''| +|[[Headers and footers][MarkupHeaderAndFooter]]|''Specifying Headers and Footers for wiki pages''| +|[[Refactoring pages][RefactoringWikiPages]]|''Renaming, moving, and deleting existing pages.''| +|[[Where Used][WhereUsed]]|''Finding out which pages reference the current page.''| +|ShortcutKeys|''The shortcuts for the buttons.''| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/properties.xml new file mode 100644 index 0000000000..ad5e21ac90 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/properties.xml @@ -0,0 +1,7 @@ + + + + 20081020135130 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/content.txt new file mode 100644 index 0000000000..1b4280353d --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/content.txt @@ -0,0 +1,6 @@ +SuiteGames +SuiteTiming + +SetUp + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/properties.xml new file mode 100644 index 0000000000..fdf2bc33b1 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/properties.xml @@ -0,0 +1,7 @@ + + + + 20081102091343 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/content.txt new file mode 100644 index 0000000000..5258ed77c9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/content.txt @@ -0,0 +1,2 @@ +|Import| +|eg.bowling.fixtures| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/properties.xml new file mode 100644 index 0000000000..4b014efca0 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/properties.xml @@ -0,0 +1,7 @@ + + + + 20081102091342 + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/content.txt new file mode 100644 index 0000000000..9ce2c1b46c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/content.txt @@ -0,0 +1,14 @@ +Rules of bowling. + +Spare: 10 + next ball. +Strike: 10 + next two balls. +Otherwise sum of two balls in frame. + +|Final score| +|1|4|3|7|5|2|10|10|5|5|3|2|1|0|7|1|5|5|3|||112| + +|Final score| +|10|10|10|10|10|10|10|10|10|10|10|10||||||||||300| + +|Final score| +|10|10|10|10|10|10|10|10|10|10|10|9||||||||||299| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/properties.xml new file mode 100644 index 0000000000..e062bc0a97 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124332 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/content.txt new file mode 100644 index 0000000000..48415e41bb --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/content.txt @@ -0,0 +1,13 @@ +|Simple score game.| +|1|4|3|7|5|2|10|10|5|5|3|2|1|0|7|1|5|5|3||| +|5|20|27|52|72|85|90|91|99|112| + +|Simple score game.| +|10|10|10|10|10|10|10|10|10|10|10|10|||||||||| +|30|60|90|120|150|180|210|240|270|300| + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/properties.xml new file mode 100644 index 0000000000..2b60f3d089 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124354 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/content.txt new file mode 100644 index 0000000000..8c4fd63f80 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/content.txt @@ -0,0 +1,13 @@ +|Score game.| +|1-1|1-2|2-1|2-2|3-1|3-2|4-1|4-2|5-1|5-2|6-1|6-2|7-1|7-2|8-1|8-2|9-1|9-2|10-1|10-2|10-3| +| 1 | 4 | 3 | / | 5 | 2 | | X | | X | 5 | / | 3 | 2 | 1 | 0 | 7 | 1 | 5 | / | 3 | +|| 5 || 20|| 27|| 52|| 72|| 85|| 90|| 91|| 99|| 112| | + +|Score game.| +|1-1|1-2|2-1|2-2|3-1|3-2|4-1|4-2|5-1|5-2|6-1|6-2|7-1|7-2|8-1|8-2|9-1|9-2|10-1|10-2|10-3| +| | X | | X | | X | | X | | X | | X | | X | | X | | X | X | X | X | +|| 30|| 60|| 90|| 120|| 150|| 180|| 210|| 240|| 270|| 300| | + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/properties.xml new file mode 100644 index 0000000000..01a48332fd --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124405 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/content.txt new file mode 100644 index 0000000000..33c0fd5a2c --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/content.txt @@ -0,0 +1,3 @@ +^TestFinalScores +^TestGames +^TestGamesWithFancyFixture diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/properties.xml new file mode 100644 index 0000000000..4a09c763f3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124418 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/content.txt new file mode 100644 index 0000000000..366464b08b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/content.txt @@ -0,0 +1,17 @@ +|Game timing.| +|pins|roll()|currentFrame()|currentBall()|scorableFrame()|currentScore()|validGame()|gameOver()| +| - | | 1 | 1 | 0 | 0 | true | false | +| 10 | | 2 | 1 | 0 | 0 | true | false | +| 10 | | 3 | 1 | 0 | 0 | true | false | +| 10 | | 4 | 1 | 1 | 30 | true | false | +| 10 | | 5 | 1 | 2 | 60 | true | false | +| 10 | | 6 | 1 | 3 | 90 | true | false | +| 10 | | 7 | 1 | 4 | 120 | true | false | +| 10 | | 8 | 1 | 5 | 150 | true | false | +| 10 | | 9 | 1 | 6 | 180 | true | false | +| 10 | | 10 | 1 | 7 | 210 | true | false | +| 10 | | 10 | 2 | 8 | 240 | true | false | +| 10 | | 10 | 3 | 9 | 270 | true | false | +| 10 | | 10 | 0 | 10 | 300 | true | true | + +|Summary| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/properties.xml new file mode 100644 index 0000000000..24e873a69b --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124514 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/content.txt new file mode 100644 index 0000000000..c173d5d652 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/content.txt @@ -0,0 +1,25 @@ +|Game timing.| +|pins|roll()|currentFrame()|currentBall()|scorableFrame()|currentScore()|validGame()|gameOver()| +| - | | 1 | 1 | 0 | 0 | true | false | +| 0 | | 1 | 2 | 0 | 0 | true | false | +| 0 | | 2 | 1 | 1 | 0 | true | false | +| 0 | | 2 | 2 | 1 | 0 | true | false | +| 0 | | 3 | 1 | 2 | 0 | true | false | +| 0 | | 3 | 2 | 2 | 0 | true | false | +| 0 | | 4 | 1 | 3 | 0 | true | false | +| 0 | | 4 | 2 | 3 | 0 | true | false | +| 0 | | 5 | 1 | 4 | 0 | true | false | +| 0 | | 5 | 2 | 4 | 0 | true | false | +| 0 | | 6 | 1 | 5 | 0 | true | false | +| 0 | | 6 | 2 | 5 | 0 | true | false | +| 0 | | 7 | 1 | 6 | 0 | true | false | +| 0 | | 7 | 2 | 6 | 0 | true | false | +| 0 | | 8 | 1 | 7 | 0 | true | false | +| 0 | | 8 | 2 | 7 | 0 | true | false | +| 0 | | 9 | 1 | 8 | 0 | true | false | +| 0 | | 9 | 2 | 8 | 0 | true | false | +| 0 | | 10 | 1 | 9 | 0 | true | false | +| 0 | | 10 | 2 | 9 | 0 | true | false | +| 0 | | 10 | 0 | 10 | 0 | true | true | + +|Summary| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/properties.xml new file mode 100644 index 0000000000..8b0c58eb9f --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124437 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/content.txt new file mode 100644 index 0000000000..d5c7cfd9a9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/content.txt @@ -0,0 +1,25 @@ +|Game timing.| +|pins|roll()|currentFrame()|currentBall()|scorableFrame()|currentScore()|validGame()|gameOver()| +| - | | 1 | 1 | 0 | 0 | true | false | +| 1 | | 1 | 2 | 0 | 0 | true | false | +| 2 | | 2 | 1 | 1 | 3 | true | false | +| 3 | | 2 | 2 | 1 | 3 | true | false | +| 4 | | 3 | 1 | 2 | 10 | true | false | +| 5 | | 3 | 2 | 2 | 10 | true | false | +| 4 | | 4 | 1 | 3 | 19 | true | false | +| 3 | | 4 | 2 | 3 | 19 | true | false | +| 2 | | 5 | 1 | 4 | 24 | true | false | +| 1 | | 5 | 2 | 4 | 24 | true | false | +| 0 | | 6 | 1 | 5 | 25 | true | false | +| 1 | | 6 | 2 | 5 | 25 | true | false | +| 2 | | 7 | 1 | 6 | 28 | true | false | +| 3 | | 7 | 2 | 6 | 28 | true | false | +| 4 | | 8 | 1 | 7 | 35 | true | false | +| 5 | | 8 | 2 | 7 | 35 | true | false | +| 4 | | 9 | 1 | 8 | 44 | true | false | +| 3 | | 9 | 2 | 8 | 44 | true | false | +| 2 | | 10 | 1 | 9 | 49 | true | false | +| 1 | | 10 | 2 | 9 | 49 | true | false | +| 0 | | 10 | 0 | 10 | 50 | true | true | + +|Summary| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/properties.xml new file mode 100644 index 0000000000..392fa386ea --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124449 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/content.txt new file mode 100644 index 0000000000..983cc30960 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/content.txt @@ -0,0 +1,24 @@ +|Game timing.| +|pins|roll()|currentFrame()|currentBall()|scorableFrame()|currentScore()|validGame()|gameOver()| +| - | | 1 | 1 | 0 | 0 | true | false | +| 5 | | 1 | 2 | 0 | 0 | true | false | +| 5 | | 2 | 1 | 0 | 0 | true | false | +| 3 | | 2 | 2 | 1 | 13 | true | false | +| 2 | | 3 | 1 | 2 | 18 | true | false | +| 7 | | 3 | 2 | 2 | 18 | true | false | +| 3 | | 4 | 1 | 2 | 18 | true | false | +| 10 | | 5 | 1 | 3 | 38 | true | false | +| 5 | | 5 | 2 | 3 | 38 | true | false | +| 5 | | 6 | 1 | 4 | 58 | true | false | +| 10 | | 7 | 1 | 5 | 78 | true | false | +| 3 | | 7 | 2 | 5 | 78 | true | false | +| 4 | | 8 | 1 | 7 | 102 | true | false | +| 5 | | 8 | 2 | 7 | 102 | true | false | +| 4 | | 9 | 1 | 8 | 111 | true | false | +| 3 | | 9 | 2 | 8 | 111 | true | false | +| 5 | | 10 | 1 | 9 | 119 | true | false | +| 5 | | 10 | 2 | 9 | 119 | true | false | +| 5 | | 10 | 3 | 9 | 119 | true | false | +| 5 | | 10 | 0 | 10 | 134 | true | true | + +|Summary| diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/properties.xml new file mode 100644 index 0000000000..47d757f7a2 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124502 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/content.txt new file mode 100644 index 0000000000..ccc53a2551 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/content.txt @@ -0,0 +1,5 @@ +^TestGutterGameTiming +^TestNoMarksTiming +^TestSpareAndStrikeTiming +^PerfectGameTiming + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/properties.xml new file mode 100644 index 0000000000..cb289bedfc --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124631 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/content.txt new file mode 100644 index 0000000000..e12986fdff --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/content.txt @@ -0,0 +1,3 @@ +The Bowling Game is a simple sample project showing acceptance testing. + +^FrontPage diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/properties.xml new file mode 100644 index 0000000000..d800e7ed23 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/properties.xml @@ -0,0 +1,10 @@ + + + + + 20090327124555 + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/content.txt new file mode 100644 index 0000000000..78091d0024 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/content.txt @@ -0,0 +1,26 @@ +The name of a ''fitnesse test page'' begins with '''"Test"''', or has the '''Test''' attribute set. See [[Page Attributes][PageProperties]]. This makes sure that the page will have a '''Test''' button. + +''Fitnesse tests'' are written in ''Fit'' format (http://fit.c2.com ). This format is very simple. The page can contain any text at all. Any tables that exist on the page will be interpreted by ''Fit''. + +A ''Fit'' table begins with a row that contains the classname of the test fixture that will interpret the rest of the table. Usually you write these test fixtures. There are a number of test fixture base classes that make writing these fixtures very simple. + +The rest of the rows in a ''Fit'' table have formats that are determined by the fixture. + +|!c !3 Fixtures and Examples| +|TableFixture|''A simple fixture for dealing with static tables of data.''| +|ColumnFixture|''Each row loads a data structure and then invokes functions upon it.''| +|RowEntryFixture|''A special case of ColumnFixture for processing rows of data.''| +|RowFixture|''Allows you to match all the rows from a simple query, independent of order.''| +|ActionFixture|''A fixture that allows you write a script that emulates a user interface.''| +|.| +|ParametersInFixtures|''Allows you to pass arguments into any Fixture.''| +|SymbolsInTestTables|''Allows you to store outputs fromm one fixture and use them as inputs to another.''| +|KeywordsInTestTables|''There are certain keywords that can be used in fixtures. I.e. null and blank''| +|DataTypesInFixtures|''There are several data types that can be used in fixtures.''| +|[[Graceful Names][GracefulName]]|''Managing the names of fixtures, packages, and variables''| +|[[Comment Tables][CommentTables]]|''Sometimes you want a table in a test, that is not part of the test, but is just a comment''| +|.| +|[[Payroll Example][PayrollTests]]|''An example using ColumnFixture''| +|^BowlingGameProject|''A simple example of some custom acceptance tests.''| + + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/properties.xml b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/properties.xml new file mode 100644 index 0000000000..956a5eeb67 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/WritingFitTables/properties.xml @@ -0,0 +1,12 @@ + + + + 20090327124209 + + + + + + 1238175729166 + -404914652185593072 + diff --git a/fitnesse/FitNesseRoot/FitNesse/UserGuide/content.txt b/fitnesse/FitNesseRoot/FitNesse/UserGuide/content.txt new file mode 100644 index 0000000000..1822757975 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/UserGuide/content.txt @@ -0,0 +1,102 @@ +!1 !c FitNesse User Guide +!c Robert C. Martin +!c Micah D. Martin +!c Patrick Wilson-Welsh +!c October, 2008 +---- +!2 Getting Started +What FitNesse is, a brief example, and how to install it on your computer. +|[[A One-Minute Description][>OneMinuteDescription]]|''What is FitNesse? Start here.''| +|[[A Two-Minute Example][>TwoMinuteExample]]|''A brief example. Read this one second.''| +|[[Downloading, Installing, and Updating][>DownloadingAndInstallingFitNesse]]|''How to get FitNesse up and running on your machine.''| +|[[Quick Reference Guide][>QuickReferenceGuide]]|''A cheat sheet for markups and usage.''| + +---- +!2 Working With FitNesse Wiki Pages +FitNesse is a [[wiki web server][http://wiki.org/wiki.cgi?WhatIsWiki]]. Learn how to use wiki features to create and change FitNesse pages. + +FitNesse is an application testing suite that allows you to test the business layer of your application. + +It is not a browser automation tool, although there are such tools that work with FitNesse. + +It is not a unit testing tool. The tests that FitNesse runs integrate the various layers of your application together, demonstrating even to non-coders that the application works as designed. + +It is an ''integration testing tool''. That means that it provides a method to automatically determine that your application is working correctly. Not your beautiful user interface, with all its fancy CSS and slick Ajax calls, but the stuff underneath, where the actual brains of the application live. + +The goal is for FitNesse to operate at a level just ''below'' the user interface level, demonstrating that, given various inputs to your application, the correct results are returned. In a sense, you could consider it an alternative user interface for the application. + +FitNesse provides an easy-to-use [[wiki][http://wiki.org/wiki.cgi?WhatIsWiki]] to create web pages that are run as tests. Test pages have a button on them allowing all the tests on the page to be run, so any user can go to that page and click the button at any time, and see if the tests are passing. Also, FitNesse provides means to automatically run tests, so it can be easily added to your automated build scripts. + +So what does a test page look like? Each page that has tests will consist of a series of HTML tables. Fitnesse understands various formats of tables, and if those formats are not sufficient, developers are welcome to add additional ones. Generally, the tables take the basic form of a Command cell and some Parameter cells, which are followed by some Output cells. When a test is run, the command and parameters are evaluated to see if the correct output is given. [[Here's a quick example][>TwoMinuteExample]] to get you started. + +Now, if you're reading this on the web site, you probably found that the Fitnesse Test button in that example didn't work as advertised. It's been disabled to minimize stress on the site. But that's ok - since among other things, Fitnesse is a wiki, you can simply download and run it, and read these same web pages as served up by your local system. When you do that, you'll be able to run the tests. Why not [[download it now][>DownloadingAndInstallingFitNesse]]? + +!3 Creating the Table +Okay, so you saw what Fitnesse can do. You ran a test with some inputs, checked to make sure the outputs were as expected, and saw how easy it was to determine whether the application worked correctly or not. Now you'd like to create some tests of your own. How do you do it? + +If you go back and edit the [[Example page][>TwoMinuteExample]], you'll see some wiki markup that looks like this: {{{ +|eg.Division| +|numerator|denominator|quotient?| +|10 |2 |5 | +|12.6 |3 |4.2 | +|100 |4 |33 | }}} + +The vertical bars delimit table cells. For this table, there is not much more too it than that. You don't have to line up the vertical bars this way; we just do it to make it easier to read. Go ahead and modify this page a little. Add some extra rows with some additional numbers to test, or change some of the numbers around. Then save the page, and click the Test button. You'll see how the system is set up to show successes and failures ''each time you run the test''. This ability to modify a test and immediately see the result is a big benefit of having integration tests. + +If you'll be spending a lot of time writing tests, you'll probably want to study these tips for using the wiki: + +|[[Editing !-FitNesse-! Pages][>EditingFitNessePages]]|''An intro to creating and changing FitNesse pages using the wiki markup language.''| +|[[Working with Wiki Pages][>WorkingWithWikiPages]]|''More FitNesse wiki page features.''| +|[[Markup Language Reference][>MarkupLanguageReference]]|''A reference for formatting FitNesse pages using the wiki markup language.''| +|[[Sub Wikis][>SubWiki]]|''How to create hierarchies of FitNesse pages.''| +|[[Special Wiki Functions][>SpecialWikiFunctions]]|''Special things you can do with wikis.''| +|[[Wiki Import][>WikiImport]]|''Importing wiki pages from a remote FitNesse server.''| +|[[Symbolic Links][>SymbolicLinks]]|''Dynamically altering the wiki page structure.''| +|[[Special Pages][>SpecialPages]]|''Some pages in FitNesse that serve special purposes.''| +|[[Quick Reference Guide][>QuickReferenceGuide]]|''A cheat sheet for markups and usage.''| + +!3 Creating the Fixtures + +The task of actually making the test ''pass'' is going to fall to a developer, presumably one who knows a little about the feature of the application that we're interested in. Going back to the Division example, let's pretend that the actual application has a web page containing two input boxes that accept numbers, and a Submit button. When the user clicks Submit, the application will divide the two numbers and show the result on the page. + +Again, we're not interested in testing the user interface. We're not interested in making sure that the input boxes only accept digits, for example - we're strictly concerned with the business logic. We have some code that accepts two numbers as inputs, divides them, and returns the result. That's the code we're interested in. + +So our goal is to write this code in such a way that it can be called from either the web page UI or the FitNesse table UI. (If we've done that properly, we could even easily expand our product line by adding an iPhone UI, for example, or a console application.) + +But how do we get from an HTML table to our code? Well, FitNesse provides a set of classes called Fixtures. Depending on the organization of the input and output cells, various fixtures translate the data in the cells to class properties. The application developer will derive a class from one of the fixtures, and make a call inside a fixture method to the business logic. [[Here's][>FixtureCode]] a more detailed walkthrough of the process. + +Of course, there's plenty more to know. If you have an existing application, you'll want to [[Tell FitNesse where to find it][>ClassPath]]. If you don't think the HTML table matches up well to your application, you might be interested in a different [[Test Table Style][>TestTableStyles]]. If you do change the style, you'll probably want to look through the [[Fixture Gallery][>FixtureGallery]] to determine which fixture is most appropriate to use. And, of course, developers always need to know [[How to debug the fixtures][>DebugingFixtureCode]]. + +And continue on below to learn more! + +!2 Tutorial: Creating and Organizing Acceptance Tests +Acceptance tests are what FitNesse is about. Learn why and how to make, run, and organize them. +|[[Project Death by Requirements][>ProjectDeathByRequirements]]|''Why use automated acceptance tests? What goes wrong when we don't use them?''| +|[[Test Systems][>TestSystems]]|''[[Slim][>SliM]] and [[Fit][>FitFramework]], the two major test systems of FitNesse.''| +|[[Acceptance Tests][>AcceptanceTests]]|''What are the advantages of FitNesse automated acceptance tests?''| +|[[Delivering the Right System][>DeliveringTheRightSystem]]|''An intro to how software teams can use FitNesse to build better systems.''| +|[[Creating Test Tables][>CreatingTestTables]]|''Creating and enabling test tables on FitNesse pages.''| +|[[Graceful Names][>GracefulName]]|''Managing the names of fixtures, packages, and variables.''| +|[[Test Table Styles][>TestTableStyles]]|''The different styles and uses of test tables and corresponding fixtures.''| +|[[Test Suites][>TestSuites]]|''How to group many test pages into a suite; then tag, search, and execute them.''| +|[[Acceptance Test Patterns][>AcceptanceTestPatterns]]|''Some patterns we have seen emerge while writing FitNesse [[Acceptance Tests][>AcceptanceTests]].''| +|[[Test History][>TestHistory]]|''The results of all test runs are recorded. You can access and display those results at any time.''| + +!2 Tutorial: FitNesse Fixtures +|[[Fixture Code][>FixtureCode]]|''An intro to the fixture code that lets you run FitNesse tables.''| +|[[Class Path][>ClassPath]]|''Telling FitNesse where your Fixture Code is.''| +|[[Test Table Styles][>TestTableStyles]]|''The styles of FitNesse test tables, and corresponding Fixture Code they use.''| +|[[Fixture Gallery][>FixtureGallery]]|''A walk through of the various Fit Fixtures.''| +|[[Debuging Fixture Code][>DebugingFixtureCode]]|''How to debug the testing code.''| + +!2 FitNesse for Integrators +|[[Source Code Control][>SourceCodeControl]]|''How to create a plugin for marrying !-FitNesse-! to your SCM system.''| +|[[Customizing Test Execution][>CustomizingTestExecution]]|''Modify the way tests are executed.''| +|[[Multi-Language Fitnesse][>MultiLanguageFitNesse]] |''Using fixtures written in programming languages other than Java.''| +|[[Executing Tests from Outside The UI][>ExecutingTestsOutsideTheUserInterface]]|''How to run tests from IDEs, commandline and build scripts.''| +|[[Plugin Usage][>PluginUsage]]|''How to create and use plugins.''| +Several plugins for FitNesse are available at http://www.fitnesse.org/FrontPage.PluginsPage. + +!2 Miscellaneous +|[[Design Notes][>DesignNotes]]|''Various articles and discussions on the design of FitNesse.''| +|[[!-FitNesse-! Tests][ + + + + + + + + + + + + + 1238192174455 + -6165030170622598997 + diff --git a/fitnesse/FitNesseRoot/FitNesse/content.txt b/fitnesse/FitNesseRoot/FitNesse/content.txt new file mode 100644 index 0000000000..2d09a2b9d9 --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/content.txt @@ -0,0 +1,29 @@ +|!c !2 Contents| +|!contents -g| + +!path fitnesse.jar +!path classes + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/FitNesse/properties.xml b/fitnesse/FitNesseRoot/FitNesse/properties.xml new file mode 100644 index 0000000000..fb047448ba --- /dev/null +++ b/fitnesse/FitNesseRoot/FitNesse/properties.xml @@ -0,0 +1,9 @@ + + + + + true + + + + diff --git a/fitnesse/FitNesseRoot/FrontPage/CommonTests/content.txt b/fitnesse/FitNesseRoot/FrontPage/CommonTests/content.txt new file mode 100644 index 0000000000..f0e96e5bbc --- /dev/null +++ b/fitnesse/FitNesseRoot/FrontPage/CommonTests/content.txt @@ -0,0 +1 @@ +!contents \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FrontPage/CommonTests/properties.xml b/fitnesse/FitNesseRoot/FrontPage/CommonTests/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/FrontPage/CommonTests/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/FrontPage/content.txt b/fitnesse/FitNesseRoot/FrontPage/content.txt new file mode 100644 index 0000000000..2d5e0dad06 --- /dev/null +++ b/fitnesse/FitNesseRoot/FrontPage/content.txt @@ -0,0 +1,17 @@ +!1 Welcome to !-GlobalQSS-! !-ADempiere-! [[FitNesse][FitNesse.FitNesse]]! +!3 ''The fully integrated stand-alone acceptance testing framework and wiki.'' + +# Here is a good place to add your first page (WikiWord). For example, MyTopLevelApplicationPage + +Suites: +IdempiereSuite +AvgCostSuite + + +| '''To Learn More...'''| +| [[A One-Minute Description][FitNesse.UserGuide.OneMinuteDescription]]|''What is [[FitNesse][FitNesse.FitNesse]]? Start here.''| +| [[A Two-Minute Example][FitNesse.UserGuide.TwoMinuteExample]]|''A brief example. Read this one next.''| +| [[User Guide][FitNesse.UserGuide]]|''Answer the rest of your questions here.''| +| [[Acceptance Tests][FitNesse.SuiteAcceptanceTests]]|''FitNesse's suite of Acceptance Tests''| + +!note Release v20111026 \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/FrontPage/properties.xml b/fitnesse/FitNesseRoot/FrontPage/properties.xml new file mode 100644 index 0000000000..ca7c9ee8d3 --- /dev/null +++ b/fitnesse/FitNesseRoot/FrontPage/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/QuickTest/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/QuickTest/content.txt new file mode 100644 index 0000000000..9a94b0e976 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/QuickTest/content.txt @@ -0,0 +1,16 @@ +!include -c TestLoginGardenAdmin + +Check the inventory level before the document + +!|Set Variable| +|@InventoryLevelBefore@|@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103| + +Check the bp balance before the document + +!|Read Record| +|*Table* |C_bpartner| +|c_bpartner_id |120 | +|*Read* | | +|actuallifetimevalue| | +|so_creditused | | +|totalopenbalance | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/QuickTest/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/QuickTest/properties.xml new file mode 100644 index 0000000000..5ea7bd38a8 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/QuickTest/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238299189180 + -8636125131582470951 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestBug1733602/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestBug1733602/content.txt new file mode 100644 index 0000000000..7e47f39e02 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestBug1733602/content.txt @@ -0,0 +1,21 @@ +Test case for +https://sourceforge.net/tracker/index.php?func=detail&aid=1733602&group_id=176962&atid=879332 +Bug 1733602 - Price List including Tax Error + +Create a tax category 25% + +Create a tax rate of 25% from USA to USA + +Create a BP exempt + +Create a product with tax category 25% + +Create a sales price list with tax included + +Create a price list version + +Create a product price with value 100 + +Create a sales order for the BP Exempt with price list with tax included + +Create a sales order line - expected price = 80 \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestBug1733602/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestBug1733602/properties.xml new file mode 100644 index 0000000000..ceb421cc63 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestBug1733602/properties.xml @@ -0,0 +1,15 @@ + + + true + true + 20090429015827 + true + true + true + true + true + true + true + 1240988307045 + 6979666883496554234 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCashPosOrder/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestCashPosOrder/content.txt new file mode 100644 index 0000000000..cfc4f468b0 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCashPosOrder/content.txt @@ -0,0 +1,139 @@ +!include -c TestLoginGardenAdmin + +Check the inventory level before the document + +!|Set Variable| +|@InventoryLevelBefore@ |@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103 | +|@ExpectedInventoryLevelAfter@|@SQL=SELECT SUM(s.qtyonhand) -2 FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103| + +Check the bp balance before the document + +!|Read Record| +|*Table* |C_bpartner | +|c_bpartner_id |@Ref=c_bpartner[Value='SeedFarm'].c_bpartner_id| +|*Read* | | +|actuallifetimevalue| | +|so_creditused | | +|totalopenbalance | | + +Create sales order + +!|Create Record| +|*Table* |C_Order | +|ad_org_id |11 | +|c_doctypetarget_id |@Ref=c_doctype[Name='POS Order'].c_doctype_id| +|salesrep_id |101 | +|dateordered |2009-03-25 00:00:00.0 | +|c_bpartner_id |@c_bpartner.c_bpartner_id@ | +|c_bpartner_location_id|114 | +|paymentrule |B | +|m_warehouse_id |103 | +|m_pricelist_id |101 | +|ad_user_id |105 | +|*Save* | | + +Create sales order line + +!|Create Record| +|*Table* |C_OrderLine | +|c_order_id |@C_order.c_Order_id@ | +|ad_org_id |@C_Order.AD_Org_ID@ | +|m_product_id|@Ref=M_Product[Value='PChair'].M_Product_ID| +|qtyentered |2 | +|qtyordered |2 | +|*Save* | | + +Complete the sales order + +!|Run Process| +|*ProcessValue*|C_Order Process | +|*RecordID* |@C_Order.C_Order_ID@| +|*DocAction* |CO | +|*Run* | | + +Assert the order + +!|Assert Record| +|*Table* |C_order | +|c_order_id|@C_order.c_Order_id@| +|*Read* | | +|GrandTotal|67.50 | + +Check the inventory level after the document + +!|Assert Variable| +|@ExpectedInventoryLevelAfter@|@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103| + + +Check the bp balance after the document + +!|Assert Record| +|*Table* |C_bpartner | +|*Where* |c_bpartner_id=120 | +|*Read* | | +|actuallifetimevalue|@SQL=SELECT @C_bpartner.actuallifetimevalue@ + @c_order.grandtotal@ FROM DUAL| +|so_creditused |@SQL=SELECT @C_bpartner.so_creditused@ + @c_order.grandtotal@ FROM DUAL | +|totalopenbalance |@SQL=SELECT @C_bpartner.totalopenbalance@ + @c_order.grandtotal@ FROM DUAL | + +Check existance of shipment + +!|Read Record| +|*Table* |M_InOut | +|c_order_id |@C_Order.C_Order_ID@| +|*Read* | | +|documentno | | +|docstatus | | +|issotrx | | +|m_warehouse_id| | +|description | | + +!|Read Record| +|*Table* |M_InOutLine | +|m_inout_id |@M_InOut.M_InOut_ID@| +|*Read* | | +|line | | +|description | | +|c_orderline_id| | +|m_locator_id | | +|m_product_id | | +|movementqty | | + +Check existance of invoice + +!|Read Record| +|*Table* |C_Invoice | +|c_order_id |@C_Order.C_Order_ID@| +|*Read* | | +|documentno | | +|issotrx | | +|docstatus | | +|c_bpartner_id| | +|description | | +|totallines | | +|grandtotal | | + +!|Read Record| +|*Table* |C_InvoiceLine | +|C_Invoice_id |@C_Invoice.C_Invoice_id@| +|*Read* | | +|line | | +|description | | +|c_orderline_id| | +|m_product_id | | +|qtyinvoiced | | +|linenetamt | | + +Check existance of cash journal line + +!|Read Record| +|*Table* |C_CashLine | +|C_Invoice_id|@C_Invoice.C_Invoice_id@| +|*Read* | | +|line | | +|c_cash_id | | +|line | | +|description | | +|amount | | +|isgenerated | | +|processed | | + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCashPosOrder/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestCashPosOrder/properties.xml new file mode 100644 index 0000000000..18db07fe88 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCashPosOrder/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1240991531828 + 8914870695658953752 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCompletePayment/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestCompletePayment/content.txt new file mode 100644 index 0000000000..5ad6e6a073 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCompletePayment/content.txt @@ -0,0 +1,30 @@ +!include -c TestLoginGardenAdmin + +!|Set DocAction| +|*Table*|C_Payment| +|C_Payment_ID|100 | +|docAction |VO | +|*Save* | | + +!|Create Record| +|*Table* |C_Payment | +|ad_org_id |11 | +|datetrx |2002-02-22 00:00:00.0| +|isreceipt |Y | +|c_doctype_id |119 | +|c_bankaccount_id|100 | +|c_bpartner_id |112 | +|c_invoice_id |101 | +|tendertype |K | +|c_currency_id |100 | +|payamt |98.8 | +|discountamt |1.9 | +|description |Testing from fitnesse| +|isprepayment |N | +|*Save* | | + +!|Set DocAction| +|*Table* |C_Payment | +|C_Payment_ID|@C_Payment.C_Payment_ID@| +|docAction |CO | +|*Save* | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCompletePayment/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestCompletePayment/properties.xml new file mode 100644 index 0000000000..75e28a857a --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCompletePayment/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238066398806 + -8521580992966398914 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateBusinessPartner/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateBusinessPartner/content.txt new file mode 100644 index 0000000000..411a471b35 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateBusinessPartner/content.txt @@ -0,0 +1,9 @@ +!include -c TestLoginGardenAdmin + +!|Create Record| +|*Table* |C_BPartnEr | +|NAME |@random_string(Carlos , Ruiz,6)| +|Value |@random_number(,,8)| +|C_BP_Group_ID|103 | +|PotentialLifeTimeValue|@random_number(-,,4,2)| +|*Save* | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateBusinessPartner/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateBusinessPartner/properties.xml new file mode 100644 index 0000000000..cb51f13e57 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateBusinessPartner/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238077654295 + -4609339749349982923 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateReference/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateReference/content.txt new file mode 100644 index 0000000000..0de14861a5 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateReference/content.txt @@ -0,0 +1,10 @@ +This test tries to create a reference in the database, intentionally the !-ValidationType-! is left to a wrong value (Y) to make it fail. + +!include TestLoginSystem + +!|Create Record| +|*Table* |AD_Reference | +|Name |Fitnesse Test| +|ValidationType|Y | +|invalidcolumn|Y | +|*Save* | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateReference/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateReference/properties.xml new file mode 100644 index 0000000000..bd80711157 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestCreateReference/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238081110353 + 7364192729146061314 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestInitialClientSetup/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestInitialClientSetup/content.txt new file mode 100644 index 0000000000..320b83ed9e --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestInitialClientSetup/content.txt @@ -0,0 +1,20 @@ +This test creates a new tenant in the database. + +!include TestLoginSystem + +!|Run Process| +|*ProcessValue* |InitialClientSetup | +|ClientName |Prueba | +|OrgName |Prueba | +|AdminUserName |PruebaAdmin | +|NormalUserName |PruebaUser | +|C_Currency_ID |230 | +|C_Country_ID |156 | +|CityName |Bogotá | +|IsUseBPDimension |Y | +|IsUseProductDimension |Y | +|IsUseProjectDimension |Y | +|IsUseCampaignDimension |N | +|IsUseSalesRegionDimension|N | +|CoAFile |/home/carlos/hgAdempiere/adempiere361/data/import/AccountingUS.csv| +|*Run* | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestInitialClientSetup/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestInitialClientSetup/properties.xml new file mode 100644 index 0000000000..04eab32b2a --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestInitialClientSetup/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238081153712 + -3968534398453810734 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginGardenAdmin/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginGardenAdmin/content.txt new file mode 100644 index 0000000000..b968db0744 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginGardenAdmin/content.txt @@ -0,0 +1,6 @@ +!|Login| +|User |GardenAdmin| +|Password |GardenAdmin| +|AD_ClIEnT_id|@Ref=AD_Client[Value='GardenWorld'].AD_Client_ID| +|AD_Role_id |@Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID | +|*Login* | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginGardenAdmin/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginGardenAdmin/properties.xml new file mode 100644 index 0000000000..5f0e16f2bb --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginGardenAdmin/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238072183958 + 5325752418564558384 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginSystem/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginSystem/content.txt new file mode 100644 index 0000000000..ee9b70081b --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginSystem/content.txt @@ -0,0 +1,6 @@ +!|Login| +|User |SuperUser| +|Password |System | +|AD_ClIEnT_id|0 | +|AD_Role_id |0 | +|*Login* | | diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginSystem/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginSystem/properties.xml new file mode 100644 index 0000000000..f32948715e --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestLoginSystem/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238066529522 + -8332776960820036767 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestPostInternalInventory/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/TestPostInternalInventory/content.txt new file mode 100644 index 0000000000..cc9d42f948 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestPostInternalInventory/content.txt @@ -0,0 +1,46 @@ +To check error reported here: +[ adempiere-Bugs-2713724 ] Incorrect Accounting for Internal Use Inventory +https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2713724&group_id=176962 + +!include -c TestLoginGardenAdmin + +Create the internal use document + +!|Create Record| +|*Table*|M_Inventory | +|ad_org_id |11 | +|c_doctype_id |144 | +|m_warehouse_id|103 | +|movementdate |2009-03-26 00:00:00.0| +|*Save*| | + +Create internal use line + +!|Create Record| +|*Table*|M_InventoryLine | +|M_Inventory_ID|@M_Inventory.M_Inventory_ID@ | +|ad_org_id |@M_Inventory.AD_Org_ID@ | +|m_locator_id |101 | +|m_product_id |141 | +|c_charge_id |101 | +|qtyinternaluse|@SQL=select sum(qtyonhand) from m_storage where m_product_id=141 and m_locator_id=101 and m_attributesetinstance_id=0| +|qtybook|@SQL=select sum(qtyonhand) from m_storage where m_product_id=141 and m_locator_id=101 and m_attributesetinstance_id=0| +|*Save*| | + +Complete the internal use + +!|Run Process| +|*ProcessValue*|M_Inventory Process | +|*RecordID* |@M_Inventory.M_Inventory_ID@| +|*DocAction* |CO | +|*Run*| | + +Post + +!|Set DocAction| +|*Table* |M_Inventory| +|M_Inventory_ID|@M_Inventory.M_Inventory_ID@ | +|docAction |PO | +|*Save*| | + +Check the postings \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/TestPostInternalInventory/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/TestPostInternalInventory/properties.xml new file mode 100644 index 0000000000..587e6f42ea --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/TestPostInternalInventory/properties.xml @@ -0,0 +1,14 @@ + + + true + true + true + true + true + true + true + true + true + 1238071269016 + 4865548470980791594 + diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/content.txt b/fitnesse/FitNesseRoot/IdempiereSuite/content.txt new file mode 100644 index 0000000000..990fb6f9e1 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/content.txt @@ -0,0 +1 @@ +!contents -R2 -g -p -f -h \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/IdempiereSuite/properties.xml b/fitnesse/FitNesseRoot/IdempiereSuite/properties.xml new file mode 100644 index 0000000000..9acdbaeb80 --- /dev/null +++ b/fitnesse/FitNesseRoot/IdempiereSuite/properties.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 1240990020692 + -6657601679247894849 + diff --git a/fitnesse/FitNesseRoot/PageFooter/content.txt b/fitnesse/FitNesseRoot/PageFooter/content.txt new file mode 100644 index 0000000000..8cd930eed1 --- /dev/null +++ b/fitnesse/FitNesseRoot/PageFooter/content.txt @@ -0,0 +1,2 @@ +[[Front Page][.FrontPage]] | [[User Guide][.FitNesse.UserGuide]] +[[root][root]] (for global !-!path's-!, ''etc.'') diff --git a/fitnesse/FitNesseRoot/PageFooter/properties.xml b/fitnesse/FitNesseRoot/PageFooter/properties.xml new file mode 100644 index 0000000000..05179cfd15 --- /dev/null +++ b/fitnesse/FitNesseRoot/PageFooter/properties.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + 1238490732869 + -5498758380075500221 + diff --git a/fitnesse/FitNesseRoot/PageHeader/content.txt b/fitnesse/FitNesseRoot/PageHeader/content.txt new file mode 100644 index 0000000000..67e70376d8 --- /dev/null +++ b/fitnesse/FitNesseRoot/PageHeader/content.txt @@ -0,0 +1 @@ +#page header \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/PageHeader/properties.xml b/fitnesse/FitNesseRoot/PageHeader/properties.xml new file mode 100644 index 0000000000..6a30bb3755 --- /dev/null +++ b/fitnesse/FitNesseRoot/PageHeader/properties.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/FitNesseRoot/RecentChanges/content.txt b/fitnesse/FitNesseRoot/RecentChanges/content.txt new file mode 100644 index 0000000000..d4cb5cb29e --- /dev/null +++ b/fitnesse/FitNesseRoot/RecentChanges/content.txt @@ -0,0 +1,28 @@ +|||14:59:04 Tue, Nov 27, 2012| +|CommonTests.CreateMaterialReceipt||01:36:56 mar, abr 03, 2012| +|CommonTests.CreateProductPrice||01:29:57 mar, abr 03, 2012| +|AvgCostSuite.BasicTest||01:18:34 mar, abr 03, 2012| +|CommonTests.CreatePurchaseOrder||01:13:34 mar, abr 03, 2012| +|IdempiereSuite.TestPostInternalInventory||24:21:25 mar, abr 03, 2012| +|IdempiereSuite.TestInitialClientSetup||24:20:45 mar, abr 03, 2012| +|IdempiereSuite.TestCreateReference||24:20:15 mar, abr 03, 2012| +|IdempiereSuite.TestLoginSystem||24:20:05 mar, abr 03, 2012| +|IdempiereSuite.TestCreateBusinessPartner||24:19:40 mar, abr 03, 2012| +|IdempiereSuite.TestCompletePayment||24:19:18 mar, abr 03, 2012| +|IdempiereSuite.TestCashPosOrder||24:18:46 mar, abr 03, 2012| +|IdempiereSuite||24:17:17 mar, abr 03, 2012| +|IdempiereSuite.TestLoginGardenAdmin||24:17:07 mar, abr 03, 2012| +|IdempiereSuite.QuickTest||24:16:36 mar, abr 03, 2012| +|AvgCostSuite||24:14:47 mar, abr 03, 2012| +|CommonTests.CreateProduct||24:14:23 mar, abr 03, 2012| +|CommonTests.SetRandomName||24:14:15 mar, abr 03, 2012| +|CommonTests.ValidateClientSetOnAvgInv||24:14:09 mar, abr 03, 2012| +|CommonTests.LoginGardenAdmin||24:14:01 mar, abr 03, 2012| +|FrontPage||24:12:35 mar, abr 03, 2012| +|CommonTests||23:24:23 lun, abr 02, 2012| +|AvgCostSuite.CreateProduct||23:14:23 lun, abr 02, 2012| +|AvgCostSuite.ValidateClientSetOnAvgInv||23:10:02 lun, abr 02, 2012| +|AvgCostSuite.TestLoginGardenAdmin||22:59:47 lun, abr 02, 2012| +|AdempiereSuite.TestInitialClientSetup||22:06:44 lun, abr 02, 2012| +|AdempiereSuite.TestCashPosOrder||21:58:23 lun, abr 02, 2012| +|AdempiereSuite||21:44:38 lun, abr 02, 2012| diff --git a/fitnesse/FitNesseRoot/RecentChanges/properties.xml b/fitnesse/FitNesseRoot/RecentChanges/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/RecentChanges/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/content.txt b/fitnesse/FitNesseRoot/content.txt new file mode 100644 index 0000000000..b510848d45 --- /dev/null +++ b/fitnesse/FitNesseRoot/content.txt @@ -0,0 +1,25 @@ +Define the global path: + +Where to find the fixtures classes: ( i.e. /home/hengsin/workspace/idempiere/fitnesse/bin ) + +!define fitnesse_home {/home/hengsin/workspace/idempiere/fitnesse} + +!path ${fitnesse_home}/fitnesse.jar:${fitnesse_home}/lib/*.jar:${fitnesse_home}/bin + +Define the command to access iDempiere fitnesse servlet + +There are some important variables here: +* LOG4J_LEVEL to set the desired log level +* Include "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044" to enable remote debugging of the test +* URL to access the iDempiere fitnesse servlet + +This variables can be redefined specifically at page level. + +!define TEST_RUNNER {fitnesse.client.FitServerServletInvoker} +!define COMMAND_PATTERN {java -Xms32m -Xmx512m -DLOG4J_LEVEL=CONFIG -cp %p %m http://localhost:8080/fitnesse/FitServlet} + +To enable remote debugging the tests will stop until you connect remotely via eclipse using RemoteADempiereFitnesse.launch + +You must add this to the URL ?responder=test&remote_debug=true + +!define REMOTE_DEBUG_COMMAND {java -Xms32m -Xmx512m -DLOG4J_LEVEL=ALL -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044 -cp %p %m http://localhost:8080/fitnesse/FitServlet} diff --git a/fitnesse/FitNesseRoot/files/css/fitnesse.css b/fitnesse/FitNesseRoot/files/css/fitnesse.css new file mode 100644 index 0000000000..7f7624b989 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/css/fitnesse.css @@ -0,0 +1 @@ +@import url( "/files/css/fitnesse_base.css" ); \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/css/fitnesse_base.css b/fitnesse/FitNesseRoot/files/css/fitnesse_base.css new file mode 100644 index 0000000000..32c1258026 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/css/fitnesse_base.css @@ -0,0 +1,762 @@ +/********** + + Global effects + +**********/ + +body { + margin: 0px; + padding: 0px; + font-family: 'Lucida Grande', 'Bitstream Vera Sans', 'trebuchet ms', verdana, tahoma, arial, sans-serif; + font-size: 1em; + background-color: #FAFAFE; +} + +ul, ol { + padding-left: 0; + margin: 0; + list-style-position: inside; +} + +ul { + padding-left: 1em; + text-indent: -1em; +} + +ol { + padding-left: 1.3em; + text-indent: -1.3em; +} + +a:link, a:visited, a:hover, a:active { + background: transparent; +} + +a:link { + color: #2E2EB2; +} + +a:visited { + color: #606099; +} + +a:hover { + color: #8989D9; + text-decoration: none; +} + +a:active { + color: #FF8000; +} + +table, td, th { + border: solid #777777; +} + +table { + background: #F8F8F8; + margin: 5px; + padding: 0px; + border-width: 1px 0px 0px 1px; +} + +table.plain_text_table { + background: #FFFFFF; + margin: 5px; + padding: 0px; + border-width: 1px 1px 1px 1px; + border-style:dotted; +} + +table.plain_text_table td { + border-width:0px 0px 1px 1px; + border-style:dotted; + border-color:#D0D0D0; + padding: 0px 6px 0px 6px; + margin: 0px; +} + +table.plain_text_table tr { + margin: 1px; +} + +td, th { + border-width: 0px 1px 1px 0px; + padding: 5px; +} + +table.hash_table { + border: solid #777777; + margin: 5px; + padding: 0px; + border-width: 1px 0px 0px 1px; + border-style:dotted; +} + +td.hash_key { + border-width: 0px 1px 1px 0px; + background: #dddddd; + padding: 5px; + font-weight: bold; + border-style:dotted; +} + +td.hash_value { + border-width: 0px 1px 1px 0px; + padding: 5px; + border-style:dotted; +} + +table.confirmation-form { + border: solid 1px #C6CCB7; + padding: 5px; + margin: 5px; +} + +td.confirmation-form, th.confirmation-form { + vertical-align: middle; + border: solid 0px #C6CCB7; + padding: 0px; + margin: 0px; +} + +td.numeric, th.numeric { + text-align:right; +} + +h1, h2, h3, h4 { + font-family: Helvetica, sans-serif; + font-variant: small-caps; +} + +h1 { + font-size: 1.6em; +} + +h2 { + font-size: 1.4em; +} + +h3 { + font-size: 1.2em; +} + +h4 { + font-size: 1em; + font-style: italic; +} + +textarea.oldContent { + width: 100%; +} + +textarea.pageContent { + font-family: monaco, 'Lucida Sans Typewriter', monospace; + font-size: 12px; + height: 100%; + width: 100%; +} + +textarea.no_wrap { + overflow: scroll; +} + +pre { +/* font-size: 1.5em;*/ +} + +img { + border: 0px; +} + +/********** + + Structural + +**********/ + +div.popup_window { + visibility: hidden; + position: absolute; + top: 50px; + width: 600px; + height: 300px; + border: 3px outset gray; + z-index: 10; +} + +div.popup_title { + position: absolute; + top: 0px; + height: 18px; + width: 590px; + background-color: #aaa; + border-bottom: groove gray 2px; + padding: 3px 5px 2px 5px; + font: bold 11pt sans-serif; +} + +div.popup_content { + position: absolute; + top: 25px; + height: 265px; + width: 590px; + padding: 5px; + overflow: auto; + background-color: white; +} + +div.sidebar { + background: #D9DFC9; + margin: 0px; + padding: 5px; + position: fixed; + top: 0px; + left: 0px; + width: 130px; + height: 1000px; + border-right: 1px dotted #C6CCB7; +} + +div.art_niche { + margin: 0px; + padding: 0px 0px 5px 0px; + position: relative; + top: 0px; + left: 0px; + height: 90px; + border-bottom: solid 1px #984D00; + background-image: url("/files/images/FitNesseLogo.gif"); + background-repeat: no-repeat; + background-position: center; +} + +div.actions { + margin: 0px; + padding-top: 5px; + padding-botton: 5px; +} + +div.mainbar { + margin: 0px; + position: absolute; + top: 0px; + left: 145px; + width: 85%; +} + +div.header { + margin: 0px; + padding: 5px; + height: 90px; + border-bottom: 1px solid #984D00; +} + +div.footer { + margin: 0px; + padding: 5px; /* Use same color as border color for div.header. */ + border-top: 1px solid #984D00; + font-size: 12px; + text-align: center; +} + +div.contents { + margin: 2px; + padding: 2px; + border: 1px solid #F0F0F0; +} + +div.nested-contents { + margin: 2px; + padding: 2px; + border: 0px solid #F0F0F0; +} + +hr { +/* Use same color as border color for div.header. */ + color: #984D00; /* for IE */ + background-color: #984D00; /* for other browsers */ + height: 1; +} + +div.main { + margin: 0px; + padding: 5px; +} + +div.properties { + height: 150px; + width: 100%; + margin: 5px; + padding: 5px; + border: solid 1px #C6CCB7; +} + +div.virtual-wiki-properties { + height: 80px; + width: 100%; + margin: 5px; + padding: 5px; + border: solid 1px #C6CCB7; +} + +#execution-status, + #stop-test { + position: absolute; + top: 0px; + right: 0px; + width: 100px; + height: 90px; + margin: 5px; + text-align: center; +} + +#test-summary { + width: 99%; + top: 105px; + padding: 2px 2px 2px 5px; + margin: 0px 0px 5px 0px; + font-size: 1.2em; + border: solid black 1px; +} + +#progressBar { + margin: -2px -2px -2px -5px; + padding: 2px 2px 2px 5px; +} + +.actions a:link, .actions a:visited { + display: block; + margin: 0px; + line-height: 2.2em; + text-indent: .5em; + color: black; + font-family: sans-serif, verdana, tahoma, arial, sans-serif; + font-size: 14px; + background-color: #F8F6D3; + text-decoration: none; + border: solid 1px #8D8360; +} + +.actions a:hover { + color: #3D4529; + background-color: #DEDDBD; +} + +.header a:link { + font-weight: bold; +} + +/********** + + Miscellaneous formatting + +**********/ + +.note { + font-size: 12px; + color: #818181; +} + +.page_title { + font-size: 2.5em; +} + +span.page_title { +} + +.page_type { + font-size: 1.2em; + font-variant: small-caps; +} + +.caps, .resultsHeader { + font-size: 1em; + font-variant: small-caps; +} + +.resultsHeader, .resultsRow2 { + background-color: #EFEFEF; +} + +.resultsRow1 { + background-color: #FFFFFF; +} + +.centered { + margin: 5px; + text-align: center; +} + +.right { + float: right; +} + +.left { + float: left; +} + +.strike { + text-decoration: line-through; +} + +.code { + font-family: courier, 'Lucida Sans Typewriter', monospace; + font-size: 16px; + color: #004000; + font-weight: bold; +} + +.red { + color: red; +} + +.orange { + color: orange; +} + +.yellow { + color: yellow; +} + +.green { + color: green; +} + +.blue { + color: blue; +} + +.indigo { + color: indigo; +} + +.violet { + color: violet; +} + +.pink { + color: pink; +} + +.lightYellow { + color: lightYellow; +} + +.lightGreen { + color: lightGreen; +} + +.lightBlue { + color: lightBlue; +} + +.chocolate { + color: chocolate; +} + +.darkOrange { + color: darkOrange; +} + +.darkRed { + color: darkRed; +} + +.olive { + color: olive; +} + +.darkBlue { + color: darkBlue; +} + +.darkGreen { + color: darkGreen; +} + +.virtual { + background-image: url("/files/images/virtualPage.jpg"); + background-position: center top; + background-repeat: no-repeat; +} + +.imported { + background-image: url("/files/images/importedPage.jpg"); + background-position: center top; + background-repeat: no-repeat; +} + +.meta { + color: #BF8660; + font-style: italic; +} + +.included, .setup, .teardown, .collapse_rim { + background: #F9F9F9; + margin: 5px 0px 5px 0px; + padding: 2px 2px 2px 2px; + border: 1px dotted #909090; +} + +.setup, .teardown { + background: #FFFFF0; + border-color: #FF8000; +} + +.included { + background: #F9F9FF; + border-color: #2E2EB2; +} + +.collapse_rim { + border-color: #BF8660; +} + +.alternating_row_1, .alternating_row_2 { + display: block; + height: 1.5em; + width: 100%; + clear: both; +} + +.alternating_row_1, .alternating_block_1 { + background-color: #EFEFEF; +} + +.alternating_row_2, .alternating_block_2 { + background-color: #FFFFFF; +} + +.alternating_block_1, .alternating_block_2 { + border: solid 1px #DFD4A7; +} + +div.collapsable { + margin: 0px 0px 0px 15px; + display: block; +} + +div.collapsable-contents { + margin: 0px 0px 0px 15px; + display: block; +} + +div.invisible { + line-height: 0px; + margin: 0px 0px 0px 0px; + display: none; + visibility: hidden; +} + +.pageHelp { + color: #CC6600; + font-size: 0.7em; + font-style: italic; + margin-left: 1.5em; +} + +.hidden { + display: none; +} + +.toc1 ul { + list-style-type: disc; + color: black; +} + +.toc3 ul { + list-style-type: disc; + color: gray; +} + +.toc2 ul, .toc4 ul, .toc5 ul, .toc6 ul { + list-style-type: circle; +} + +table { + padding: 0; + margin: 0; +} + +/********** + + Page Specific + +**********/ + +div.edit_buttons { + float: left; +} + +div.edit_options { + float: right; +} + +div.hints { + clear: both; +} + +div.nav_break { + font-size: .3em; +} + +div.merge_new { + float: left; + font-size: 1.4em; + width: 49%; +} + +div.merge_old { + float: right; + font-size: 1.4em; + width: 49%; +} + +.test_summary_link { + text-align: right; +} + +.test_summary_results { + padding: 0px 5px 0px 5px; + text-align: left; +} + +.suite_summary { + margin: 5px; + margin-left: auto; + margin-right: auto; + text-align: center; +} + +.test_name { + font-size: 1.5em; + float: left; +} + +.top_of_page { + margin-top: .5em; + margin-right: 3px; + float: right; + color: #BF8660; + font-style: italic; +} + +.test_output_name { + margin-top: 10px; + background-color: #DFD4A7; + text-indent: 1em; + height: 2em; +} + +table.dirListing { + background: transparent; + margin: 2px; + padding: 0px; + border: 0px; + width: 99%; + font-size: 1.0em; +} + +.dirListing td, .dirListing th { + border: 0px; + padding: 1px 3px 1px 3px; +} + +/********** + + Used in FIT and the summary bar + +**********/ + +.pass { + background-color: #AAFFAA; +} + +.fail { + background-color: #FFAAAA; +} + +.error { + background-color: #FFFFAA; +} + +.ignore { + background-color: #CCCCCC; +} + +.fit_stacktrace { + font-size: 0.7em; +} + +.fit_label { + font-style: italic; + color: #C08080; +} + +.fit_grey { + color: #808080; +} + +.passed_tests, +.unrun_tests, +.failed_tests { + background-repeat: no-repeat; + padding-left: 22px; + margin: 0px 4px; +} + +.passed_tests { + background-image: url('../images/pass.png'); +} + +.unrun_tests { + background-image: url('../images/unrun.png'); +} + +.failed_tests { + background-image: url('../images/fail.png'); +} + +.completion_folder{ + margin: 2px 5px; +} + +.completion_test{ + margin: 0px 25px; +} + +a.fail, +.fail { + background-color: #ffcbd0; +} + +.unrun, +a.unrun +{ + background-color: #fff3b4; +} + +.overview_part { + margin: 0px; + padding: 0px; + float: left; + height: 1.4em; +} + +.overview_bar { + border: 1px solid black; + height: 1.4em; + margin: 0 -.5px; +} + +.overview_results table td { + border : none; + background-position: 1px; +} + +.overview_results table { + border : 1px solid black; + margin : 10px 0px; + padding : 10px; +} diff --git a/fitnesse/FitNesseRoot/files/css/fitnesse_print.css b/fitnesse/FitNesseRoot/files/css/fitnesse_print.css new file mode 100644 index 0000000000..27e49a1233 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/css/fitnesse_print.css @@ -0,0 +1,11 @@ +@import url( "/files/css/fitnesse_base.css" ); + +div.sidebar { + display: none; +} + +div.mainbar { + position: relative; + left: 0px; + width: 100%; +} diff --git a/fitnesse/FitNesseRoot/files/css/jquery.autocomplete.css b/fitnesse/FitNesseRoot/files/css/jquery.autocomplete.css new file mode 100644 index 0000000000..91b6228337 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/css/jquery.autocomplete.css @@ -0,0 +1,48 @@ +.ac_results { + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + margin: 0px; + padding: 2px 5px; + cursor: default; + display: block; + /* + if width will be 100% horizontal scrollbar will apear + when scroll mode will be used + */ + /*width: 100%;*/ + font: menu; + font-size: 12px; + /* + it is very important, if line-height not setted or setted + in relative units scroll will be broken in firefox + */ + line-height: 16px; + overflow: hidden; +} + +.ac_loading { + background: white url('indicator.gif') right center no-repeat; +} + +.ac_odd { + background-color: #eee; +} + +.ac_over { + background-color: #0A246A; + color: white; +} diff --git a/fitnesse/FitNesseRoot/files/html/index.html b/fitnesse/FitNesseRoot/files/html/index.html new file mode 100644 index 0000000000..a28c18a7d1 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/html/index.html @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/html/treeControl.html b/fitnesse/FitNesseRoot/files/html/treeControl.html new file mode 100644 index 0000000000..110de15383 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/html/treeControl.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + +

    FitNesse Pages

    +
    +
    + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/images/FitNesseInstallerLogo.png b/fitnesse/FitNesseRoot/files/images/FitNesseInstallerLogo.png new file mode 100644 index 0000000000..a3d6c3820d Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/FitNesseInstallerLogo.png differ diff --git a/fitnesse/FitNesseRoot/files/images/FitNesseLogo.gif b/fitnesse/FitNesseRoot/files/images/FitNesseLogo.gif new file mode 100644 index 0000000000..3838c76e15 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/FitNesseLogo.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/FitNesseLogo.psd b/fitnesse/FitNesseRoot/files/images/FitNesseLogo.psd new file mode 100644 index 0000000000..0667726071 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/FitNesseLogo.psd differ diff --git a/fitnesse/FitNesseRoot/files/images/FitNesseLogoMedium.jpg b/fitnesse/FitNesseRoot/files/images/FitNesseLogoMedium.jpg new file mode 100644 index 0000000000..485d67595f Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/FitNesseLogoMedium.jpg differ diff --git a/fitnesse/FitNesseRoot/files/images/FitnesseStarted.png b/fitnesse/FitNesseRoot/files/images/FitnesseStarted.png new file mode 100644 index 0000000000..1622fcb147 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/FitnesseStarted.png differ diff --git a/fitnesse/FitNesseRoot/files/images/Thumbs.db b/fitnesse/FitNesseRoot/files/images/Thumbs.db new file mode 100644 index 0000000000..f0681b911d Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/Thumbs.db differ diff --git a/fitnesse/FitNesseRoot/files/images/collapsableClosed.gif b/fitnesse/FitNesseRoot/files/images/collapsableClosed.gif new file mode 100644 index 0000000000..7b68c97dba Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/collapsableClosed.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/collapsableOpen.gif b/fitnesse/FitNesseRoot/files/images/collapsableOpen.gif new file mode 100644 index 0000000000..decbacc4c8 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/collapsableOpen.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/executionStatus/Thumbs.db b/fitnesse/FitNesseRoot/files/images/executionStatus/Thumbs.db new file mode 100644 index 0000000000..dbb7e34e9c Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/executionStatus/Thumbs.db differ diff --git a/fitnesse/FitNesseRoot/files/images/executionStatus/error.gif b/fitnesse/FitNesseRoot/files/images/executionStatus/error.gif new file mode 100644 index 0000000000..b9f47c4b07 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/executionStatus/error.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/executionStatus/ok.gif b/fitnesse/FitNesseRoot/files/images/executionStatus/ok.gif new file mode 100644 index 0000000000..d9801a41b6 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/executionStatus/ok.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/executionStatus/output.gif b/fitnesse/FitNesseRoot/files/images/executionStatus/output.gif new file mode 100644 index 0000000000..b6f3d06b45 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/executionStatus/output.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/fail.png b/fitnesse/FitNesseRoot/files/images/fail.png new file mode 100644 index 0000000000..ff7ddb25dc Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/fail.png differ diff --git a/fitnesse/FitNesseRoot/files/images/fitnesse_architecture.jpg b/fitnesse/FitNesseRoot/files/images/fitnesse_architecture.jpg new file mode 100644 index 0000000000..1b1b59596c Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/fitnesse_architecture.jpg differ diff --git a/fitnesse/FitNesseRoot/files/images/folder.gif b/fitnesse/FitNesseRoot/files/images/folder.gif new file mode 100644 index 0000000000..058e08fe91 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/folder.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/importedPage.jpg b/fitnesse/FitNesseRoot/files/images/importedPage.jpg new file mode 100644 index 0000000000..a7fed77019 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/importedPage.jpg differ diff --git a/fitnesse/FitNesseRoot/files/images/pass.png b/fitnesse/FitNesseRoot/files/images/pass.png new file mode 100644 index 0000000000..921ff5bd55 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/pass.png differ diff --git a/fitnesse/FitNesseRoot/files/images/plus.png b/fitnesse/FitNesseRoot/files/images/plus.png new file mode 100644 index 0000000000..92e72b5c30 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/plus.png differ diff --git a/fitnesse/FitNesseRoot/files/images/stop.gif b/fitnesse/FitNesseRoot/files/images/stop.gif new file mode 100644 index 0000000000..902cac8b67 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/stop.gif differ diff --git a/fitnesse/FitNesseRoot/files/images/unrun.png b/fitnesse/FitNesseRoot/files/images/unrun.png new file mode 100644 index 0000000000..017ae6b08b Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/unrun.png differ diff --git a/fitnesse/FitNesseRoot/files/images/virtualPage.jpg b/fitnesse/FitNesseRoot/files/images/virtualPage.jpg new file mode 100644 index 0000000000..75e22587a4 Binary files /dev/null and b/fitnesse/FitNesseRoot/files/images/virtualPage.jpg differ diff --git a/fitnesse/FitNesseRoot/files/javascript/SpreadsheetTranslator.js b/fitnesse/FitNesseRoot/files/javascript/SpreadsheetTranslator.js new file mode 100644 index 0000000000..3bef96eba4 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/SpreadsheetTranslator.js @@ -0,0 +1,154 @@ +// Copyright (C) 2004 by Alain Bienvenue. All rights reserved. +// Released under the terms of the GNU General Public License version 2 or later. + +function SpreadsheetTranslator() +{ + this.currentLine; + this.rows; + this.fitNesseTables; + + this.isImplicitTableStart = function(index) + { + if (this.rows[index][0].match("^[A-Za-z][0-9A-Za-z]*\\.[A-Za-z][0-9A-Za-z]*")) + { + return true; + } + var i; + for (i = index; i < this.rows.length; i++) + { + if ((this.rows[i][0] == '!') || this.lineSize(this.rows[i]) == 0) + { + return false; + } + if (this.lineSize(this.rows[i]) > 1) + { + return true; + } + } + return false; + } + + this.isExplicitTableStart = function(rows, index) + { + return (rows[index][0] == "!"); + } + + this.isNotTableLine = function(currentLine, columnsToSkip) + { + var row = this.rows[currentLine]; + if (this.lineSize(row) == 0) + { + return true; + } + + var i; + for (i = 0; i < columnsToSkip; i++) + { + if (row[i] != '') + { + return true; + } + } + return false; + } + + this.lineSize = function(row) + { + var x; + for (x = row.length - 1; x >= 0; x--) + { + if (row[x] != '') return x + 1; + } + return 0; + } + + this.parseExcelTable = function(excelTable) + { + var table = this.removeCarriageReturns(excelTable); + var lines = table.split("\n"); + this.rows = new Array; + for (i = 0; i < lines.length; i++) + { + this.rows[i] = lines[i].split("\t"); + } + } + + + this.removeCarriageReturns = function(str) + { + return str.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + } + + this.getFitNesseTables = function() + { + this.currentLine = 0; + this.fitNesseTables = new String(); + while (this.currentLine < this.rows.length) + { + if (this.isExplicitTableStart(this.rows, this.currentLine)) + { + this.processTable(1); + } + else if (this.isImplicitTableStart(this.currentLine)) + { + if (this.rows[this.currentLine][0] == '') + { + this.processTable(1); + } + else + { + this.processTable(0); + } + } + else + { + this.fitNesseTables += "\n" + this.rows[this.currentLine][0]; + } + this.currentLine++; + } + return this.fitNesseTables.substring(1); + } + + + this.processTable = function(columnsToSkip) + { + var tableFirstLine = this.currentLine; + var tableSize; + + while (this.currentLine < this.rows.length) + { + var row = this.rows[this.currentLine]; + if (this.currentLine > tableFirstLine && this.isNotTableLine(this.currentLine, columnsToSkip)) + { + this.currentLine--; + return; + } + + this.fitNesseTables += "\n"; + var lineSize = 0; + if (this.currentLine == tableFirstLine) + { + this.fitNesseTables += "!"; + lineSize = this.lineSize(row); + } + else if (this.currentLine == tableFirstLine + 1) + { + lineSize = this.lineSize(row); + tableSize = lineSize; + } + else + { + lineSize = Math.max(tableSize, this.lineSize(row)); + lineSize = Math.min(lineSize, row.length); + } + + this.fitNesseTables += "|"; + var j; + for (j = columnsToSkip; j < lineSize; j++) + { + this.fitNesseTables += row[j] + "|"; + } + this.currentLine++; + } + } +} diff --git a/fitnesse/FitNesseRoot/files/javascript/WikiFormatter.js b/fitnesse/FitNesseRoot/files/javascript/WikiFormatter.js new file mode 100644 index 0000000000..2d20235543 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/WikiFormatter.js @@ -0,0 +1,285 @@ +function WikiFormatter() +{ + /* + * This is the entry point, it takes a chunk of text, splits it into lines, loops + * through the lines collecting consecutive lines that are part of a table, and returns + * a chunk of text with those tables it collected formatted. + */ + this.format = function(wikiText) { + this.wikificationPrevention = false; + + var formatted = ""; + var currentTable = []; + var lines = wikiText.split("\n"); + var line = null; + + for(var i = 0, j = lines.length; i < j; i++) { + line = lines[i]; + + if(this.isTableRow(line)) { + currentTable.push(line); + } + else { + formatted += this.formatTable(currentTable); + currentTable = []; + formatted += line + "\n"; + } + } + + formatted += this.formatTable(currentTable); + return formatted.slice(0, formatted.length - 1); + } + + /* + * This function receives an array of strings(rows), it splits each of those strings + * into an array of strings(columns), calls off to calculate what the widths + * of each of those columns should be and then returns a string with each column + * right/space padded based on the calculated widths. + */ + this.formatTable = function(table) { + var formatted = ""; + var splitRowsResult = this.splitRows(table); + var rows = splitRowsResult.rows; + var suffixes = splitRowsResult.suffixes; + var widths = this.calculateColumnWidths(rows); + var row = null; + + for(var rowIndex = 0, numberOfRows = rows.length; rowIndex < numberOfRows; rowIndex++) { + row = rows[rowIndex]; + formatted += "|"; + + for(var columnIndex = 0, numberOfColumns = row.length; columnIndex < numberOfColumns; columnIndex++) { + formatted += this.rightPad(row[columnIndex], widths[rowIndex][columnIndex]) + "|"; + } + + formatted += suffixes[rowIndex] + "\n"; + } + + if(this.wikificationPrevention) { + formatted = '!|' + formatted.substr(2); + this.wikificationPrevention = false; + } + + return formatted; + } + + /* + * This is where the nastiness starts due to trying to emulate + * the html rendering of colspans. + * - make a row/column matrix that contains data lengths + * - find the max widths of those columns that don't have colspans + * - update the matrix to set each non colspan column to those max widths + * - find the max widths of the colspan columns + * - increase the non colspan columns if the colspan columns lengths are greater + * - adjust colspan columns to pad out to the max length of the row + * + * Feel free to refator as necessary for clarity + */ + this.calculateColumnWidths = function(rows) { + var widths = this.getRealColumnWidths(rows); + var totalNumberOfColumns = this.getNumberOfColumns(rows); + + var maxWidths = this.getMaxWidths(widths, totalNumberOfColumns); + this.setMaxWidthsOnNonColspanColumns(widths, maxWidths); + + var colspanWidths = this.getColspanWidth(widths, totalNumberOfColumns); + this.adjustWidthsForColspans(widths, maxWidths, colspanWidths); + + this.adjustColspansForWidths(widths, maxWidths); + + return widths; + } + + this.isTableRow = function(line) { + return line.match(/^!?\|/); + } + + this.splitRows = function(rows) { + var splitRows = []; + var rowSuffixes = []; + + this.each(rows, function(row) { + var columns = this.splitRow(row); + rowSuffixes.push(columns[columns.length - 1]); + splitRows.push(columns.slice(0, columns.length - 1)); + }, this); + + return {rows: splitRows, suffixes: rowSuffixes}; + } + + this.splitRow = function(row) { + var columns = this.trim(row).split('|'); + + if(!this.wikificationPrevention && columns[0] == '!') { + this.wikificationPrevention = true; + columns[1] = '!' + columns[1]; //leave a placeholder + } + + columns = columns.slice(1, columns.length); + + this.each(columns, function(column, i) { + columns[i] = this.trim(column); + }, this); + + return columns; + } + + this.getRealColumnWidths = function(rows) { + var widths = []; + + this.each(rows, function(row, rowIndex) { + widths.push([]); + + this.each(row, function(column, columnIndex) { + widths[rowIndex][columnIndex] = column.length; + }, this); + }, this); + + return widths; + } + + this.getMaxWidths = function(widths, totalNumberOfColumns) { + var maxWidths = []; + var row = null; + + this.each(widths, function(row, rowIndex) { + this.each(row, function(columnWidth, columnIndex) { + if(columnIndex == (row.length - 1) && row.length < totalNumberOfColumns) { + return false; + } + + if(columnIndex >= maxWidths.length) { + maxWidths.push(columnWidth); + } + else if(columnWidth > maxWidths[columnIndex]) { + maxWidths[columnIndex] = columnWidth; + } + }, this); + }, this); + + return maxWidths; + } + + this.getNumberOfColumns = function(rows) { + var numberOfColumns = 0; + + this.each(rows, function(row) { + if(row.length > numberOfColumns) { + numberOfColumns = row.length; + } + }); + + return numberOfColumns; + } + + this.getColspanWidth = function(widths, totalNumberOfColumns) { + var colspanWidths = []; + var colspan = null; + var colspanWidth = null; + + this.each(widths, function(row, rowIndex) { + if(row.length < totalNumberOfColumns) { + colspan = totalNumberOfColumns - row.length; + colspanWidth = row[row.length - 1]; + + if(colspan >= colspanWidths.length) { + colspanWidths[colspan] = colspanWidth; + } + else if(!colspanWidths[colspan] || colspanWidth > colspanWidths[colspan]) { + colspanWidths[colspan] = colspanWidth; + } + } + }); + + return colspanWidths; + } + + this.setMaxWidthsOnNonColspanColumns = function(widths, maxWidths) { + this.each(widths, function(row, rowIndex) { + this.each(row, function(columnWidth, columnIndex) { + if(columnIndex == (row.length - 1) && row.length < maxWidths.length) { + return false; + } + + row[columnIndex] = maxWidths[columnIndex]; + }, this); + }, this); + } + + this.getWidthOfLastNumberOfColumns = function(maxWidths, numberOfColumns) { + var width = 0; + + for(var i = 1; i <= numberOfColumns; i++) { + width += maxWidths[maxWidths.length - i] + } + + return width + numberOfColumns - 1; //add in length of separators + } + + this.spreadOutExcessOverLastNumberOfColumns = function(maxWidths, excess, numberOfColumns){ + var columnToApplyExcessTo = maxWidths.length - numberOfColumns; + + for(var i = 0; i < excess; i++) { + maxWidths[columnToApplyExcessTo++] += 1; + + if(columnToApplyExcessTo == maxWidths.length) { + columnToApplyExcessTo = maxWidths.length - numberOfColumns; + } + } + } + + this.adjustWidthsForColspans = function(widths, maxWidths, colspanWidths) { + var lastNumberOfColumnsWidth = null; + var excess = null; + + this.each(colspanWidths, function(colspanWidth, index) { + lastNumberOfColumnsWidth = this.getWidthOfLastNumberOfColumns(maxWidths, index + 1); + + if(colspanWidth && colspanWidth > lastNumberOfColumnsWidth){ + excess = colspanWidth - lastNumberOfColumnsWidth; + this.spreadOutExcessOverLastNumberOfColumns(maxWidths, excess, index + 1); + this.setMaxWidthsOnNonColspanColumns(widths, maxWidths); + } + }, this); + } + + this.adjustColspansForWidths = function(widths, maxWidths) { + var colspan = null; + var lastNumberOfColumnsWidth = null + + this.each(widths, function(row, rowIndex) { + colspan = maxWidths.length - row.length + 1; + + if(colspan > 1) { + row[row.length - 1] = this.getWidthOfLastNumberOfColumns(maxWidths, colspan); + } + }, this); + } + + /* + * Utility functions + */ + this.trim = function(text) { + return (text || "").replace( /^\s+|\s+$/g, "" ); + } + + this.each = function(array, callback, context) { + var index = 0; + var length = array.length; + + while(index < length && callback.call(context, array[index], index) !== false) { + index++; + } + }, + + this.rightPad = function(value, length) { + var padded = value; + + for(var i = 0, j = length - value.length; i < j; i++) { + padded += " "; + } + + return padded; + } + +} diff --git a/fitnesse/FitNesseRoot/files/javascript/clientSideSort.js b/fitnesse/FitNesseRoot/files/javascript/clientSideSort.js new file mode 100644 index 0000000000..3dc0917950 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/clientSideSort.js @@ -0,0 +1,181 @@ +TableSorter = function(id, dateParser) +{ + this.id = id; + this.table = document.getElementById(id); + this.activeSort = null; + this.dateParser = dateParser; + + this.getSortDirection = function(sortCol) + { + if (this.activeSort == null || this.activeSort.column != sortCol) + this.activeSort = new SortReference(sortCol, "asc"); + else + { + if (this.activeSort.direction == "asc") + this.activeSort.direction = "dsc"; + else + this.activeSort.direction = "asc"; + } + return this.activeSort.direction; + } + + this.sort = function(sortCol, datatype) + { + var rowDataArray = new TableRowDataArray(this.id); + rowDataArray.setSortCol(sortCol); + var direction = this.getSortDirection(sortCol); + if (datatype == 'number') + rowDataArray.sort(new NumericComparator()); + else if (datatype == 'date') + rowDataArray.sort(new DateComparator(this.dateParser)); + else + rowDataArray.sort(); + if (direction == "dsc") + rowDataArray.reverse(); + rowDataArray.rebuildTable(); + } + return this; +} + +TableRowData = function(cols) +{ + this.cols = cols; + this.sortCol = 0; + this.setSortCol = function(col) + { + this.sortCol = col; + } + this.toString = function() + { + return this.cols[this.sortCol]; + } +} + +TableRowDataArray = function(id) +{ + this.arr = new Array(); + this.arr.table = document.getElementById(id); + this.arr.cssClasses = new Array(); + + var tbody = this.arr.table.tBodies[0]; + var rows = tbody.rows; + for (var row = 0; row < rows.length; row++) + { + this.arr.cssClasses.push(rows[row].className); + var cells = rows[row].cells; + var cellTextArray = new Array(); + for (var j = 0; j < cells.length; j++) + cellTextArray.push(cells[j].innerHTML); + this.arr.push(new TableRowData(cellTextArray)); + } + + this.arr.rebuildTable = function() + { + var tbody = this.table.tBodies[0]; + var mybody = tbody.cloneNode(false); + for (var row = 0; row < this.length; row++) + { + var tr = document.createElement("tr"); + tr.className = this.cssClasses[row]; + for (var i = 0; i < this[row].cols.length; i++) + { + var td = document.createElement("td"); + td.innerHTML = this[row].cols[i]; + tr.appendChild(td); + } + mybody.appendChild(tr); + } + this.table.replaceChild(mybody, tbody); + } + + this.arr.setSortCol = function(sortCol) + { + for (var i = 0; i < this.length; i++) + { + this[i].setSortCol(sortCol); + } + } + return this.arr; +} + +SortReference = function (column, direction) +{ + this.column = column; + this.direction = direction; +} + + +NumericComparator = function() +{ + function compare(a, b) + { + a = parseInt(a); + b = parseInt(b); + if (a > b) + return 1; + if (a < b) + return -1; + return 0; + } + return compare; +} + +DateComparator = function(dateParser) +{ + this.compare = function(x, y) + { + x = dateParser.parse(x).getTime(); + y = dateParser.parse(y).getTime(); + if (x > y) + return 1; + if (x < y) + return -1; + return 0; + } + return this.compare; +} + +DateParser = function(re, a, b, c, d, e, f) +{ + this.re = re; + this.a = a; + this.b = b; + this.c = c; + this.d = d || -1; + this.e = e || -1; + this.f = f || -1; + this.parseMonth = function(month) + { + month = month.toLowerCase(); + months = "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec".split(','); + for (var i = 0; i < months.length; i++) + { + if (month == months[i]) + { + return i; + } + } + } + + this.parse = function(dateStr) + { + value = dateStr.toString().toLowerCase(); + if (this.re.test(value)) + { + matches = this.re.exec(value); + year = parseInt(matches[a]); + if (parseInt(matches[b])) + month = parseInt(matches[b] - 1); + else + month = this.parseMonth(matches[b]); + day = parseInt(matches[c]); + hour = d > 0 ? parseInt(matches[d]) : 0; + minute = e > 0 ? parseInt(matches[e]) : 0; + second = f > 0 ? parseInt(matches[f]) : 0; + date = new Date(year, month, day, hour, minute, second); + return date; + } + } + + return this; +} diff --git a/fitnesse/FitNesseRoot/files/javascript/fitnesse.js b/fitnesse/FitNesseRoot/files/javascript/fitnesse.js new file mode 100644 index 0000000000..5ebb57b6d2 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/fitnesse.js @@ -0,0 +1,131 @@ +var collapsableOpenCss = "collapsable"; +var collapsableClosedCss = "hidden"; +var collapsableOpenImg = "/files/images/collapsableOpen.gif"; +var collapsableClosedImg = "/files/images/collapsableClosed.gif"; + +function toggleCollapsable(id) +{ + var div = document.getElementById(id); + var img = document.getElementById("img" + id); + if (div.className.indexOf(collapsableClosedCss) != -1) + { + div.className = collapsableOpenCss; + img.src = collapsableOpenImg; + } + else + { + div.className = collapsableClosedCss; + img.src = collapsableClosedImg; + } +} + +function popup(window_id) { + var window = document.getElementById(window_id); + window.style.visibility = "visible"; +} + +function popdown(window_id) { + var window = document.getElementById(window_id); + window.style.visibility = "hidden"; +} + +function expandOrCollapseAll(cssClass) +{ + divs = document.getElementsByTagName("div"); + for (i = 0; i < divs.length; i++) + { + div = divs[i]; + if (div.className == cssClass) + { + toggleCollapsable(div.id); + } + } +} + +function collapseAll() +{ + expandOrCollapseAll(collapsableOpenCss); +} + +function expandAll() +{ + expandOrCollapseAll(collapsableClosedCss); +} + +function symbolicLinkRename(linkName, resource) +{ + var newName = document.symbolics[linkName].value.replace(/ +/g, ''); + + if (newName.length > 0) + window.location = resource + '?responder=symlink&rename=' + linkName + '&newname=' + newName; + else + alert('Enter a new name first.'); +} + +// Allow ctrl-s to save the changes. +// Currently this alone appears to work on OS X. For windows (and linux??) use alt-s, which doesn't work on OS X! +formToSubmit = null; +function enableSaveOnControlS(control, formToSubmit) +{ + formToSubmit = formToSubmit; + if (document.addEventListener) + { + document.addEventListener("keypress", keypress, false); + } + else if (document.attachEvent) + { + document.attachEvent("onkeypress", keypress); + } + else + { + document.onkeypress = keypress; + } + +} +function keypress(e) +{ + if (!e) e = event; + if (e.keyIdentifier == "U+0053" || e.keyIdentifier == "U+0060") + { + suppressdefault(e, formToSubmit.keypress.checked); + if (formToSubmit != null) + { + formToSubmit.submit + } + } +} + +function doSilentRequest(url) +{ + var xmlHttp; + try + { + // Firefox, Opera 8.0+, Safari + xmlHttp=new XMLHttpRequest(); + } + catch (e) + { + // Internet Explorer + try + { + xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) + { + try + { + xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (e) + { + alert("Your browser does not support AJAX!"); + return false; + } + } + } + xmlHttp.onreadystatechange=function() {} + xmlHttp.open("GET",url,true); + xmlHttp.send(null); + return false; +} + diff --git a/fitnesse/FitNesseRoot/files/javascript/fitnesseTreeControl.js b/fitnesse/FitNesseRoot/files/javascript/fitnesseTreeControl.js new file mode 100644 index 0000000000..d4dfa7ab4a --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/fitnesseTreeControl.js @@ -0,0 +1,45 @@ +function add_fitnesse_methods_to_YUI_textnode() { + YAHOO.widget.TextNode.prototype.fitnesse_path = function() { + var node_list = this.path_labels(); + return node_list.join('.'); + }; + YAHOO.widget.TextNode.prototype.path_labels = function() { + if (!this.parent.path_labels) { + return [this.label]; + } + return this.parent.path_labels().concat(this.label); + }; +} + +function add_nodes_to_parent(child_node_names, parent_node) { + $(child_node_names).sort().each(function() { + var node = new YAHOO.widget.TextNode({label:this, target:"page_frame"}, parent_node, false); + node.href = "/" + node.fitnesse_path(); + }); +} + +var tree; +function tree_init(div_id) { + add_fitnesse_methods_to_YUI_textnode(); + + tree = new YAHOO.widget.TreeView(div_id); + tree.setDynamicLoad(load_child_nodes, 1); + $.getJSON("/root?names&format=json", + function(json) { + add_nodes_to_parent(json, tree.getRoot()); + tree.render(); + } + ); + tree.subscribe("clickEvent", function(node) { + return false; + }); +} +function load_child_nodes(node, fnLoadComplete) +{ + var callback = function(json) { + add_nodes_to_parent(json, node); + fnLoadComplete(); + }; + var url = "/" + node.fitnesse_path() + "?names&format=json"; + $.getJSON(url, callback); +} diff --git a/fitnesse/FitNesseRoot/files/javascript/jquery-1.3.2.min.js b/fitnesse/FitNesseRoot/files/javascript/jquery-1.3.2.min.js new file mode 100644 index 0000000000..b1ae21d8b2 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jquery-1.3.2.min.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/javascript/jsUnitTestLink.js b/fitnesse/FitNesseRoot/files/javascript/jsUnitTestLink.js new file mode 100644 index 0000000000..4170994aa7 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsUnitTestLink.js @@ -0,0 +1,4 @@ +document.write(''); +document.write("

    " + document.title + "

    "); +document.write("Run this test"); + diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitCore.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitCore.js new file mode 100644 index 0000000000..438513efbd --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitCore.js @@ -0,0 +1,534 @@ +var JSUNIT_UNDEFINED_VALUE; +var JSUNIT_VERSION = 2.2; +var isTestPageLoaded = false; + +//hack for NS62 bug +function jsUnitFixTop() { + var tempTop = top; + if (!tempTop) { + tempTop = window; + while (tempTop.parent) { + tempTop = tempTop.parent; + if (tempTop.top && tempTop.top.jsUnitTestSuite) { + tempTop = tempTop.top; + break; + } + } + } + try { + window.top = tempTop; + } catch (e) { + } +} + +jsUnitFixTop(); + +/** + + * A more functional typeof + + * @param Object o + + * @return String + + */ +function _trueTypeOf(something) { + var result = typeof something; + try { + switch (result) { + case 'string': + case 'boolean': + case 'number': + break; + case 'object': + case 'function': + switch (something.constructor) + { + case String: + result = 'String'; + break; + case Boolean: + result = 'Boolean'; + break; + case Number: + result = 'Number'; + break; + case Array: + result = 'Array'; + break; + case RegExp: + result = 'RegExp'; + break; + case Function: + result = 'Function'; + break; + default: + var m = something.constructor.toString().match(/function\s*([^( ]+)\(/); + if (m) + result = m[1]; + else + break; + } + break; + } + } + finally { + result = result.substr(0, 1).toUpperCase() + result.substr(1); + return result; + } +} + +function _displayStringForValue(aVar) { + var result = '<' + aVar + '>'; + if (!(aVar === null || aVar === top.JSUNIT_UNDEFINED_VALUE)) { + result += ' (' + _trueTypeOf(aVar) + ')'; + } + return result; +} + +function fail(failureMessage) { + throw new JsUnitException("Call to fail()", failureMessage); +} + +function error(errorMessage) { + var errorObject = new Object(); + errorObject.description = errorMessage; + errorObject.stackTrace = getStackTrace(); + throw errorObject; +} + +function argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) { + return args.length == expectedNumberOfNonCommentArgs + 1; +} + +function commentArg(expectedNumberOfNonCommentArgs, args) { + if (argumentsIncludeComments(expectedNumberOfNonCommentArgs, args)) + return args[0]; + + return null; +} + +function nonCommentArg(desiredNonCommentArgIndex, expectedNumberOfNonCommentArgs, args) { + return argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) ? + args[desiredNonCommentArgIndex] : + args[desiredNonCommentArgIndex - 1]; +} + +function _validateArguments(expectedNumberOfNonCommentArgs, args) { + if (!( args.length == expectedNumberOfNonCommentArgs || + (args.length == expectedNumberOfNonCommentArgs + 1 && typeof(args[0]) == 'string') )) + error('Incorrect arguments passed to assert function'); +} + +function _assert(comment, booleanValue, failureMessage) { + if (!booleanValue) + throw new JsUnitException(comment, failureMessage); +} + +function assert() { + _validateArguments(1, arguments); + var booleanValue = nonCommentArg(1, 1, arguments); + + if (typeof(booleanValue) != 'boolean') + error('Bad argument to assert(boolean)'); + + _assert(commentArg(1, arguments), booleanValue === true, 'Call to assert(boolean) with false'); +} + +function assertTrue() { + _validateArguments(1, arguments); + var booleanValue = nonCommentArg(1, 1, arguments); + + if (typeof(booleanValue) != 'boolean') + error('Bad argument to assertTrue(boolean)'); + + _assert(commentArg(1, arguments), booleanValue === true, 'Call to assertTrue(boolean) with false'); +} + +function assertFalse() { + _validateArguments(1, arguments); + var booleanValue = nonCommentArg(1, 1, arguments); + + if (typeof(booleanValue) != 'boolean') + error('Bad argument to assertFalse(boolean)'); + + _assert(commentArg(1, arguments), booleanValue === false, 'Call to assertFalse(boolean) with true'); +} + +function assertEquals() { + _validateArguments(2, arguments); + var var1 = nonCommentArg(1, 2, arguments); + var var2 = nonCommentArg(2, 2, arguments); + _assert(commentArg(2, arguments), var1 === var2, 'Expected ' + _displayStringForValue(var1) + ' but was ' + _displayStringForValue(var2)); +} + +function assertNotEquals() { + _validateArguments(2, arguments); + var var1 = nonCommentArg(1, 2, arguments); + var var2 = nonCommentArg(2, 2, arguments); + _assert(commentArg(2, arguments), var1 !== var2, 'Expected not to be ' + _displayStringForValue(var2)); +} + +function assertNull() { + _validateArguments(1, arguments); + var aVar = nonCommentArg(1, 1, arguments); + _assert(commentArg(1, arguments), aVar === null, 'Expected ' + _displayStringForValue(null) + ' but was ' + _displayStringForValue(aVar)); +} + +function assertNotNull() { + _validateArguments(1, arguments); + var aVar = nonCommentArg(1, 1, arguments); + _assert(commentArg(1, arguments), aVar !== null, 'Expected not to be ' + _displayStringForValue(null)); +} + +function assertUndefined() { + _validateArguments(1, arguments); + var aVar = nonCommentArg(1, 1, arguments); + _assert(commentArg(1, arguments), aVar === top.JSUNIT_UNDEFINED_VALUE, 'Expected ' + _displayStringForValue(top.JSUNIT_UNDEFINED_VALUE) + ' but was ' + _displayStringForValue(aVar)); +} + +function assertNotUndefined() { + _validateArguments(1, arguments); + var aVar = nonCommentArg(1, 1, arguments); + _assert(commentArg(1, arguments), aVar !== top.JSUNIT_UNDEFINED_VALUE, 'Expected not to be ' + _displayStringForValue(top.JSUNIT_UNDEFINED_VALUE)); +} + +function assertNaN() { + _validateArguments(1, arguments); + var aVar = nonCommentArg(1, 1, arguments); + _assert(commentArg(1, arguments), isNaN(aVar), 'Expected NaN'); +} + +function assertNotNaN() { + _validateArguments(1, arguments); + var aVar = nonCommentArg(1, 1, arguments); + _assert(commentArg(1, arguments), !isNaN(aVar), 'Expected not NaN'); +} + +function assertObjectEquals() { + _validateArguments(2, arguments); + var var1 = nonCommentArg(1, 2, arguments); + var var2 = nonCommentArg(2, 2, arguments); + var type; + var msg = commentArg(2, arguments)?commentArg(2, arguments):''; + var isSame = (var1 === var2); + //shortpath for references to same object + var isEqual = ( (type = _trueTypeOf(var1)) == _trueTypeOf(var2) ); + if (isEqual && !isSame) { + switch (type) { + case 'String': + case 'Number': + isEqual = (var1 == var2); + break; + case 'Boolean': + case 'Date': + isEqual = (var1 === var2); + break; + case 'RegExp': + case 'Function': + isEqual = (var1.toString() === var2.toString()); + break; + default: //Object | Array + var i; + if (isEqual = (var1.length === var2.length)) + for (i in var1) + assertObjectEquals(msg + ' found nested ' + type + '@' + i + '\n', var1[i], var2[i]); + } + _assert(msg, isEqual, 'Expected ' + _displayStringForValue(var1) + ' but was ' + _displayStringForValue(var2)); + } +} + +assertArrayEquals = assertObjectEquals; + +function assertEvaluatesToTrue() { + _validateArguments(1, arguments); + var value = nonCommentArg(1, 1, arguments); + if (!value) + fail(commentArg(1, arguments)); +} + +function assertEvaluatesToFalse() { + _validateArguments(1, arguments); + var value = nonCommentArg(1, 1, arguments); + if (value) + fail(commentArg(1, arguments)); +} + +function assertHTMLEquals() { + _validateArguments(2, arguments); + var var1 = nonCommentArg(1, 2, arguments); + var var2 = nonCommentArg(2, 2, arguments); + var var1Standardized = standardizeHTML(var1); + var var2Standardized = standardizeHTML(var2); + + _assert(commentArg(2, arguments), var1Standardized === var2Standardized, 'Expected ' + _displayStringForValue(var1Standardized) + ' but was ' + _displayStringForValue(var2Standardized)); +} + +function assertHashEquals() { + _validateArguments(2, arguments); + var var1 = nonCommentArg(1, 2, arguments); + var var2 = nonCommentArg(2, 2, arguments); + for (var key in var1) { + assertNotUndefined("Expected hash had key " + key + " that was not found", var2[key]); + assertEquals( + "Value for key " + key + " mismatch - expected = " + var1[key] + ", actual = " + var2[key], + var1[key], var2[key] + ); + } + for (var key in var2) { + assertNotUndefined("Actual hash had key " + key + " that was not expected", var1[key]); + } +} + +function assertRoughlyEquals() { + _validateArguments(3, arguments); + var expected = nonCommentArg(1, 3, arguments); + var actual = nonCommentArg(2, 3, arguments); + var tolerance = nonCommentArg(3, 3, arguments); + assertTrue( + "Expected " + expected + ", but got " + actual + " which was more than " + tolerance + " away", + Math.abs(expected - actual) < tolerance + ); +} + +function assertContains() { + _validateArguments(2, arguments); + var contained = nonCommentArg(1, 2, arguments); + var container = nonCommentArg(2, 2, arguments); + assertTrue( + "Expected '" + container + "' to contain '" + contained + "'", + container.indexOf(contained) != -1 + ); +} + +function standardizeHTML(html) { + var translator = document.createElement("DIV"); + translator.innerHTML = html; + return translator.innerHTML; +} + +function isLoaded() { + return isTestPageLoaded; +} + +function setUp() { +} + +function tearDown() { +} + +function getFunctionName(aFunction) { + var regexpResult = aFunction.toString().match(/function(\s*)(\w*)/); + if (regexpResult && regexpResult.length >= 2 && regexpResult[2]) { + return regexpResult[2]; + } + return 'anonymous'; +} + +function getStackTrace() { + var result = ''; + + if (typeof(arguments.caller) != 'undefined') { // IE, not ECMA + for (var a = arguments.caller; a != null; a = a.caller) { + result += '> ' + getFunctionName(a.callee) + '\n'; + if (a.caller == a) { + result += '*'; + break; + } + } + } + else { // Mozilla, not ECMA + // fake an exception so we can get Mozilla's error stack + var testExcp; + try + { + foo.bar; + } + catch(testExcp) + { + var stack = parseErrorStack(testExcp); + for (var i = 1; i < stack.length; i++) + { + result += '> ' + stack[i] + '\n'; + } + } + } + + return result; +} + +function parseErrorStack(excp) +{ + var stack = []; + var name; + + if (!excp || !excp.stack) + { + return stack; + } + + var stacklist = excp.stack.split('\n'); + + for (var i = 0; i < stacklist.length - 1; i++) + { + var framedata = stacklist[i]; + + name = framedata.match(/^(\w*)/)[1]; + if (!name) { + name = 'anonymous'; + } + + stack[stack.length] = name; + } + // remove top level anonymous functions to match IE + + while (stack.length && stack[stack.length - 1] == 'anonymous') + { + stack.length = stack.length - 1; + } + return stack; +} + +function JsUnitException(comment, message) { + this.isJsUnitException = true; + this.comment = comment; + this.jsUnitMessage = message; + this.stackTrace = getStackTrace(); +} + +function warn() { + if (top.tracer != null) + top.tracer.warn(arguments[0], arguments[1]); +} + +function inform() { + if (top.tracer != null) + top.tracer.inform(arguments[0], arguments[1]); +} + +function info() { + inform(arguments[0], arguments[1]); +} + +function debug() { + if (top.tracer != null) + top.tracer.debug(arguments[0], arguments[1]); +} + +function setJsUnitTracer(aJsUnitTracer) { + top.tracer = aJsUnitTracer; +} + +function trim(str) { + if (str == null) + return null; + + var startingIndex = 0; + var endingIndex = str.length - 1; + + while (str.substring(startingIndex, startingIndex + 1) == ' ') + startingIndex++; + + while (str.substring(endingIndex, endingIndex + 1) == ' ') + endingIndex--; + + if (endingIndex < startingIndex) + return ''; + + return str.substring(startingIndex, endingIndex + 1); +} + +function isBlank(str) { + return trim(str) == ''; +} + +// the functions push(anArray, anObject) and pop(anArray) +// exist because the JavaScript Array.push(anObject) and Array.pop() +// functions are not available in IE 5.0 + +function push(anArray, anObject) { + anArray[anArray.length] = anObject; +} +function pop(anArray) { + if (anArray.length >= 1) { + delete anArray[anArray.length - 1]; + anArray.length--; + } +} + +function jsUnitGetParm(name) +{ + if (typeof(top.jsUnitParmHash[name]) != 'undefined') + { + return top.jsUnitParmHash[name]; + } + return null; +} + +if (top && typeof(top.xbDEBUG) != 'undefined' && top.xbDEBUG.on && top.testManager) +{ + top.xbDebugTraceObject('top.testManager.containerTestFrame', 'JSUnitException'); + // asserts + top.xbDebugTraceFunction('top.testManager.containerTestFrame', '_displayStringForValue'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'error'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'argumentsIncludeComments'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'commentArg'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'nonCommentArg'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', '_validateArguments'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', '_assert'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assert'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertTrue'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertEquals'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotEquals'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNull'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotNull'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertUndefined'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotUndefined'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNaN'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'assertNotNaN'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'isLoaded'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'setUp'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'tearDown'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'getFunctionName'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'getStackTrace'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'warn'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'inform'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'debug'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'setJsUnitTracer'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'trim'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'isBlank'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'newOnLoadEvent'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'push'); + top.xbDebugTraceFunction('top.testManager.containerTestFrame', 'pop'); +} + +function newOnLoadEvent() { + isTestPageLoaded = true; +} + +function jsUnitSetOnLoad(windowRef, onloadHandler) +{ + var isKonqueror = navigator.userAgent.indexOf('Konqueror/') != -1 || + navigator.userAgent.indexOf('Safari/') != -1; + + if (typeof(windowRef.attachEvent) != 'undefined') { + // Internet Explorer, Opera + windowRef.attachEvent("onload", onloadHandler); + } else if (typeof(windowRef.addEventListener) != 'undefined' && !isKonqueror) { + // Mozilla, Konqueror + // exclude Konqueror due to load issues + windowRef.addEventListener("load", onloadHandler, false); + } else if (typeof(windowRef.document.addEventListener) != 'undefined' && !isKonqueror) { + // DOM 2 Events + // exclude Mozilla, Konqueror due to load issues + windowRef.document.addEventListener("load", onloadHandler, false); + } else if (typeof(windowRef.onload) != 'undefined' && windowRef.onload) { + windowRef.jsunit_original_onload = windowRef.onload; + windowRef.onload = function() { + windowRef.jsunit_original_onload(); + onloadHandler(); + }; + } else { + // browsers that do not support windowRef.attachEvent or + // windowRef.addEventListener will override a page's own onload event + windowRef.onload = onloadHandler; + } +} + +jsUnitSetOnLoad(window, newOnLoadEvent); \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitMockTimeout.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitMockTimeout.js new file mode 100644 index 0000000000..99a4bf187a --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitMockTimeout.js @@ -0,0 +1,81 @@ +// Mock setTimeout, clearTimeout +// Contributed by Pivotal Computer Systems, www.pivotalsf.com + +var Clock = { + timeoutsMade: 0, + scheduledFunctions: {}, + nowMillis: 0, + reset: function() { + this.scheduledFunctions = {}; + this.nowMillis = 0; + this.timeoutsMade = 0; + }, + tick: function(millis) { + var oldMillis = this.nowMillis; + var newMillis = oldMillis + millis; + this.runFunctionsWithinRange(oldMillis, newMillis); + this.nowMillis = newMillis; + }, + runFunctionsWithinRange: function(oldMillis, nowMillis) { + var scheduledFunc; + var funcsToRun = []; + for (var timeoutKey in this.scheduledFunctions) { + scheduledFunc = this.scheduledFunctions[timeoutKey]; + if (scheduledFunc != undefined && + scheduledFunc.runAtMillis >= oldMillis && + scheduledFunc.runAtMillis <= nowMillis) { + funcsToRun.push(scheduledFunc); + this.scheduledFunctions[timeoutKey] = undefined; + } + } + + if (funcsToRun.length > 0) { + funcsToRun.sort(function(a, b) { + return a.runAtMillis - b.runAtMillis; + }); + for (var i = 0; i < funcsToRun.length; ++i) { + try { + this.nowMillis = funcsToRun[i].runAtMillis; + funcsToRun[i].funcToCall(); + if (funcsToRun[i].recurring) { + Clock.scheduleFunction(funcsToRun[i].timeoutKey, + funcsToRun[i].funcToCall, + funcsToRun[i].millis, + true); + } + } catch(e) { + } + } + this.runFunctionsWithinRange(oldMillis, nowMillis); + } + }, + scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { + Clock.scheduledFunctions[timeoutKey] = { + runAtMillis: Clock.nowMillis + millis, + funcToCall: funcToCall, + recurring: recurring, + timeoutKey: timeoutKey, + millis: millis + }; + } +}; + +function setTimeout(funcToCall, millis) { + Clock.timeoutsMade = Clock.timeoutsMade + 1; + Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, false); + return Clock.timeoutsMade; +} + +function setInterval(funcToCall, millis) { + Clock.timeoutsMade = Clock.timeoutsMade + 1; + Clock.scheduleFunction(Clock.timeoutsMade, funcToCall, millis, true); + return Clock.timeoutsMade; +} + +function clearTimeout(timeoutKey) { + Clock.scheduledFunctions[timeoutKey] = undefined; +} + +function clearInterval(timeoutKey) { + Clock.scheduledFunctions[timeoutKey] = undefined; +} diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTestManager.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTestManager.js new file mode 100644 index 0000000000..7d5bf0f794 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTestManager.js @@ -0,0 +1,705 @@ +function jsUnitTestManager() { + this._windowForAllProblemMessages = null; + + this.container = top.frames.testContainer + this.documentLoader = top.frames.documentLoader; + this.mainFrame = top.frames.mainFrame; + + this.containerController = this.container.frames.testContainerController; + this.containerTestFrame = this.container.frames.testFrame; + + var mainData = this.mainFrame.frames.mainData; + + // form elements on mainData frame + this.testFileName = mainData.document.testRunnerForm.testFileName; + this.runButton = mainData.document.testRunnerForm.runButton; + this.traceLevel = mainData.document.testRunnerForm.traceLevel; + this.closeTraceWindowOnNewRun = mainData.document.testRunnerForm.closeTraceWindowOnNewRun; + this.timeout = mainData.document.testRunnerForm.timeout; + this.setUpPageTimeout = mainData.document.testRunnerForm.setUpPageTimeout; + + // image output + this.progressBar = this.mainFrame.frames.mainProgress.document.progress; + + this.problemsListField = this.mainFrame.frames.mainErrors.document.testRunnerForm.problemsList; + this.testCaseResultsField = this.mainFrame.frames.mainResults.document.resultsForm.testCases; + this.resultsTimeField = this.mainFrame.frames.mainResults.document.resultsForm.time; + + // 'layer' output frames + this.uiFrames = new Object(); + this.uiFrames.mainStatus = this.mainFrame.frames.mainStatus; + + var mainCounts = this.mainFrame.frames.mainCounts; + + this.uiFrames.mainCountsErrors = mainCounts.frames.mainCountsErrors; + this.uiFrames.mainCountsFailures = mainCounts.frames.mainCountsFailures; + this.uiFrames.mainCountsRuns = mainCounts.frames.mainCountsRuns; + this._baseURL = ""; + + this.setup(); +} + +// seconds to wait for each test page to load +jsUnitTestManager.TESTPAGE_WAIT_SEC = 120; +jsUnitTestManager.TIMEOUT_LENGTH = 20; + +// seconds to wait for setUpPage to complete +jsUnitTestManager.SETUPPAGE_TIMEOUT = 120; + +// milliseconds to wait between polls on setUpPages +jsUnitTestManager.SETUPPAGE_INTERVAL = 100; + +jsUnitTestManager.RESTORED_HTML_DIV_ID = "jsUnitRestoredHTML"; + +jsUnitTestManager.prototype.setup = function () { + this.totalCount = 0; + this.errorCount = 0; + this.failureCount = 0; + this._suiteStack = Array(); + + var initialSuite = new top.jsUnitTestSuite(); + push(this._suiteStack, initialSuite); +} + +jsUnitTestManager.prototype.start = function () { + this._baseURL = this.resolveUserEnteredTestFileName(); + var firstQuery = this._baseURL.indexOf("?"); + if (firstQuery >= 0) { + this._baseURL = this._baseURL.substring(0, firstQuery); + } + var lastSlash = this._baseURL.lastIndexOf("/"); + var lastRevSlash = this._baseURL.lastIndexOf("\\"); + if (lastRevSlash > lastSlash) { + lastSlash = lastRevSlash; + } + if (lastSlash > 0) { + this._baseURL = this._baseURL.substring(0, lastSlash + 1); + } + + this._timeRunStarted = new Date(); + this.initialize(); + setTimeout('top.testManager._nextPage();', jsUnitTestManager.TIMEOUT_LENGTH); +} + +jsUnitTestManager.prototype.getBaseURL = function () { + return this._baseURL; +} + +jsUnitTestManager.prototype.doneLoadingPage = function (pageName) { + //this.containerTestFrame.setTracer(top.tracer); + this._testFileName = pageName; + if (this.isTestPageSuite()) + this._handleNewSuite(); + else + { + this._testIndex = 0; + this._testsInPage = this.getTestFunctionNames(); + this._numberOfTestsInPage = this._testsInPage.length; + this._runTest(); + } +} + +jsUnitTestManager.prototype._handleNewSuite = function () { + var allegedSuite = this.containerTestFrame.suite(); + if (allegedSuite.isjsUnitTestSuite) { + var newSuite = allegedSuite.clone(); + if (newSuite.containsTestPages()) + push(this._suiteStack, newSuite); + this._nextPage(); + } + else { + this.fatalError('Invalid test suite in file ' + this._testFileName); + this.abort(); + } +} + +jsUnitTestManager.prototype._runTest = function () { + if (this._testIndex + 1 > this._numberOfTestsInPage) + { + // execute tearDownPage *synchronously* + // (unlike setUpPage which is asynchronous) + if (typeof this.containerTestFrame.tearDownPage == 'function') { + this.containerTestFrame.tearDownPage(); + } + + this._nextPage(); + return; + } + + if (this._testIndex == 0) { + this.storeRestoredHTML(); + if (typeof(this.containerTestFrame.setUpPage) == 'function') { + // first test for this page and a setUpPage is defined + if (typeof(this.containerTestFrame.setUpPageStatus) == 'undefined') { + // setUpPage() not called yet, so call it + this.containerTestFrame.setUpPageStatus = false; + this.containerTestFrame.startTime = new Date(); + this.containerTestFrame.setUpPage(); + // try test again later + setTimeout('top.testManager._runTest()', jsUnitTestManager.SETUPPAGE_INTERVAL); + return; + } + + if (this.containerTestFrame.setUpPageStatus != 'complete') { + top.status = 'setUpPage not completed... ' + this.containerTestFrame.setUpPageStatus + ' ' + (new Date()); + if ((new Date() - this.containerTestFrame.startTime) / 1000 > this.getsetUpPageTimeout()) { + this.fatalError('setUpPage timed out without completing.'); + if (!this.userConfirm('Retry Test Run?')) { + this.abort(); + return; + } + this.containerTestFrame.startTime = (new Date()); + } + // try test again later + setTimeout('top.testManager._runTest()', jsUnitTestManager.SETUPPAGE_INTERVAL); + return; + } + } + } + + top.status = ''; + // either not first test, or no setUpPage defined, or setUpPage completed + this.executeTestFunction(this._testsInPage[this._testIndex]); + this.totalCount++; + this.updateProgressIndicators(); + this._testIndex++; + setTimeout('top.testManager._runTest()', jsUnitTestManager.TIMEOUT_LENGTH); +} + +jsUnitTestManager.prototype._done = function () { + var secondsSinceRunBegan = (new Date() - this._timeRunStarted) / 1000; + this.setStatus('Done (' + secondsSinceRunBegan + ' seconds)'); + this._cleanUp(); + if (top.shouldSubmitResults()) { + this.resultsTimeField.value = secondsSinceRunBegan; + top.submitResults(); + } +} + +jsUnitTestManager.prototype._nextPage = function () { + this._restoredHTML = null; + if (this._currentSuite().hasMorePages()) { + this.loadPage(this._currentSuite().nextPage()); + } + else { + pop(this._suiteStack); + if (this._currentSuite() == null) + this._done(); + else + this._nextPage(); + } +} + +jsUnitTestManager.prototype._currentSuite = function () { + var suite = null; + + if (this._suiteStack && this._suiteStack.length > 0) + suite = this._suiteStack[this._suiteStack.length - 1]; + + return suite; +} + +jsUnitTestManager.prototype.calculateProgressBarProportion = function () { + if (this.totalCount == 0) + return 0; + var currentDivisor = 1; + var result = 0; + + for (var i = 0; i < this._suiteStack.length; i++) { + var aSuite = this._suiteStack[i]; + currentDivisor *= aSuite.testPages.length; + result += (aSuite.pageIndex - 1) / currentDivisor; + } + result += (this._testIndex + 1) / (this._numberOfTestsInPage * currentDivisor); + return result; +} + +jsUnitTestManager.prototype._cleanUp = function () { + this.containerController.setTestPage('./app/emptyPage.html'); + this.finalize(); + top.tracer.finalize(); +} + +jsUnitTestManager.prototype.abort = function () { + this.setStatus('Aborted'); + this._cleanUp(); +} + +jsUnitTestManager.prototype.getTimeout = function () { + var result = jsUnitTestManager.TESTPAGE_WAIT_SEC; + try { + result = eval(this.timeout.value); + } + catch (e) { + } + return result; +} + +jsUnitTestManager.prototype.getsetUpPageTimeout = function () { + var result = jsUnitTestManager.SETUPPAGE_TIMEOUT; + try { + result = eval(this.setUpPageTimeout.value); + } + catch (e) { + } + return result; +} + +jsUnitTestManager.prototype.isTestPageSuite = function () { + var result = false; + if (typeof(this.containerTestFrame.suite) == 'function') + { + result = true; + } + return result; +} + +jsUnitTestManager.prototype.getTestFunctionNames = function () { + var testFrame = this.containerTestFrame; + var testFunctionNames = new Array(); + var i; + + if (testFrame && typeof(testFrame.exposeTestFunctionNames) == 'function') + return testFrame.exposeTestFunctionNames(); + + if (testFrame && + testFrame.document && + typeof(testFrame.document.scripts) != 'undefined' && + testFrame.document.scripts.length > 0) { // IE5 and up + var scriptsInTestFrame = testFrame.document.scripts; + + for (i = 0; i < scriptsInTestFrame.length; i++) { + var someNames = this._extractTestFunctionNamesFromScript(scriptsInTestFrame[i]); + if (someNames) + testFunctionNames = testFunctionNames.concat(someNames); + } + } + else { + for (i in testFrame) { + if (i.substring(0, 4) == 'test' && typeof(testFrame[i]) == 'function') + push(testFunctionNames, i); + } + } + return testFunctionNames; +} + +jsUnitTestManager.prototype._extractTestFunctionNamesFromScript = function (aScript) { + var result; + var remainingScriptToInspect = aScript.text; + var currentIndex = this._indexOfTestFunctionIn(remainingScriptToInspect); + while (currentIndex != -1) { + if (!result) + result = new Array(); + + var fragment = remainingScriptToInspect.substring(currentIndex, remainingScriptToInspect.length); + result = result.concat(fragment.substring('function '.length, fragment.indexOf('('))); + remainingScriptToInspect = remainingScriptToInspect.substring(currentIndex + 12, remainingScriptToInspect.length); + currentIndex = this._indexOfTestFunctionIn(remainingScriptToInspect); + } + return result; +} + +jsUnitTestManager.prototype._indexOfTestFunctionIn = function (string) { + return string.indexOf('function test'); +} + +jsUnitTestManager.prototype.loadPage = function (testFileName) { + this._testFileName = testFileName; + this._loadAttemptStartTime = new Date(); + this.setStatus('Opening Test Page "' + this._testFileName + '"'); + this.containerController.setTestPage(this._testFileName); + this._callBackWhenPageIsLoaded(); +} + +jsUnitTestManager.prototype._callBackWhenPageIsLoaded = function () { + if ((new Date() - this._loadAttemptStartTime) / 1000 > this.getTimeout()) { + this.fatalError('Reading Test Page ' + this._testFileName + ' timed out.\nMake sure that the file exists and is a Test Page.'); + if (this.userConfirm('Retry Test Run?')) { + this.loadPage(this._testFileName); + return; + } else { + this.abort(); + return; + } + } + if (!this._isTestFrameLoaded()) { + setTimeout('top.testManager._callBackWhenPageIsLoaded();', jsUnitTestManager.TIMEOUT_LENGTH); + return; + } + this.doneLoadingPage(this._testFileName); +} + +jsUnitTestManager.prototype._isTestFrameLoaded = function () { + try { + return this.containerController.isPageLoaded(); + } + catch (e) { + } + return false; +} + +jsUnitTestManager.prototype.executeTestFunction = function (functionName) { + this._testFunctionName = functionName; + this.setStatus('Running test "' + this._testFunctionName + '"'); + var excep = null; + var timeBefore = new Date(); + try { + if (this._restoredHTML) + top.testContainer.testFrame.document.getElementById(jsUnitTestManager.RESTORED_HTML_DIV_ID).innerHTML = this._restoredHTML; + if (this.containerTestFrame.setUp !== JSUNIT_UNDEFINED_VALUE) + this.containerTestFrame.setUp(); + this.containerTestFrame[this._testFunctionName](); + } + catch (e1) { + excep = e1; + } + finally { + try { + if (this.containerTestFrame.tearDown !== JSUNIT_UNDEFINED_VALUE) + this.containerTestFrame.tearDown(); + } + catch (e2) { + //Unlike JUnit, only assign a tearDown exception to excep if there is not already an exception from the test body + if (excep == null) + excep = e2; + } + } + var timeTaken = (new Date() - timeBefore) / 1000; + if (excep != null) + this._handleTestException(excep); + var serializedTestCaseString = this._currentTestFunctionNameWithTestPageName(true) + "|" + timeTaken + "|"; + if (excep == null) + serializedTestCaseString += "S||"; + else { + if (typeof(excep.isJsUnitException) != 'undefined' && excep.isJsUnitException) + serializedTestCaseString += "F|"; + else { + serializedTestCaseString += "E|"; + } + serializedTestCaseString += this._problemDetailMessageFor(excep); + } + this._addOption(this.testCaseResultsField, + serializedTestCaseString, + serializedTestCaseString); +} + +jsUnitTestManager.prototype._currentTestFunctionNameWithTestPageName = function(useFullyQualifiedTestPageName) { + var testURL = this.containerTestFrame.location.href; + var testQuery = testURL.indexOf("?"); + if (testQuery >= 0) { + testURL = testURL.substring(0, testQuery); + } + if (!useFullyQualifiedTestPageName) { + if (testURL.substring(0, this._baseURL.length) == this._baseURL) + testURL = testURL.substring(this._baseURL.length); + } + return testURL + ':' + this._testFunctionName; +} + +jsUnitTestManager.prototype._addOption = function(listField, problemValue, problemMessage) { + if (typeof(listField.ownerDocument) != 'undefined' + && typeof(listField.ownerDocument.createElement) != 'undefined') { + // DOM Level 2 HTML method. + // this is required for Opera 7 since appending to the end of the + // options array does not work, and adding an Option created by new Option() + // and appended by listField.options.add() fails due to WRONG_DOCUMENT_ERR + var problemDocument = listField.ownerDocument; + var errOption = problemDocument.createElement('option'); + errOption.setAttribute('value', problemValue); + errOption.appendChild(problemDocument.createTextNode(problemMessage)); + listField.appendChild(errOption); + } + else { + // new Option() is DOM 0 + errOption = new Option(problemMessage, problemValue); + if (typeof(listField.add) != 'undefined') { + // DOM 2 HTML + listField.add(errOption, null); + } + else if (typeof(listField.options.add) != 'undefined') { + // DOM 0 + listField.options.add(errOption, null); + } + else { + // DOM 0 + listField.options[listField.length] = errOption; + } + } +} + +jsUnitTestManager.prototype._handleTestException = function (excep) { + var problemMessage = this._currentTestFunctionNameWithTestPageName(false) + ' '; + var errOption; + if (typeof(excep.isJsUnitException) == 'undefined' || !excep.isJsUnitException) { + problemMessage += 'had an error'; + this.errorCount++; + } + else { + problemMessage += 'failed'; + this.failureCount++; + } + var listField = this.problemsListField; + this._addOption(listField, + this._problemDetailMessageFor(excep), + problemMessage); +} + +jsUnitTestManager.prototype._problemDetailMessageFor = function (excep) { + var result = null; + if (typeof(excep.isJsUnitException) != 'undefined' && excep.isJsUnitException) { + result = ''; + if (excep.comment != null) + result += ('"' + excep.comment + '"\n'); + + result += excep.jsUnitMessage; + + if (excep.stackTrace) + result += '\n\nStack trace follows:\n' + excep.stackTrace; + } + else { + result = 'Error message is:\n"'; + result += + (typeof(excep.description) == 'undefined') ? + excep : + excep.description; + result += '"'; + if (typeof(excep.stack) != 'undefined') // Mozilla only + result += '\n\nStack trace follows:\n' + excep.stack; + } + return result; +} + +jsUnitTestManager.prototype._setTextOnLayer = function (layerName, str) { + try { + var content; + if (content = this.uiFrames[layerName].document.getElementById('content')) + content.innerHTML = str; + else + throw 'No content div found.'; + } + catch (e) { + var html = ''; + html += ''; + html += '<\/head>'; + html += '
    '; + html += str; + html += '<\/div><\/body>'; + html += '<\/html>'; + this.uiFrames[layerName].document.write(html); + this.uiFrames[layerName].document.close(); + } +} + +jsUnitTestManager.prototype.setStatus = function (str) { + this._setTextOnLayer('mainStatus', 'Status:<\/b> ' + str); +} + +jsUnitTestManager.prototype._setErrors = function (n) { + this._setTextOnLayer('mainCountsErrors', 'Errors: <\/b>' + n); +} + +jsUnitTestManager.prototype._setFailures = function (n) { + this._setTextOnLayer('mainCountsFailures', 'Failures:<\/b> ' + n); +} + +jsUnitTestManager.prototype._setTotal = function (n) { + this._setTextOnLayer('mainCountsRuns', 'Runs:<\/b> ' + n); +} + +jsUnitTestManager.prototype._setProgressBarImage = function (imgName) { + this.progressBar.src = imgName; +} + +jsUnitTestManager.prototype._setProgressBarWidth = function (w) { + this.progressBar.width = w; +} + +jsUnitTestManager.prototype.updateProgressIndicators = function () { + this._setTotal(this.totalCount); + this._setErrors(this.errorCount); + this._setFailures(this.failureCount); + this._setProgressBarWidth(300 * this.calculateProgressBarProportion()); + + if (this.errorCount > 0 || this.failureCount > 0) + this._setProgressBarImage('../images/red.gif'); + else + this._setProgressBarImage('../images/green.gif'); +} + +jsUnitTestManager.prototype.showMessageForSelectedProblemTest = function () { + var problemTestIndex = this.problemsListField.selectedIndex; + if (problemTestIndex != -1) + this.fatalError(this.problemsListField[problemTestIndex].value); +} + +jsUnitTestManager.prototype.showMessagesForAllProblemTests = function () { + if (this.problemsListField.length == 0) + return; + + try { + if (this._windowForAllProblemMessages && !this._windowForAllProblemMessages.closed) + this._windowForAllProblemMessages.close(); + } + catch(e) { + } + + this._windowForAllProblemMessages = window.open('', '', 'width=600, height=350,status=no,resizable=yes,scrollbars=yes'); + var resDoc = this._windowForAllProblemMessages.document; + resDoc.write('Tests with problems - JsUnit<\/title><head><body>'); + resDoc.write('<p class="jsUnitSubHeading">Tests with problems (' + this.problemsListField.length + ' total) - JsUnit<\/p>'); + resDoc.write('<p class="jsUnitSubSubHeading"><i>Running on ' + navigator.userAgent + '</i></p>'); + for (var i = 0; i < this.problemsListField.length; i++) + { + resDoc.write('<p class="jsUnitDefault">'); + resDoc.write('<b>' + (i + 1) + '. '); + resDoc.write(this.problemsListField[i].text); + resDoc.write('<\/b><\/p><p><pre>'); + resDoc.write(this._makeHTMLSafe(this.problemsListField[i].value)); + resDoc.write('<\/pre><\/p>'); + } + + resDoc.write('<\/body><\/html>'); + resDoc.close(); +} + +jsUnitTestManager.prototype._makeHTMLSafe = function (string) { + string = string.replace(/&/g, '&'); + string = string.replace(/</g, '<'); + string = string.replace(/>/g, '>'); + return string; +} + +jsUnitTestManager.prototype._clearProblemsList = function () { + var listField = this.problemsListField; + var initialLength = listField.options.length; + + for (var i = 0; i < initialLength; i++) + listField.remove(0); +} + +jsUnitTestManager.prototype.initialize = function () { + this.setStatus('Initializing...'); + this._setRunButtonEnabled(false); + this._clearProblemsList(); + this.updateProgressIndicators(); + this.setStatus('Done initializing'); +} + +jsUnitTestManager.prototype.finalize = function () { + this._setRunButtonEnabled(true); +} + +jsUnitTestManager.prototype._setRunButtonEnabled = function (b) { + this.runButton.disabled = !b; +} + +jsUnitTestManager.prototype.getTestFileName = function () { + var rawEnteredFileName = this.testFileName.value; + var result = rawEnteredFileName; + + while (result.indexOf('\\') != -1) + result = result.replace('\\', '/'); + + return result; +} + +jsUnitTestManager.prototype.getTestFunctionName = function () { + return this._testFunctionName; +} + +jsUnitTestManager.prototype.resolveUserEnteredTestFileName = function (rawText) { + var userEnteredTestFileName = top.testManager.getTestFileName(); + + // only test for file:// since Opera uses a different format + if (userEnteredTestFileName.indexOf('http://') == 0 || userEnteredTestFileName.indexOf('https://') == 0 || userEnteredTestFileName.indexOf('file://') == 0) + return userEnteredTestFileName; + + return getTestFileProtocol() + this.getTestFileName(); +} + +jsUnitTestManager.prototype.storeRestoredHTML = function () { + if (document.getElementById && top.testContainer.testFrame.document.getElementById(jsUnitTestManager.RESTORED_HTML_DIV_ID)) + this._restoredHTML = top.testContainer.testFrame.document.getElementById(jsUnitTestManager.RESTORED_HTML_DIV_ID).innerHTML; +} + +jsUnitTestManager.prototype.fatalError = function(aMessage) { + if (top.shouldSubmitResults()) + this.setStatus(aMessage); + else + alert(aMessage); +} + +jsUnitTestManager.prototype.userConfirm = function(aMessage) { + if (top.shouldSubmitResults()) + return false; + else + return confirm(aMessage); +} + +function getTestFileProtocol() { + return getDocumentProtocol(); +} + +function getDocumentProtocol() { + var protocol = top.document.location.protocol; + + if (protocol == "file:") + return "file:///"; + + if (protocol == "http:") + return "http://"; + + if (protocol == 'https:') + return 'https://'; + + if (protocol == "chrome:") + return "chrome://"; + + return null; +} + +function browserSupportsReadingFullPathFromFileField() { + return !isOpera() && !isIE7(); +} + +function isOpera() { + return navigator.userAgent.toLowerCase().indexOf("opera") != -1; +} + +function isIE7() { + return navigator.userAgent.toLowerCase().indexOf("msie 7") != -1; +} + +function isBeingRunOverHTTP() { + return getDocumentProtocol() == "http://"; +} + +function getWebserver() { + if (isBeingRunOverHTTP()) { + var myUrl = location.href; + var myUrlWithProtocolStripped = myUrl.substring(myUrl.indexOf("/") + 2); + return myUrlWithProtocolStripped.substring(0, myUrlWithProtocolStripped.indexOf("/")); + } + return null; +} + +// the functions push(anArray, anObject) and pop(anArray) +// exist because the JavaScript Array.push(anObject) and Array.pop() +// functions are not available in IE 5.0 + +function push(anArray, anObject) { + anArray[anArray.length] = anObject; +} + +function pop(anArray) { + if (anArray.length >= 1) { + delete anArray[anArray.length - 1]; + anArray.length--; + } +} + +if (xbDEBUG.on) { + xbDebugTraceObject('window', 'jsUnitTestManager'); + xbDebugTraceFunction('window', 'getTestFileProtocol'); + xbDebugTraceFunction('window', 'getDocumentProtocol'); +} diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTestSuite.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTestSuite.js new file mode 100644 index 0000000000..3f3eb8cd33 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTestSuite.js @@ -0,0 +1,44 @@ +function jsUnitTestSuite() { + this.isjsUnitTestSuite = true; + this.testPages = Array(); + this.pageIndex = 0; +} + +jsUnitTestSuite.prototype.addTestPage = function (pageName) +{ + this.testPages[this.testPages.length] = pageName; +} + +jsUnitTestSuite.prototype.addTestSuite = function (suite) +{ + for (var i = 0; i < suite.testPages.length; i++) + this.addTestPage(suite.testPages[i]); +} + +jsUnitTestSuite.prototype.containsTestPages = function () +{ + return this.testPages.length > 0; +} + +jsUnitTestSuite.prototype.nextPage = function () +{ + return this.testPages[this.pageIndex++]; +} + +jsUnitTestSuite.prototype.hasMorePages = function () +{ + return this.pageIndex < this.testPages.length; +} + +jsUnitTestSuite.prototype.clone = function () +{ + var clone = new jsUnitTestSuite(); + clone.testPages = this.testPages; + return clone; +} + +if (xbDEBUG.on) +{ + xbDebugTraceObject('window', 'jsUnitTestSuite'); +} + diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTracer.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTracer.js new file mode 100644 index 0000000000..b120e393ac --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitTracer.js @@ -0,0 +1,102 @@ +var TRACE_LEVEL_NONE = new JsUnitTraceLevel(0, null); +var TRACE_LEVEL_WARNING = new JsUnitTraceLevel(1, "#FF0000"); +var TRACE_LEVEL_INFO = new JsUnitTraceLevel(2, "#009966"); +var TRACE_LEVEL_DEBUG = new JsUnitTraceLevel(3, "#0000FF"); + +function JsUnitTracer(testManager) { + this._testManager = testManager; + this._traceWindow = null; + this.popupWindowsBlocked = false; +} + +JsUnitTracer.prototype.initialize = function() { + if (this._traceWindow != null && top.testManager.closeTraceWindowOnNewRun.checked) + this._traceWindow.close(); + this._traceWindow = null; +} + +JsUnitTracer.prototype.finalize = function() { + if (this._traceWindow != null) { + this._traceWindow.document.write('<\/body>\n<\/html>'); + this._traceWindow.document.close(); + } +} + +JsUnitTracer.prototype.warn = function() { + this._trace(arguments[0], arguments[1], TRACE_LEVEL_WARNING); +} + +JsUnitTracer.prototype.inform = function() { + this._trace(arguments[0], arguments[1], TRACE_LEVEL_INFO); +} + +JsUnitTracer.prototype.debug = function() { + this._trace(arguments[0], arguments[1], TRACE_LEVEL_DEBUG); +} + +JsUnitTracer.prototype._trace = function(message, value, traceLevel) { + if (!top.shouldSubmitResults() && this._getChosenTraceLevel().matches(traceLevel)) { + var traceString = message; + if (value) + traceString += ': ' + value; + var prefix = this._testManager.getTestFileName() + ":" + + this._testManager.getTestFunctionName() + " - "; + this._writeToTraceWindow(prefix, traceString, traceLevel); + } +} + +JsUnitTracer.prototype._getChosenTraceLevel = function() { + var levelNumber = eval(top.testManager.traceLevel.value); + return traceLevelByLevelNumber(levelNumber); +} + +JsUnitTracer.prototype._writeToTraceWindow = function(prefix, traceString, traceLevel) { + var htmlToAppend = '<p class="jsUnitDefault">' + prefix + '<font color="' + traceLevel.getColor() + '">' + traceString + '</font><\/p>\n'; + this._getTraceWindow().document.write(htmlToAppend); +} + +JsUnitTracer.prototype._getTraceWindow = function() { + if (this._traceWindow == null && !top.shouldSubmitResults() && !this.popupWindowsBlocked) { + this._traceWindow = window.open('', '', 'width=600, height=350,status=no,resizable=yes,scrollbars=yes'); + if (!this._traceWindow) + this.popupWindowsBlocked = true; + else { + var resDoc = this._traceWindow.document; + resDoc.write('<html>\n<head>\n<link rel="stylesheet" href="css/jsUnitStyle.css">\n<title>Tracing - JsUnit<\/title>\n<head>\n<body>'); + resDoc.write('<h2>Tracing - JsUnit<\/h2>\n'); + resDoc.write('<p class="jsUnitDefault"><i>(Traces are color coded: '); + resDoc.write('<font color="' + TRACE_LEVEL_WARNING.getColor() + '">Warning</font> - '); + resDoc.write('<font color="' + TRACE_LEVEL_INFO.getColor() + '">Information</font> - '); + resDoc.write('<font color="' + TRACE_LEVEL_DEBUG.getColor() + '">Debug</font>'); + resDoc.write(')</i></p>'); + } + } + return this._traceWindow; +} + +if (xbDEBUG.on) { + xbDebugTraceObject('window', 'JsUnitTracer'); +} + +function JsUnitTraceLevel(levelNumber, color) { + this._levelNumber = levelNumber; + this._color = color; +} + +JsUnitTraceLevel.prototype.matches = function(anotherTraceLevel) { + return this._levelNumber >= anotherTraceLevel._levelNumber; +} + +JsUnitTraceLevel.prototype.getColor = function() { + return this._color; +} + +function traceLevelByLevelNumber(levelNumber) { + switch (levelNumber) { + case 0: return TRACE_LEVEL_NONE; + case 1: return TRACE_LEVEL_WARNING; + case 2: return TRACE_LEVEL_INFO; + case 3: return TRACE_LEVEL_DEBUG; + } + return null; +} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitVersionCheck.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitVersionCheck.js new file mode 100644 index 0000000000..41c8862574 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/jsUnitVersionCheck.js @@ -0,0 +1,59 @@ +var versionRequest; + +function isOutOfDate(newVersionNumber) { + return JSUNIT_VERSION < newVersionNumber; +} + +function sendRequestForLatestVersion(url) { + versionRequest = createXmlHttpRequest(); + if (versionRequest) { + versionRequest.onreadystatechange = requestStateChanged; + versionRequest.open("GET", url, true); + versionRequest.send(null); + } +} + +function createXmlHttpRequest() { + if (window.XMLHttpRequest) + return new XMLHttpRequest(); + else if (window.ActiveXObject) + return new ActiveXObject("Microsoft.XMLHTTP"); +} + +function requestStateChanged() { + if (versionRequest && versionRequest.readyState == 4) { + if (versionRequest.status == 200) { + var latestVersion = versionRequest.responseText; + if (isOutOfDate(latestVersion)) + versionNotLatest(latestVersion); + else + versionLatest(); + } else + versionCheckError(); + } +} + +function checkForLatestVersion(url) { + setLatestVersionDivHTML("Checking for newer version..."); + try { + sendRequestForLatestVersion(url); + } catch (e) { + setLatestVersionDivHTML("An error occurred while checking for a newer version: " + e.message); + } +} + +function versionNotLatest(latestVersion) { + setLatestVersionDivHTML('<font color="red">A newer version of JsUnit, version ' + latestVersion + ', is available.</font>'); +} + +function versionLatest() { + setLatestVersionDivHTML("You are running the latest version of JsUnit."); +} + +function setLatestVersionDivHTML(string) { + document.getElementById("versionCheckDiv").innerHTML = string; +} + +function versionCheckError() { + setLatestVersionDivHTML("An error occurred while checking for a newer version."); +} \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/javascript/jsunit/app/xbDebug.js b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/xbDebug.js new file mode 100644 index 0000000000..b7167ec8af --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/jsunit/app/xbDebug.js @@ -0,0 +1,306 @@ +// xbDebug.js revision: 0.003 2002-02-26 + +/* ***** BEGIN LICENSE BLOCK ***** + * Licensed under Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * Full Terms at /xbProjects-srce/license/mpl-tri-license.txt + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Netscape code. + * + * The Initial Developer of the Original Code is + * Netscape Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): Bob Clary <bclary@netscape.com> + * + * ***** END LICENSE BLOCK ***** */ + +/* +ChangeLog: + +2002-02-25: bclary - modified xbDebugTraceOject to make sure + that original versions of wrapped functions were not + rewrapped. This had caused an infinite loop in IE. + +2002-02-07: bclary - modified xbDebug.prototype.close to not null + the debug window reference. This can cause problems with + Internet Explorer if the page is refreshed. These issues will + be addressed at a later date. +*/ + +function xbDebug() +{ + this.on = false; + this.stack = new Array(); + this.debugwindow = null; + this.execprofile = new Object(); +} + +xbDebug.prototype.push = function () +{ + this.stack[this.stack.length] = this.on; + this.on = true; +} + +xbDebug.prototype.pop = function () +{ + this.on = this.stack[this.stack.length - 1]; + --this.stack.length; +} + +xbDebug.prototype.open = function () +{ + if (this.debugwindow && !this.debugwindow.closed) + this.close(); + + this.debugwindow = window.open('about:blank', 'DEBUGWINDOW', 'height=400,width=600,resizable=yes,scrollbars=yes'); + + this.debugwindow.title = 'xbDebug Window'; + this.debugwindow.document.write('<html><head><title>xbDebug Window

    Javascript Debug Window

    '); + this.debugwindow.focus(); +} + +xbDebug.prototype.close = function () +{ + if (!this.debugwindow) + return; + + if (!this.debugwindow.closed) + this.debugwindow.close(); + + // bc 2002-02-07, other windows may still hold a reference to this: this.debugwindow = null; +} + +xbDebug.prototype.dump = function (msg) +{ + if (!this.on) + return; + + if (!this.debugwindow || this.debugwindow.closed) + this.open(); + + this.debugwindow.document.write(msg + '
    '); + + return; +} + +var xbDEBUG = new xbDebug(); + +window.onunload = function () { + xbDEBUG.close(); +} + +function xbDebugGetFunctionName(funcref) +{ + + if (!funcref) + { + return ''; + } + + if (funcref.name) + return funcref.name; + + var name = funcref + ''; + name = name.substring(name.indexOf(' ') + 1, name.indexOf('(')); + funcref.name = name; + + if (!name) alert('name not defined'); + return name; +} + +// emulate functionref.apply for IE mac and IE win < 5.5 +function xbDebugApplyFunction(funcname, funcref, thisref, argumentsref) +{ + var rv; + + if (!funcref) + { + alert('xbDebugApplyFunction: funcref is null'); + } + + if (typeof(funcref.apply) != 'undefined') + return funcref.apply(thisref, argumentsref); + + var applyexpr = 'thisref.xbDebug_orig_' + funcname + '('; + var i; + + for (i = 0; i < argumentsref.length; i++) + { + applyexpr += 'argumentsref[' + i + '],'; + } + + if (argumentsref.length > 0) + { + applyexpr = applyexpr.substring(0, applyexpr.length - 1); + } + + applyexpr += ')'; + + return eval(applyexpr); +} + +function xbDebugCreateFunctionWrapper(scopename, funcname, precall, postcall) +{ + var wrappedfunc; + var scopeobject = eval(scopename); + var funcref = scopeobject[funcname]; + + scopeobject['xbDebug_orig_' + funcname] = funcref; + + wrappedfunc = function () + { + var rv; + + precall(scopename, funcname, arguments); + rv = xbDebugApplyFunction(funcname, funcref, scopeobject, arguments); + postcall(scopename, funcname, arguments, rv); + return rv; + }; + + if (typeof(funcref.constructor) != 'undefined') + wrappedfunc.constructor = funcref.constuctor; + + if (typeof(funcref.prototype) != 'undefined') + wrappedfunc.prototype = funcref.prototype; + + scopeobject[funcname] = wrappedfunc; +} + +function xbDebugCreateMethodWrapper(contextname, classname, methodname, precall, postcall) +{ + var context = eval(contextname); + var methodref = context[classname].prototype[methodname]; + + context[classname].prototype['xbDebug_orig_' + methodname] = methodref; + + var wrappedmethod = function () + { + var rv; + // eval 'this' at method run time to pick up reference to the object's instance + var thisref = eval('this'); + // eval 'arguments' at method run time to pick up method's arguments + var argsref = arguments; + + precall(contextname + '.' + classname, methodname, argsref); + rv = xbDebugApplyFunction(methodname, methodref, thisref, argsref); + postcall(contextname + '.' + classname, methodname, argsref, rv); + return rv; + }; + + return wrappedmethod; +} + +function xbDebugPersistToString(obj) +{ + var s = ''; + var p; + + if (obj == null) + return 'null'; + + switch (typeof(obj)) + { + case 'number': + return obj; + case 'string': + return '"' + obj + '"'; + case 'undefined': + return 'undefined'; + case 'boolean': + return obj + ''; + } + + if (obj.constructor) + return '[' + xbDebugGetFunctionName(obj.constructor) + ']'; + + return null; +} + +function xbDebugTraceBefore(scopename, funcname, funcarguments) +{ + var i; + var s = ''; + var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname]; + if (!execprofile) + execprofile = xbDEBUG.execprofile[scopename + '.' + funcname] = { started: 0, time: 0, count: 0 }; + + for (i = 0; i < funcarguments.length; i++) + { + s += xbDebugPersistToString(funcarguments[i]); + if (i < funcarguments.length - 1) + s += ', '; + } + + xbDEBUG.dump('enter ' + scopename + '.' + funcname + '(' + s + ')'); + execprofile.started = (new Date()).getTime(); +} + +function xbDebugTraceAfter(scopename, funcname, funcarguments, rv) +{ + var i; + var s = ''; + var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname]; + if (!execprofile) + xbDEBUG.dump('xbDebugTraceAfter: execprofile not created for ' + scopename + '.' + funcname); + else if (execprofile.started == 0) + xbDEBUG.dump('xbDebugTraceAfter: execprofile.started == 0 for ' + scopename + '.' + funcname); + else + { + execprofile.time += (new Date()).getTime() - execprofile.started; + execprofile.count++; + execprofile.started = 0; + } + + for (i = 0; i < funcarguments.length; i++) + { + s += xbDebugPersistToString(funcarguments[i]); + if (i < funcarguments.length - 1) + s += ', '; + } + + xbDEBUG.dump('exit ' + scopename + '.' + funcname + '(' + s + ')==' + xbDebugPersistToString(rv)); +} + +function xbDebugTraceFunction(scopename, funcname) +{ + xbDebugCreateFunctionWrapper(scopename, funcname, xbDebugTraceBefore, xbDebugTraceAfter); +} + +function xbDebugTraceObject(contextname, classname) +{ + var classref = eval(contextname + '.' + classname); + var p; + var sp; + + if (!classref || !classref.prototype) + return; + + for (p in classref.prototype) + { + sp = p + ''; + if (typeof(classref.prototype[sp]) == 'function' && (sp).indexOf('xbDebug_orig') == -1) + { + classref.prototype[sp] = xbDebugCreateMethodWrapper(contextname, classname, sp, xbDebugTraceBefore, xbDebugTraceAfter); + } + } +} + +function xbDebugDumpProfile() +{ + var p; + var execprofile; + var avg; + + for (p in xbDEBUG.execprofile) + { + execprofile = xbDEBUG.execprofile[p]; + avg = Math.round(100 * execprofile.time / execprofile.count) / 100; + xbDEBUG.dump('Execution profile ' + p + ' called ' + execprofile.count + ' times. Total time=' + execprofile.time + 'ms. Avg Time=' + avg + 'ms.'); + } +} diff --git a/fitnesse/FitNesseRoot/files/javascript/spreadsheetSupport.js b/fitnesse/FitNesseRoot/files/javascript/spreadsheetSupport.js new file mode 100644 index 0000000000..1d810caa31 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/spreadsheetSupport.js @@ -0,0 +1,31 @@ +// Copyright (C) 2004 by Alain Bienvenue. All rights reserved. +// Released under the terms of the GNU General Public License version 2 or later. + +function SelectionSpreadsheetToWiki(textArea) +{ + var translator = new SpreadsheetTranslator(); + translator.parseExcelTable(textArea.value); + textArea.value = translator.getFitNesseTables(); + textArea.focus(); +} + +function SelectionWikiToSpreadsheet(textArea) +{ + var selection = textArea.value; + selection = selection.replace(/\r\n/g, '\n'); + selection = selection.replace(/\r/g, '\n'); + selection = selection.replace(/\|\n/g, '\n'); // remove the last | at the end of the line + selection = selection.replace(/\|/g, '\t'); // replace all remaining | with \t + textArea.value = selection; + textArea.focus(); +} + + +title = "This function will convert the text from spreadsheet format to FitNesse format."; + +document.write(""); +document.write(" "); + +title = "This function will convert the text from FitNesse format to spreadsheet."; +document.write(""); + diff --git a/fitnesse/FitNesseRoot/files/javascript/textareaWrapSupport.js b/fitnesse/FitNesseRoot/files/javascript/textareaWrapSupport.js new file mode 100644 index 0000000000..3476062814 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/textareaWrapSupport.js @@ -0,0 +1,36 @@ +function addClassName(element, className) { + element.className += (element.className ? ' ' : '') + className; +} + +function removeClassName(element, className) { + var c = element.className; + + if(c && c.length > 0) { + element.className = c.replace(new RegExp("(^|\\s)" + className + "(\\s|$)"), ''); + } +} + +function setWrap(area, wrap) { + if (area.wrap) { + area.wrap = wrap; + } else { // wrap attribute not supported - try Mozilla workaround + area.setAttribute('wrap', wrap); + var newarea= area.cloneNode(true); + newarea.value= area.value; + area.parentNode.replaceChild(newarea, area); + } +} + +function toggleWrap(checkbox) { + setWrap(document.f.pageContent, checkbox.checked ? 'soft' : 'off'); + + if(checkbox.checked) { + removeClassName(document.f.pageContent, 'no_wrap'); + } + else { + addClassName(document.f.pageContent, 'no_wrap'); + } +} + +document.write(''); +document.write('wrap'); diff --git a/fitnesse/FitNesseRoot/files/javascript/wikiFormatterSupport.js b/fitnesse/FitNesseRoot/files/javascript/wikiFormatterSupport.js new file mode 100644 index 0000000000..e11b7ffd9d --- /dev/null +++ b/fitnesse/FitNesseRoot/files/javascript/wikiFormatterSupport.js @@ -0,0 +1,9 @@ +function FormatWiki(textArea) +{ + var formatter = new WikiFormatter(); + textArea.value = formatter.format(textArea.value); + textArea.focus(); +} + +document.write(''); + diff --git a/fitnesse/FitNesseRoot/files/templates/addChildPagePopup.vm b/fitnesse/FitNesseRoot/files/templates/addChildPagePopup.vm new file mode 100644 index 0000000000..614b4e8111 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/addChildPagePopup.vm @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/compareHistory.vm b/fitnesse/FitNesseRoot/files/templates/compareHistory.vm new file mode 100644 index 0000000000..ea2c51ef32 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/compareHistory.vm @@ -0,0 +1,50 @@ +#set ($page_title="History Comparison") +#parse("pageHead.vm") +#if($resultContent) + +#set($Header ="" ) +#set($passfail = "fail") + #if($completeMatch) + #set($Header = "A Complete Match") + #set($passfail = "pass") + #else + #set($Header = "Something Didn't Match") + #end + + + + +
    + $Header +
    + +#set($score = "") + + + + + + + #set ($matched = "Match") +#foreach($result in $resultContent) + #set($score = $comparer.findScoreByFirstTableIndexAsStringAsPercent($count)) + + #if($result.equals("pass")) + #set($matched = "Match. Score: " + $score + "%") + #else + #set($matched = "Not a match. Score: " + $score + "%") + #end + + #set ($firstTable = $firstTables.get($count)) + #set ($secondTable = $secondTables.get($count)) + + + #set ($count = $count + 1) + + +#end +
    "Scores"$firstFileName$secondFileName
    $matched$firstTable$secondTable
    +#else +

    Comparison Failed: $pageTitle.Title

    +#end + #parse("pageFooter.vm") \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/pageFooter.vm b/fitnesse/FitNesseRoot/files/templates/pageFooter.vm new file mode 100644 index 0000000000..142c567595 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/pageFooter.vm @@ -0,0 +1,4 @@ +
    +
    + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/pageHead.vm b/fitnesse/FitNesseRoot/files/templates/pageHead.vm new file mode 100644 index 0000000000..0d2c20ead7 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/pageHead.vm @@ -0,0 +1,16 @@ + + + $page_title + + + + + + + +
    + #if($pageTitle)#parse("pageTitle.vm")#end +
    diff --git a/fitnesse/FitNesseRoot/files/templates/pageHistory.vm b/fitnesse/FitNesseRoot/files/templates/pageHistory.vm new file mode 100644 index 0000000000..6612d5ce32 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/pageHistory.vm @@ -0,0 +1,37 @@ +#set ($page_title="Page History") +#parse("pageHead.vm") +#if($pageHistory) + + + + + + + + + #set($dates = $pageHistory.datesInChronologicalOrder()) + + + + #foreach($date in $dates) + + + #set($bar = $pageHistory.getPassFailBar($date, 50)) + + + + #if($bar.PassUnits > 0)#foreach($barsegment in [1..$bar.PassUnits])#end#end + #if($bar.FailUnits > 0)#foreach($barsegment in [1..$bar.FailUnits])#end#end + #set($ignores=50-($bar.PassUnits+$bar.FailUnits)) + #if($ignores > 0)#foreach($barsegment in [1..$ignores])#end#end + + + #end + +
    CompareTimePassFail0..$pageHistory.maxAssertions()
    0)"fail"#elseif($bar.Pass>0)"pass"#else"ignore"#end> + $pageHistory.formatDate("dd MMM, yy HH:mm", $date) + $bar.Pass$bar.Fail   
    +#else +

    No history for page: $pageTitle.Title

    +#end + #parse("pageFooter.vm") diff --git a/fitnesse/FitNesseRoot/files/templates/pageHistoryXML.vm b/fitnesse/FitNesseRoot/files/templates/pageHistoryXML.vm new file mode 100644 index 0000000000..a0882221b2 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/pageHistoryXML.vm @@ -0,0 +1,22 @@ + + + + #if($pageHistory) + + + $pageHistory.FullPageName + #set($dates = $pageHistory.datesInChronologicalOrder()) + #foreach($date in $dates) + + $date + $pageHistory.FullPageName?pageHistory&resultDate=$pageHistory.formatDate("yyyyMMddHHmmss",$date)&format=xml + #set($bar = $pageHistory.getPassFailBar($date, 50)) + $bar.Pass + $bar.Fail + + #end + + + #end + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/pageTitle.vm b/fitnesse/FitNesseRoot/files/templates/pageTitle.vm new file mode 100644 index 0000000000..f654326a41 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/pageTitle.vm @@ -0,0 +1,9 @@ +
    + #foreach($breadCrumb in $pageTitle.BreadCrumbs) + $breadCrumb.Name. + #end + #if($pageTitle.Link)
    $pageTitle.Title + #else$pageTitle.Title#end +
    + #if($pageTitle.PageType)$pageTitle.PageType#end +
    diff --git a/fitnesse/FitNesseRoot/files/templates/refactorForm.vm b/fitnesse/FitNesseRoot/files/templates/refactorForm.vm new file mode 100644 index 0000000000..cd4000899c --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/refactorForm.vm @@ -0,0 +1,41 @@ +#set ($page_title="Refactor: $pageTitle.link") +#parse("pageHead.vm") +

    Replace

    +
    + +Search String: + +Replacement: + +
    + +

    + Search & Replace: +Please note that this feature is experimental! It uses java-based regular expressions. For an introduction, take a look here (new window). +
    +
    +

    Delete:

    +Delete this entire sub-wiki.
    + + +
    +

    Rename:

    +
    + + New Name: + +
    + + - Find all references to this page and change them accordingly (May take several minutes)
    + +
    +

    Move:

    +
    + +New Location: + +
    + + - Find all references to this page and change them accordingly (May take several minutes)
    + +
    diff --git a/fitnesse/FitNesseRoot/files/templates/searchForm.vm b/fitnesse/FitNesseRoot/files/templates/searchForm.vm new file mode 100644 index 0000000000..8045f59ca7 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/searchForm.vm @@ -0,0 +1,109 @@ +#set ($page_title="Search Form") +#set ($load_actions="document.forms[0].searchString.focus()") +#parse("pageHead.vm") +
    + +Search String: + +
    + + +

    + Search Titles!: +Searches in page titles only. Will run fairly quickly.
    + Search Content!: +Searches in the content of every page. Don't hold your breath.
    +
    +

    Search Properties

    +
    + +
    +
    + + + + + + + +
    Tags
    + +
    +
    +
    + + + + + + + +
    PageType
    + +
    +
    + +
    +
    +
    +
    + + + + + + + +
    Action
    + #set( $numberActionAttributes = $actionAttributes.size() + 1 ) + +
    +
    +
    + + + + + + + +
    Security
    + #set( $numberSecurityAttributes = $securityAttributes.size() + 1 ) + +
    +
    +
    + + + + + + + +
    Special Pages
    + #set( $numberSpecialAttributes = $specialAttributes.size() + 1 ) + +
    +
    +
    +
    +#parse("pageFooter.vm") diff --git a/fitnesse/FitNesseRoot/files/templates/searchResultsEntry.vm b/fitnesse/FitNesseRoot/files/templates/searchResultsEntry.vm new file mode 100644 index 0000000000..9db485b6d0 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/searchResultsEntry.vm @@ -0,0 +1,18 @@ + + + #if($result.getData().hasAttribute("Suite")) + + #end + #if($result.getData().hasAttribute("Test")) + + #end + + + $result.getPageCrawler().getFullPath($result).toString() + + + #set ( $tags = $result.getData().getAttribute("Suites") ) + + + $result.getData().getProperties().getLastModificationTime() + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/searchResultsFooter.vm b/fitnesse/FitNesseRoot/files/templates/searchResultsFooter.vm new file mode 100644 index 0000000000..f1d4dd6149 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/searchResultsFooter.vm @@ -0,0 +1,12 @@ + +#if ($hits > 1) + +#elseif ($hits == 1) + +#else + +#end +

    To save this search as a link, paste the text below into a page.

    +
    [[Search below !-$page.getName()-! for <description>][$page.getPageCrawler().getFullPath($page)?$request]]
    +#parse("pageFooter.vm") + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/searchResultsHeader.vm b/fitnesse/FitNesseRoot/files/templates/searchResultsHeader.vm new file mode 100644 index 0000000000..e5ac6b878a --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/searchResultsHeader.vm @@ -0,0 +1,20 @@ +#parse("pageHead.vm") + +
    Searching...
    + + + + + + + + + \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/suiteExecutionReport.vm b/fitnesse/FitNesseRoot/files/templates/suiteExecutionReport.vm new file mode 100644 index 0000000000..30b2219998 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/suiteExecutionReport.vm @@ -0,0 +1,66 @@ +#set ($page_title = "Suite Execution Report") +#parse("pageHead.vm") +#if($suiteExecutionReport) +

    $suiteExecutionReport.getRootPath()

    +
    + Test + + Page + + Tags + + LastModified +
    + + + + +
    $suiteExecutionReport.getDate()FitNesse Version: $suiteExecutionReport.Version
    +
    +#set($finalCounts = $suiteExecutionReport.FinalCounts) +#if($finalCounts) +
    +
    + Test Pages: + $finalCounts.Right right, + $finalCounts.Wrong wrong, + $finalCounts.Ignores ignored, + $finalCounts.Exceptions exceptions + #if($suiteExecutionReport.hasRunTimes()) + ($suiteExecutionReport.totalRunTimeInMillis ms) + #end +
    +
    +#end +

    + + + + + + + + #if($suiteExecutionReport.hasRunTimes()) + + #end + + #foreach($pageHistoryReference in $suiteExecutionReport.getPageHistoryReferences()) + #set($counts = $pageHistoryReference.getTestSummary()) + + + + + + + #if($suiteExecutionReport.hasRunTimes()) + + #end + + #end +
    RightWrongIgnoredExceptionsPageRun time (ms)
    + $counts.Right + + $counts.Wrong + + $counts.Ignores + + $counts.Exceptions + + $pageHistoryReference.getPageName() + + $pageHistoryReference.RunTimeInMillis +
    +#end + #parse("pageFooter.vm") \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/suiteHistoryXML.vm b/fitnesse/FitNesseRoot/files/templates/suiteHistoryXML.vm new file mode 100644 index 0000000000..7055969664 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/suiteHistoryXML.vm @@ -0,0 +1,28 @@ + + + $suiteExecutionReport.getVersion() + $suiteExecutionReport.getRootPath() + #foreach ($reference in $suiteExecutionReport.getPageHistoryReferences()) + + $reference.getPageName() + $reference.getDateString() + $reference.getPageName()?pageHistory&resultDate=$reference.getResultDate() + + $reference.getTestSummary().getRight() + $reference.getTestSummary().getWrong() + $reference.getTestSummary().getIgnores() + $reference.getTestSummary().getExceptions() + + $reference.RunTimeInMillis + + #end + + $suiteExecutionReport.getFinalCounts().getRight() + $suiteExecutionReport.getFinalCounts().getWrong() + $suiteExecutionReport.getFinalCounts().getIgnores() + $suiteExecutionReport.getFinalCounts().getExceptions() + + $suiteExecutionReport.TotalRunTimeInMillis + + + diff --git a/fitnesse/FitNesseRoot/files/templates/suiteOverview.vm b/fitnesse/FitNesseRoot/files/templates/suiteOverview.vm new file mode 100644 index 0000000000..f163ead104 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/suiteOverview.vm @@ -0,0 +1,62 @@ +#set ($page_title="Suite Overview") +#parse("pageHead.vm") + +#if($treeRoot) + #set ($branch=$treeRoot) + #if ($branch.branches.size()==1) + #set ($branch=$branch.getBranches().get(0)) +

    +

    Results Summary

    +
    + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + $branch.getTestsPassed() ($branch.getPassedPercent()%) Test(s) Passed
    + $branch.getTestsUnrun()($branch.getUnrunPercent()%) Test(s) Not Run
    + $branch.getTestsFailed() ($branch.getFailedPercent()%)Test(s) Failed
    +
    +
    +
    +

    Detailed Results

    + $branch.getName() + + (Expand | + Collapse) + + + +
    + #parse("suiteOverviewNode.vm") +
    +
    + #else + #parse("suiteOverviewNode.vm") + #end +#else +

    Sorry no information: $pageTitle.Title

    +#end + +#parse("pageFooter.vm") diff --git a/fitnesse/FitNesseRoot/files/templates/suiteOverviewNode.vm b/fitnesse/FitNesseRoot/files/templates/suiteOverviewNode.vm new file mode 100644 index 0000000000..3902f66c8b --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/suiteOverviewNode.vm @@ -0,0 +1,27 @@ +#foreach($branch in $branch.getBranches()) + #if ($branch.isTest()) + + #else + +
    + + + +
    $branch.getName() ( + #if ($branch.getTestsPassed() != 0) + $branch.getTestsPassed()   $branch.getPassedPercentString() + #end + #if ($branch.getTestsUnrun() != 0) + $branch.getTestsUnrun()   $branch.getUnrunPercentString() + #end + #if ($branch.getTestsFailed() != 0) + $branch.getTestsFailed()   $branch.getFailedPercentString() + #end + ) +
    + +
    + #end +#end diff --git a/fitnesse/FitNesseRoot/files/templates/suiteXML.vm b/fitnesse/FitNesseRoot/files/templates/suiteXML.vm new file mode 100644 index 0000000000..c396f1ce1b --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/suiteXML.vm @@ -0,0 +1,37 @@ + + + $formatter.getFitNesseVersion() + $formatter.getRootPageName() + #foreach ($reference in $formatter.getPageHistoryReferences()) + #set($executionReport = $formatter.getTestExecutionReport($reference)) + #set($result = $executionReport.getResults().get(0)) + + + $result.Right + $result.Wrong + $result.Ignores + $result.Exceptions + + $result.RunTimeInMillis + $result.RelativePageName + $reference.getPageName()?pageHistory&resultDate=$reference.getResultDate()&format=xml + #if($result.Tags) + $result.Tags + #end + #if($formatter.shouldIncludeHtml()) + + #end + + + #end + + + $formatter.getPageCounts().right + $formatter.getPageCounts().wrong + $formatter.getPageCounts().ignores + $formatter.getPageCounts().exceptions + + $formatter.TotalRunTimeInMillis + + + diff --git a/fitnesse/FitNesseRoot/files/templates/testExecutionReport.vm b/fitnesse/FitNesseRoot/files/templates/testExecutionReport.vm new file mode 100644 index 0000000000..7e2355aebd --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/testExecutionReport.vm @@ -0,0 +1,44 @@ +#set ($page_title="Test Execution Report") +#parse("pageHead.vm") +#if($testExecutionReport) + + + + + +
    $testExecutionReport.DateFitNesse Version: $testExecutionReport.Version
    + +#foreach($testResult in $testExecutionReport.Results) +

    +


    +

    + + + + + + + + #if($testExecutionReport.hasRunTimes()) + + #end + +
    + + $testResult.RelativePageName + + + $testResult.Right Right + + $testResult.Wrong Wrong + + $testResult.Ignores Ignores + + $testResult.Exceptions Exceptions + + $testResult.runTimeInMillis ms +
    +

    $testResult.Content
    +#end +#end + #parse("pageFooter.vm") \ No newline at end of file diff --git a/fitnesse/FitNesseRoot/files/templates/testHistory.vm b/fitnesse/FitNesseRoot/files/templates/testHistory.vm new file mode 100644 index 0000000000..350e74c8da --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/testHistory.vm @@ -0,0 +1,80 @@ +#set ($page_title="Test History") +#parse("pageHead.vm") +#set($noHistory = true) + + + + + + + +
    +
    + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + #foreach ($page in $testHistory.pageNames) + #set ($pageHistory = $testHistory.getPageHistory($page)) + #if($pageHistory) + #set($noHistory = false) + + + #set ($barGraph = $pageHistory.getBarGraph()) + + #if($pageHistory.passes==0) #set ($passClass = "ignore") + #else #set ($passClass = "pass") + #end + + #if($pageHistory.failures==0) #set ($failClass = "ignore") + #else #set ($failClass = "fail") + #end + + + + + + #foreach($passFail in $barGraph.passFailArray()) + #if($passFail.Pass) + + + #else + + + + #end + #end + + + #end + #end + +
    PagePassFailLatestLast 20 Results
    $page$pageHistory.passes$pageHistory.failures$barGraph.formatEndingDate("dd MMM, yy HH:mm")+-
    +#if ($noHistory)No History#end +#parse("pageFooter.vm") diff --git a/fitnesse/FitNesseRoot/files/templates/testHistoryXML.vm b/fitnesse/FitNesseRoot/files/templates/testHistoryXML.vm new file mode 100644 index 0000000000..038541da84 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/testHistoryXML.vm @@ -0,0 +1,22 @@ + + + + #foreach ($page in $testHistory.pageNames) + #set ($pageHistory = $testHistory.getPageHistory($page)) + #if($pageHistory) + #set($linkExtra = "?pageHistory&format=xml") + + + $page + $page$linkExtra + $pageHistory.passes + $pageHistory.failures + $pageHistory.minDate + $pageHistory.maxDate + + + #end + #end + + + diff --git a/fitnesse/FitNesseRoot/files/templates/testResults.vm b/fitnesse/FitNesseRoot/files/templates/testResults.vm new file mode 100644 index 0000000000..e4bffc3340 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/templates/testResults.vm @@ -0,0 +1,86 @@ + + + $response.Version + $response.RootPath + #foreach ($result in $response.Results) + + + $result.Right + $result.Wrong + $result.Ignores + $result.Exceptions + + $result.RunTimeInMillis + + $result.RelativePageName + #if($result.Tags) + $result.Tags + #end + + #if($result.Tables.size() > 0) + + #foreach($table in $result.Tables) + + $table.Name + #foreach($row in $table) + + #foreach($col in $row) + + #end + + + #end + +
    + #end + +
    + #end + + #if($result.Instructions.size() > 0) + + + #foreach($instructionResult in $result.Instructions) + + + + #foreach($expectation in $instructionResult.Expectations) + + $expectation.Status + $expectation.InstructionId + $expectation.Col + $expectation.Row + $expectation.Type + #if($expectation.Actual) + + #end + #if($expectation.Expected) + + #end + #if($expectation.EvaluationMessage) + + #end + + #end + + + #end + + + #end + +
    + #end + + #if($response.FinalCounts) + + $response.FinalCounts.Right + $response.FinalCounts.Wrong + $response.FinalCounts.Ignores + $response.FinalCounts.Exceptions + + $response.TotalRunTimeInMillis + #end + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127124208_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127124208_0_0_0_1.xml new file mode 100644 index 0000000000..e6a53f391a --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127124208_0_0_0_1.xml @@ -0,0 +1,62 @@ + + + v20111026 + CreateProduct + + + 0 + 0 + 0 + 1 + + 4 + + + Create Record
    Could not find fixture: CreateRecord. + + + *Table* + M_Product + + + Name + @RandomName@ + + + Value + @RandomName@ + + + C_UOM_ID + @Ref=C_UOM[Name='Each'].C_UOM_ID + + + M_Product_Category_ID + @Ref=M_Product_Category[Name='Standard' and AD_Client_ID=@AD_Client_ID@].M_Product_Category_ID + + + C_TaxCategory_ID + @Ref=C_TaxCategory[Name='Standard' and AD_Client_ID=@AD_Client_ID@].C_TaxCategory_ID + + + *Save* + + + +]]>
    + CreateProduct + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127124241_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127124241_0_0_0_1.xml new file mode 100644 index 0000000000..5c713d215e --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127124241_0_0_0_1.xml @@ -0,0 +1,62 @@ + + + v20111026 + CreateProduct + + + 0 + 0 + 0 + 1 + + 6 + + + Create Record
    Could not find fixture: CreateRecord. + + + *Table* + M_Product + + + Name + @RandomName@ + + + Value + @RandomName@ + + + C_UOM_ID + @Ref=C_UOM[Name='Each'].C_UOM_ID + + + M_Product_Category_ID + @Ref=M_Product_Category[Name='Standard' and AD_Client_ID=@AD_Client_ID@].M_Product_Category_ID + + + C_TaxCategory_ID + @Ref=C_TaxCategory[Name='Standard' and AD_Client_ID=@AD_Client_ID@].C_TaxCategory_ID + + + *Save* + + + +]]>
    + CreateProduct + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127130309_0_0_0_3.xml b/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127130309_0_0_0_3.xml new file mode 100644 index 0000000000..6b67193b54 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/CommonTests.CreateProduct/20121127130309_0_0_0_3.xml @@ -0,0 +1,168 @@ + + + v20111026 + CreateProduct + + + 0 + 0 + 0 + 3 + + 7 + + + Create Record
    org.adempiere.exceptions.DBException: org.postgresql.util.PSQLException: ERROR: syntax error at end of input + Position: 59 + at org.compiere.util.DB.getSQLValueStringEx(DB.java:1448) + at org.idempiere.fitnesse.fixture.Util.evaluate(Util.java:120) + at org.idempiere.fitnesse.fixture.CreateRecord.doStaticTable(CreateRecord.java:134) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at end of input + Position: 59 + at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) + at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) + at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) + at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) + at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) + at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302) + at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) + at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:616) + at org.compiere.db.StatementProxy.invoke(StatementProxy.java:125) + at $Proxy0.executeQuery(Unknown Source) + at org.compiere.util.DB.getSQLValueStringEx(DB.java:1440) + ... 27 more +
    + + + *Table* + M_Product + + + Name + @RandomName@

    java.lang.IllegalArgumentException: Name is mandatory. + at org.compiere.model.PO.set_Value(PO.java:751) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:1009) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:978) + at org.idempiere.fitnesse.fixture.CreateRecord.doStaticTable(CreateRecord.java:176) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + + Value + @RandomName@

    java.lang.IllegalArgumentException: Value is mandatory. + at org.compiere.model.PO.set_Value(PO.java:751) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:1009) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:978) + at org.idempiere.fitnesse.fixture.CreateRecord.doStaticTable(CreateRecord.java:176) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + + C_UOM_ID + @Ref=C_UOM[Name='Each'].C_UOM_ID
    100 + + + M_Product_Category_ID + @Ref=M_Product_Category[Name='Standard' and AD_Client_ID=@AD_Client_ID@].M_Product_Category_ID + + + C_TaxCategory_ID + @Ref=C_TaxCategory[Name='Standard' and AD_Client_ID=@AD_Client_ID@].C_TaxCategory_ID + + + *Save* + + + +]]>
    + CreateProduct + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/CommonTests.LoginGardenAdmin/20121127124138_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/CommonTests.LoginGardenAdmin/20121127124138_0_0_0_1.xml new file mode 100644 index 0000000000..6376c42d91 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/CommonTests.LoginGardenAdmin/20121127124138_0_0_0_1.xml @@ -0,0 +1,62 @@ + + + v20111026 + LoginGardenAdmin + + + 0 + 0 + 0 + 1 + + 4 + + + Login
    Could not find fixture: Login. + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_Client_ID + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID + + + AD_Org_ID + @Ref=AD_Org[Name='HQ'].AD_Org_ID + + + M_Warehouse_ID + @Ref=M_Warehouse[Name='HQ Warehouse'].M_Warehouse_ID + + + *Login* + + + +]]>
    + LoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/CommonTests.LoginGardenAdmin/20121127130013_2_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/CommonTests.LoginGardenAdmin/20121127130013_2_0_0_0.xml new file mode 100644 index 0000000000..5ba58d5f91 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/CommonTests.LoginGardenAdmin/20121127130013_2_0_0_0.xml @@ -0,0 +1,62 @@ + + + v20111026 + LoginGardenAdmin + + + 2 + 0 + 0 + 0 + + 7 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_Client_ID + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + AD_Org_ID + @Ref=AD_Org[Name='HQ'].AD_Org_ID
    11 + + + M_Warehouse_ID + @Ref=M_Warehouse[Name='HQ Warehouse'].M_Warehouse_ID
    103 + + + *Login* + + + +]]>
    + LoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/CommonTests.ValidateClientSetOnAvgInv/20121127130051_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/CommonTests.ValidateClientSetOnAvgInv/20121127130051_0_0_0_1.xml new file mode 100644 index 0000000000..c12b611336 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/CommonTests.ValidateClientSetOnAvgInv/20121127130051_0_0_0_1.xml @@ -0,0 +1,69 @@ + + + v20111026 + ValidateClientSetOnAvgInv + + + 0 + 0 + 0 + 1 + + 3 + + + Assert Variable
    java.lang.IllegalArgumentException: No SQL + at org.compiere.util.DB.prepareStatement(DB.java:758) + at org.compiere.util.DB.prepareStatement(DB.java:729) + at org.compiere.util.DB.getSQLValueStringEx(DB.java:1438) + at org.idempiere.fitnesse.fixture.Util.evaluate(Util.java:105) + at org.idempiere.fitnesse.fixture.AssertVariable.doStaticTable(AssertVariable.java:64) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + + I + @SQL=select costingmethod from c_acctschema where c_acctschema_id = (select c_acctschema1_id from ad_clientinfo where ad_client_id=@AD_Client_ID@) + + +]]>
    + ValidateClientSetOnAvgInv + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127121927_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127121927_0_0_0_1.xml new file mode 100644 index 0000000000..302c8ac4fe --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127121927_0_0_0_1.xml @@ -0,0 +1,93 @@ + + + v20111026 + QuickTest + + + 0 + 0 + 0 + 1 + + 10 + + + + + +  + Included page: TestLoginGardenAdmin (edit) + +

    Check the inventory level before the document

    + + + + + + + +
    Set Variable
    @InventoryLevelBefore@@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103not logged in
    +
    Check the bp balance before the document

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read Record
    *Table*C_bpartner
    c_bpartner_id120
    *Read*
    actuallifetimevalue
    so_creditused
    totalopenbalancenot logged in
    +]]>
    + QuickTest + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127123937_3_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127123937_3_0_0_0.xml new file mode 100644 index 0000000000..3357c392f6 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127123937_3_0_0_0.xml @@ -0,0 +1,105 @@ + + + v20111026 + QuickTest + + + 3 + 0 + 0 + 0 + + 264 + + + + + +  + Included page: TestLoginGardenAdmin (edit) + +
    +

    Check the inventory level before the document

    + + + + + + + +
    Set Variable
    @InventoryLevelBefore@@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103
    61
    +
    Check the bp balance before the document

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read Record
    *Table*C_bpartner
    c_bpartner_id120
    *Read*MBPartner[ID=120,Value=SeedFarm,Name=Seed Farm Inc.,Open=-2731.5]
    actuallifetimevalue0
    so_creditused0
    totalopenbalance-2731.5
    +]]> + QuickTest + + + + + + + 0 + 0 + 0 + 0 + + 0 + + + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127143715_3_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127143715_3_0_0_0.xml new file mode 100644 index 0000000000..f069b2926f --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127143715_3_0_0_0.xml @@ -0,0 +1,105 @@ + + + v20111026 + QuickTest + + + 3 + 0 + 0 + 0 + + 15 + + + + + +  + Included page: TestLoginGardenAdmin (edit) + +
    +

    Check the inventory level before the document

    + + + + + + + +
    Set Variable
    @InventoryLevelBefore@@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103
    61
    +
    Check the bp balance before the document

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read Record
    *Table*C_bpartner
    c_bpartner_id120
    *Read*MBPartner[ID=120,Value=SeedFarm,Name=Seed Farm Inc.,Open=-2731.5]
    actuallifetimevalue0
    so_creditused0
    totalopenbalance-2731.5
    +]]> + QuickTest + + + + + + + 0 + 0 + 0 + 0 + + 0 + + + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127150334_3_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127150334_3_0_0_0.xml new file mode 100644 index 0000000000..8fcac73ccd --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127150334_3_0_0_0.xml @@ -0,0 +1,105 @@ + + + v20111026 + QuickTest + + + 3 + 0 + 0 + 0 + + 10 + + + + + +  + Included page: TestLoginGardenAdmin (edit) + +
    +

    Check the inventory level before the document

    + + + + + + + +
    Set Variable
    @InventoryLevelBefore@@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103
    61
    +
    Check the bp balance before the document

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read Record
    *Table*C_bpartner
    c_bpartner_id120
    *Read*MBPartner[ID=120,Value=SeedFarm,Name=Seed Farm Inc.,Open=-2731.5]
    actuallifetimevalue0
    so_creditused0
    totalopenbalance-2731.5
    +]]> + QuickTest + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + + + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127160556_3_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127160556_3_0_0_0.xml new file mode 100644 index 0000000000..142ab8e3de --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.QuickTest/20121127160556_3_0_0_0.xml @@ -0,0 +1,105 @@ + + + v20111026 + QuickTest + + + 3 + 0 + 0 + 0 + + 17 + + + + + +  + Included page: TestLoginGardenAdmin (edit) + + +

    Check the inventory level before the document

    + + + + + + + +
    Set Variable
    @InventoryLevelBefore@@SQL=SELECT SUM(s.qtyonhand) FROM m_storage s, m_locator l, m_warehouse w WHERE s.m_product_id=133 AND s.m_locator_id = l.m_locator_id AND l.m_warehouse_id=w.m_warehouse_id AND w.m_warehouse_id=103
    61
    +
    Check the bp balance before the document

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Read Record
    *Table*C_bpartner
    c_bpartner_id120
    *Read*MBPartner[ID=120,Value=SeedFarm,Name=Seed Farm Inc.,Open=-2731.5]
    actuallifetimevalue0
    so_creditused0
    totalopenbalance-2731.5
    +]]>
    + QuickTest + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127130353_2_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127130353_2_1_0_1.xml new file mode 100644 index 0000000000..02c04e3d01 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127130353_2_1_0_1.xml @@ -0,0 +1,123 @@ + + + v20111026 + TestCreateReference + + + 2 + 1 + 0 + 1 + + 4 +
    + + + + +  + Included page: TestLoginSystem (edit) +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Login
    UserSuperUser
    PasswordSystem
    AD_ClIEnT_id0
    AD_Role_id0
    *Login*
    +
    +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    Create Record
    *Table*AD_Reference
    NameFitnesse Test
    ValidationTypeY
    java.lang.IllegalArgumentException: ValidationType Invalid value - Y - Reference_ID=2 - D - L - T + at org.compiere.model.PO.set_Value(PO.java:826) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:1009) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:978) + at org.idempiere.fitnesse.fixture.CreateRecord.doStaticTable(CreateRecord.java:176) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretFollowingTables(Fixture.java:119) + at fit.Fixture.interpretTables(Fixture.java:105) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    invalidcolumnY
    *Save*
    +]]>
    + TestCreateReference + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127130420_2_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127130420_2_1_0_1.xml new file mode 100644 index 0000000000..8420722096 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127130420_2_1_0_1.xml @@ -0,0 +1,123 @@ + + + v20111026 + TestCreateReference + + + 2 + 1 + 0 + 1 + + 17 +
    + + + + +  + Included page: TestLoginSystem (edit) +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Login
    UserSuperUser
    PasswordSystem
    AD_ClIEnT_id0
    AD_Role_id0
    *Login*
    +
    +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    Create Record
    *Table*AD_Reference
    NameFitnesse Test
    ValidationTypeY
    java.lang.IllegalArgumentException: ValidationType Invalid value - Y - Reference_ID=2 - D - L - T + at org.compiere.model.PO.set_Value(PO.java:826) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:1009) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:978) + at org.idempiere.fitnesse.fixture.CreateRecord.doStaticTable(CreateRecord.java:176) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretFollowingTables(Fixture.java:119) + at fit.Fixture.interpretTables(Fixture.java:105) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    invalidcolumnY
    *Save*
    +]]>
    + TestCreateReference + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127142851_2_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127142851_2_1_0_1.xml new file mode 100644 index 0000000000..7bb2d30c7a --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestCreateReference/20121127142851_2_1_0_1.xml @@ -0,0 +1,123 @@ + + + v20111026 + TestCreateReference + + + 2 + 1 + 0 + 1 + + 6 +
    + + + + +  + Included page: TestLoginSystem (edit) +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Login
    UserSuperUser
    PasswordSystem
    AD_ClIEnT_id0
    AD_Role_id0
    *Login*
    +
    +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    Create Record
    *Table*AD_Reference
    NameFitnesse Test
    ValidationTypeY
    java.lang.IllegalArgumentException: ValidationType Invalid value - Y - Reference_ID=2 - D - L - T + at org.compiere.model.PO.set_Value(PO.java:826) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:1009) + at org.compiere.model.PO.set_ValueOfColumnReturningBoolean(PO.java:978) + at org.idempiere.fitnesse.fixture.CreateRecord.doStaticTable(CreateRecord.java:176) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretFollowingTables(Fixture.java:119) + at fit.Fixture.interpretTables(Fixture.java:105) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    invalidcolumnY
    *Save*
    +]]>
    + TestCreateReference + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127120507_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127120507_0_0_0_1.xml new file mode 100644 index 0000000000..f625e84555 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127120507_0_0_0_1.xml @@ -0,0 +1,83 @@ + + + v20111026 + TestLoginGardenAdmin + + + 0 + 0 + 0 + 1 + + 13 + + + Login
    java.lang.UnsupportedOperationException: Missing Context #AD_Client_ID + at org.compiere.util.Login.getOrgs(Login.java:566) + at org.idempiere.fitnesse.fixture.Login.modelLogin(Login.java:172) + at org.idempiere.fitnesse.fixture.Login.doStaticTable(Login.java:109) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* + + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127120752_0_0_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127120752_0_0_0_1.xml new file mode 100644 index 0000000000..cd5eef679d --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127120752_0_0_0_1.xml @@ -0,0 +1,83 @@ + + + v20111026 + TestLoginGardenAdmin + + + 0 + 0 + 0 + 1 + + 12 + + + Login
    java.lang.UnsupportedOperationException: Missing Context #AD_Client_ID + at org.compiere.util.Login.getOrgs(Login.java:566) + at org.idempiere.fitnesse.fixture.Login.modelLogin(Login.java:172) + at org.idempiere.fitnesse.fixture.Login.doStaticTable(Login.java:109) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* + + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127122728_0_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127122728_0_1_0_1.xml new file mode 100644 index 0000000000..f28382cd15 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127122728_0_1_0_1.xml @@ -0,0 +1,81 @@ + + + v20111026 + TestLoginGardenAdmin + + + 0 + 1 + 0 + 1 + + 12 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* +
    java.lang.Exception: Error logging in - no organizations for this role + at org.idempiere.fitnesse.fixture.Login.doStaticTable(Login.java:116) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123229_0_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123229_0_1_0_1.xml new file mode 100644 index 0000000000..55d6196089 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123229_0_1_0_1.xml @@ -0,0 +1,81 @@ + + + v20111026 + TestLoginGardenAdmin + + + 0 + 1 + 0 + 1 + + 11 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* +
    java.lang.Exception: Error logging in - no organizations for this role + at org.idempiere.fitnesse.fixture.Login.doStaticTable(Login.java:116) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123249_0_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123249_0_1_0_1.xml new file mode 100644 index 0000000000..0a48f29569 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123249_0_1_0_1.xml @@ -0,0 +1,81 @@ + + + v20111026 + TestLoginGardenAdmin + + + 0 + 1 + 0 + 1 + + 9 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* +
    java.lang.Exception: Error logging in - no organizations for this role + at org.idempiere.fitnesse.fixture.Login.doStaticTable(Login.java:116) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123406_0_1_0_1.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123406_0_1_0_1.xml new file mode 100644 index 0000000000..8ea436b044 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123406_0_1_0_1.xml @@ -0,0 +1,81 @@ + + + v20111026 + TestLoginGardenAdmin + + + 0 + 1 + 0 + 1 + + 16 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* +
    java.lang.Exception: Error logging in - no organizations for this role + at org.idempiere.fitnesse.fixture.Login.doStaticTable(Login.java:116) + at fitnesse.fixtures.TableFixture.doRows(TableFixture.java:16) + at fit.Fixture.doTable(Fixture.java:153) + at fit.Fixture.interpretTables(Fixture.java:99) + at fit.Fixture.doTables(Fixture.java:79) + at fit.FitServer.process(FitServer.java:81) + at fit.FitServer.run(FitServer.java:56) + at org.idempiere.fitnesse.server.fit.FitServerRunner.run(FitServerRunner.java:18) + at org.idempiere.fitnesse.server.Runner.execute(Runner.java:18) + at org.idempiere.fitnesse.server.fit.FitServlet.runTests(FitServlet.java:25) + at org.idempiere.fitnesse.server.fit.FitServlet.service(FitServlet.java:21) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) + at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) + at java.lang.Thread.run(Thread.java:679) +
    + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123925_2_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123925_2_0_0_0.xml new file mode 100644 index 0000000000..1aec16dd82 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127123925_2_0_0_0.xml @@ -0,0 +1,54 @@ + + + v20111026 + TestLoginGardenAdmin + + + 2 + 0 + 0 + 0 + + 8 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* + + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127142951_2_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127142951_2_0_0_0.xml new file mode 100644 index 0000000000..146a865a66 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginGardenAdmin/20121127142951_2_0_0_0.xml @@ -0,0 +1,54 @@ + + + v20111026 + TestLoginGardenAdmin + + + 2 + 0 + 0 + 0 + + 4 + + + Login + + + User + GardenAdmin + + + Password + GardenAdmin + + + AD_ClIEnT_id + @Ref=AD_Client[Value='GardenWorld'].AD_Client_ID
    11 + + + AD_Role_id + @Ref=AD_Role[Name='GardenWorld Admin'].AD_Role_ID
    102 + + + *Login* + + + +]]>
    + TestLoginGardenAdmin + + + +
    + + + 0 + 0 + 0 + 0 + + 0 + +
    + diff --git a/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginSystem/20121127142938_2_0_0_0.xml b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginSystem/20121127142938_2_0_0_0.xml new file mode 100644 index 0000000000..96abeef142 --- /dev/null +++ b/fitnesse/FitNesseRoot/files/testResults/IdempiereSuite.TestLoginSystem/20121127142938_2_0_0_0.xml @@ -0,0 +1,54 @@ + + + v20111026 + TestLoginSystem + + + 2 + 0 + 0 + 0 + + 1 + + + Login + + + User + SuperUser + + + Password + System + + + AD_ClIEnT_id + 0 + + + AD_Role_id + 0 + + + *Login* + + + +]]> + TestLoginSystem + + + + + + + 0 + 0 + 0 + 0 + + 0 + + + diff --git a/fitnesse/FitNesseRoot/properties b/fitnesse/FitNesseRoot/properties new file mode 100644 index 0000000000..89ca9c9042 --- /dev/null +++ b/fitnesse/FitNesseRoot/properties @@ -0,0 +1,2 @@ +#FitNesse properties +Version=v20111026 diff --git a/fitnesse/FitNesseRoot/properties.xml b/fitnesse/FitNesseRoot/properties.xml new file mode 100644 index 0000000000..72aa2b6a6b --- /dev/null +++ b/fitnesse/FitNesseRoot/properties.xml @@ -0,0 +1,11 @@ + + + true + true + true + true + true + true + true + true + diff --git a/fitnesse/FitNesseRoot/updateDoNotCopyOverList b/fitnesse/FitNesseRoot/updateDoNotCopyOverList new file mode 100644 index 0000000000..5eb95426b3 --- /dev/null +++ b/fitnesse/FitNesseRoot/updateDoNotCopyOverList @@ -0,0 +1,4 @@ +FitNesseRoot/files/css/fitnesse.css +FitNesseRoot/files/css/fitnesse_print.css +FitNesseRoot/FrontPage/content.txt +FitNesseRoot/FrontPage/properties.xml diff --git a/fitnesse/FitNesseRoot/updateList b/fitnesse/FitNesseRoot/updateList new file mode 100644 index 0000000000..a8621145ce --- /dev/null +++ b/fitnesse/FitNesseRoot/updateList @@ -0,0 +1,1446 @@ +FitNesseRoot/files/images/executionStatus/Thumbs.db +FitNesseRoot/files/images/executionStatus/error.gif +FitNesseRoot/files/images/executionStatus/ok.gif +FitNesseRoot/files/images/executionStatus/output.gif +FitNesseRoot/files/images/FitNesseInstallerLogo.png +FitNesseRoot/files/images/FitNesseLogo.gif +FitNesseRoot/files/images/FitNesseLogo.psd +FitNesseRoot/files/images/FitNesseLogoMedium.jpg +FitNesseRoot/files/images/FitnesseStarted.png +FitNesseRoot/files/images/Thumbs.db +FitNesseRoot/files/images/collapsableClosed.gif +FitNesseRoot/files/images/collapsableOpen.gif +FitNesseRoot/files/images/fail.png +FitNesseRoot/files/images/fitnesse_architecture.jpg +FitNesseRoot/files/images/folder.gif +FitNesseRoot/files/images/importedPage.jpg +FitNesseRoot/files/images/pass.png +FitNesseRoot/files/images/plus.png +FitNesseRoot/files/images/stop.gif +FitNesseRoot/files/images/unrun.png +FitNesseRoot/files/images/virtualPage.jpg +FitNesseRoot/files/css/fitnesse_base.css +FitNesseRoot/files/css/jquery.autocomplete.css +FitNesseRoot/files/javascript/jsunit/app/jsUnitCore.js +FitNesseRoot/files/javascript/jsunit/app/jsUnitMockTimeout.js +FitNesseRoot/files/javascript/jsunit/app/jsUnitTestManager.js +FitNesseRoot/files/javascript/jsunit/app/jsUnitTestSuite.js +FitNesseRoot/files/javascript/jsunit/app/jsUnitTracer.js +FitNesseRoot/files/javascript/jsunit/app/jsUnitVersionCheck.js +FitNesseRoot/files/javascript/jsunit/app/xbDebug.js +FitNesseRoot/files/javascript/SpreadsheetTranslator.js +FitNesseRoot/files/javascript/WikiFormatter.js +FitNesseRoot/files/javascript/clientSideSort.js +FitNesseRoot/files/javascript/fitnesse.js +FitNesseRoot/files/javascript/fitnesseTreeControl.js +FitNesseRoot/files/javascript/jquery-1.3.2.min.js +FitNesseRoot/files/javascript/jsUnitTestLink.js +FitNesseRoot/files/javascript/spreadsheetSupport.js +FitNesseRoot/files/javascript/textareaWrapSupport.js +FitNesseRoot/files/javascript/wikiFormatterSupport.js +FitNesseRoot/files/html/index.html +FitNesseRoot/files/html/treeControl.html +FitNesseRoot/files/templates/addChildPagePopup.vm +FitNesseRoot/files/templates/compareHistory.vm +FitNesseRoot/files/templates/pageFooter.vm +FitNesseRoot/files/templates/pageHead.vm +FitNesseRoot/files/templates/pageHistory.vm +FitNesseRoot/files/templates/pageHistoryXML.vm +FitNesseRoot/files/templates/pageTitle.vm +FitNesseRoot/files/templates/refactorForm.vm +FitNesseRoot/files/templates/searchForm.vm +FitNesseRoot/files/templates/searchResultsEntry.vm +FitNesseRoot/files/templates/searchResultsFooter.vm +FitNesseRoot/files/templates/searchResultsHeader.vm +FitNesseRoot/files/templates/suiteExecutionReport.vm +FitNesseRoot/files/templates/suiteHistoryXML.vm +FitNesseRoot/files/templates/suiteOverview.vm +FitNesseRoot/files/templates/suiteOverviewNode.vm +FitNesseRoot/files/templates/suiteXML.vm +FitNesseRoot/files/templates/testExecutionReport.vm +FitNesseRoot/files/templates/testHistory.vm +FitNesseRoot/files/templates/testHistoryXML.vm +FitNesseRoot/files/templates/testResults.vm +FitNesseRoot/FitNesse/FitNesse/content.txt +FitNesseRoot/FitNesse/FitNesse/properties.xml +FitNesseRoot/FitNesse/JunkPage/content.txt +FitNesseRoot/FitNesse/JunkPage/properties.xml +FitNesseRoot/FitNesse/ReadProtectedPage/content.txt +FitNesseRoot/FitNesse/ReadProtectedPage/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/GreatGrandChildPageOne/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/GrandChildPageOne/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildPageOne/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildPageThree/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/GrandChildPageTwo/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildPageTwo/properties.xml +FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/content.txt +FitNesseRoot/FitNesse/SampleWiki/ChildWithUnicode/properties.xml +FitNesseRoot/FitNesse/SampleWiki/content.txt +FitNesseRoot/FitNesse/SampleWiki/properties.xml +FitNesseRoot/FitNesse/SliM/content.txt +FitNesseRoot/FitNesse/SliM/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildOne/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithAliasLinkToNonExistentSubPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithLinkToNonExistentPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/ChildWithSubPageLinkToNonExistentPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludedPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/ChildIncludingPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/IncludingPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/AcceptanceTestPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/FixtureList/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageFooter/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/PageHeader/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/AlwaysSecureOperation/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureReadOperations/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureTestOperations/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SecureWriteOperations/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestInsecureReadPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestReadChildOfSecurePage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureFilesAccess/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureSuitePage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/TestSecureTestPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteAuthenticationTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditExistingPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestEditNewPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUnicodeCharacters/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInProperties/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInRecentChanges/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameInVersions/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/TestUserNameSaved/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteEditResponderTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAndAppendLastRow/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/CopyAppendLastRowAndIncrementColumnValues/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/IncrementColumnsValues/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MaxTimeDivision/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/MultipleDivision/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TearDown/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimeRangeDivision/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/TimedMultipleDivision/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFitDecoratorTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestArraysInColumnFixture/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingField/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestMissingMethod/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/TestSaveAndRecallSymbol/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteColumnFixtureSpec/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestBlankAndNullCells/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestCannotResolveGracefullyNamedFixture/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFound/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestFixtureNotFoundAfterTackingOnFixture/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNoDefaultConstructor/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestNotFixture/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestParsingOfObjects/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/TestTackOnFixtureNotFixture/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteGeneralFixtureSpec/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/TestBasicRowFixture/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/SuiteRowFixtureSpec/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddChildToNonExistentPageTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfSuiteTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddDefaultWithNameOfTestTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddInvalidChildNameTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfSuiteTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddNormalWithNameOfTestTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSimpleChildPageTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddSuitePageTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/AddTestPageTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/CantAddChildWithNoNameTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/AddChildResponderSuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/TestFileSectionOrder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteFileSection/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestCantMovePageBeneathSelf/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveIncludedPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageInsideItself/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageThreeLevelsDown/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithAbsoluteInternalReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithExternalReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithManyLevelsOfSubPages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithRelativeInternalReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMovePageWithSubPages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestMoveToNonExistentPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestReferencesOfChildOfMovedPageAreRenamed/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/TestSimpleMove/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteMoveResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/TestPropertyCheckboxesArePresent/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuitePropertiesResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestProtectedWidgetsAreNotRenamed/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithAbsoluteReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameChildPageWithSiblingReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameDoesNotMove/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenameMovesChildPages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageThatRefersToItself/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasAbsoluteReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasLinkReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithAliasSubLinkReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithBackwardsSearchReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSiblingReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/TestRenamePageWithSubpageReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRenameResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplaceContentsInPageHierarchy/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacementWithPatternGroups/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/TestReplacesContent/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteReplaceResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/TestLinearClassPath/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteRunResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/SamplePages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestContentSearch/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestSearchForm/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/TestTitleSearch/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteSearchResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/DoTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestErrorOccurred/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestExecutedOk/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/TestOutputCaptured/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteExecutionStatusMessages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/SetUpAndTearDownShouldBeIncludedProperly/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestExecutionStatusBox/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestFirstTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestNotSuiteFilter/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestOneSubPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestPrunedPageIsExcluded/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteFilter/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestSuiteWithOneXrefWidget/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/TestTwoSubPages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDown/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreCollapsableWithVariable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreHidden/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/TestSetUpAndTearDownAreUncollapsedWithVariable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/SuiteSetUpAndTearDown/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestPathIsIncluded/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/TestStatusBox/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteTestResponders/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/TestUsenameInVersionList/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/SuiteVersionResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestNameResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestPacketResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestRssResponder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/TestShutdown/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteResponderTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ChainWithInstanceTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/DefineTableTypeTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ErikPragtBug/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/ShouldConvertHashWidgetToHashTable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/HashTableTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LastLibraryPreceedsEarlierLibraryTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpAndPageTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/LibraryInSetUpTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/LibraryInSetUpSuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/OneLibraryTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/LibrarySuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/MultiByteCharsInSlim/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ParameterizedScenarios/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/TestMatching/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/QueryTableSuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/RegularExpressionMatching/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BlankCellsInNestedScenariosShouldWork/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/BrotherScenarioLibraryIsIncluded/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/DoesntFailIfScenariosIncludedTwice/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ManyUnclesAreIncluded/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NewPageThing/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/NoScenarioSectionIfThereAreNone/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/ScenarioLibraryOrderIsCorrect/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/ScenarioLibraryOrderTestParent/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/ScenarioLibraryOrderSuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibariesOrderTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesAreIncludedInTheCorrectOrder/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenarioLibrariesOnlyIncludedInTestPages/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/ScenariosOnlyInSlimTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/ScenarioLibraryTestSuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolCanHoldInstanceUsedAsParameter/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolDollarDollar/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SlimSymbolsCanBeBlankOrNull/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SuiteSpecificationsPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/SystemUnderTestTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TableTableReturnsNull/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestCanPassSymbolsIntoConstructors/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestComparators/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestOrderedQueryWithDuplicateRows/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/IncludedPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestPageWithInclude/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSequentialArgumentProcessing/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSubsetQuery/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestSymbolsDontGetTurnedToStringsInTheOutput/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTryingParameterizationIsntTooGreedy/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/TestTwoIdenticalTablesOnPageDontConflict/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSlimTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateAbsoluteSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateBackwardSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateBackwardSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateNestedBackSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateNestedBackSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateRelativeSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/CreateSubPageSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingAbsoluteSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingBackwardSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingNestedBackSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingRelativeSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestCreatingSubPageSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRemovingSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestRenameSymbolicLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/TestSymbolicLinkBehavior/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteSymbolicLinkTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryFailCountIsSumOfFailuresAndExceptions/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryForSuiteCountsTestsNotAsserts/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasBreadCrumbs/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenDateFieldIfNoErrors/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreenPassCountWhenNonZero/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyDateIfNeitherPassNorFail/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyFailureCountWhenZero/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasGreyPassCountWhenZero/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedDateFieldIfFailure/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryHasRedFailureCountWhenNonZero/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryLineIsLinkToTestResult/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithOneTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/PageHistoryWithTwoTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTestHistoryTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineIsLinkToPageHistory/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineResultElementsAreLinksToTestResults/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowLastTwentyResults/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryLineShouldShowPassFailResultsInColor/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/TopLevelHistoryShouldHaveTitle/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/SuiteTopLevelTestHistory/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteTestHistory/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAccessVirtualChild/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentPageDefersToRemoteServer/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestAliasLinkToNonExistentSubPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageInRange/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestIncludedPageOutOfRange/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkDefersToRemoteServer/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestQuestionMarkLinkForChildPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkConnection/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/TestVirtualLinkError/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteVirtualWikiTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsInclude/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsTestsIncludeWithHelp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ContentsUsage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SetUpLinkTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ShouldNotBeAbleToIncludeParentPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/ShouldNotBeAbleToIncludeParentPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/DavidHookersBug/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/SimpleWidgets/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBackwardsSearchWidget/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBackwardsSearchWidget/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestBrokenWikiWordLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathContainingVariable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestClasspathPrecededByDefine/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestCollapsableSections/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestComment/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContents/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsFilters/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsFilters/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsHelp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsHelp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsProperties/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsProperties/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsRegraced/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsRegraced/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsWithRecursion/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestContentsWithRecursion/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEmailWidget/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestEvaluator/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExistingWikiWordLink/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestExpression/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidget/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestGtSubPageWidgetInAlias/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHash/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHelp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpLinkWithVariable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestHttpStatus/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestInclude/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeBackwardsSearchPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeBackwardsSearchPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeCollapsed/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeIsCollapsable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSeamless/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSetUpTearDownWithPageName/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestIncludeSubPage/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLineBreak/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestLinkAlias/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestMultiLineTable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNormalListWithLeadingNumbers/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestNumericList/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestParentVariables/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestRunningPageName/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleList/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSimpleTable/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubList/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidget/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestSubPageWidgetInAlias/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTables/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTheXrefWidget/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestTitleTag/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariables/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesFromSystemProperties/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/TestVariablesWithBracesBracketsAndParents/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPagePath/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiPageReference/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/WikiWord/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWidgetTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/CreateSecureWiki/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/ScenarioLibrary/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/SetUp/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/SetUp/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestAutomaticUpdate/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestCantImportFromSecureWiki/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportFromSecureWikiWithCredentials/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingSampleWiki/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestImportingUnicodeCharacters/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestOrphanedPagesAreRemoved/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasImportForm/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasImportForm/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasUpdateForm/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestPropertiesPageHasUpdateForm/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUnmodifiedPagesAreNotImported/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestUpdatingImportedWiki/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/TestWaterMarkAndEditButtons/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiImportTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestBreadCrumbs/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestHeadersAndFooters/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationDefault/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithSuite/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/TestNavigationWithTest/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/SuiteWikiPageResponderTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/TearDown/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTests/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTests/properties.xml +FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/content.txt +FitNesseRoot/FitNesse/SuiteAcceptanceTestsDummy/properties.xml +FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/content.txt +FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/TestFixtures/properties.xml +FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/content.txt +FitNesseRoot/FitNesse/SuiteFitAcceptanceTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/content.txt +FitNesseRoot/FitNesse/UserGuide/AcceptanceTestPatterns/properties.xml +FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/content.txt +FitNesseRoot/FitNesse/UserGuide/AcceptanceTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/ActionFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/ActionFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/content.txt +FitNesseRoot/FitNesse/UserGuide/ActionFixtureCode/properties.xml +FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/content.txt +FitNesseRoot/FitNesse/UserGuide/AdministeringFitnesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/content.txt +FitNesseRoot/FitNesse/UserGuide/AttentionMessagesInTestResults/properties.xml +FitNesseRoot/FitNesse/UserGuide/BeingAsister/content.txt +FitNesseRoot/FitNesse/UserGuide/BeingAsister/properties.xml +FitNesseRoot/FitNesse/UserGuide/BuildOperateCheck/content.txt +FitNesseRoot/FitNesse/UserGuide/BuildOperateCheck/properties.xml +FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/content.txt +FitNesseRoot/FitNesse/UserGuide/BuildingClassPaths/properties.xml +FitNesseRoot/FitNesse/UserGuide/ClassPath/content.txt +FitNesseRoot/FitNesse/UserGuide/ClassPath/properties.xml +FitNesseRoot/FitNesse/UserGuide/ColumnFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/ColumnFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/content.txt +FitNesseRoot/FitNesse/UserGuide/ColumnFixtureCode/properties.xml +FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/content.txt +FitNesseRoot/FitNesse/UserGuide/ColumnFixtureDesign/properties.xml +FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/content.txt +FitNesseRoot/FitNesse/UserGuide/CommandLineArguments/properties.xml +FitNesseRoot/FitNesse/UserGuide/CommandLineOption/content.txt +FitNesseRoot/FitNesse/UserGuide/CommandLineOption/properties.xml +FitNesseRoot/FitNesse/UserGuide/CommentTables/content.txt +FitNesseRoot/FitNesse/UserGuide/CommentTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/CommonIncludes/content.txt +FitNesseRoot/FitNesse/UserGuide/CommonIncludes/properties.xml +FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/ComparisonExpressionsInFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/content.txt +FitNesseRoot/FitNesse/UserGuide/ControllingFitNesseFromTheCommandLine/properties.xml +FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/content.txt +FitNesseRoot/FitNesse/UserGuide/CreatingTestTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/content.txt +FitNesseRoot/FitNesse/UserGuide/CustomizingLookAndFeel/properties.xml +FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/content.txt +FitNesseRoot/FitNesse/UserGuide/CustomizingTestExecution/properties.xml +FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/DataTypesInFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/content.txt +FitNesseRoot/FitNesse/UserGuide/DebuggingFitNesseTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/content.txt +FitNesseRoot/FitNesse/UserGuide/DebugingFixtureCode/properties.xml +FitNesseRoot/FitNesse/UserGuide/DeliveringTheRightSystem/content.txt +FitNesseRoot/FitNesse/UserGuide/DeliveringTheRightSystem/properties.xml +FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitNesse/content.txt +FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitNesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServer/content.txt +FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServer/properties.xml +FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/content.txt +FitNesseRoot/FitNesse/UserGuide/DesignNotes/FitServerProtocol/properties.xml +FitNesseRoot/FitNesse/UserGuide/DesignNotes/content.txt +FitNesseRoot/FitNesse/UserGuide/DesignNotes/properties.xml +FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/DesigningWithActionFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/DesigningWithRowFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetFitServer/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/DotNetTestRunner/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBlankAndNullKeywords/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestBooleanSymbols/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestErrorKeyword/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestExceptionKeywordHandler/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestFailKeyword/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestSaveAndRecallSymbols/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/TestSaveAndRecallSymbols/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteDefaultCellHandlerTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestCustomHandler/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestHandlerLoader/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestRangeHandlers/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/TestSubstringHandlers/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/SuiteOptionalAndCustomHandlerTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/TestQuerySymbols/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteCellHandlerTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/TestPathParser/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFitServerTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestActionFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestExecuteOnColumnFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestFixtureParameters/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestImportFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestItemsWithSomeCommonProperties/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestRowFixtureAllowsDups/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestTableFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/TestWhiteSpace/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteFixtureTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/FormPacketServiceFitTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/SuitePacketBuilder/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteLifeWorkSheetsOnlineTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestArrayConversion/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestCustomTypeConversion/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestEnumConversion/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/TestPrimitiveTypeConversion/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/SuiteTypeConversionTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TearDown/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestCustomType/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestFieldsPropertiesAndMethods/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulFixtureNames/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/TestGracefulMemberNames/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/SuiteAcceptanceTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/DotNet/content.txt +FitNesseRoot/FitNesse/UserGuide/DotNet/properties.xml +FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/content.txt +FitNesseRoot/FitNesse/UserGuide/DownloadingAndInstallingFitNesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/content.txt +FitNesseRoot/FitNesse/UserGuide/EditingFitNessePages/properties.xml +FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/content.txt +FitNesseRoot/FitNesse/UserGuide/ExceptionsInFitTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/content.txt +FitNesseRoot/FitNesse/UserGuide/ExecutingTestsOutsideTheUserInterface/properties.xml +FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/content.txt +FitNesseRoot/FitNesse/UserGuide/ExternalHtmlPages/properties.xml +FitNesseRoot/FitNesse/UserGuide/FilesSection/content.txt +FitNesseRoot/FitNesse/UserGuide/FilesSection/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitFramework/content.txt +FitNesseRoot/FitNesse/UserGuide/FitFramework/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/SuiteSetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/AnotherSuiteFixtureExample/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ArrayFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/WritingFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CalculateFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CombinationFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/CommentFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ConstraintFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/DoFixtureSummary/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/FixtureDetails/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SetUpTearDown/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/SpecialisedIssues/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WhenActionsFail/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/WritingFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DoFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/DotGraphics/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExperimentalExtensions/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ExtendedCamelCase/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/KeepTags/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FaQ4Programmers/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FileCompareFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitBook/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FitLibraryFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/FolderRunner/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/GridFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/IgnoreTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/HowTo/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ImageNameGraphic/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/LatestChanges/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/MetaTypeAdapter/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/NestedTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/OtherLanguages/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ParamRowFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SequenceFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/WritingFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SetUpFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SubsetFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/SuiteSetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChat/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithDifferentName/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithKeywords/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/TestChatWithSkippedKeywords/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtureExample/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/CustomerSuiteFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/ProgrammerSuiteFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/SuiteFixtureDetailsAndRationale/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SuiteFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/SupportForGraphics/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TaggedStrings/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/ToStringArrayFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/AnotherTreeExample/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/TreeList/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/WritingListFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/content.txt +FitNesseRoot/FitNesse/UserGuide/FitLibraryUserGuide/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitNesse/content.txt +FitNesseRoot/FitNesse/UserGuide/FitNesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitNesseTests/content.txt +FitNesseRoot/FitNesse/UserGuide/FitNesseTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/content.txt +FitNesseRoot/FitNesse/UserGuide/FitNesseWontStart/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitProtocol/content.txt +FitNesseRoot/FitNesse/UserGuide/FitProtocol/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitServer/content.txt +FitNesseRoot/FitNesse/UserGuide/FitServer/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/content.txt +FitNesseRoot/FitNesse/UserGuide/FitServerProtocol/properties.xml +FitNesseRoot/FitNesse/UserGuide/FitTableStyles/content.txt +FitNesseRoot/FitNesse/UserGuide/FitTableStyles/properties.xml +FitNesseRoot/FitNesse/UserGuide/FiveMinuteIntroduction/content.txt +FitNesseRoot/FitNesse/UserGuide/FiveMinuteIntroduction/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureCode/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureCode/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ActionFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ActionFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ColumnFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ColumnFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ImportFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/ImportFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/RowFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/RowFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/SummaryFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/SummaryFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/TableFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/TableFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/BasicFitFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ArrayFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ArrayFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CalculateFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CalculateFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CombinationFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/CombinationFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ConstraintFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/ConstraintFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/DoFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/DoFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SequenceFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SequenceFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetUpFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SetUpFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SubsetFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/SubsetFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/FitLibraryFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/GalleryIntroduction/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/GalleryIntroduction/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureArguments/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureArguments/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureSymbols/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FixtureSymbols/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FlowMode/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/FlowMode/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/MarkupVariables/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/MarkupVariables/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/SystemUnderTest/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/SystemUnderTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/TargetObject/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/TargetObject/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/ImportantConcepts/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/PageFooter/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/PageFooter/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/SourceCode/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/SourceCode/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/TableOfContents/properties.xml +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/content.txt +FitNesseRoot/FitNesse/UserGuide/FixtureGallery/properties.xml +FitNesseRoot/FitNesse/UserGuide/FormattingOption/content.txt +FitNesseRoot/FitNesse/UserGuide/FormattingOption/properties.xml +FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/content.txt +FitNesseRoot/FitNesse/UserGuide/GettingStarted/CreateExampleAcceptanceTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/content.txt +FitNesseRoot/FitNesse/UserGuide/GettingStarted/FitNesseWontStart/properties.xml +FitNesseRoot/FitNesse/UserGuide/GettingStarted/content.txt +FitNesseRoot/FitNesse/UserGuide/GettingStarted/properties.xml +FitNesseRoot/FitNesse/UserGuide/GracefulName/content.txt +FitNesseRoot/FitNesse/UserGuide/GracefulName/properties.xml +FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/content.txt +FitNesseRoot/FitNesse/UserGuide/KeywordsInTestTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/LastModificationTime/content.txt +FitNesseRoot/FitNesse/UserGuide/LastModificationTime/properties.xml +FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/content.txt +FitNesseRoot/FitNesse/UserGuide/LinksWithinPages/properties.xml +FitNesseRoot/FitNesse/UserGuide/LogFiles/content.txt +FitNesseRoot/FitNesse/UserGuide/LogFiles/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupAliasLink/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupBold/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupBold/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupCenter/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupCenter/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupCollapsableSection/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupComments/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupComments/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupContents/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupContents/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupCrossReference/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupEditWikiPage/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupExpressions/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupExpressions/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupExternalLink/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupHashTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupHeaderAndFooter/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupHeaders/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupHorizontalRule/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupInternalLink/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupItalics/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupItalics/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupLanguageReference/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupLists/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupLists/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupLiteralText/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupNote/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupNote/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupPageInclude/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupPageInclude/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupPath/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupPath/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupPicture/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupPicture/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupPreformatted/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupStrike/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupStrike/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupStyle/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupStyle/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupTable/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupVariables/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupVariables/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/VirtualWikiNetworkError/properties.xml +FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/content.txt +FitNesseRoot/FitNesse/UserGuide/MarkupVirtualWiki/properties.xml +FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/content.txt +FitNesseRoot/FitNesse/UserGuide/MultiLanguageFitNesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/content.txt +FitNesseRoot/FitNesse/UserGuide/OneMinuteDescription/properties.xml +FitNesseRoot/FitNesse/UserGuide/PageFooter/content.txt +FitNesseRoot/FitNesse/UserGuide/PageFooter/properties.xml +FitNesseRoot/FitNesse/UserGuide/PageHeader/content.txt +FitNesseRoot/FitNesse/UserGuide/PageHeader/properties.xml +FitNesseRoot/FitNesse/UserGuide/PageProperties/content.txt +FitNesseRoot/FitNesse/UserGuide/PageProperties/properties.xml +FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/content.txt +FitNesseRoot/FitNesse/UserGuide/ParameterizedIncludes/properties.xml +FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/content.txt +FitNesseRoot/FitNesse/UserGuide/ParametersInFixtures/properties.xml +FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/ParametricRowFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/PasswordCipher/content.txt +FitNesseRoot/FitNesse/UserGuide/PasswordCipher/properties.xml +FitNesseRoot/FitNesse/UserGuide/PasswordFile/content.txt +FitNesseRoot/FitNesse/UserGuide/PasswordFile/properties.xml +FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/content.txt +FitNesseRoot/FitNesse/UserGuide/PasteFromExcel/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollExample/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollExample/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/ChangeBetweenTwoPaydays/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/FicaTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/PageFooter/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/PayrollChequePrintingTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/SetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/TearDown/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/TearDown/properties.xml +FitNesseRoot/FitNesse/UserGuide/PayrollTests/content.txt +FitNesseRoot/FitNesse/UserGuide/PayrollTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/PlainTextTable/content.txt +FitNesseRoot/FitNesse/UserGuide/PlainTextTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/PluginUsage/content.txt +FitNesseRoot/FitNesse/UserGuide/PluginUsage/properties.xml +FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/content.txt +FitNesseRoot/FitNesse/UserGuide/ProjectDeathByRequirements/properties.xml +FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/content.txt +FitNesseRoot/FitNesse/UserGuide/QuickReferenceGuide/properties.xml +FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/content.txt +FitNesseRoot/FitNesse/UserGuide/RefactoringWikiPages/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulPackets/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulPackets/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulServices/JsonProperties/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulServices/PageHistoryXml/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulServices/RestfulSuiteXmlFormat/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulServices/TestHistoryXml/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulServices/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulServices/properties.xml +FitNesseRoot/FitNesse/UserGuide/RestfulTests/content.txt +FitNesseRoot/FitNesse/UserGuide/RestfulTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/RootPage/content.txt +FitNesseRoot/FitNesse/UserGuide/RootPage/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/RowEntryFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/RowFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/content.txt +FitNesseRoot/FitNesse/UserGuide/RowFixtureCode/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/content.txt +FitNesseRoot/FitNesse/UserGuide/RowFixtureFunctions/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/content.txt +FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/VirtualWikiNetworkError/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/content.txt +FitNesseRoot/FitNesse/UserGuide/RowFixtureMultipleKeys/properties.xml +FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/content.txt +FitNesseRoot/FitNesse/UserGuide/RowFixtureOld/properties.xml +FitNesseRoot/FitNesse/UserGuide/RssFeed/content.txt +FitNesseRoot/FitNesse/UserGuide/RssFeed/properties.xml +FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/content.txt +FitNesseRoot/FitNesse/UserGuide/RunningAcceptanceTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/content.txt +FitNesseRoot/FitNesse/UserGuide/RunningFromJunit/properties.xml +FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/content.txt +FitNesseRoot/FitNesse/UserGuide/RunningFromMaven/properties.xml +FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/content.txt +FitNesseRoot/FitNesse/UserGuide/SampleOperateForTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/content.txt +FitNesseRoot/FitNesse/UserGuide/SampleParameterizedPage/properties.xml +FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/content.txt +FitNesseRoot/FitNesse/UserGuide/SampleSetupForTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/content.txt +FitNesseRoot/FitNesse/UserGuide/SecurityDescription/SpnegoAuthentication/properties.xml +FitNesseRoot/FitNesse/UserGuide/SecurityDescription/content.txt +FitNesseRoot/FitNesse/UserGuide/SecurityDescription/properties.xml +FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/content.txt +FitNesseRoot/FitNesse/UserGuide/ShortcutKeys/properties.xml +FitNesseRoot/FitNesse/UserGuide/SisterSites/content.txt +FitNesseRoot/FitNesse/UserGuide/SisterSites/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/CommentTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/ConstructorArguments/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/CustomTypes/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/DataTypes/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/DecisionTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/DefineTableType/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/ExceptionHandling/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/GracefulNames/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/ImportTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/LibraryTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/OrderedQueryTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/QueryTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/ScenarioTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/ScenarioTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/ScriptTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/SetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/PortManagement/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/SlimProtocol/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/SubsetQueryTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/SymbolsInTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/SystemUnderTest/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/ReportTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/TableTable/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/ValueComparisons/properties.xml +FitNesseRoot/FitNesse/UserGuide/SliM/content.txt +FitNesseRoot/FitNesse/UserGuide/SliM/properties.xml +FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/GitPlugin/content.txt +FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/GitPlugin/properties.xml +FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/content.txt +FitNesseRoot/FitNesse/UserGuide/SourceCodeControl/properties.xml +FitNesseRoot/FitNesse/UserGuide/SpecialPages/content.txt +FitNesseRoot/FitNesse/UserGuide/SpecialPages/properties.xml +FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/content.txt +FitNesseRoot/FitNesse/UserGuide/SpecialWikiFunctions/properties.xml +FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/content.txt +FitNesseRoot/FitNesse/UserGuide/StartingAndStoppingFitNesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/SubWiki/content.txt +FitNesseRoot/FitNesse/UserGuide/SubWiki/properties.xml +FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/content.txt +FitNesseRoot/FitNesse/UserGuide/SymbolicLinks/properties.xml +FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/content.txt +FitNesseRoot/FitNesse/UserGuide/SymbolsInTestTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/TableFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/TableFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/content.txt +FitNesseRoot/FitNesse/UserGuide/TestDevelopmentEnvironment/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestHistory/content.txt +FitNesseRoot/FitNesse/UserGuide/TestHistory/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/content.txt +FitNesseRoot/FitNesse/UserGuide/TestResultsFormat/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestRunner/content.txt +FitNesseRoot/FitNesse/UserGuide/TestRunner/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSuites/CrossReferenceSuites/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSuites/CrossReferenceSuites/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSuites/SubWikiSuites/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSuites/SubWikiSuites/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteQuery/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteSetUpAndSuiteTearDown/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSuites/SuiteSetUpAndSuiteTearDown/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSuites/TagsAndFilters/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSuites/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSuites/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestSystems/content.txt +FitNesseRoot/FitNesse/UserGuide/TestSystems/properties.xml +FitNesseRoot/FitNesse/UserGuide/TestTableStyles/content.txt +FitNesseRoot/FitNesse/UserGuide/TestTableStyles/properties.xml +FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/content.txt +FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/VirtualWikiNetworkError/properties.xml +FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/TimedActionFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/TodaysDate/content.txt +FitNesseRoot/FitNesse/UserGuide/TodaysDate/properties.xml +FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/content.txt +FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/EachRegularPlaceHasaCategory/properties.xml +FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/SetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/content.txt +FitNesseRoot/FitNesse/UserGuide/TriviaGameUserStories/properties.xml +FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/content.txt +FitNesseRoot/FitNesse/UserGuide/TroubleshootingAcceptanceTests/properties.xml +FitNesseRoot/FitNesse/UserGuide/TwoMinuteExample/content.txt +FitNesseRoot/FitNesse/UserGuide/TwoMinuteExample/properties.xml +FitNesseRoot/FitNesse/UserGuide/VariableScope/content.txt +FitNesseRoot/FitNesse/UserGuide/VariableScope/properties.xml +FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/content.txt +FitNesseRoot/FitNesse/UserGuide/WhatIsFitNesse/properties.xml +FitNesseRoot/FitNesse/UserGuide/WhereUsed/content.txt +FitNesseRoot/FitNesse/UserGuide/WhereUsed/properties.xml +FitNesseRoot/FitNesse/UserGuide/WikiImport/content.txt +FitNesseRoot/FitNesse/UserGuide/WikiImport/properties.xml +FitNesseRoot/FitNesse/UserGuide/WikiWord/content.txt +FitNesseRoot/FitNesse/UserGuide/WikiWord/properties.xml +FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/content.txt +FitNesseRoot/FitNesse/UserGuide/WorkingWithWikiPages/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/FrontPage/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SetUp/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestFinalScores/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGames/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/TestGamesWithFancyFixture/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteGames/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/PerfectGameTiming/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestGutterGameTiming/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestNoMarksTiming/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/TestSpareAndStrikeTiming/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/SuiteTiming/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/BowlingGameProject/properties.xml +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/content.txt +FitNesseRoot/FitNesse/UserGuide/WritingFitTables/properties.xml +FitNesseRoot/FitNesse/UserGuide/content.txt +FitNesseRoot/FitNesse/UserGuide/properties.xml +FitNesseRoot/FitNesse/content.txt +FitNesseRoot/FitNesse/properties.xml +FitNesseRoot/PageFooter/content.txt +FitNesseRoot/PageFooter/properties.xml +FitNesseRoot/PageHeader/content.txt +FitNesseRoot/PageHeader/properties.xml diff --git a/fitnesse/Remote_iDempiereFitnesse.launch b/fitnesse/Remote_iDempiereFitnesse.launch new file mode 100644 index 0000000000..408a711780 --- /dev/null +++ b/fitnesse/Remote_iDempiereFitnesse.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/fitnesse/iDempiereFitNesse.launch b/fitnesse/iDempiereFitNesse.launch new file mode 100644 index 0000000000..417ef1bc73 --- /dev/null +++ b/fitnesse/iDempiereFitNesse.launch @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/fitnesse/readme.txt b/fitnesse/readme.txt new file mode 100644 index 0000000000..e03dceb810 --- /dev/null +++ b/fitnesse/readme.txt @@ -0,0 +1,10 @@ +Run the server from eclipse with iDempiereFitNesse.launch + +Run the server from command line with sh run.sh + +Access the server running navigating to http://127.0.0.1:8089/ + +Before running any test, you must start the org.idempiere.fitnesse.fixture and org.idempiere.fitnesse.server bundle +at the idempiere server's osgi console. + + \ No newline at end of file diff --git a/fitnesse/run.sh b/fitnesse/run.sh new file mode 100755 index 0000000000..1f88c30eaa --- /dev/null +++ b/fitnesse/run.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# run.sh - Start FitNesse. +# try "run.sh -h" for help. + +function help +{ + echo "Usage: run.sh [-p port] [-d dir] [-r root] [-l logDir] [-e days] [-o] [-a userpass] [-J jvm_option ...] + -e Number of days before page versions expire (default: 14). + -o omit updates Don't do updates from remote wikis, if any. + -a {user:pwd | user-file-name} Enable authentication. + -J Arguments to pass to the JVM (can be repeated). + -h This help message. Exits after printing..." +} + +declare -a jvm_args +declare -a fitnesse_args +while [ $# -gt 0 ] +do + case $1 in + -h|-help) + help "$@" + exit 0 + ;; + -J) + shift + jvm_args[${#jvm_args[*]}]=$1 + ;; + -[pdrleoa]*) + fitnesse_args[${#fitnesse_args[*]}]=$1 + shift + fitnesse_args[${#fitnesse_args[*]}]=$1 + ;; + *) + echo "Unknown argument specified: $1" + help "$@" + exit 1 + ;; + esac + shift +done +jvm_args[${#jvm_args[*]}]="-jar" +jvm_args[${#jvm_args[*]}]="fitnesse.jar" + +echo java ${jvm_args[*]} ${fitnesse_args[*]} +java -Xmx100M ${jvm_args[*]} -p 8089 -l log ${fitnesse_args[*]} + + diff --git a/fitnesse/src/fitnesse/client/FitServerServletInvoker.java b/fitnesse/src/fitnesse/client/FitServerServletInvoker.java new file mode 100644 index 0000000000..62bab55f4f --- /dev/null +++ b/fitnesse/src/fitnesse/client/FitServerServletInvoker.java @@ -0,0 +1,38 @@ +package fitnesse.client; + +import util.CommandLine; + +public class FitServerServletInvoker extends ServletInvoker { + private int socketToken; + + public FitServerServletInvoker(String[] args) { + super(args); + } + + public static void main(String[] args) throws Exception { + new FitServerServletInvoker(args).run(); + } + + @Override + protected void args(String[] argv) { + CommandLine commandLine = new CommandLine("url host port socketToken"); + if (commandLine.parse(argv)) { + servletUrl = commandLine.getArgument("url"); + fitnesseHostAddress = commandLine.getArgument("host"); + fitnessePort = Integer.parseInt(commandLine.getArgument("port")); + socketToken = Integer.parseInt(commandLine.getArgument("socketToken")); + } else { + usage(); + } + } + + @Override + protected String urlWithRequestParams() { + return servletUrl + "?host=" + fitnesseHostAddress + "&port=" + fitnessePort + "&socketToken=" + socketToken; + } + + private void usage() { + System.out.println("usage: java fitnesse.FitServerServletInvoker host port socketTicket"); + exit(-1); + } +} diff --git a/fitnesse/src/fitnesse/client/ServletInvoker.java b/fitnesse/src/fitnesse/client/ServletInvoker.java new file mode 100644 index 0000000000..aa6dba941d --- /dev/null +++ b/fitnesse/src/fitnesse/client/ServletInvoker.java @@ -0,0 +1,68 @@ +package fitnesse.client; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; + +public abstract class ServletInvoker { + static final String EXIT_CODE_PREFIX = "Exit Code = "; + static final int ERROR = -1; + protected String fitnesseHostAddress; + protected int fitnessePort; + protected String servletUrl; + + public ServletInvoker(String[] args) { + args(args); + } + + public void run() throws Exception { + int returnCode = postUrlRequest(); + exit(returnCode); + } + + protected abstract void args(String[] args); + + protected abstract String urlWithRequestParams(); + + protected void exit(int statusCode) { + System.exit(statusCode); + } + + private int postUrlRequest() throws Exception { + HttpURLConnection conn = createHttpConnection(); + conn.connect(); + int errorCode = readResults(conn); + conn.disconnect(); + return errorCode; + } + + int readResults(HttpURLConnection conn) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + int errorCode = returnCode(reader); + reader.close(); + return errorCode; + } + + HttpURLConnection createHttpConnection() throws MalformedURLException, IOException, ProtocolException { + URL url = new URL(urlWithRequestParams()); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + return conn; + } + + int returnCode(BufferedReader reader) throws IOException { + String line = null; + while ((line = reader.readLine()) != null) { + int index = line.indexOf(EXIT_CODE_PREFIX); + if (index != -1) { + return Integer.parseInt(line.substring(index + EXIT_CODE_PREFIX.length())); + } + System.out.println(line); + } + return ERROR; + } +} diff --git a/fitnesse/src/fitnesse/client/SlimServerServletInvoker.java b/fitnesse/src/fitnesse/client/SlimServerServletInvoker.java new file mode 100644 index 0000000000..5502c759b7 --- /dev/null +++ b/fitnesse/src/fitnesse/client/SlimServerServletInvoker.java @@ -0,0 +1,57 @@ +package fitnesse.client; + +import util.CommandLine; + +/** + * This class will invoke the SlimServlet deployed on a web container. + */ +public class SlimServerServletInvoker extends ServletInvoker { + + private String servletUrl; + private Integer fitnessePort; + + public SlimServerServletInvoker(String[] args) { + super(args); + } + + public static void main(String[] args) { + try { + new SlimServerServletInvoker(args).run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /* + * (non-Javadoc) + * @see fitnesse.client.ServletInvoker#args(java.lang.String[]) + */ + @Override + protected void args(String[] argv) { + CommandLine commandLine = new CommandLine("url port"); + if (commandLine.parse(argv)) { + servletUrl = commandLine.getArgument("url"); + fitnessePort = Integer.parseInt(commandLine.getArgument("port")); + } else { + usage(); + } + } + + /* + * (non-Javadoc) + * @see fitnesse.client.ServletInvoker#urlWithRequestParams() + */ + @Override + protected String urlWithRequestParams() { + String urlString = servletUrl + "?port=" + fitnessePort; + System.out.println(String.format("url:%s", urlString)); + return urlString; + } + + private void usage() { + System.out + .println("usage: java fitnesse.client.SlimServerServletInvoker port"); + + exit(-1); + } +} diff --git a/org.adempiere.sdk-feature/feature.xml b/org.adempiere.sdk-feature/feature.xml index 0f7fa007c8..abae046a65 100644 --- a/org.adempiere.sdk-feature/feature.xml +++ b/org.adempiere.sdk-feature/feature.xml @@ -34,6 +34,10 @@ version="0.0.0" optional="true"/> + + + + + @@ -59,9 +62,13 @@ + + + + diff --git a/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties b/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties index 8127877a58..4695ef0fee 100644 --- a/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties +++ b/org.adempiere.server-feature/buckminster_linux_gtk_x86.properties @@ -10,6 +10,6 @@ target.os=linux target.ws=gtk target.arch=x86_64 -product.features=org.idempiere.eclipse.platform.feature.group +product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group product.profile=DefaultProfile product.id=org.adempiere.server.product diff --git a/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties b/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties index 8127877a58..4695ef0fee 100644 --- a/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties +++ b/org.adempiere.server-feature/buckminster_linux_gtk_x86_64.properties @@ -10,6 +10,6 @@ target.os=linux target.ws=gtk target.arch=x86_64 -product.features=org.idempiere.eclipse.platform.feature.group +product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group product.profile=DefaultProfile product.id=org.adempiere.server.product diff --git a/org.adempiere.server-feature/buckminster_macosx_x86.properties b/org.adempiere.server-feature/buckminster_macosx_x86.properties index 1e303d33d8..351f709838 100644 --- a/org.adempiere.server-feature/buckminster_macosx_x86.properties +++ b/org.adempiere.server-feature/buckminster_macosx_x86.properties @@ -10,6 +10,6 @@ target.os=macosx target.ws=cocoa target.arch=x86 -product.features=org.idempiere.eclipse.platform.feature.group +product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group product.profile=DefaultProfile product.id=org.adempiere.server.product diff --git a/org.adempiere.server-feature/buckminster_win32_x86.properties b/org.adempiere.server-feature/buckminster_win32_x86.properties index 81f260903e..a390f75ae2 100644 --- a/org.adempiere.server-feature/buckminster_win32_x86.properties +++ b/org.adempiere.server-feature/buckminster_win32_x86.properties @@ -10,6 +10,6 @@ target.os=win32 target.ws=win32 target.arch=x86 -product.features=org.idempiere.eclipse.platform.feature.group +product.features=org.idempiere.eclipse.platform.feature.group, org.idempiere.fitnesse.feature.group product.profile=DefaultProfile product.id=org.adempiere.server.product diff --git a/org.adempiere.server-feature/server.product.launch b/org.adempiere.server-feature/server.product.launch index 5e499556e9..cc3f4d2d92 100644 --- a/org.adempiere.server-feature/server.product.launch +++ b/org.adempiere.server-feature/server.product.launch @@ -22,7 +22,7 @@ - + diff --git a/org.idempiere.fitnesse-feature/.project b/org.idempiere.fitnesse-feature/.project new file mode 100644 index 0000000000..f538ce0351 --- /dev/null +++ b/org.idempiere.fitnesse-feature/.project @@ -0,0 +1,17 @@ + + + org.idempiere.fitnesse-feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/org.idempiere.fitnesse-feature/build.properties b/org.idempiere.fitnesse-feature/build.properties new file mode 100644 index 0000000000..64f93a9f0b --- /dev/null +++ b/org.idempiere.fitnesse-feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/org.idempiere.fitnesse-feature/feature.xml b/org.idempiere.fitnesse-feature/feature.xml new file mode 100644 index 0000000000..37955b10e9 --- /dev/null +++ b/org.idempiere.fitnesse-feature/feature.xml @@ -0,0 +1,33 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + diff --git a/org.idempiere.fitnesse.fixture/.classpath b/org.idempiere.fitnesse.fixture/.classpath new file mode 100644 index 0000000000..ad32c83a78 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.idempiere.fitnesse.fixture/.project b/org.idempiere.fitnesse.fixture/.project new file mode 100644 index 0000000000..70c5844d50 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/.project @@ -0,0 +1,33 @@ + + + org.idempiere.fitnesse.fixture + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.idempiere.fitnesse.fixture/.settings/org.eclipse.jdt.core.prefs b/org.idempiere.fitnesse.fixture/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..c537b63063 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/org.idempiere.fitnesse.fixture/.settings/org.eclipse.pde.core.prefs b/org.idempiere.fitnesse.fixture/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000000..f29e940a00 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/org.idempiere.fitnesse.fixture/META-INF/MANIFEST.MF b/org.idempiere.fitnesse.fixture/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..371b96d92a --- /dev/null +++ b/org.idempiere.fitnesse.fixture/META-INF/MANIFEST.MF @@ -0,0 +1,63 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Fixture +Bundle-SymbolicName: org.idempiere.fitnesse.fixture +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.idempiere.fitnesse.fixture.Activator +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Import-Package: fit, + fit.decorator, + fit.decorator.exceptions, + fit.decorator.performance, + fit.decorator.util, + fit.exception, + fit.testFxtr, + fitnesse, + fitnesse.authentication, + fitnesse.components, + fitnesse.fixtures, + fitnesse.html, + fitnesse.http, + fitnesse.junit, + fitnesse.responders, + fitnesse.responders.editing, + fitnesse.responders.files, + fitnesse.responders.refactoring, + fitnesse.responders.run, + fitnesse.responders.run.formatters, + fitnesse.responders.run.slimResponder, + fitnesse.responders.search, + fitnesse.responders.templateUtilities, + fitnesse.responders.testHistory, + fitnesse.responders.versions, + fitnesse.runner, + fitnesse.schedule, + fitnesse.slim, + fitnesse.slim.converters, + fitnesse.slim.test, + fitnesse.slim.test.library, + fitnesse.slim.test.testSlimInThisPackageShouldNotBeTheOneUsed, + fitnesse.slimTables, + fitnesse.socketservice, + fitnesse.testutil, + fitnesse.tools, + fitnesse.updates, + fitnesse.wiki, + fitnesse.wiki.cmSystems, + fitnesse.wiki.zip, + fitnesse.wikitext, + fitnesse.wikitext.parser, + fitnesse.wikitext.test, + fitnesse.wikitext.widgets, + fitnesseMain, + fitnesseMain.ant, + org.compiere, + org.compiere.model, + org.compiere.process, + org.compiere.util, + org.compiere.wf, + org.idempiere.fitnesse.server.fit, + org.idempiere.fitnesse.server.slim, + org.osgi.framework;version="1.3.0" +Service-Component: OSGI-INF/fitfixturefactory.xml, OSGI-INF/slimfixturefactory.xml diff --git a/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml b/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml new file mode 100644 index 0000000000..a7d64bfff9 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/OSGI-INF/fitfixturefactory.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml b/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml new file mode 100644 index 0000000000..e842348679 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/OSGI-INF/slimfixturefactory.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.idempiere.fitnesse.fixture/build.properties b/org.idempiere.fitnesse.fixture/build.properties new file mode 100644 index 0000000000..6c4d05a4c0 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/build.properties @@ -0,0 +1,6 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/fitfixturefactory.xml,\ + OSGI-INF/slimfixturefactory.xml +source.. = src/ diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Activator.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Activator.java new file mode 100644 index 0000000000..c1eadba0f5 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Activator.java @@ -0,0 +1,48 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.fixture; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +/** + * + * @author hengsin + * + */ +public class Activator implements BundleActivator { + + private static BundleContext context; + + static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + } + +} diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java new file mode 100644 index 0000000000..d6dce28088 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java @@ -0,0 +1,181 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.model.POInfo; +import org.compiere.util.DB; +import org.compiere.util.Env; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Read Record fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class AssertRecord extends TableFixture { + private static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + PO gpo = null; + String tableName = new String(""); + boolean tableOK = false; + MTable table = null; + POInfo poinfo = null; + boolean alreadyread = false; + String whereclause = new String(""); + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*Table*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); + return; + } + tableName = cell_value; + table = MTable.get(ctx, tableName); + if (table == null || table.get_ID() <= 0) { + wrong(i, 1); + tableOK = false; + } else { + tableOK = true; + } + poinfo = POInfo.getPOInfo(ctx, table.getAD_Table_ID()); + } else if (cell_title.equalsIgnoreCase("*Where*")) { + if (i != 1) { + exception(getCell(i, 1), new Exception("*Where* must be defined in second row")); + return; + } + whereclause = cell_value; + } else if (cell_title.equalsIgnoreCase("*Read*")) { + if (! tableOK) { + getCell(i, 1).addToBody("Table " + tableName + " does not exist"); + wrong(i, 1); + return; + } + if (whereclause.length() == 0) { + getCell(i, 1).addToBody("No where clause"); + wrong(i, 1); + return; + } + String sql = "SELECT * FROM " + tableName + " WHERE " + whereclause; + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + if (rs.next()) { + gpo = table.getPO(rs, null); + } else { + getCell(i, 1).addToBody("No record found: " + sql); + wrong(i, 1); + return; + } + if (rs.next()) { + getCell(i, 1).addToBody("More than one record found: " + sql); + wrong(i, 1); + return; + } + } + catch (SQLException e) + { + exception(getCell(i, 1), e); + return; + } + finally + { + DB.close(rs, pstmt); + rs = null; + pstmt = null; + } + right(i, 1); + getCell(i, 1).addToBody(gpo.toString()); + alreadyread = true; + } else { + // columns + if (tableOK) { + if (! alreadyread) { + // not read yet - add value to where clause + String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + if (whereclause.length() > 0) + whereclause = whereclause + " AND "; + whereclause = whereclause + cell_title + "=" + value_evaluated; + } else { + // already read, compare the value of db with the context variable or formula + String title_evaluated = ""; + Object result = gpo.get_Value(cell_title); + if (result != null) { + getCell(i, 0).addToBody("
    " + result.toString()); + title_evaluated = result.toString(); + } + + String value_evaluated = cell_value; + if (cell_value.startsWith("@")) { + value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + } + + if (title_evaluated.equals(value_evaluated)) { + right(i, 1); + } else { + wrong(i, 1); + } + } + } + } + } + // set the variables at the end + // read - set context variables + for (int idx = 0; idx < poinfo.getColumnCount(); idx++) { + String colname = poinfo.getColumnName(idx); + Object result = gpo.get_Value(colname); + if (result != null) + Env.setContext(ctx, windowNo, tableName.toLowerCase() + "." + colname.toLowerCase(), result.toString()); + } + + } // doStaticTable + +} // AdempiereReadRecord diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertVariable.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertVariable.java new file mode 100644 index 0000000000..47e739b981 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertVariable.java @@ -0,0 +1,76 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.util.Properties; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Assert Variable fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class AssertVariable extends TableFixture { + private static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String title_evaluated = cell_title; + if (cell_title.startsWith("@")) { + title_evaluated = Util.evaluate(ctx, windowNo, cell_title, getCell(i, 0)); + } + + String cell_value = getText(i, 1); + String value_evaluated = cell_value; + if (cell_value.startsWith("@")) { + value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + } + + if (title_evaluated.equals(value_evaluated)) { + right(i, 1); + } else { + wrong(i, 1); + } + + } + } // doStaticTable + +} // AdempiereSetVariable diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java new file mode 100644 index 0000000000..2764ba093b --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java @@ -0,0 +1,190 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.Properties; + +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.model.POInfo; +import org.compiere.util.Env; +import org.compiere.util.ValueNamePair; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Create Record fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class CreateRecord extends TableFixture { + private static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + PO gpo = null; + String tableName = new String(""); + String columnName = null; + boolean tableOK = false; + boolean columnsOK = true; + MTable table = null; + POInfo poinfo = null; + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*Table*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); + return; + } + tableName = cell_value; + // TODO : trx + // TODO : verify if the record already exists + table = MTable.get(ctx, tableName); + if (table == null || table.get_ID() <= 0) { + wrong(i, 1); + tableOK = false; + } else { + tableOK = true; + gpo = table.getPO(0, null); + } + poinfo = POInfo.getPOInfo(ctx, table.getAD_Table_ID()); + } else if (cell_title.equalsIgnoreCase("*Save*")) { + if (i != rows-1) { + exception(getCell(i, 1), new Exception("*Save* must be called in last row")); + return; + } + if (! tableOK) { + getCell(i, 1).addToBody("Table " + tableName + " does not exist"); + wrong(i, 1); + } else { + if (columnsOK) { + if (!gpo.save()) { + StringBuffer msg = new StringBuffer(); + Exception e = (Exception) ctx.get("org.compiere.util.CLogger.lastException"); + if (e != null) + msg.append("Exception: "+ e.getMessage()); + else { + ValueNamePair vnp = (ValueNamePair) ctx.get("org.compiere.util.CLogger.lastError"); + if (vnp != null) + msg.append("Error: " + vnp.getName()); + } + getCell(i, 1).addToBody(msg.toString()); + wrong(i, 1); + } else { + right(i, 1); + getCell(i, 1).addToBody(gpo.toString()); + for (int idx = 0; idx < poinfo.getColumnCount(); idx++) { + String colname = poinfo.getColumnName(idx); + Object result = gpo.get_Value(colname); + if (result != null) + Env.setContext(ctx, windowNo, poinfo.getTableName().toLowerCase() + "." + colname.toLowerCase(), result.toString()); + } + } + } + } + gpo = null; + } else { + if (tableOK) { + columnName = cell_title; + int idxcol = gpo.get_ColumnIndex(columnName); + if (idxcol < 0) { + wrong(i, 0); + // column does not exist in dictionary - anyways try custom column in case it exists in table + gpo.set_CustomColumnReturningBoolean(columnName, cell_value); + } else { + Class columnClass = poinfo.getColumnClass(idxcol); + String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + // set value according to class + Object value = null; + if (value_evaluated == null || value_evaluated.length() == 0) { + value = null; + } else if (columnClass == Boolean.class) { + if ("Y".equalsIgnoreCase(value_evaluated) || "true".equalsIgnoreCase(value_evaluated)) + value = new Boolean(true); + else if ("N".equalsIgnoreCase(value_evaluated) || "false".equalsIgnoreCase(value_evaluated)) + value = new Boolean(false); + else { + exception(getCell(i, 1), new Exception("Wrong value for boolean, allowed Y/N/true/false")); + continue; + } + } else if (columnClass == Integer.class) { + try { + value = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + continue; + } + } else if (columnClass == BigDecimal.class) { + try { + value = new BigDecimal(value_evaluated); + } catch (Exception e) { + exception(getCell(i, 1), e); + continue; + } + } else if (columnClass == Timestamp.class) { + try { + value = Timestamp.valueOf(value_evaluated); + } catch (Exception e) { + exception(getCell(i, 1), e); + continue; + } + } else if (columnClass == byte[].class) { + exception(getCell(i, 1), new Exception("LOB not supported")); + continue; + } else { + value = value_evaluated; + } + try { + if (!gpo.set_ValueOfColumnReturningBoolean(columnName, value)) { + columnsOK = false; + exception(getCell(i, 1), new Exception("Cannot set value of column")); + } + } catch (Exception e) { + columnsOK = false; + exception(getCell(i, 1), e); + } + } + } + } + } + } // doStaticTable + +} // AdempiereCreateRecord diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/FitFixtureFactory.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/FitFixtureFactory.java new file mode 100644 index 0000000000..b14e418c4b --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/FitFixtureFactory.java @@ -0,0 +1,63 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.fixture; + +import org.idempiere.fitnesse.server.fit.IFitFixtureFactory; + +import fit.Fixture; +import fit.FixtureName; + +/** + * Fit fixture factory + * @author hengsin + * + */ +public class FitFixtureFactory implements IFitFixtureFactory { + + private final static String DEFAULT_PACKAGE = "org.idempiere.fitnesse.fixture"; + + /** + * default constructor + */ + public FitFixtureFactory() { + } + + /* (non-Javadoc) + * @see org.idempiere.fitnesse.server.fit.IFixtureFactory#getFixture(FixtureName) + */ + @Override + public Fixture getFixture(FixtureName fixtureName) { + String className = fixtureName.toString(); + try { + Class clazz = (Class) getClass().getClassLoader().loadClass(className); + return clazz.newInstance(); + } catch (ClassNotFoundException e) { + } catch (InstantiationException e) { + } catch (IllegalAccessException e) { + } + + if (!fixtureName.isFullyQualified()) { + className = DEFAULT_PACKAGE + "." + fixtureName.toString(); + try { + Class clazz = (Class) getClass().getClassLoader().loadClass(className); + return clazz.newInstance(); + } catch (ClassNotFoundException e) { + } catch (InstantiationException e) { + } catch (IllegalAccessException e) { + } + } + return null; + } + +} diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Instance.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Instance.java new file mode 100644 index 0000000000..e1c4ef644d --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Instance.java @@ -0,0 +1,50 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +/** + * iDempiere Create Record fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class Instance { + + private ThreadLocal service = new ThreadLocal() { + @Override + protected Service initialValue() { + Service service = new Service(); + service.connect(); + return service; + } + + }; + + public Service getAdempiereService() { + return service.get(); + } // getAdempiereService + +} // AdempiereInstance diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java new file mode 100644 index 0000000000..dcaf6eb857 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java @@ -0,0 +1,221 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import org.compiere.model.MSession; +import org.compiere.util.Env; +import org.compiere.util.KeyNamePair; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Login fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class Login extends TableFixture { + private static final String LANGUAGE_EN_US = "en_US"; + private static Instance adempiereInstance = null; + private String m_user; + private String m_password; + private String m_language; + private int m_client_id = -1; + private int m_org_id = 0; + private int m_role_id = -1; + private int m_warehouse_id = 0; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + String value_evaluated = Util.evaluate(null, 0, cell_value, getCell(i, 1)); + if (cell_title.equalsIgnoreCase("User")) { + m_user = value_evaluated; + } else if (cell_title.equalsIgnoreCase("Password")) { + m_password = value_evaluated; + } else if (cell_title.equalsIgnoreCase("Language")) { + m_language = value_evaluated; + } else if (cell_title.equalsIgnoreCase("AD_Role_ID")) { + try { + m_role_id = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + continue; + } + } else if (cell_title.equalsIgnoreCase("AD_Client_ID")) { + try { + m_client_id = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + continue; + } + } else if (cell_title.equalsIgnoreCase("AD_Org_ID")) { + try { + m_org_id = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + continue; + } + } else if (cell_title.equalsIgnoreCase("M_Warehouse_ID")) { + try { + m_warehouse_id = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + continue; + } + } else if (cell_title.equalsIgnoreCase("*Login*")) { + if (i != rows-1) { + exception(getCell(i, 1), new Exception("*Login* must be called in last row")); + return; + } + + if (m_language == null || m_language.length() == 0) + m_language = LANGUAGE_EN_US; + if ( m_user == null || m_user.length() == 0 + || m_password == null || m_password.length() == 0 + || m_role_id < 0 + || m_client_id < 0) { + exception(getCell(rows-1, 1), new Exception("Incomplete data to login, needed User|Password|AD_Role_ID|AD_Client_ID")); + } + else { + String msg = modelLogin(); + if (msg == null || msg.length() == 0) { + MSession.get (Env.getCtx(), true); // Start Session + right(rows-1, 0); + right(rows-1, 1); + } else { + wrong(rows-1, 0); + exception(getCell(rows-1, 1), new Exception(msg)); + } + } + + } else { + wrong(i, 0); + } + } + } // doStaticTable + + /* Brought and then changed from 3E_WebServices */ + private String modelLogin() { + + Service m_ads = adempiereInstance.getAdempiereService(); + + // TODO: Share login between different sessions + if ( m_ads != null + && m_ads.isLoggedIn() + && m_ads.getM_AD_Client_ID() == m_client_id + && m_ads.getM_AD_Org_ID() == m_org_id + && m_ads.getAD_Role_ID() == m_role_id + && m_ads.getM_Warehouse_ID() == m_warehouse_id + && m_ads.getUser().equals(m_user) + ) + return null; // already logged with same data + + org.compiere.util.Login login = new org.compiere.util.Login(m_ads.getCtx()); + KeyNamePair[] roles = login.getRoles(m_user, m_password); + if (roles != null) + { + boolean okrole = false; + for (KeyNamePair role : roles) { + if (role.getKey() == m_role_id) { + okrole = true; + break; + } + } + if (!okrole) + return "Error logging in - role not allowed for this user"; + + KeyNamePair[] clients = login.getClients( new KeyNamePair(m_role_id, "" ) ); + boolean okclient = false; + for (KeyNamePair client : clients) { + if (client.getKey() == m_client_id) { + okclient = true; + break; + } + } + if (!okclient) + return "Error logging in - client not allowed for this role"; + + m_ads.getCtx().setProperty("#AD_Client_ID", Integer.toString(m_client_id)); + + KeyNamePair[] orgs = login.getOrgs( new KeyNamePair(m_role_id, "" )); + + if (orgs == null) + return "Error logging in - no organizations for this role"; + + KeyNamePair orglogin = null; + boolean okorg = false; + for (KeyNamePair org : orgs) { + if (org.getKey() == m_org_id) { + okorg = true; + orglogin = org; + break; + } + } + if (!okorg) + return "Error logging in - org not allowed for this role"; + + KeyNamePair[] warehouses = login.getWarehouses( new KeyNamePair(m_org_id, "" ) ); + boolean okwh = false; + if (warehouses == null || warehouses.length == 0) { + if (m_org_id == 0 && m_warehouse_id == 0) + okwh = true; + } else { + for (KeyNamePair warehouse : warehouses) { + if (warehouse.getKey() == m_warehouse_id) { + okwh = true; + break; + } + } + } + if (!okwh) + return "Error logging in - warehouse not allowed for this org"; + + String error = login.validateLogin(orglogin); + if (error != null && error.length() > 0) + return error; + + int m_user_id = Env.getAD_User_ID(m_ads.getCtx()); + + if ( !m_ads.login( m_user_id, m_role_id, m_client_id, m_org_id, m_warehouse_id, m_language) ) + return "Error logging in"; + } + else + { + return "Error logging in - no roles or user/pwd invalid for user " + m_user; + } + + int windowNo = adempiereInstance.getAdempiereService().nextWindowNo(); + + return null; + } // modelLogin + +} // doStaticTable diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java new file mode 100644 index 0000000000..64e10a604d --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java @@ -0,0 +1,165 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.model.POInfo; +import org.compiere.util.DB; +import org.compiere.util.Env; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Read Record fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class ReadRecord extends TableFixture { + private static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + PO gpo = null; + String tableName = new String(""); + boolean tableOK = false; + MTable table = null; + POInfo poinfo = null; + boolean alreadyread = false; + String whereclause = new String(""); + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*Table*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); + return; + } + tableName = cell_value; + table = MTable.get(ctx, tableName); + if (table == null || table.get_ID() <= 0) { + wrong(i, 1); + tableOK = false; + } else { + tableOK = true; + } + poinfo = POInfo.getPOInfo(ctx, table.getAD_Table_ID()); + } else if (cell_title.equalsIgnoreCase("*Where*")) { + if (i != 1) { + exception(getCell(i, 1), new Exception("*Where* must be defined in second row")); + return; + } + whereclause = cell_value; + } else if (cell_title.equalsIgnoreCase("*Read*")) { + if (! tableOK) { + getCell(i, 1).addToBody("Table " + tableName + " does not exist"); + wrong(i, 1); + return; + } + if (whereclause.length() == 0) { + getCell(i, 1).addToBody("No where clause"); + wrong(i, 1); + return; + } + String sql = "SELECT * FROM " + tableName + " WHERE " + whereclause; + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + if (rs.next()) { + gpo = table.getPO(rs, null); + } else { + getCell(i, 1).addToBody("No record found: " + sql); + wrong(i, 1); + return; + } + if (rs.next()) { + getCell(i, 1).addToBody("More than one record found: " + sql); + wrong(i, 1); + return; + } + } + catch (SQLException e) + { + exception(getCell(i, 1), e); + return; + } + finally + { + DB.close(rs, pstmt); + rs = null; + pstmt = null; + } + right(i, 1); + getCell(i, 1).addToBody(gpo.toString()); + // read - set context variables + for (int idx = 0; idx < poinfo.getColumnCount(); idx++) { + String colname = poinfo.getColumnName(idx); + Object result = gpo.get_Value(colname); + if (result != null) + Env.setContext(ctx, windowNo, poinfo.getTableName().toLowerCase() + "." + colname.toLowerCase(), result.toString()); + } + alreadyread = true; + } else { + // columns + if (tableOK) { + if (! alreadyread) { + // not read yet - add value to where clause + String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + if (whereclause.length() > 0) + whereclause = whereclause + " AND "; + whereclause = whereclause + cell_title + "=" + value_evaluated; + } else { + // already read, show the value of context variable + Object result = gpo.get_Value(cell_title); + if (result != null) + getCell(i, 1).addToBody(result.toString()); + } + } + } + } + } // doStaticTable + +} // AdempiereReadRecord diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java new file mode 100644 index 0000000000..aabbd28ff9 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java @@ -0,0 +1,406 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Properties; + +import org.compiere.model.Lookup; +import org.compiere.model.MPInstance; +import org.compiere.model.MPInstanceLog; +import org.compiere.model.MPInstancePara; +import org.compiere.model.MProcess; +import org.compiere.model.MProcessPara; +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.process.ProcessInfo; +import org.compiere.util.CLogger; +import org.compiere.util.DisplayType; +import org.compiere.util.Env; +import org.compiere.util.Msg; +import org.compiere.util.NamePair; +import org.compiere.util.Trx; +import org.compiere.wf.MWFProcess; +import org.compiere.wf.MWorkflow; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Run Process fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class RunProcess extends TableFixture { + private static Instance adempiereInstance = null; + + private static CLogger log = CLogger.getCLogger(RunProcess.class); + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + MProcess process = null; + MProcessPara[] processParams = null; + MPInstance pInstance = null; + HashMap fmap = new HashMap(); + int recordID = 0; + String docAction = null; + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*ProcessValue*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*ProcessValue* must be defined in first row")); + return; + } + String processValue = cell_value; + int processID = MProcess.getProcess_ID(processValue, null); + if (processID <= 0) { + exception(getCell(i, 1), new Exception("Process with Value=" + processValue + " doesn't exist")); + return; + } + process = new MProcess(ctx, processID, null); + } else if (cell_title.equalsIgnoreCase("*ProcessID*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*ProcessID* must be defined in first row")); + return; + } + int processID = getInt(i, 1); + process = new MProcess(ctx, processID, null); + if (process == null || process.get_ID() <= 0) { + exception(getCell(i, 1), new Exception("Process with ID=" + processID + " doesn't exist")); + return; + } + } else if (cell_title.equalsIgnoreCase("*Run*")) { + if (i != rows-1) { + exception(getCell(i, 1), new Exception("*Run* must be called in last row")); + return; + } + processParams = process.getParameters(); + pInstance = new MPInstance (process, 0); + MPInstancePara[] iParams = pInstance.getParameters(); + String errorMsg = setParams(process, iParams, fmap); + if (errorMsg != null) + exception(getCell(i, 1), new Exception(errorMsg)); + if (recordID > 0) + pInstance.setRecord_ID( recordID); + pInstance.save(); + if (docAction != null) { + if (docAction != null && docAction.length() > 0) { + // Requirements + // - the process must be a workflow document + if (process.getAD_Workflow_ID() > 0) { + MWorkflow wf = MWorkflow.get(ctx, process.getAD_Workflow_ID()); + if (wf.getWorkflowType().equals(MWorkflow.WORKFLOWTYPE_DocumentProcess)) { + // - get the table associated with the workflow document + // - set DocAction in such table + + // get the PO for the tablename and record ID + MTable table = MTable.get(ctx, wf.getAD_Table_ID()); + if (table != null) { + PO po = table.getPO(recordID, null); + if (po != null) { + po.set_ValueOfColumn("DocAction", docAction); + po.save(); + } + } + } + } + } + } + ProcessInfo pi = new ProcessInfo (process.getName(), process.getAD_Process_ID()); + pi.setAD_User_ID(Env.getAD_User_ID(ctx)); + pi.setAD_Client_ID(Env.getAD_Client_ID(ctx)); + pi.setAD_PInstance_ID(pInstance.getAD_PInstance_ID()); + if (recordID >0) + pi.setRecord_ID(recordID); + boolean processOK = false; + boolean jasperreport = (process != null && process.getClassname()!=null && process.getClassname().indexOf( "net.sf.compilo.report.ReportStarter" ) >=0 ); + // Start + if (process.isWorkflow()) + { + try + { + int AD_Workflow_ID = process.getAD_Workflow_ID(); + MWorkflow wf = MWorkflow.get (ctx, AD_Workflow_ID); + MWFProcess wfProcess = wf.startWait(pi); // may return null + if(wfProcess != null) + { + getCell(i, 1).addToBody(Msg.parseTranslation(ctx, pi.getSummary())); + addLogInfo(pInstance, i); + right(getCell(i, 1)); + } + } + catch(Exception ex) + { + exception(getCell(i, 1), ex); + } + //started = wfProcess != null; + } + + if (process.isJavaProcess() && !jasperreport) + { + Trx trx = Trx.get(Trx.createTrxName("FixturePrc"), true); + try + { + processOK = process.processIt(pi, trx); + trx.commit(); + trx.close(); + } + catch (Throwable t) + { + trx.rollback(); + trx.close(); + } + if (!processOK || pi.isError()) + { + exception(getCell(i, 1), new Exception(pi.getSummary())); + processOK = false; + } + else + { + getCell(i, 1).addToBody(Msg.parseTranslation(ctx, pi.getSummary())); + addLogInfo(pInstance, i); + right(getCell(i, 1)); + } + } + + // Report + if (/*processOK &&*/ (process.isReport() || jasperreport))//&& !m_jasperreport) + { + exception(getCell(i, 1), new Exception("Report not supported yet")); + return; + } + } else { + if (i <= 0 || i >= rows-1) { + exception(getCell(i, 1), new Exception("Parameters must be defined in middle rows")); + return; + } + // Parameter + String parameterName = cell_title; + String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + if (parameterName.equalsIgnoreCase("*RecordID*")) { + try { + recordID = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + continue; + } + } + else if (parameterName.equalsIgnoreCase("*DocAction*")) + docAction = value_evaluated; + else + fmap.put(parameterName, value_evaluated); + } + } + + } // doStaticTable + + private void addLogInfo(MPInstance pInstance, int i) { + // pi.getLogInfo was cleared by unlock - the results must be read from database + MPInstanceLog[] pils = pInstance.getLog(); + if (pils != null && pils.length > 0) { + getCell(i, 1).addToBody("
    "); + SimpleDateFormat dateFormat = DisplayType.getDateFormat(DisplayType.DateTime); + for (MPInstanceLog pil : pInstance.getLog()) { + if (pil.getP_Date() != null) + getCell(i, 1).addToBody(dateFormat.format(pil.getP_Date()) + " \t"); + if (pil.getP_Number() != null) + getCell(i, 1).addToBody(pil.getP_Number() + " \t"); + if (pil.getP_Msg() != null) + getCell(i, 1).addToBody(Msg.parseTranslation(Env.getCtx(), pil.getP_Msg()).replaceAll("\\n", "
    ")); + } + } + } + + private String setParams(MProcess process, MPInstancePara[] iParams, HashMap fmap) { + // Code brought from 3E_WebServices Process + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); + for (int pi = 0; pi < iParams.length; pi++) + { + MPInstancePara iPara = iParams[pi]; + String key = iPara.getParameterName(); + MProcessPara pPara = process.getParameter(key); + if (pPara == null) + { + return "Parameter not found: " + key; + } + int displayType = pPara.getAD_Reference_ID(); + + String valueString = null; + Object ob = fmap.get( key ); + if (ob!=null ) + valueString = ob.toString(); + String valueString2 = null; + if (pPara.isRange()) + { + ob = fmap.get( key+"_2" ); + if (ob!=null) + valueString2 = ob.toString(); + } + log.fine("fillParameter - " + key + " = " + valueString); + Object value = valueString; + if (valueString != null && valueString.length() == 0) + value = null; + if (value != null && (DisplayType.List == displayType || + DisplayType.TableDir== displayType || + DisplayType.Table== displayType)&& value.equals("-1")) + value= null; + // No Value + if (value == null && DisplayType.YesNo != pPara.getAD_Reference_ID()) + { + if (pPara.isMandatory()) + return "Parameter "+ pPara.getName() +" is required"; + } + else + { + // Convert to Type + try + { + if (DisplayType.isNumeric(displayType) + || DisplayType.isID(displayType)) + { + BigDecimal bd = null; + if (value instanceof BigDecimal) + bd = (BigDecimal)value; + else if (value instanceof Integer) + bd = new BigDecimal (((Integer)value).intValue()); + else + bd = new BigDecimal (value.toString()); + iPara.setP_Number(bd); + log.fine("fillParameter - " + key + + " = " + valueString + " (=" + bd + "=)"); + + if (pPara.isRange()) + { + bd = null; + bd = new BigDecimal (valueString2.toString()); + iPara.setP_Number_To( bd ); + } + } + else if (DisplayType.isDate(displayType)) + { + java.util.Date d; + if (displayType == DisplayType.DateTime) + d = dateFormat.parse(value.toString()); + + else // TODO: datetime + d = dateFormat.parse(value.toString()); + //d = m_cs.dateTimeFormat.parse(value.toString()); + + Timestamp ts = null; + ts = new Timestamp(d.getTime()); + iPara.setP_Date(ts); + + if (pPara.isRange()) + { + if (displayType == DisplayType.DateTime) + d = dateFormat.parse(valueString2); + //d = m_cs.dateTimeFormat.parse(valueString2); + else + { + if (valueString2 == null || valueString2.length() == 0) + d = new java.util.Date(); + else + d = dateFormat.parse(valueString2); //TODO: datetime + } + + ts = new Timestamp(d.getTime()); + iPara.setP_Date_To(ts ); + } + + + log.fine("fillParameter - " + key + + " = " + valueString + " (=" + ts + "=)"); + } + else if (DisplayType.YesNo == pPara.getAD_Reference_ID()) + { + String bv = "N"; + if (value == null) + bv = "N"; + else + //if (value.toString().toLowerCase().charAt(0)=='t') + { + if ("true".equalsIgnoreCase(valueString) || "y".equalsIgnoreCase(valueString)) bv = "Y"; else bv = "N"; + } + //bv ="Y"; + iPara.setP_String(bv); + } + else + { + iPara.setP_String(value.toString()); + } + + if (pPara.isLookup()) // kolec - ustawia wartosc dla parametru Lookup + { + Lookup lok = pPara.getLookup(); + if (lok != null) + { + NamePair np = lok.getDirect( value, false, false); + if (np!=null) + { + iPara.setInfo( np.getName() ); + } + } + } else + { + if (value != null) + iPara.setInfo( value.toString() ); + if (valueString2 != null) + iPara.setInfo_To( valueString2 ); + } + + // + iPara.save(); + } + catch (Exception e) + { + return "fillParameter - " + key + + " = " + valueString + " (" + value + + ") " + value.getClass().getName() + + " - " + e.getLocalizedMessage(); + } + } // not null + } // instance parameter loop + + return null; + + } // setParams + +} // AdempiereRunProcess diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Service.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Service.java new file mode 100644 index 0000000000..154f5e6119 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Service.java @@ -0,0 +1,383 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Properties; + +import org.compiere.model.MUser; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.DisplayType; +import org.compiere.util.Env; +import org.compiere.util.KeyNamePair; +import org.compiere.util.Language; +import org.compiere.util.Login; + +/** + * iDempiere Service to control login for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class Service { + + private static CLogger log = CLogger.getCLogger(Service.class); + + public final static String datePattern = "dd-MM-yyyy"; + + private String m_trx_name; + + private int m_AD_Client_ID; + private int m_AD_Org_ID; + private int m_AD_User_ID; + private int m_AD_Role_ID; + private int m_M_Warehouse_ID; + private String m_Lang; + private String m_User; + + private int m_WindowNo = 1; + + private boolean LoggedIn = false; + + + /** Localized Date format */ + public SimpleDateFormat dateFormat = null; + /** Localized Timestamp format */ + public SimpleDateFormat dateTimeFormat = null; + + /** Localized Amount format */ + public DecimalFormat amountFormat = null; + /** Localized Integer format */ + public DecimalFormat integerFormat = null; + /** Localized Number format */ + public DecimalFormat numberFormat = null; + /** Localized Quantity format */ + public DecimalFormat quantityFormat = null; + + /** Localized Date format */ + public SimpleDateFormat modelDateFormat = null; + /** Localized Timestamp format */ + public SimpleDateFormat modelDateTimeFormat = null; + + /** Localized Amount format */ + public DecimalFormat modelAmountFormat = null; + /** Localized Integer format */ + public DecimalFormat modelIntegerFormat = null; + /** Localized Number format */ + public DecimalFormat modelNumberFormat = null; + /** Localized Quantity format */ + public DecimalFormat modelQuantityFormat = null; + + private Language m_lang; + + public final String dateFormatOnlyForCtx = "yyyy-MM-dd"; + + public int getM_AD_Client_ID() { + return m_AD_Client_ID; + } + + public void setM_AD_Client_ID(int client_ID) { + m_AD_Client_ID = client_ID; + } + + public int getM_AD_Org_ID() { + return m_AD_Org_ID; + } + + public void setM_AD_Org_ID(int org_ID) { + m_AD_Org_ID = org_ID; + } + + public Properties getCtx() { + return Env.getCtx(); + } + + public String get_TrxName() { + return m_trx_name; + } + + public void set_TrxName(String m_trx_name) { + this.m_trx_name = m_trx_name; + } + + + public Service() + { + m_trx_name= null; //Trx.createTrxName(); + LoggedIn = false; + } + + public void connect() + { + Util.initWeb(); + + getCtx().setProperty("#AD_Client_ID", "0"); + Env.setContext( getCtx(), "#AD_Language", "en_US" ); + m_lang = Language.getLanguage("en_US"); + + // These variables are needed for ADClient.exe + Language m_lang2 = Language.getLanguage("pl_PL"); + + //dateFormat = DisplayType.getDateFormat(DisplayType.Date, m_lang2); + //dateTimeFormat = DisplayType.getDateFormat(DisplayType.DateTime, m_lang2); + + dateFormat = new SimpleDateFormat( datePattern ); + dateTimeFormat = new SimpleDateFormat( datePattern ); + + //dateTimeFormat = DisplayType.getDateFormat(DisplayType.DateTime, m_lang2); + // + amountFormat = DisplayType.getNumberFormat(DisplayType.Amount, m_lang2); + integerFormat = DisplayType.getNumberFormat(DisplayType.Integer, m_lang2); + numberFormat = DisplayType.getNumberFormat(DisplayType.Number, m_lang2); + quantityFormat = DisplayType.getNumberFormat(DisplayType.Quantity, m_lang2); + + } // connect + + public Language getM_lang() { + return m_lang; + } + + public void setM_lang(Language m_lang) { + this.m_lang = m_lang; + } + + public boolean isLoggedIn() { + return LoggedIn; + } + + /* + public static Properties testLogin (boolean isClient) + { + //logger.entering("Env", "initTest"); + Compiere.startupEnvironment(true); + // Test Context + Properties ctx = Env.getCtx(); + org.compiere.util.Login login = new org.compiere.util.Login(ctx); + KeyNamePair[] roles = login.getRoles("SuperUser", "System1969"); + // load role + if (roles != null && roles.length > 0) + { + int x = -1; + for (int i=0; i 0) + { + KeyNamePair[] orgs = login.getOrgs(clients[0]); + // load org + if (orgs != null && orgs.length > 0) + { + KeyNamePair[] whs = login.getWarehouses(orgs[0]); + // + login.loadPreferences(orgs[0], null, null, null); + } + } + } + // + Env.setContext(ctx, "#Date", "2006-01-26"); + // logger.exiting("Env", "initTest"); + return ctx; + } // testInit + */ + + + + /** + * Check Login information and set context. + * @returns true if login info are OK + * @param ctx context + * @param AD_User_ID user + * @param AD_Role_ID role + * @param AD_Client_ID client + * @param AD_Org_ID org + * @param M_Warehouse_ID warehouse + */ + private String checkLogin (Properties ctx, int AD_User_ID, int AD_Role_ID, int AD_Client_ID, int AD_Org_ID, int M_Warehouse_ID) + { + // Get Login Info + String loginInfo = null; + // Verify existance of User/Client/Org/Role and User's acces to Client & Org + String sql = "SELECT u.Name || '@' || c.Name || '.' || o.Name || ' [' || INITCAP(USER) || ']' AS Text " + + "FROM AD_User u, AD_Client c, AD_Org o, AD_User_Roles ur " + + "WHERE u.AD_User_ID=?" // #1 + + " AND c.AD_Client_ID=?" // #2 + + " AND o.AD_Org_ID=?" // #3 + + " AND ur.AD_Role_ID=?" // #4 + + " AND ur.AD_User_ID=u.AD_User_ID" + + " AND (o.AD_Client_ID = 0 OR o.AD_Client_ID=c.AD_Client_ID)" + + " AND c.AD_Client_ID IN (SELECT AD_Client_ID FROM AD_Role_OrgAccess ca WHERE ca.AD_Role_ID=ur.AD_Role_ID)" + + " AND o.AD_Org_ID IN (SELECT AD_Org_ID FROM AD_Role_OrgAccess ca WHERE ca.AD_Role_ID=ur.AD_Role_ID)"; + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, AD_User_ID); + pstmt.setInt(2, AD_Client_ID); + pstmt.setInt(3, AD_Org_ID); + pstmt.setInt(4, AD_Role_ID); + rs = pstmt.executeQuery(); + if (rs.next()) + loginInfo = rs.getString(1); + } + catch (SQLException e) + { + // log.log(Level.SEVERE, "checkLogin", e); + } + finally + { + DB.close(rs, pstmt); + rs = null; + pstmt = null; + } + + // not verified + if (loginInfo == null) + return null; + + // Set Preferences + KeyNamePair org = new KeyNamePair(AD_Org_ID, String.valueOf(AD_Org_ID)); + KeyNamePair wh = null; + if (M_Warehouse_ID > 0) + wh = new KeyNamePair(M_Warehouse_ID, String.valueOf(M_Warehouse_ID)); + // + Timestamp date = null; + String printer = null; + Login login = new Login(ctx); + login.loadPreferences(org, wh, date, printer); + // Don't Show Acct/Trl Tabs on HTML UI + Env.setContext(ctx, "#ShowAcct", "N"); + Env.setContext(ctx, "#ShowTrl", "N"); + // + return loginInfo; + } // checkLogin + + public boolean login( int AD_User_ID, int AD_Role_ID, int AD_Client_ID, int AD_Org_ID, int AD_Warehouse_ID, String Lang ) { + LoggedIn = false; + String loginInfo = checkLogin (getCtx(), AD_User_ID, AD_Role_ID, AD_Client_ID, AD_Org_ID, AD_Warehouse_ID ); + if (loginInfo == null) + return false; + + m_AD_Client_ID = AD_Client_ID; + m_AD_Org_ID = AD_Org_ID; + m_AD_User_ID = AD_User_ID; + m_AD_Role_ID = AD_Role_ID; + m_M_Warehouse_ID = AD_Warehouse_ID; + m_Lang = Lang; + m_User = MUser.getNameOfUser(m_AD_User_ID); + + Env.setContext( getCtx(), "#AD_Language", Lang); + m_lang = Language.getLanguage(Lang); + Env.verifyLanguage( getCtx(), m_lang ); + + modelDateFormat = new SimpleDateFormat( datePattern ); + modelDateTimeFormat = new SimpleDateFormat( datePattern ); + + modelAmountFormat = DisplayType.getNumberFormat(DisplayType.Amount, m_lang); + modelIntegerFormat = DisplayType.getNumberFormat(DisplayType.Integer, m_lang); + modelNumberFormat = DisplayType.getNumberFormat(DisplayType.Number, m_lang); + modelQuantityFormat = DisplayType.getNumberFormat(DisplayType.Quantity, m_lang); + + // Set Date + Timestamp ts = new Timestamp(System.currentTimeMillis()); + + SimpleDateFormat dateFormat4Timestamp = new SimpleDateFormat( dateFormatOnlyForCtx ); + Env.setContext( getCtx(), "#Date", dateFormat4Timestamp.format(ts)+" 00:00:00" ); // JDBC format + log.info(" #Date = "+ Env.getContextAsDate( getCtx(), "#Date")); + + Env.setContext( getCtx(), "#M_Warehouse_ID", AD_Warehouse_ID ); + Env.setContext(getCtx(), Env.LANGUAGE, m_lang.getAD_Language()); + //Env.setContext( m_ctx, "#AD_Language", Lang ); + + LoggedIn = true; + return true; + } // login + + public void setAD_User_ID(int m_AD_User_ID) { + this.m_AD_User_ID = m_AD_User_ID; + } + + public int getAD_User_ID() { + return m_AD_User_ID; + } + + public void setAD_Role_ID(int m_AD_Role_ID) { + this.m_AD_Role_ID = m_AD_Role_ID; + } + + public int getAD_Role_ID() { + return m_AD_Role_ID; + } + + public void setLanguage(String m_Lang) { + this.m_Lang = m_Lang; + } + + public String getLanguage() { + return m_Lang; + } + + public void setM_Warehouse_ID(int m_AD_Warehouse_ID) { + this.m_M_Warehouse_ID = m_AD_Warehouse_ID; + } + + public int getM_Warehouse_ID() { + return m_M_Warehouse_ID; + } + + public void setUser(String m_User) { + this.m_User = m_User; + } + + public String getUser() { + return m_User; + } + + public int getWindowNo() { + return m_WindowNo; + } + + public void setWindowNo(int windowNo) { + m_WindowNo = windowNo; + } + + public int nextWindowNo() { + m_WindowNo ++; + return m_WindowNo; + } + +} // AdempiereService diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SetDocAction.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SetDocAction.java new file mode 100644 index 0000000000..23c160661f --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SetDocAction.java @@ -0,0 +1,249 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.util.Properties; + +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.process.DocAction; +import org.compiere.process.DocumentEngine; +import org.compiere.util.CLogger; +import org.compiere.util.Trx; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Set Doc Action fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class SetDocAction extends TableFixture { + private static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + PO gpo = null; + String tableName = new String(""); + String columnName = null; + boolean tableOK = false; + MTable table = null; + int recordID = -1; + String docAction = null; + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*Table*")) { + if (i > 0) + exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); + tableName = cell_value; + // TODO : trx + // TODO : verify if the record already exists + table = MTable.get(ctx, tableName); + if (table == null || table.get_ID() <= 0) { + wrong(i, 1); + tableOK = false; + } else { + tableOK = true; + } + } else if (cell_title.equalsIgnoreCase("*Save*")) { + if (i != rows-1) { + exception(getCell(i, 1), new Exception("*Save* must be called in last row")); + return; + } + if (! tableOK) { + getCell(i, 1).addToBody("Table " + tableName + " does not exist"); + wrong(i, 1); + return; + } + if (recordID == -1 || docAction == null) { + exception(getCell(i, 1), new Exception("You need to assign " + tableName + "_ID and DocAction")); + return; + } + + Trx trx = Trx.get(Trx.createTrxName("FixtureSetDocAction"), true); + + gpo = table.getPO(recordID, trx.getTrxName()); + if (gpo == null) { + exception(getCell(i, 1), new Exception("No Record " + recordID + " in " + tableName)); + return; + } + + DocumentEngine engine = new DocumentEngine ((DocAction) gpo, ((DocAction)gpo).getDocStatus()); + if (! engine.isValidAction(docAction)) { + StringBuffer msg = new StringBuffer("Not a valid action for docStatus="); + msg.append(((DocAction)gpo).getDocStatus()) + .append(" valid actions are:"); + for (String s : engine.getActionOptions()) + msg.append(" ").append(s); + exception(getCell(i, 1), new Exception(msg.toString())); + return; + } + + if (! DocAction.ACTION_Post.equals(docAction)) { + // set explicitly the column DocAction to avoid automatic process of default option - except for Post + if (!gpo.set_ValueOfColumnReturningBoolean("DocAction", docAction)) { + exception(getCell(i, 1), new Exception("No Record " + recordID + " in " + tableName)); + return; + } + if (!gpo.save()) { + exception(getCell(i, 1), new Exception("Cannot save before setDocAction: " + CLogger.retrieveErrorString("no log message"))); + return; + } + } + + // call process it + try { + if (! ((DocAction) gpo).processIt(docAction)) { + exception(getCell(i, 1), new Exception("Couldn't set docAction: " + ((DocAction) gpo).getProcessMsg())); + return; + } + } catch (Exception e) { + exception(getCell(i, 1), e); + } + + // close the trx + if (!gpo.save()) { + exception(getCell(i, 1), new Exception("Cannot save after setDocAction: " + CLogger.retrieveErrorString("no log message"))); + return; + } + + if (!trx.commit()) { + exception(getCell(i, 1), new Exception("Cannot commit: " + CLogger.retrieveErrorString("no log message"))); + return; + } + + trx.close(); + + // Now validate the expected status according to DocAction + + StringBuffer expected = new StringBuffer(); + if (validateResult(docAction, ((DocAction) gpo).getDocStatus(), expected)) { + right(i, 1); + } else { + wrong(i, 1); + } + getCell(i, 1).addToBody("DocStatus="+((DocAction) gpo).getDocStatus()+" expected " + expected.toString()); + + gpo = null; + } else { + if (tableOK) { + columnName = cell_title; + String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + if (columnName.equalsIgnoreCase(tableName + "_ID")) { + try { + recordID = Integer.parseInt(value_evaluated); + } catch (NumberFormatException e) { + exception(getCell(i, 1), e); + return; + } + } else if (columnName.equalsIgnoreCase("DocAction")) { + docAction = value_evaluated; + } else { + exception(getCell(i, 1), new Exception("Column not allowed, just assign " + tableName + "_ID or DocAction")); + return; + } + } + } + } + } + + private boolean validateResult(String docAction, String docStatus, StringBuffer expected) { + + // Now validate the expected status according to DocAction + if (DocAction.ACTION_Unlock.equals(docAction)) { + expected.append(DocAction.STATUS_Drafted); + return DocAction.STATUS_Drafted.equals(docStatus); + + } else if (DocAction.ACTION_Invalidate.equals(docAction)) { + expected.append(DocAction.STATUS_Invalid); + return DocAction.STATUS_Invalid.equals(docStatus); + + } else if (DocAction.ACTION_Prepare.equals(docAction)) { + expected.append(DocAction.STATUS_InProgress); + return DocAction.STATUS_InProgress.equals(docStatus); + + } else if (DocAction.ACTION_Approve.equals(docAction)) { + expected.append(DocAction.STATUS_Approved); + return DocAction.STATUS_Approved.equals(docStatus); + + } else if (DocAction.ACTION_Reject.equals(docAction)) { + expected.append(DocAction.STATUS_NotApproved); + return DocAction.STATUS_NotApproved.equals(docStatus); + + } else if ( DocAction.ACTION_Complete.equals(docAction) + || DocAction.ACTION_WaitComplete.equals(docAction)) { + expected.append(DocAction.STATUS_Completed).append(" - "); + expected.append(DocAction.STATUS_InProgress).append(" - "); + expected.append(DocAction.STATUS_WaitingPayment).append(" - "); + expected.append(DocAction.STATUS_WaitingConfirmation); + return DocAction.STATUS_Completed.equals(docStatus) + || DocAction.STATUS_InProgress.equals(docStatus) + || DocAction.STATUS_WaitingPayment.equals(docStatus) + || DocAction.STATUS_WaitingConfirmation.equals(docStatus); + + } else if (DocAction.ACTION_ReActivate.equals(docAction)) { + expected.append(DocAction.STATUS_InProgress); + return DocAction.STATUS_InProgress.equals(docStatus); + + } else if (DocAction.ACTION_Reverse_Accrual.equals(docAction)) { + expected.append(DocAction.STATUS_Reversed); + return DocAction.STATUS_Reversed.equals(docStatus); + + } else if (DocAction.ACTION_Reverse_Correct.equals(docAction)) { + expected.append(DocAction.STATUS_Reversed); + return DocAction.STATUS_Reversed.equals(docStatus); + + } else if (DocAction.ACTION_Close.equals(docAction)) { + expected.append(DocAction.STATUS_Closed); + return DocAction.STATUS_Closed.equals(docStatus); + + } else if (DocAction.ACTION_Void.equals(docAction)) { + expected.append(DocAction.STATUS_Voided); + return DocAction.STATUS_Voided.equals(docStatus); + + } else if (DocAction.ACTION_Post.equals(docAction)) { + expected.append(docStatus); + return true; + + } + + return false; + } + +} // AdempiereSetDocAction \ No newline at end of file diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SetVariable.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SetVariable.java new file mode 100644 index 0000000000..a1c6a9d532 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SetVariable.java @@ -0,0 +1,68 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.util.Properties; + +import org.compiere.util.Env; + +import fitnesse.fixtures.TableFixture; + +/** + * iDempiere Set Variable fixture for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class SetVariable extends TableFixture { + private static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null || ! adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows-1, 1); + getCell(rows-1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.startsWith("@") && cell_title.endsWith("@")) { + String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); + Env.setContext(ctx, windowNo, cell_title.substring(1, cell_title.length()-1), value_evaluated); + } else { + exception(getCell(i, 0), new Exception("Variable must start and end with @")); + } + } + } // doStaticTable + +} // AdempiereSetVariable diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SlimFixtureFactory.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SlimFixtureFactory.java new file mode 100644 index 0000000000..5806b0cbcb --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/SlimFixtureFactory.java @@ -0,0 +1,98 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.fixture; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.idempiere.fitnesse.server.slim.ISlimFixtureFactory; + +import fitnesse.slim.ConverterSupport; + +/** + * Slim fixture factory + * @author hengsin + * + */ +public class SlimFixtureFactory implements ISlimFixtureFactory { + + private List paths = new ArrayList(); + + /** + * default constructor + */ + public SlimFixtureFactory() { + paths.add("org.idempiere.fitnesse.fixture"); + } + + /* + * (non-Javadoc) + * + * @see + * org.idempiere.fitnesse.server.slim.ISlimFixtureFactory#getFixture(java + * .lang.String, java.lang.Object[]) + */ + @Override + public Object getFixture(String className, Object[] args) { + Class k = searchPathsForClass(className); + if (k == null) + return null; + + Constructor constructor = getConstructor(k.getConstructors(), args); + if (constructor == null) + return null; + + try { + Object newInstance = constructor.newInstance(ConverterSupport + .convertArgs(args, constructor.getParameterTypes())); + return newInstance; + } catch (Exception e) { + } + return null; + } + + private Constructor getConstructor(Constructor[] constructors, + Object[] args) { + for (Constructor constructor : constructors) { + Class arguments[] = constructor.getParameterTypes(); + if (arguments.length == args.length) + return constructor; + } + return null; + } + + private Class searchPathsForClass(String className) { + Class k = getClass(className); + if (k != null) + return k; + List reversedPaths = new ArrayList(paths); + Collections.reverse(reversedPaths); + for (String path : reversedPaths) { + k = getClass(path + "." + className); + if (k != null) + return k; + } + return null; + } + + private Class getClass(String className) { + try { + return getClass().getClassLoader().loadClass(className); + } catch (ClassNotFoundException e) { + return null; + } + } +} diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Static_iDempiereInstance.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Static_iDempiereInstance.java new file mode 100644 index 0000000000..506624e70e --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Static_iDempiereInstance.java @@ -0,0 +1,44 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +/** + * iDempiere Static Instance for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class Static_iDempiereInstance { + private static Instance adempiereInstance; + + public static Instance getInstance() { + if (adempiereInstance == null) { + adempiereInstance = new Instance(); + } + return adempiereInstance; + } + +} // StaticAdempiereInstance diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java new file mode 100644 index 0000000000..f1c43b9ced --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java @@ -0,0 +1,240 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* Copyright (C) Carlos Ruiz * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - Carlos Ruiz - globalqss * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + + +import java.util.Properties; +import java.util.Random; +import java.util.logging.Level; + +import org.compiere.Adempiere; +import org.compiere.model.MClient; +import org.compiere.model.MSystem; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.Env; + +import fit.Parse; + +/** + * iDempiere Util for use with fitnesse framework testing + * + * @author Carlos Ruiz - globalqss + */ +public class Util { + + private static CLogger log = CLogger.getCLogger(Util.class); + private static boolean s_initOK = false; + + + public static boolean initWeb() + { + if (s_initOK) + { + //log.info(context.getServletContextName()); + return true; + } + + // TODO: + // Load Environment Variables (serverApps/src/web/WEB-INF/web.xml) + + + try + { + //CLogMgt.setLevel(Level.OFF); + + /* ADEMPIERE/COMPIERE */ + //s_initOK = Compiere.startup(false); + s_initOK = Adempiere.startup(false); + } + catch (Exception ex) + { + log.log(Level.SEVERE, "startup", ex); + } + if (!s_initOK) + return false; + + // Logging now initiated + //log.info(info.toString()); + + // + Properties ctx = new Properties(); + MClient client = MClient.get(ctx, 0); + MSystem system = MSystem.get(ctx); + + // Env.setContext( ctx, "#AD_Language", "pl_PL" ); + //client.sendEMail(client.getRequestEMail(), + // "Server started: " + system.getName() + // ,"ServerInfo: " + context.getServerInfo() + //); + + return s_initOK; + } // initWeb + + public static String evaluate(Properties ctx, int windowNo, String cell_value, Parse parse) { + + if (cell_value == null || cell_value.length() == 0) + return cell_value; + + if (cell_value.toLowerCase().startsWith("@sql=")) { + String sqlcmd = Env.parseContext(ctx, windowNo, lowerContextTableColumn(cell_value.substring(5)), false, false); + String newval = DB.getSQLValueStringEx(null, sqlcmd); + parse.addToBody("
    " + newval); + log.config("Cell value " + cell_value + " evaluated to " + newval); + return newval; + } else if (cell_value.toLowerCase().startsWith("@ref=")) { + int pos_opsqb = cell_value.indexOf("["); + int pos_clsqb = cell_value.indexOf("]."); + if (pos_opsqb < 0 || pos_clsqb < 0) { + // wrong format - it must be @Ref=Table[Where].Column + return cell_value; + } + String tablename = cell_value.substring(5, pos_opsqb); + String where = cell_value.substring(pos_opsqb+1, pos_clsqb); + String whereParsed = Env.parseContext(ctx, windowNo, where, false); + String columnname = cell_value.substring(pos_clsqb+2); + String newval = DB.getSQLValueStringEx(null, "SELECT " + columnname + " FROM " + tablename + " WHERE " + whereParsed); + parse.addToBody("
    " + newval); + log.config("Cell value " + cell_value + " evaluated to " + newval); + return newval; + } else if (cell_value.startsWith("@") && cell_value.endsWith("@")) { + int posdot = cell_value.indexOf("."); + if (posdot >= 0) { + cell_value = cell_value.toLowerCase(); + } + String newval = Env.getContext(ctx, windowNo, cell_value.substring(1, cell_value.length()-1)); + if (newval == null) + return cell_value; + parse.addToBody("
    " + newval); + log.config("Cell value " + cell_value + " evaluated to " + newval); + return newval; + } else if ((cell_value.toLowerCase().startsWith("@random_number(") || cell_value.toLowerCase().startsWith("@random_string(")) + && cell_value.endsWith(")")) { + // allow @RANDOM_NUMBER(PREFIX,SUFFIX,LENGTH,DECIMALS)@ in column value + // allow @RANDOM_STRING(PREFIX,SUFFIX,LENGTH)@ in column value + Random rndgen = new Random(System.currentTimeMillis()); + String prefix = ""; + String suffix = ""; + int length = 10; + int decs = 0; + String[] tokens = cell_value.substring(15, cell_value.length()-1).split(","); + for (int it = 0; it < tokens.length; it++) { + String tok = tokens[it]; + if (tok != null && tok.length() > 0) { + switch (it) { + case 0: prefix = tok; break; + case 1: suffix = tok; break; + case 2: + try { + length = Integer.parseInt(tok); + } catch (NumberFormatException e) { + length = 10; + } + break; + case 3: + try { + decs = Integer.parseInt(tok); + } catch (NumberFormatException e) { + decs = 0; + } + } + } + } + StringBuffer randomstr = new StringBuffer(); + if (prefix != null && prefix.length() > 0) + randomstr.append(prefix); + for (int i = 0; i < length; i++) { + int r = 0; + if (cell_value.toLowerCase().startsWith("@random_number(")) { + r = rndgen.nextInt(10) + 48; // random ascii number + } else { + r = rndgen.nextInt(26) + 65; // random ascii letter + } + char c = (char) r; + randomstr.append(c); + } + if (decs > 0) + randomstr.append("."); + for (int i = 0; i < decs; i++) { + int r = rndgen.nextInt(10) + 48; // random ascii number + char c = (char) r; + randomstr.append(c); + } + if (suffix != null && suffix.length() > 0) + randomstr.append(suffix); + String newval = randomstr.toString(); + if (newval == null) + return cell_value; + parse.addToBody("
    " + newval); + log.config("Cell value " + cell_value + " evaluated to " + newval); + return newval; + } else if (cell_value.startsWith("\\@")) { + cell_value = cell_value.substring(1); + } + + return cell_value; + } + + public static String lowerContextTableColumn (String value) + { + if (value == null || value.length() == 0) + return ""; + + String token; + String inStr = new String(value); + StringBuffer outStr = new StringBuffer(); + + int i = inStr.indexOf('@'); + while (i != -1) + { + outStr.append(inStr.substring(0, i)); // up to @ + outStr.append("@"); + inStr = inStr.substring(i+1, inStr.length()); // from first @ + + int j = inStr.indexOf('@'); // next @ + if (j < 0) + { + return ""; // no second tag + } + + token = inStr.substring(0, j); + if (token.indexOf(".") >= 0) + token = token.toLowerCase(); + + outStr.append(token); // replace context with Context + outStr.append("@"); + + inStr = inStr.substring(j+1, inStr.length()); // from second @ + i = inStr.indexOf('@'); + } + outStr.append(inStr); // add the rest of the string + + return outStr.toString(); + } // parseContext + + +} // AdempiereUtil diff --git a/org.idempiere.fitnesse.server/.classpath b/org.idempiere.fitnesse.server/.classpath new file mode 100644 index 0000000000..fd3f6ce5c3 --- /dev/null +++ b/org.idempiere.fitnesse.server/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.idempiere.fitnesse.server/.project b/org.idempiere.fitnesse.server/.project new file mode 100644 index 0000000000..8ba84c71e3 --- /dev/null +++ b/org.idempiere.fitnesse.server/.project @@ -0,0 +1,28 @@ + + + org.idempiere.fitnesse.server + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.idempiere.fitnesse.server/.settings/org.eclipse.jdt.core.prefs b/org.idempiere.fitnesse.server/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..c537b63063 --- /dev/null +++ b/org.idempiere.fitnesse.server/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/org.idempiere.fitnesse.server/.settings/org.eclipse.pde.core.prefs b/org.idempiere.fitnesse.server/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000000..f29e940a00 --- /dev/null +++ b/org.idempiere.fitnesse.server/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/org.idempiere.fitnesse.server/META-INF/MANIFEST.MF b/org.idempiere.fitnesse.server/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..d67e7bad6d --- /dev/null +++ b/org.idempiere.fitnesse.server/META-INF/MANIFEST.MF @@ -0,0 +1,63 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Fitnesse Server +Bundle-SymbolicName: org.idempiere.fitnesse.server +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.idempiere.fitnesse.server.Activator +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Import-Package: javax.servlet;version="3.0.0", + javax.servlet.http;version="3.0.0", + org.adempiere.base, + org.osgi.framework;version="1.3.0" +Bundle-ClassPath: ., + fitnesse.jar +Web-ContextPath: fitnesse +Export-Package: fit, + fit.decorator, + fit.decorator.exceptions, + fit.decorator.performance, + fit.decorator.util, + fit.exception, + fit.testFxtr, + fitnesse, + fitnesse.authentication, + fitnesse.components, + fitnesse.fixtures, + fitnesse.html, + fitnesse.http, + fitnesse.junit, + fitnesse.responders, + fitnesse.responders.editing, + fitnesse.responders.files, + fitnesse.responders.refactoring, + fitnesse.responders.run, + fitnesse.responders.run.formatters, + fitnesse.responders.run.slimResponder, + fitnesse.responders.search, + fitnesse.responders.templateUtilities, + fitnesse.responders.testHistory, + fitnesse.responders.versions, + fitnesse.runner, + fitnesse.schedule, + fitnesse.slim, + fitnesse.slim.converters, + fitnesse.slim.test, + fitnesse.slim.test.library, + fitnesse.slim.test.testSlimInThisPackageShouldNotBeTheOneUsed, + fitnesse.slimTables, + fitnesse.socketservice, + fitnesse.testutil, + fitnesse.tools, + fitnesse.updates, + fitnesse.wiki, + fitnesse.wiki.cmSystems, + fitnesse.wiki.zip, + fitnesse.wikitext, + fitnesse.wikitext.parser, + fitnesse.wikitext.test, + fitnesse.wikitext.widgets, + fitnesseMain, + fitnesseMain.ant, + org.idempiere.fitnesse.server.fit, + org.idempiere.fitnesse.server.slim diff --git a/org.idempiere.fitnesse.server/WEB-INF/web.xml b/org.idempiere.fitnesse.server/WEB-INF/web.xml new file mode 100644 index 0000000000..f69cea6c41 --- /dev/null +++ b/org.idempiere.fitnesse.server/WEB-INF/web.xml @@ -0,0 +1,30 @@ + + + Fitnesse Server + + + + FitServlet + org.idempiere.fitnesse.server.fit.FitServlet + + + + + SlimServlet + org.idemiere.fitnesse.server.slim.SlimServlet + + + + FitServlet + /FitServlet/* + + + + SlimServlet + /SlimServlet/* + + + \ No newline at end of file diff --git a/org.idempiere.fitnesse.server/build.properties b/org.idempiere.fitnesse.server/build.properties new file mode 100644 index 0000000000..399970959c --- /dev/null +++ b/org.idempiere.fitnesse.server/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + fitnesse.jar diff --git a/org.idempiere.fitnesse.server/src/fitnesse/slim/ConverterSupport.java b/org.idempiere.fitnesse.server/src/fitnesse/slim/ConverterSupport.java new file mode 100644 index 0000000000..0857e34b38 --- /dev/null +++ b/org.idempiere.fitnesse.server/src/fitnesse/slim/ConverterSupport.java @@ -0,0 +1,43 @@ +package fitnesse.slim; + +import java.beans.PropertyEditor; +import java.beans.PropertyEditorManager; + +import fitnesse.slim.converters.ConverterRegistry; +import fitnesse.slim.converters.PropertyEditorConverter; + +public class ConverterSupport { + + public static Converter getConverter(Class k) { + Converter c = ConverterRegistry.getConverterForClass(k); + if (c != null) + return c; + PropertyEditor pe = PropertyEditorManager.findEditor(k); + if (pe != null) { + return new PropertyEditorConverter(pe); + } + return null; + } + + public static Object[] convertArgs(Object[] args, Class[] argumentTypes) { + Object[] convertedArgs = new Object[args.length]; + for (int i = 0; i < argumentTypes.length; i++) { + convertedArgs[i] = convertArg(args[i], argumentTypes[i]); + } + return convertedArgs; + } + + private static Object convertArg(Object arg, Class argumentType) throws SlimError { + if (arg == null || argumentType.isInstance(arg)) { + // arg may be a List or an instance that comes from the variable store + return arg; + } + Converter converter = getConverter(argumentType); + if (converter != null) { + return converter.fromString(arg.toString()); + } + throw new SlimError(String.format("message:<>", + argumentType.getName())); + } + +} diff --git a/org.idempiere.fitnesse.server/src/fitnesse/slim/StatementExecutor.java b/org.idempiere.fitnesse.server/src/fitnesse/slim/StatementExecutor.java new file mode 100644 index 0000000000..72fd877182 --- /dev/null +++ b/org.idempiere.fitnesse.server/src/fitnesse/slim/StatementExecutor.java @@ -0,0 +1,203 @@ +// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. +// Released under the terms of the CPL Common Public License version 1.0. +package fitnesse.slim; + +import fitnesse.slim.converters.*; + +import java.beans.PropertyEditorManager; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.*; + +import org.adempiere.base.Service; +import org.idempiere.fitnesse.server.slim.ISlimFixtureFactory; + +/** + * This is the API for executing a SLIM statement. This class should not know + * about the syntax of a SLIM statement. + */ + +public class StatementExecutor implements StatementExecutorInterface { + + private static final String SLIM_HELPER_LIBRARY_INSTANCE_NAME = "SlimHelperLibrary"; + private Map instances = new HashMap(); + private List libraries = new ArrayList(); + + private List executorChain = new ArrayList(); + + private VariableStore variables = new VariableStore(); + private List paths = new ArrayList(); + + private boolean stopRequested = false; + + public StatementExecutor() { + PropertyEditorManager.registerEditor(Map.class, MapEditor.class); + + executorChain.add(new FixtureMethodExecutor(instances)); + executorChain.add(new SystemUnderTestMethodExecutor(instances)); + executorChain.add(new LibraryMethodExecutor(libraries)); + + addSlimHelperLibraryToLibraries(); + } + + private void addSlimHelperLibraryToLibraries() { + SlimHelperLibrary slimHelperLibrary = new SlimHelperLibrary(); + slimHelperLibrary.setStatementExecutor(this); + libraries.add(new Library(SLIM_HELPER_LIBRARY_INSTANCE_NAME, slimHelperLibrary)); + } + + public void setVariable(String name, Object value) { + variables.setSymbol(name, new MethodExecutionResult(value, Object.class)); + } + + private void setVariable(String name, MethodExecutionResult value) { + variables.setSymbol(name, value); + } + + public Object addPath(String path) { + paths.add(path); + return "OK"; + } + + public Object getInstance(String instanceName) { + Object instance = instances.get(instanceName); + if (instance != null) { + return instance; + } + + for (Library library : libraries) { + if (library.instanceName.equals(instanceName)) { + return library.instance; + } + } + throw new SlimError(String.format("message:<>", instanceName)); + } + + public Converter getConverter(Class k) { + return ConverterSupport.getConverter(k); + } + + public Object create(String instanceName, String className, Object[] args) { + try { + if (hasStoredActor(className)) { + addToInstancesOrLibrary(instanceName, getStoredActor(className)); + } else { + String replacedClassName = variables.replaceSymbolsInString(className); + Object instance = createInstanceOfConstructor(replacedClassName, replaceSymbols(args)); + addToInstancesOrLibrary(instanceName, instance); + } + return "OK"; + } catch (SlimError e) { + return couldNotInvokeConstructorException(className, args); + } catch (IllegalArgumentException e) { + return couldNotInvokeConstructorException(className, args); + } catch (Throwable e) { + return exceptionToString(e); + } + } + + private void addToInstancesOrLibrary(String instanceName, Object instance) { + if (isLibrary(instanceName)) { + libraries.add(new Library(instanceName, instance)); + } else { + setInstance(instanceName, instance); + } + } + + public void setInstance(String instanceName, Object instance) { + instances.put(instanceName, instance); + } + + private boolean hasStoredActor(String nameWithDollar) { + if (!variables.containsValueFor(nameWithDollar)) { + return false; + } + Object potentialActor = getStoredActor(nameWithDollar); + return potentialActor != null && !(potentialActor instanceof String); + } + + private Object getStoredActor(String nameWithDollar) { + return variables.getStored(nameWithDollar); + } + + private boolean isLibrary(String instanceName) { + return instanceName.startsWith("library"); + } + + private String couldNotInvokeConstructorException(String className, Object[] args) { + return exceptionToString(new SlimError(String.format( + "message:<>", className, args.length))); + } + + private Object createInstanceOfConstructor(String className, Object[] args) throws Exception { + List factories = Service.locator().list(ISlimFixtureFactory.class).getServices(); + for (ISlimFixtureFactory factory : factories) { + Object newInstance = factory.getFixture(className, args); + if (newInstance != null) { + if (newInstance instanceof StatementExecutorConsumer) { + ((StatementExecutorConsumer) newInstance).setStatementExecutor(this); + } + return newInstance; + } + } + + throw new SlimError(String.format("message:<>", className)); + } + + public Object call(String instanceName, String methodName, Object... args) { + try { + return getMethodExecutionResult(instanceName, methodName, args).returnValue(); + } catch (Throwable e) { + return exceptionToString(e); + } + } + + private MethodExecutionResult getMethodExecutionResult(String instanceName, String methodName, Object... args) + throws Throwable { + MethodExecutionResults results = new MethodExecutionResults(); + for (int i = 0; i < executorChain.size(); i++) { + MethodExecutionResult result = executorChain.get(i).execute(instanceName, methodName, + replaceSymbols(args)); + if (result.hasResult()) { + return result; + } + results.add(result); + } + return results.getFirstResult(); + } + + public Object callAndAssign(String variable, String instanceName, String methodName, Object[] args) { + try { + MethodExecutionResult result = getMethodExecutionResult(instanceName, methodName, args); + setVariable(variable, result); + return result.returnValue(); + } catch (Throwable e) { + return exceptionToString(e); + } + } + + private Object[] replaceSymbols(Object[] args) { + return variables.replaceSymbols(args); + } + + private String exceptionToString(Throwable exception) { + StringWriter stringWriter = new StringWriter(); + PrintWriter pw = new PrintWriter(stringWriter); + exception.printStackTrace(pw); + if (exception.getClass().toString().contains("StopTest")) { + stopRequested = true; + return SlimServer.EXCEPTION_STOP_TEST_TAG + stringWriter.toString(); + } else { + return SlimServer.EXCEPTION_TAG + stringWriter.toString(); + } + } + + public boolean stopHasBeenRequested() { + return stopRequested; + } + + public void reset() { + stopRequested = false; + } + +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Activator.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Activator.java new file mode 100644 index 0000000000..63b1182e5c --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Activator.java @@ -0,0 +1,52 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.server; + +import org.idempiere.fitnesse.server.fit.OSGiFixtureLoader; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import fit.FixtureLoader; + +/** + * + * @author hengsin + * + */ +public class Activator implements BundleActivator { + + private static BundleContext context; + + static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + FixtureLoader.setInstance(new OSGiFixtureLoader()); + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + } + +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Parameters.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Parameters.java new file mode 100644 index 0000000000..13e5e4908e --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Parameters.java @@ -0,0 +1,67 @@ +/** + * + */ +package org.idempiere.fitnesse.server; + +import java.io.IOException; +import java.io.PrintStream; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +public abstract class Parameters { + protected static final String VERBOSE = "-v"; + protected static final String DO_NOT_USE_DOWNLOADED_PATHS = "-nopath"; + protected static final String HOST = "host"; + protected static final String PORT = "port"; + protected static final String SOCKET_TOKEN = "socketToken"; + protected static final String FIT_PAGE = "fitpage"; + + protected static final String DEFAULT_HOST = "localhost"; + protected static final String DEFAULT_PORT = "8087"; + protected static final String DEFAULT_FIT_PAGE = "FrontPage"; + protected static final String DEFAULT_HTML_FILE_FORMAT = "-html"; + protected static final String DEFAULT_XML_FILE_FORMAT = "-xml"; + protected static final String DEFAULT_OUTPUT_FILE = "stdout"; + + protected static final String DESTINATION_XML_FILE_PATH = "destinationxmlFilepath"; + protected static final String OUTPUT_XML_FILE_FORMAT = "outputxmlFileFormat"; + protected static final String DESTINATION_HTML_FILE_PATH = "destinationhtmlFilepath"; + protected static final String OUTPUT_HTML_FILE_FORMAT = "outputhtmlFileFormat"; + protected static final String HTML_HEADER_POSTFIX = ""; + protected static final String HTML_HEADER_PREFIX = "

    "; + + protected final String fitnesseHostAddress; + protected final String fitnessePort; + protected final PrintStream out; + protected final ServletRequest request; + + public Parameters(ServletRequest request, ServletResponse response) throws IOException { + this.request = request; + out = new PrintStream(response.getOutputStream()); + fitnesseHostAddress = getParameter(HOST, DEFAULT_HOST); + fitnessePort = getParameter(PORT, DEFAULT_PORT); + } + + protected String getParameter(String paramName, String defaultValue) { + Object value = request.getParameter(paramName); + if (value == null) { + out.println(HTML_HEADER_PREFIX + "Using default value:" + defaultValue + " for param:" + paramName + + HTML_HEADER_POSTFIX); + return defaultValue; + } + return (String) value; + } + + protected PrintStream outputStream() { + return out; + } + + public abstract String[] list(); + +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Runner.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Runner.java new file mode 100644 index 0000000000..f8dfc361a2 --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/Runner.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.idempiere.fitnesse.server; + +import java.io.PrintStream; + +import org.idempiere.fitnesse.server.fit.FitServlet; + +import fit.Counts; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +public abstract class Runner { + protected Parameters parameters; + + public void execute() { + final PrintStream out = parameters.outputStream(); + try { + Counts results = run(parameters.list()); + out.println(results.toString()); + out.println(FitServlet.EXIT_CODE_PREFIX + exitCode(results)); + } catch (Exception e) { + e.printStackTrace(out); + out.println(FitServlet.EXIT_CODE_PREFIX + -1); + } + } + + protected int exitCode(Counts results) { + return results.exceptions + results.wrong; + } + + protected abstract Counts run(String[] params) throws Exception; +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServerParameters.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServerParameters.java new file mode 100644 index 0000000000..c181207b5c --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServerParameters.java @@ -0,0 +1,30 @@ +/** + * + */ +package org.idempiere.fitnesse.server.fit; + +import java.io.IOException; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.idempiere.fitnesse.server.Parameters; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +class FitServerParameters extends Parameters { + private final String socketToken; + + public FitServerParameters(ServletRequest request, ServletResponse response) throws IOException { + super(request, response); + socketToken = request.getParameter(SOCKET_TOKEN); + } + + @Override + public String[] list() { + return new String[] { VERBOSE, fitnesseHostAddress, fitnessePort, socketToken }; + } +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServerRunner.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServerRunner.java new file mode 100644 index 0000000000..73f22cffda --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServerRunner.java @@ -0,0 +1,26 @@ +package org.idempiere.fitnesse.server.fit; + +import org.idempiere.fitnesse.server.Parameters; +import org.idempiere.fitnesse.server.Runner; + +import fit.Counts; +import fit.FitServer; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +class FitServerRunner extends Runner { + + public FitServerRunner(Parameters fitServerParameters) { + parameters = fitServerParameters; + } + + @Override + protected Counts run(String[] params) throws Exception { + FitServer fitServer = new FitServer(); + fitServer.run(params); + return fitServer.getCounts(); + } +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServlet.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServlet.java new file mode 100644 index 0000000000..055a7a922d --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/FitServlet.java @@ -0,0 +1,32 @@ +package org.idempiere.fitnesse.server.fit; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; + +import org.idempiere.fitnesse.server.Parameters; +import org.idempiere.fitnesse.server.Runner; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +public class FitServlet extends HttpServlet { + private static final long serialVersionUID = 6348014852939712903L; + public static final String EXIT_CODE_PREFIX = "Exit Code = "; + + @Override + public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { + Parameters fitServerParameters = new FitServerParameters(request, response); + Runner runner = new FitServerRunner(fitServerParameters); + runTests(runner); + } + + protected void runTests(Runner runner) { + runner.execute(); + } +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/IFitFixtureFactory.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/IFitFixtureFactory.java new file mode 100644 index 0000000000..5cfb4c3f85 --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/IFitFixtureFactory.java @@ -0,0 +1,32 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.server.fit; + +import fit.Fixture; +import fit.FixtureName; + +/** + * + * @author hengsin + * + */ +public interface IFitFixtureFactory { + + /** + * Get new fixture instance + * @param fixtureName + * @return Fixture + */ + public Fixture getFixture(FixtureName fixtureName); +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/OSGiFixtureLoader.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/OSGiFixtureLoader.java new file mode 100644 index 0000000000..cd449c95be --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/fit/OSGiFixtureLoader.java @@ -0,0 +1,47 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.server.fit; + +import java.util.List; + +import org.adempiere.base.Service; + +import fit.Fixture; +import fit.FixtureLoader; +import fit.FixtureName; +import fit.exception.NoSuchFixtureException; + +/** + * Load fixture instance using osgi service factory + * @author hengsin + * + */ +public class OSGiFixtureLoader extends FixtureLoader { + + public OSGiFixtureLoader() { + super(); + } + + @Override + public Fixture disgraceThenLoad(String className) throws Throwable { + FixtureName fixtureName = new FixtureName(className); + List factories = Service.locator().list(IFitFixtureFactory.class).getServices(); + for(IFitFixtureFactory factory : factories) { + Fixture fixture = factory.getFixture(fixtureName); + if (fixture != null) + return fixture; + } + throw new NoSuchFixtureException(fixtureName.toString()); + } +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/ISlimFixtureFactory.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/ISlimFixtureFactory.java new file mode 100644 index 0000000000..8c94bc8058 --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/ISlimFixtureFactory.java @@ -0,0 +1,29 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.idempiere.fitnesse.server.slim; + +/** + * + * @author hengsin + * + */ +public interface ISlimFixtureFactory { + + /** + * Get new slim fixture instance + * @param className + * @param args + */ + public Object getFixture(String className, Object[] args); +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServer.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServer.java new file mode 100644 index 0000000000..ea33e219cd --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServer.java @@ -0,0 +1,48 @@ +package org.idempiere.fitnesse.server.slim; + +import java.net.Socket; +import java.util.logging.Logger; + +import fitnesse.slim.SlimFactory; +import fitnesse.slim.SlimService; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +public class SlimServer extends fitnesse.slim.SlimServer { + private SlimService slimService; + private boolean exceptionWhileExecuting; + private static Logger LOGGER = Logger.getLogger(SlimServer.class.getName()); + + public SlimServer(boolean verbose, SlimFactory slimFactory, int portNumber) { + super(verbose, slimFactory); + try { + slimService = new SlimService(portNumber, this); + } catch (Exception e) { + exceptionWhileExecuting = true; + LOGGER.throwing(SlimServer.class.getName(), "Constructor", e); + } + } + + @Override + public void serve(Socket s) { + // We are storing the instance of SlimService in an instance variable + // rather than on a static variable. To ensure we close the one we want + // to close + SlimService.instance = null; + + super.serve(s); + + try { + while (slimService == null || !exceptionWhileExecuting) { + // wait to close the server socket if we do not have reference + // to slimService available yet + } + slimService.close(); + } catch (Exception e) { + LOGGER.throwing(SlimServer.class.getName(), "serve", e); + } + } +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServerParameters.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServerParameters.java new file mode 100644 index 0000000000..25cf4434ea --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServerParameters.java @@ -0,0 +1,28 @@ +package org.idempiere.fitnesse.server.slim; + +import java.io.IOException; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.idempiere.fitnesse.server.Parameters; + +/** + * Slim Server parameters. + * Adapted from http://sourceforge.net/projects/patang/ + */ +public class SlimServerParameters extends Parameters { + public static final String PORT = "port"; + private final String portNumber; + + public SlimServerParameters(ServletRequest request, ServletResponse response) throws IOException { + super(request, response); + portNumber = request.getParameter(PORT); + } + + @Override + public String[] list() { + return new String[] { VERBOSE, portNumber }; + } + +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServerRunner.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServerRunner.java new file mode 100644 index 0000000000..957df81c32 --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServerRunner.java @@ -0,0 +1,37 @@ +package org.idempiere.fitnesse.server.slim; + +import java.util.logging.Logger; + +import fit.Counts; +import org.idempiere.fitnesse.server.Parameters; +import org.idempiere.fitnesse.server.Runner; +import fitnesse.slim.JavaSlimFactory; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +public class SlimServerRunner extends Runner { + private static Logger LOGGER = Logger.getLogger(SlimServerRunner.class.getName()); + + public SlimServerRunner(Parameters parameters) { + this.parameters = parameters; + } + + @Override + protected Counts run(String[] params) throws Exception { + int portNumber = Integer.parseInt(params[1]); + new SlimServer(true, new JavaSlimFactory(), portNumber); + return new Counts(); + } + + @Override + public void execute() { + try { + run(parameters.list()); + } catch (Exception e) { + LOGGER.throwing(SlimServerRunner.class.getName(), "execute", e); + } + } +} diff --git a/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServlet.java b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServlet.java new file mode 100644 index 0000000000..d50915307f --- /dev/null +++ b/org.idempiere.fitnesse.server/src/org/idempiere/fitnesse/server/slim/SlimServlet.java @@ -0,0 +1,30 @@ +package org.idempiere.fitnesse.server.slim; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; + +import org.idempiere.fitnesse.server.Runner; + +/** + * Adapted from http://sourceforge.net/projects/patang/ + * @author hengsin + * + */ +public class SlimServlet extends HttpServlet { + @Override + public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { + String portNumber = request.getParameter(SlimServerParameters.PORT); + if (portNumber == null || portNumber.trim().length() < 1) + throw new ServletException("Invalid Port Number : " + portNumber); + SlimServerParameters parameters = new SlimServerParameters(request, response); + runTests(new SlimServerRunner(parameters)); + } + + protected void runTests(final Runner runner) { + runner.execute(); + } +}