Files
jasmine/spec/core/TreeProcessorSpec.js
Steve Gravrock 434575f49d Use one declaration per statement
The old style of merging all of a function's variable declarations into
a single statement made some sense back in the days of var, but there's
no reason to keep doing it now that we use const and let.
2026-03-11 06:30:46 -07:00

299 lines
8.7 KiB
JavaScript

describe('TreeProcessor', function() {
let nodeNumber = 0;
let leafNumber = 0;
function Node(attrs) {
attrs = attrs || {};
this.id = 'node' + nodeNumber++;
this.children = attrs.children || [];
this.markedPending = attrs.markedPending || false;
this.sharedUserContext = function() {
return attrs.userContext || {};
};
this.getResult = jasmine.createSpy(this.id + '#execute');
this.beforeAllFns = attrs.beforeAllFns || [];
this.afterAllFns = attrs.afterAllFns || [];
this.cleanupBeforeAfter = function() {};
}
function Leaf(attrs) {
attrs = attrs || {};
this.id = 'leaf' + leafNumber++;
this.markedPending = attrs.markedPending || false;
this.execute = jasmine.createSpy(this.id + '#execute');
}
it('processes a single leaf', function() {
const leaf = new Leaf();
const processor = new privateUnderTest.TreeProcessor({
tree: leaf,
runnableIds: [leaf.id]
});
const result = processor.processTree();
expect(result.isExcluded(leaf)).toEqual(false);
});
it('processes a single pending leaf', function() {
const leaf = new Leaf({ markedPending: true });
const processor = new privateUnderTest.TreeProcessor({
tree: leaf,
runnableIds: [leaf.id]
});
const result = processor.processTree();
expect(result.isExcluded(leaf)).toEqual(false);
});
it('processes a single non-specified leaf', function() {
const leaf = new Leaf();
const processor = new privateUnderTest.TreeProcessor({
tree: leaf,
runnableIds: []
});
const result = processor.processTree();
expect(result.isExcluded(leaf)).toEqual(true);
});
it('processes a single excluded leaf', function() {
const leaf = new Leaf();
const processor = new privateUnderTest.TreeProcessor({
tree: leaf,
runnableIds: [leaf.id],
excludeNode: function() {
return true;
}
});
const result = processor.processTree();
expect(result.isExcluded(leaf)).toEqual(true);
});
it('processes a tree with a single leaf with the root specified', function() {
const leaf = new Leaf();
const parent = new Node({ children: [leaf] });
const processor = new privateUnderTest.TreeProcessor({
tree: parent,
runnableIds: [parent.id]
});
const result = processor.processTree();
expect(result.isExcluded(parent)).toEqual(false);
expect(result.childrenOfTopSuite()).toEqual([{ spec: leaf }]);
expect(result.isExcluded(leaf)).toEqual(false);
});
it('processes a tree with a single pending leaf, with the root specified', function() {
const leaf = new Leaf({ markedPending: true });
const parent = new Node({ children: [leaf] });
const processor = new privateUnderTest.TreeProcessor({
tree: parent,
runnableIds: [parent.id]
});
const result = processor.processTree();
expect(result.isExcluded(parent)).toEqual(true);
expect(result.childrenOfTopSuite()).toEqual([{ spec: leaf }]);
expect(result.isExcluded(leaf)).toEqual(false);
});
it('runs orders leaves before non-specified leaves within a parent node', function() {
const specified = new Leaf();
const nonSpecified = new Leaf();
const root = new Node({ children: [nonSpecified, specified] });
const processor = new privateUnderTest.TreeProcessor({
tree: root,
runnableIds: [specified.id]
});
const result = processor.processTree();
expect(result.childrenOfTopSuite()).toEqual([
{ spec: specified },
{ spec: nonSpecified }
]);
});
it('processes an excluded node with children', function() {
const leaf1 = new Leaf();
const node = new Node({ children: [leaf1] });
const root = new Node({ children: [node] });
const processor = new privateUnderTest.TreeProcessor({
tree: root,
runnableIds: []
});
const result = processor.processTree();
expect(result.childrenOfTopSuite()).toEqual([{ suite: node }]);
expect(result.isExcluded(node)).toEqual(true);
expect(result.childrenOfSuite(node)).toEqual([{ spec: leaf1 }]);
expect(result.isExcluded(node)).toEqual(true);
});
it('processes a complicated tree with the root specified', function() {
const pendingLeaf = new Leaf({ markedPending: true });
const executableLeaf = new Leaf({ markedPending: false });
const parent = new Node({ children: [pendingLeaf, executableLeaf] });
const childless = new Node();
const childOfPending = new Leaf({ markedPending: true });
const pendingNode = new Node({
markedPending: true,
children: [childOfPending]
});
const parentOfPendings = new Node({
markedPending: false,
children: [childless, pendingNode]
});
const root = new Node({ children: [parent, parentOfPendings] });
const processor = new privateUnderTest.TreeProcessor({
tree: root,
runnableIds: [root.id]
});
const result = processor.processTree();
expect(result.isExcluded(parent)).toEqual(false);
expect(result.childrenOfTopSuite()).toEqual([
{ suite: parent },
{ suite: parentOfPendings }
]);
expect(result.isExcluded(parentOfPendings)).toEqual(true);
expect(result.childrenOfSuite(parentOfPendings)).toEqual([
{ suite: childless },
{ suite: pendingNode }
]);
expect(result.isExcluded(childless)).toEqual(true);
expect(result.childrenOfSuite(childless)).toEqual([]);
expect(result.isExcluded(pendingLeaf)).toEqual(false);
expect(result.isExcluded(executableLeaf)).toEqual(false);
expect(result.isExcluded(parent)).toEqual(false);
expect(result.childrenOfSuite(parent)).toEqual([
{ spec: pendingLeaf },
{ spec: executableLeaf }
]);
expect(result.isExcluded(pendingNode)).toEqual(true);
expect(result.childrenOfSuite(pendingNode)).toEqual([
{ spec: childOfPending }
]);
expect(result.isExcluded(childOfPending)).toEqual(false);
});
it('orders children according to orderChildren when specified', function() {
const leaf1 = new Leaf();
const leaf2 = new Leaf();
const leaf3 = new Leaf();
const leaf4 = new Leaf();
const leaf5 = new Leaf();
const leaf6 = new Leaf();
const leaf7 = new Leaf();
const leaf8 = new Leaf();
const leaf9 = new Leaf();
const leaf10 = new Leaf();
const leaf11 = new Leaf();
const root = new Node({
children: [
leaf1,
leaf2,
leaf3,
leaf4,
leaf5,
leaf6,
leaf7,
leaf8,
leaf9,
leaf10,
leaf11
]
});
const runQueue = jasmine.createSpy('runQueue');
const processor = new privateUnderTest.TreeProcessor({
tree: root,
runnableIds: [root.id],
runQueue,
orderChildren: function(node) {
const children = node.children.slice();
return children.reverse();
}
});
const result = processor.processTree();
expect(result.childrenOfTopSuite()).toEqual([
{ spec: leaf11 },
{ spec: leaf10 },
{ spec: leaf9 },
{ spec: leaf8 },
{ spec: leaf7 },
{ spec: leaf6 },
{ spec: leaf5 },
{ spec: leaf4 },
{ spec: leaf3 },
{ spec: leaf2 },
{ spec: leaf1 }
]);
});
describe("The returned ExecutionTree's numExcludedSpecs method", function() {
it('counts filtered-out specs', function() {
const included = new Leaf();
const excluded1 = new Leaf();
const excluded2 = new Leaf();
const excluded3 = new Leaf();
const topSuite = new Node({
children: [
excluded1,
new Node({
children: [included, excluded2, new Node({ children: [excluded3] })]
})
]
});
const processor = new privateUnderTest.TreeProcessor({
tree: topSuite,
runnableIds: [topSuite.id],
excludeNode(node) {
return node.id !== included.id;
}
});
const executionTree = processor.processTree();
expect(executionTree.numExcludedSpecs()).toEqual(3);
});
it("counts specs that aren't in or descendants of runnableIds", function() {
const includedSuite = new Node({
children: [new Node({ children: [new Leaf()] }), new Leaf()]
});
const directlyIncludedSpec = new Leaf();
const topSuite = new Node({
children: [
includedSuite,
new Node({
children: [new Leaf(), directlyIncludedSpec]
})
]
});
const processor = new privateUnderTest.TreeProcessor({
tree: topSuite,
runnableIds: [includedSuite.id, directlyIncludedSpec.id]
});
const executionTree = processor.processTree();
expect(executionTree.numExcludedSpecs()).toEqual(1);
});
});
});