mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-16 23:04:50 +00:00
ece8b0ee01
* Initial Commit
* Add note to preview build
* Fix whitespace and indenting
Thanks @pmario
* Fix crash with unset $tiddler attribute on <$data> widget
Thanks @CodaCodr
* Don't duplicate "description" field in test cases
* Use different background colours for nested testcase widgets
* Extend the testcase widget to run tests
* Add testcases to control panel
* Add a view template body template to render testcase tiddlers
* Test edition should display testcases
* Whitespace fixes
* Make testcase tiddler tempalte link to itself
* Styling tweaks
* Docs improvements
* Styling tweaks
* Run the new tw5.com testcases in the test edition
* Update data widget to display its content in JSON
* Add testcase convenience procedure
* Clearer testcases for data widget, and docs tweaks
* Don't expect our intentionally failing test to pass
* Extend testcase default template so that the display format can be chosen
It is selected by setting the variable "displayFormat"
* DataWidget docs typo
* Fix data widget not refreshing
* Links in testcase output switch to the tab containing that tiddler
Thanks to @btheado for the suggestion
* Docs update for 648855e8a5
* Wording tweak
* Add support for narrative tiddlers in test cases
* Documentation improvements
* Cleanup comments
* Remove obsolete code comments
* Simplify template
* Docs update
* Rename $:/core/ui/testcases/DefaultTemplate/SourceTabs from $:/core/ui/testcases/DefaultTemplate/Source
* Use the view template body for failing tests
* Don't reference the geospatial plugin
* "Test case" should be two words
* Fix handling of currentTiddler variable
Fixes problem reported by @btheado in https://github.com/Jermolene/TiddlyWiki5/pull/7817#issuecomment-2103704468
* Prepare for merging
161 lines
5.2 KiB
JavaScript
161 lines
5.2 KiB
JavaScript
/*\
|
|
title: $:/core/modules/widgets/testcase.js
|
|
type: application/javascript
|
|
module-type: widget
|
|
|
|
Widget to display a test case
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
var Widget = require("$:/core/modules/widgets/widget.js").widget;
|
|
|
|
var TestCaseWidget = function(parseTreeNode,options) {
|
|
this.initialise(parseTreeNode,options);
|
|
};
|
|
|
|
/*
|
|
Inherit from the base widget class
|
|
*/
|
|
TestCaseWidget.prototype = new Widget();
|
|
|
|
/*
|
|
Render this widget into the DOM
|
|
*/
|
|
TestCaseWidget.prototype.render = function(parent,nextSibling) {
|
|
var self = this;
|
|
this.parentDomNode = parent;
|
|
this.computeAttributes();
|
|
this.execute();
|
|
// Create container DOM node
|
|
var domNode = this.document.createElement("div");
|
|
this.domNodes.push(domNode);
|
|
parent.insertBefore(domNode,nextSibling);
|
|
// Render the children into a hidden DOM node
|
|
var parser = {
|
|
tree: [{
|
|
type: "widget",
|
|
attributes: {},
|
|
orderedAttributes: [],
|
|
children: this.parseTreeNode.children || []
|
|
}]
|
|
};
|
|
this.contentRoot = this.wiki.makeWidget(parser,{
|
|
document: $tw.fakeDocument,
|
|
parentWidget: this
|
|
});
|
|
this.contentContainer = $tw.fakeDocument.createElement("div");
|
|
this.contentRoot.render(this.contentContainer,null);
|
|
// Create a wiki
|
|
this.testcaseWiki = new $tw.Wiki();
|
|
// Always load the core plugin
|
|
var loadTiddler = function(title) {
|
|
var tiddler = self.wiki.getTiddler(title);
|
|
if(tiddler) {
|
|
self.testcaseWiki.addTiddler(tiddler);
|
|
}
|
|
}
|
|
loadTiddler("$:/core");
|
|
loadTiddler("$:/plugins/tiddlywiki/codemirror");
|
|
// Load tiddlers from child data widgets
|
|
var tiddlers = [];
|
|
this.findChildrenDataWidgets(this.contentRoot.children,"data",function(widget) {
|
|
Array.prototype.push.apply(tiddlers,widget.readDataTiddlerValues());
|
|
});
|
|
var jsonPayload = JSON.stringify(tiddlers);
|
|
this.testcaseWiki.addTiddlers(tiddlers);
|
|
// Unpack plugin tiddlers
|
|
this.testcaseWiki.readPluginInfo();
|
|
this.testcaseWiki.registerPluginTiddlers("plugin");
|
|
this.testcaseWiki.unpackPluginTiddlers();
|
|
this.testcaseWiki.addIndexersToWiki();
|
|
// Generate a `transclusion` variable that depends on the values of the payload tiddlers so that the template can easily make unique state tiddlers
|
|
this.setVariable("transclusion",$tw.utils.hashString(jsonPayload));
|
|
// Generate a `payloadTiddlers` variable that contains the payload in JSON format
|
|
this.setVariable("payloadTiddlers",jsonPayload);
|
|
// Render the test rendering if required
|
|
if(this.testcaseTestOutput && this.testcaseTestExpectedResult) {
|
|
var testcaseOutputContainer = $tw.fakeDocument.createElement("div");
|
|
var testcaseOutputWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTestOutput,{
|
|
document: $tw.fakeDocument,
|
|
parseAsInline: false,
|
|
parentWidget: this,
|
|
variables: {
|
|
currentTiddler: this.testcaseTestOutput
|
|
}
|
|
});
|
|
testcaseOutputWidget.render(testcaseOutputContainer);
|
|
}
|
|
// Clear changes queue
|
|
this.testcaseWiki.clearTiddlerEventQueue();
|
|
// Run the actions if provided
|
|
if(this.testcaseWiki.tiddlerExists(this.testcaseTestActions)) {
|
|
testcaseOutputWidget.invokeActionString(this.testcaseWiki.getTiddlerText(this.testcaseTestActions));
|
|
testcaseOutputWidget.refresh(this.testcaseWiki.changedTiddlers,testcaseOutputContainer);
|
|
}
|
|
// Set up the test result variables
|
|
var testResult = "",
|
|
outputHTML = "",
|
|
expectedHTML = "";
|
|
if(this.testcaseTestOutput && this.testcaseTestExpectedResult) {
|
|
outputHTML = testcaseOutputContainer.children[0].innerHTML;
|
|
expectedHTML = this.testcaseWiki.getTiddlerText(this.testcaseTestExpectedResult);
|
|
if(outputHTML === expectedHTML) {
|
|
testResult = "pass";
|
|
} else {
|
|
testResult = "fail";
|
|
}
|
|
this.setVariable("outputHTML",outputHTML);
|
|
this.setVariable("expectedHTML",expectedHTML);
|
|
this.setVariable("testResult",testResult);
|
|
this.setVariable("currentTiddler",this.testcaseTestOutput);
|
|
}
|
|
// Don't display anything if testHideIfPass is "yes" and the tests have passed
|
|
if(this.testcaseHideIfPass === "yes" && testResult === "pass") {
|
|
return;
|
|
}
|
|
// Render the page root template of the subwiki
|
|
var rootWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTemplate,{
|
|
document: this.document,
|
|
parseAsInline: false,
|
|
parentWidget: this
|
|
});
|
|
rootWidget.render(domNode);
|
|
// Trap changes in the wiki and refresh the rendering
|
|
this.testcaseWiki.addEventListener("change",function(changes) {
|
|
rootWidget.refresh(changes,domNode);
|
|
});
|
|
};
|
|
|
|
/*
|
|
Compute the internal state of the widget
|
|
*/
|
|
TestCaseWidget.prototype.execute = function() {
|
|
this.testcaseTemplate = this.getAttribute("template","$:/core/ui/testcases/DefaultTemplate");
|
|
this.testcaseTestOutput = this.getAttribute("testOutput");
|
|
this.testcaseTestActions = this.getAttribute("testActions");
|
|
this.testcaseTestExpectedResult = this.getAttribute("testExpectedResult");
|
|
this.testcaseHideIfPass = this.getAttribute("testHideIfPass");
|
|
};
|
|
|
|
/*
|
|
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
|
|
*/
|
|
TestCaseWidget.prototype.refresh = function(changedTiddlers) {
|
|
var changedAttributes = this.computeAttributes();
|
|
if($tw.utils.count(changedAttributes) > 0) {
|
|
this.refreshSelf();
|
|
return true;
|
|
} else {
|
|
return this.contentRoot.refresh(changedTiddlers);
|
|
}
|
|
};
|
|
|
|
exports["testcase"] = TestCaseWidget;
|
|
|
|
})();
|