/* eslint-disable camelcase */ /* global m, Syn */ // saucelabs reporting; see // https://github.com/axemclion/grunt-saucelabs#test-result-details-with-qunit var log = [] QUnit.done(function (test_results) { "use strict" var tests = [] for (var i = 0, len = log.length; i < len; i++) { var details = log[i] tests.push({ name: details.name, result: details.result, expected: details.expected, actual: details.actual, source: details.source }) } test_results.tests = tests window.global_test_results = test_results }) QUnit.testStart(function (testDetails) { "use strict" QUnit.log(function (details) { if (!details.result) { details.name = testDetails.name log.push(details) } }) }) // qunit doesn't support Function.prototype.bind... if (!Function.prototype.bind) { /* eslint-disable */ Function.prototype.bind = function (oThis) { "use strict" if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 // internal IsCallable function throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable") } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () {}, fBound = function () { return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))) } fNOP.prototype = this.prototype fBound.prototype = new fNOP() return fBound } /* eslint-enable */ } //tests var dummyEl = document.getElementById("dummy") test("Mithril accessible as window.m", function() { "use strict" expect(1) ok(window.m) }) test("m.trust w/ html entities", function() { "use strict" expect(1) var view1 = m("div", "a", m.trust("&"), "b") m.render(dummyEl, view1) equal(dummyEl.innerHTML, "
a&b
", "view1 rendered correctly") }) test("m.trust w/ html entities 2", function() { "use strict" expect(1) var view1 = m("div", "a", m.trust("&"), "b", m.trust("&"), "c") m.render(dummyEl, view1) equal(dummyEl.innerHTML, "
a&b&c
", "view1 rendered correctly") }) test("array item removal", function() { "use strict" expect(2) var view1 = m("div", {}, [ m("div", {}, "0"), m("div", {}, "1"), m("div", {}, "2") ]) var view2 = m("div", {}, [ m("div", {}, "0") ]) m.render(dummyEl, view1) equal(dummyEl.innerHTML, "
0
1
2
", "view1 rendered correctly") m.render(dummyEl, view2) equal(dummyEl.innerHTML, "
0
", "view2 should be rendered correctly") }) test("issue99 regression", function() { "use strict" // see https://github.com/lhorie/mithril.js/issues/99 expect(2) var view1 = m("div", {}, [ m("div", {}, "0"), m("div", {}, "1"), m("div", {}, "2") ]) var view2 = m("div", {}, [ m("span", {}, "0") ]) m.render(dummyEl, view1) equal(dummyEl.innerHTML, "
0
1
2
", "view1 rendered correctly") m.render(dummyEl, view2) equal(dummyEl.innerHTML, "
0
", "view2 should be rendered correctly") }) test("config handler context", function() { "use strict" expect(3) var view = m("div", {config: function(evt, isInitialized, context) { equal(context instanceof Object, true) context.data = 1 }}) m.render(dummyEl, view) view = m("div", {config: function(evt, isInitialized, context) { equal(context instanceof Object, true) equal(context.data, 1) }}) m.render(dummyEl, view) }) test("node identity remove firstChild", function() { "use strict" expect(2) var view1 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2") ]) m.render(dummyEl, view1) var node2 = dummyEl.firstChild.lastChild equal(node2.innerHTML, "E2") var view2 = m("div", {}, [ m("div", {key: 2}, "E2") ]) m.render(dummyEl, view2) equal(dummyEl.firstChild.firstChild, node2) }) test("node identity change order", function() { "use strict" expect(2) var view1 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2"), m("div", {key: 3}, "E3") ]) m.render(dummyEl, view1) var e2 = dummyEl.firstChild.firstChild.nextSibling equal(e2.innerHTML, "E2") var view2 = m("div", {}, [ m("div", {key: 2}, "E2"), m("div", {key: 1}, "E1"), m("div", {key: 3}, "E3") ]) m.render(dummyEl, view2) equal(dummyEl.firstChild.firstChild, e2) }) test("node identity remove in the middle", function() { "use strict" expect(2) var view1 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2"), m("div", {key: 3}, "E3") ]) m.render(dummyEl, view1) var e3 = dummyEl.firstChild.lastChild equal(e3.innerHTML, "E3") var view2 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 3}, "E3") ]) m.render(dummyEl, view2) equal(dummyEl.firstChild.firstChild.nextSibling, e3) }) test("node identity remove last", function() { "use strict" expect(4) var view1 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2"), m("div", {key: 3}, "E3") ]) m.render(dummyEl, view1) var e1 = dummyEl.firstChild.firstChild equal(e1.innerHTML, "E1") var e2 = dummyEl.firstChild.firstChild.nextSibling equal(e2.innerHTML, "E2") var view2 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2") ]) m.render(dummyEl, view2) equal(dummyEl.firstChild.firstChild, e1) equal(dummyEl.firstChild.firstChild.nextSibling, e2) }) test("node identity shuffle and remove", function() { "use strict" expect(8) var view1 = m("div", {}, [ m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2"), m("div", {key: 3}, "E3"), m("div", {key: 4}, "E4"), m("div", {key: 5}, "E5") ]) m.render(dummyEl, view1) var e1 = dummyEl.firstChild.firstChild equal(e1.innerHTML, "E1") var e2 = e1.nextSibling equal(e2.innerHTML, "E2") var e3 = e2.nextSibling equal(e3.innerHTML, "E3") var e4 = e3.nextSibling equal(e4.innerHTML, "E4") var e5 = e4.nextSibling equal(e5.innerHTML, "E5") var view2 = m("div", {}, [ m("div", {key: 4}, "E4"), m("div", {key: 10}, "E10"), m("div", {key: 1}, "E1"), m("div", {key: 2}, "E2") ]) m.render(dummyEl, view2) equal(dummyEl.firstChild.firstChild, e4, "e4 is first element") equal(dummyEl.firstChild.firstChild.nextSibling.nextSibling, e1, "e1 is third element") equal(dummyEl.firstChild.firstChild.nextSibling.nextSibling.nextSibling, e2, "e2 is fourth element") }) asyncTest("issue214 regression", function() { "use strict" // see https://github.com/lhorie/mithril.js/issues/214 expect(2) function controller() { this.inputValue = m.prop("") } function view(ctrl) { return m("input#testinput", { value: ctrl.inputValue(), onkeyup: m.withAttr("value", ctrl.inputValue) }) } var ctrl = m.module(dummyEl, { controller: controller, view: view }) Syn.click({}, "testinput") .type("0").delay(10) .type("1").delay(10) .type("2").delay(10) .type("3").delay(10) .type("4").delay(10) .type("5").delay(10) .type("6").delay(10) .type("7").delay(10) .type("8").delay(10) .type("9").delay(10) .type("a").delay(10) .type("b").delay(10) .type("c").delay(10) .type("d").delay(10) .type("e").delay(10) .type("f").delay(10) .type("0").delay(10) .type("1").delay(10) .type("2").delay(10) .type("3").delay(10) .type("4").delay(10) .type("5").delay(10) .type("6").delay(10) .type("7").delay(10) .type("8").delay(10) .type("9").delay(10) .type("a").delay(10) .type("b").delay(10) .type("c").delay(10) .type("d").delay(10) .type("e").delay(10) .type("f").delay(10) .type("0").delay(10) .type("1").delay(10) .type("2").delay(10) .type("3").delay(10) .type("4").delay(10) .type("5").delay(10) .type("6").delay(10) .type("7").delay(10) .type("8").delay(10) .type("9").delay(10) .type("a").delay(10) .type("b").delay(10) .type("c").delay(10) .type("d").delay(10) .type("e").delay(10) .type("f").delay(10) .type("0").delay(10) .type("1").delay(10) .type("2").delay(10) .type("3").delay(10) .type("4").delay(10) .type("5").delay(10) .type("6").delay(10) .type("7").delay(10) .type("8").delay(10) .type("9").delay(10) .type("a").delay(10) .type("b").delay(10) .type("c").delay(10) .type("d").delay(10) .type("e").delay(10) .type("f", function() { equal(ctrl.inputValue(), "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") equal(document.getElementById("testinput").value, "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") start() }) }) asyncTest("issue288 regression", function() { "use strict" // see https://github.com/lhorie/mithril.js/issues/288 expect(2) function controller() { this.inputValue = m.prop("") this.submit = function() { if (this.inputValue()) { this.inputValue("") } }.bind(this) } function view(ctrl) { return m("form", { onsubmit: ctrl.submit }, [ m("input#testinput", { onkeyup: m.withAttr("value", ctrl.inputValue), value: ctrl.inputValue() }), m("button[type=submit]") ]) } var ctrl = m.module(dummyEl, { controller: controller, view: view }) Syn.click({}, "testinput") .type("a").delay(10) .type("b").delay(10) .type("c").delay(10) .type("d").delay(10) .type("[enter]", function() { equal(ctrl.inputValue(), "") equal(document.getElementById("testinput").value, "") start() }) }) test("issue278 regression", function() { "use strict" // see https://github.com/lhorie/mithril.js/issues/278 expect(1) var test = { controller: function() { this.values = [1, 2, 3, 4, 5] this.value = m.prop([2, 3]) }, view: function(ctrl) { return m("select#testselect", { size: ctrl.values.length, multiple: "multiple" }, [ ctrl.values.map(function(v){ var opts = {value: v} if (ctrl.value().indexOf(v) !== -1) { opts.selected = "selected" } return m("option", opts, v) }) ]) } } m.render(dummyEl, test.view(new test.controller())) var select = document.getElementById("testselect") for (var i = 0, selected = 0; i < select.options.length; i++) { if (select.options[i].selected) selected++ } equal(selected, 2) }) test("mixing trusted content", function() { "use strict" m.render(dummyEl, [m.trust("

1

2

"), m("i", "foo")]) equal(dummyEl.childNodes[2].nodeName, "I") }) test("mixing trusted content w/ text nodes", function() { "use strict" m.render(dummyEl, [m.trust("

1

123

2

"), m("i", "foo")]) equal(dummyEl.childNodes[3].nodeName, "I") }) test("mixing trusted content w/ td", function() { "use strict" m.render(dummyEl, [m.trust("12"), m("i", "foo")]) equal(dummyEl.childNodes[1].nodeName, "I") }) test("0 should not be treated as empty string", function() { "use strict" m.render(dummyEl, m("input", {value: ""})) m.render(dummyEl, m("input", {value: 0})) equal(dummyEl.childNodes[0].value, "0") }) test("empty value in ') })