165 lines
3.8 KiB
JavaScript
165 lines
3.8 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
// Test that we correctly set `moreChildrenAvailable` when doing a partial
|
|
// traversal of a dominator tree to create the initial incrementally loaded
|
|
// `DominatorTreeNode` tree.
|
|
|
|
// `tree` maps parent to children:
|
|
//
|
|
// 100
|
|
// |- 200
|
|
// | |- 500
|
|
// | |- 600
|
|
// | `- 700
|
|
// |- 300
|
|
// | |- 800
|
|
// | |- 900
|
|
// `- 400
|
|
// |- 1000
|
|
// |- 1100
|
|
// `- 1200
|
|
const tree = new Map([
|
|
[100, [200, 300, 400]],
|
|
[200, [500, 600, 700]],
|
|
[300, [800, 900]],
|
|
[400, [1000, 1100, 1200]]
|
|
]);
|
|
|
|
const mockDominatorTree = {
|
|
root: 100,
|
|
getRetainedSize: _ => 10,
|
|
getImmediatelyDominated: id => (tree.get(id) || []).slice()
|
|
};
|
|
|
|
const mockSnapshot = {
|
|
describeNode: _ => ({
|
|
objects: { count: 0, bytes: 0 },
|
|
strings: { count: 0, bytes: 0 },
|
|
scripts: { count: 0, bytes: 0 },
|
|
other: { SomeType: { count: 1, bytes: 10 } }
|
|
})
|
|
};
|
|
|
|
const breakdown = {
|
|
by: "coarseType",
|
|
objects: { by: "count", count: true, bytes: true },
|
|
strings: { by: "count", count: true, bytes: true },
|
|
scripts: { by: "count", count: true, bytes: true },
|
|
other: {
|
|
by: "internalType",
|
|
then: { by: "count", count: true, bytes: true }
|
|
},
|
|
};
|
|
|
|
const expected = {
|
|
nodeId: 100,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
shortestPaths: undefined,
|
|
children: [
|
|
{
|
|
nodeId: 200,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
parentId: 100,
|
|
shortestPaths: undefined,
|
|
children: [
|
|
{
|
|
nodeId: 500,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
parentId: 200,
|
|
moreChildrenAvailable: false,
|
|
shortestPaths: undefined,
|
|
children: undefined
|
|
},
|
|
{
|
|
nodeId: 600,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
parentId: 200,
|
|
moreChildrenAvailable: false,
|
|
shortestPaths: undefined,
|
|
children: undefined
|
|
}
|
|
],
|
|
moreChildrenAvailable: true
|
|
},
|
|
{
|
|
nodeId: 300,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
parentId: 100,
|
|
shortestPaths: undefined,
|
|
children: [
|
|
{
|
|
nodeId: 800,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
parentId: 300,
|
|
moreChildrenAvailable: false,
|
|
shortestPaths: undefined,
|
|
children: undefined
|
|
},
|
|
{
|
|
nodeId: 900,
|
|
label: [
|
|
"other",
|
|
"SomeType"
|
|
],
|
|
shallowSize: 10,
|
|
retainedSize: 10,
|
|
parentId: 300,
|
|
moreChildrenAvailable: false,
|
|
shortestPaths: undefined,
|
|
children: undefined
|
|
}
|
|
],
|
|
moreChildrenAvailable: false
|
|
}
|
|
],
|
|
moreChildrenAvailable: true,
|
|
parentId: undefined,
|
|
};
|
|
|
|
function run_test() {
|
|
// Traverse the whole depth of the test tree, but one short of the number of
|
|
// siblings. This will exercise the moreChildrenAvailable handling for
|
|
// siblings.
|
|
const actual = DominatorTreeNode.partialTraversal(mockDominatorTree,
|
|
mockSnapshot,
|
|
breakdown,
|
|
/* maxDepth = */ 4,
|
|
/* siblings = */ 2);
|
|
|
|
dumpn("Expected = " + JSON.stringify(expected, null, 2));
|
|
dumpn("Actual = " + JSON.stringify(actual, null, 2));
|
|
|
|
assertStructurallyEquivalent(expected, actual);
|
|
}
|