65 lines
1.7 KiB
JavaScript

var expect = require("chai").expect;
var domData = require("../../../../src/runtime/components/dom-data");
var vElementByDOMNode = domData.___vElementByDOMNode;
module.exports = function (helpers) {
var component = helpers.mount(require.resolve("./index"), {});
var rootEl = component.getEl();
var itemIds = ["child-a", "child-b", "child-c"];
itemIds.forEach((id) => component.addItem(id));
component.update();
var curLookup = getKeyLookup();
component.removeItem(itemIds[1]);
component.update();
ensurePreservedKeys(curLookup, (curLookup = getKeyLookup()));
component.removeItem(itemIds[0]);
component.update();
ensurePreservedKeys(curLookup, (curLookup = getKeyLookup()));
function getKeyLookup(els) {
els = els || rootEl.children;
var lookup = {};
for (var i = 0; i < els.length; i++) {
var el = els[i];
var component = helpers.getComponentForEl(el);
var key = vElementByDOMNode.get(el).___key;
lookup[key] = {
el: el,
component: component,
children: getKeyLookup(el.children),
};
}
return lookup;
}
function ensurePreservedKeys(lookupA, lookupB, path) {
path = path || "";
for (var key in lookupB) {
if (lookupA[key]) {
var fullPath = path + " " + key;
expect(
lookupA[key].el === lookupB[key].el,
'unpreserved element "' + fullPath + '"',
).to.equal(true);
expect(
lookupA[key].component === lookupB[key].component,
'unpreserved component "' + fullPath + '"',
).to.equal(true);
ensurePreservedKeys(
lookupA[key].children,
lookupB[key].children,
fullPath,
);
}
}
}
};