diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js
index 624cc609b..ae3c8de57 100755
--- a/editions/test/tiddlers/tests/test-widget.js
+++ b/editions/test/tiddlers/tests/test-widget.js
@@ -205,150 +205,6 @@ describe("Widget module", function() {
expect(wrapper.innerHTML).toBe("
My Jolly Old World is Jolly
");
});
- const checkboxTestTiddlers = [
- {title: "TiddlerOne", text: "Jolly Old World", expand: "yes"},
- {title: "TiddlerTwo", text: "Jolly Old World", expand: "no"},
- ];
-
- const checkboxTestData = [
- {
- testName: "field mode checked",
- widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' checked='yes' />",
- startsOutChecked: true,
- expectedChange: { "TiddlerOne": { expand: undefined } }
- },
- // Fails because checkbox logic can't handle this case. Will fix.
- // {
- // testName: "field mode unchecked",
- // widgetText: "<$checkbox tiddler='TiddlerTwo' field='expand' unchecked='no' />",
- // startsOutChecked: false,
- // expectedChange: { "TiddlerTwo": { expand: "yes" } }
- // },
- {
- testName: "field mode toggle",
- widgetText: "<$checkbox tiddler='TiddlerTwo' field='expand' checked='yes' unchecked='no' />",
- startsOutChecked: false,
- expectedChange: { "TiddlerTwo": { expand: "yes" } }
- },
- {
- testName: "list mode add",
- tiddlers: [{title: "Colors", colors: "orange yellow"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
- startsOutChecked: false,
- expectedChange: { "Colors": { colors: "orange yellow green" } }
- },
- {
- testName: "list mode remove",
- tiddlers: [{title: "Colors", colors: "green orange yellow"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
- startsOutChecked: true,
- expectedChange: { "Colors": { colors: "orange yellow" } }
- },
- {
- testName: "list mode remove inverted",
- tiddlers: [{title: "Colors", colors: "red orange yellow"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' />",
- startsOutChecked: false,
- expectedChange: { "Colors": { colors: "orange yellow" } }
- },
- {
- testName: "list mode remove in middle position",
- tiddlers: [{title: "Colors", colors: "orange green yellow"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
- startsOutChecked: true,
- expectedChange: { "Colors": { colors: "orange yellow" } }
- },
- {
- testName: "list mode remove in final position",
- tiddlers: [{title: "Colors", colors: "orange yellow green"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
- startsOutChecked: true,
- expectedChange: { "Colors": { colors: "orange yellow" } }
- },
- {
- testName: "list mode toggle",
- tiddlers: [{title: "Colors", colors: "red orange yellow"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
- startsOutChecked: false,
- expectedChange: { "Colors": { colors: "green orange yellow" } }
- },
- {
- testName: "list mode toggle in middle position",
- tiddlers: [{title: "Colors", colors: "orange red yellow"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
- startsOutChecked: false,
- expectedChange: { "Colors": { colors: "orange green yellow" } }
- },
- {
- testName: "list mode remove in final position",
- tiddlers: [{title: "Colors", colors: "orange yellow red"}],
- widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
- startsOutChecked: false,
- expectedChange: { "Colors": { colors: "orange yellow green" } }
- },
- {
- testName: "filter mode 1",
- tiddlers: [{title: "Colors", colors: "red orange yellow"}],
- widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
- "\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
- "<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<> uncheckactions=<> />",
- startsOutChecked: false,
- expectedChange: { "Colors": { colors: "orange yellow green" } }
- },
- {
- testName: "filter mode 2",
- tiddlers: [{title: "Colors", colors: "green orange yellow"}],
- widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
- "\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
- "<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<> uncheckactions=<> />",
- startsOutChecked: true,
- expectedChange: { "Colors": { colors: "orange yellow red" } }
- },
- ];
-
- for (const data of checkboxTestData) {
- fit('checkbox widget test: ' + data.testName, function() {
- // Setup
-
- // Create the wiki
- var wiki = new $tw.Wiki();
- // Add test tiddlers
- wiki.addTiddlers(checkboxTestTiddlers);
- if(data.tiddlers) wiki.addTiddlers(data.tiddlers);
- // Construct the widget node
- var widgetNode = createWidgetNode(parseText(data.widgetText,wiki),wiki);
- // Render the widget node to the DOM
- var wrapper = renderWidgetNode(widgetNode);
-
- // Check initial state
-
- const widget = findNodeOfType('checkbox', widgetNode);
- // Verify that the widget is or is not checked as expected
- expect(Object.getPrototypeOf(widget).getValue.call(widget)).toBe(data.startsOutChecked);
-
- // Fake an event that toggles the checkbox
- // fakedom elmenets don't have a "checked" property. so we fake it because
- // Checkbox.prototype.handleChangeEvent looks at the "checked" DOM property
- widget.inputDomNode.checked = !!widget.inputDomNode.attributes.checked;
- // Now simulate checking the box
- widget.inputDomNode.checked = !widget.inputDomNode.checked;
- Object.getPrototypeOf(widget).handleChangeEvent.call(widget, null);
-
- // Check state again: checkbox should be inverse of what it was
- expect(Object.getPrototypeOf(widget).getValue.call(widget)).toBe(!data.startsOutChecked);
- // Check that tiddler(s) has/have gone through expected change(s)
- for (const key of Object.keys(data.expectedChange)) {
- const tiddler = wiki.getTiddler(key);
- const change = data.expectedChange[key];
- for (const fieldName of Object.keys(change)) {
- const expectedValue = change[fieldName];
- const fieldValue = tiddler.fields[fieldName];
- expect(fieldValue).toBe(expectedValue);
- }
- }
- })
- }
-
it("should render the view widget", function() {
var wiki = new $tw.Wiki();
// Add a tiddler
@@ -966,6 +822,158 @@ describe("Widget module", function() {
// the <> widget to spit out something different.
expect(withA).toBe(withoutA);
});
+
+ /*
+ * Test data for checkbox widget tests
+ */
+
+ const checkboxTestTiddlers = [
+ {title: "TiddlerOne", text: "Jolly Old World", expand: "yes"},
+ {title: "TiddlerTwo", text: "Jolly Old World", expand: "no"},
+ ];
+
+ const checkboxTestData = [
+ {
+ testName: "field mode checked",
+ widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' checked='yes' />",
+ startsOutChecked: true,
+ expectedChange: { "TiddlerOne": { expand: undefined } }
+ },
+ // Fails because checkbox logic can't handle this case. Will fix.
+ // {
+ // testName: "field mode unchecked",
+ // widgetText: "<$checkbox tiddler='TiddlerTwo' field='expand' unchecked='no' />",
+ // startsOutChecked: false,
+ // expectedChange: { "TiddlerTwo": { expand: "yes" } }
+ // },
+ {
+ testName: "field mode toggle",
+ widgetText: "<$checkbox tiddler='TiddlerTwo' field='expand' checked='yes' unchecked='no' />",
+ startsOutChecked: false,
+ expectedChange: { "TiddlerTwo": { expand: "yes" } }
+ },
+ {
+ testName: "list mode add",
+ tiddlers: [{title: "Colors", colors: "orange yellow"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
+ startsOutChecked: false,
+ expectedChange: { "Colors": { colors: "orange yellow green" } }
+ },
+ {
+ testName: "list mode remove",
+ tiddlers: [{title: "Colors", colors: "green orange yellow"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
+ startsOutChecked: true,
+ expectedChange: { "Colors": { colors: "orange yellow" } }
+ },
+ {
+ testName: "list mode remove inverted",
+ tiddlers: [{title: "Colors", colors: "red orange yellow"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' />",
+ startsOutChecked: false,
+ expectedChange: { "Colors": { colors: "orange yellow" } }
+ },
+ {
+ testName: "list mode remove in middle position",
+ tiddlers: [{title: "Colors", colors: "orange green yellow"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
+ startsOutChecked: true,
+ expectedChange: { "Colors": { colors: "orange yellow" } }
+ },
+ {
+ testName: "list mode remove in final position",
+ tiddlers: [{title: "Colors", colors: "orange yellow green"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
+ startsOutChecked: true,
+ expectedChange: { "Colors": { colors: "orange yellow" } }
+ },
+ {
+ testName: "list mode toggle",
+ tiddlers: [{title: "Colors", colors: "red orange yellow"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
+ startsOutChecked: false,
+ expectedChange: { "Colors": { colors: "green orange yellow" } }
+ },
+ {
+ testName: "list mode toggle in middle position",
+ tiddlers: [{title: "Colors", colors: "orange red yellow"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
+ startsOutChecked: false,
+ expectedChange: { "Colors": { colors: "orange green yellow" } }
+ },
+ {
+ testName: "list mode remove in final position",
+ tiddlers: [{title: "Colors", colors: "orange yellow red"}],
+ widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
+ startsOutChecked: false,
+ expectedChange: { "Colors": { colors: "orange yellow green" } }
+ },
+ {
+ testName: "filter mode 1",
+ tiddlers: [{title: "Colors", colors: "red orange yellow"}],
+ widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
+ "\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
+ "<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<> uncheckactions=<> />",
+ startsOutChecked: false,
+ expectedChange: { "Colors": { colors: "orange yellow green" } }
+ },
+ {
+ testName: "filter mode 2",
+ tiddlers: [{title: "Colors", colors: "green orange yellow"}],
+ widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
+ "\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
+ "<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<> uncheckactions=<> />",
+ startsOutChecked: true,
+ expectedChange: { "Colors": { colors: "orange yellow red" } }
+ },
+ ];
+
+ /*
+ * Checkbox widget tests using the test data above
+ */
+ for (const data of checkboxTestData) {
+ fit('checkbox widget test: ' + data.testName, function() {
+ // Setup
+
+ // Create the wiki
+ var wiki = new $tw.Wiki();
+ // Add test tiddlers
+ wiki.addTiddlers(checkboxTestTiddlers);
+ if(data.tiddlers) wiki.addTiddlers(data.tiddlers);
+ // Construct the widget node
+ var widgetNode = createWidgetNode(parseText(data.widgetText,wiki),wiki);
+ // Render the widget node to the DOM
+ var wrapper = renderWidgetNode(widgetNode);
+
+ // Check initial state
+
+ const widget = findNodeOfType('checkbox', widgetNode);
+ // Verify that the widget is or is not checked as expected
+ expect(Object.getPrototypeOf(widget).getValue.call(widget)).toBe(data.startsOutChecked);
+
+ // Fake an event that toggles the checkbox
+ // fakedom elmenets don't have a "checked" property. so we fake it because
+ // Checkbox.prototype.handleChangeEvent looks at the "checked" DOM property
+ widget.inputDomNode.checked = !!widget.inputDomNode.attributes.checked;
+ // Now simulate checking the box
+ widget.inputDomNode.checked = !widget.inputDomNode.checked;
+ Object.getPrototypeOf(widget).handleChangeEvent.call(widget, null);
+
+ // Check state again: checkbox should be inverse of what it was
+ expect(Object.getPrototypeOf(widget).getValue.call(widget)).toBe(!data.startsOutChecked);
+ // Check that tiddler(s) has/have gone through expected change(s)
+ for (const key of Object.keys(data.expectedChange)) {
+ const tiddler = wiki.getTiddler(key);
+ const change = data.expectedChange[key];
+ for (const fieldName of Object.keys(change)) {
+ const expectedValue = change[fieldName];
+ const fieldValue = tiddler.fields[fieldName];
+ expect(fieldValue).toBe(expectedValue);
+ }
+ }
+ })
+ }
+
});
})();