159 lines
3 KiB
JavaScript
159 lines
3 KiB
JavaScript
/* global m, test, mock */
|
|
(function () {
|
|
"use strict"
|
|
|
|
m.deps(mock.window)
|
|
|
|
test(function () { // eslint-disable-line max-statements
|
|
var root = mock.document.createElement("div")
|
|
var retain = false
|
|
var flag = true
|
|
var loaded1 = null
|
|
var loaded2 = null
|
|
var loaded1a = null
|
|
var loaded2a = null
|
|
|
|
var Comp1 = {
|
|
controller: function () {
|
|
loaded1 = true
|
|
this.onunload = function () {
|
|
loaded1 = false
|
|
}
|
|
},
|
|
view: function () {
|
|
if (retain) {
|
|
return {subtree: "retain"}
|
|
} else {
|
|
return m("a", {
|
|
config: function (el, init, ctx) {
|
|
if (!init) {
|
|
loaded1a = true
|
|
ctx.onunload = function () {
|
|
loaded1a = false
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
var Comp2 = {
|
|
controller: function () {
|
|
loaded2 = true
|
|
this.onunload = function () {
|
|
loaded2 = false
|
|
}
|
|
},
|
|
view: function () {
|
|
if (retain) {
|
|
return {subtree: "retain"}
|
|
} else {
|
|
return m("b", {
|
|
config: function (el, init, ctx) {
|
|
if (!init) {
|
|
loaded2a = true
|
|
ctx.onunload = function () {
|
|
loaded2a = false
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
var Root = {
|
|
view: function () {
|
|
return flag ? Comp1 : Comp2
|
|
}
|
|
}
|
|
|
|
m.mount(root, Root)
|
|
|
|
mock.requestAnimationFrame.$resolve()
|
|
|
|
// loaded 1
|
|
var result1 = loaded1 === true &&
|
|
loaded2 === null &&
|
|
loaded1a === true &&
|
|
loaded2a === null
|
|
|
|
retain = true
|
|
m.redraw(true)
|
|
mock.requestAnimationFrame.$resolve()
|
|
|
|
// retained
|
|
var result2 = loaded1 === true &&
|
|
loaded2 === null &&
|
|
loaded1a === true &&
|
|
loaded2a === null
|
|
|
|
flag = false
|
|
m.redraw(true)
|
|
mock.requestAnimationFrame.$resolve()
|
|
|
|
// loaded 2 while retained: both controllers are alive at the same time
|
|
// because dom element is retained
|
|
var result3 = loaded1 === true &&
|
|
loaded2 === true &&
|
|
loaded1a === true &&
|
|
loaded2a === null
|
|
|
|
retain = false
|
|
m.redraw(true)
|
|
mock.requestAnimationFrame.$resolve()
|
|
|
|
// unretained, i.e. 2 is now dynamic
|
|
var result4 = loaded1 === false &&
|
|
loaded2 === true &&
|
|
loaded1a === false &&
|
|
loaded2a === true
|
|
|
|
flag = true
|
|
m.redraw(true)
|
|
mock.requestAnimationFrame.$resolve()
|
|
|
|
// loaded 1 while dynamic
|
|
var result5 = loaded1 === true &&
|
|
loaded2 === false &&
|
|
loaded1a === true &&
|
|
loaded2a === false
|
|
|
|
return result1 && result2 && result3 && result4 && result5
|
|
})
|
|
|
|
/*
|
|
test(function() {
|
|
var root = mock.document.createElement("div")
|
|
var redraws = 0, data
|
|
var Root = {
|
|
view: function() {
|
|
return Comp
|
|
}
|
|
}
|
|
|
|
var Comp = {
|
|
controller: function() {
|
|
this.foo = m.request({method: "GET", url: "/foo"})
|
|
},
|
|
view: function(ctrl) {
|
|
redraws++
|
|
data = ctrl.foo()
|
|
return m("div")
|
|
}
|
|
}
|
|
|
|
m.mount(root, Root)
|
|
|
|
mock.requestAnimationFrame.$resolve()
|
|
mock.XMLHttpRequest.$instances.pop().onreadystatechange()
|
|
|
|
return redraws == 1 && data.url == "/foo"
|
|
})
|
|
*/
|
|
|
|
test.print(function (value) {
|
|
console.log(value) // eslint-disable-line no-console
|
|
})
|
|
})()
|