mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-02-07 22:50:02 +00:00
![Jeremy Ruston](/assets/img/avatar_default.png)
* 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 648855e8a50b1ee3bef3120b64b5713b69190c9b * 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;
|
|
|
|
})();
|