diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 638457f9..c0daf654 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -107,7 +107,7 @@ var getJasmineRequireObj = (function(jasmineGlobal) { j$.Suite = jRequire.Suite(j$); j$.SuiteBuilder = jRequire.SuiteBuilder(j$); j$.Timer = jRequire.Timer(); - j$.TreeProcessor = jRequire.TreeProcessor(); + j$.TreeProcessor = jRequire.TreeProcessor(j$); j$.version = jRequire.version(); j$.Order = jRequire.Order(); j$.DiffBuilder = jRequire.DiffBuilder(j$); @@ -11299,7 +11299,7 @@ getJasmineRequireObj().Timer = function() { return Timer; }; -getJasmineRequireObj().TreeProcessor = function() { +getJasmineRequireObj().TreeProcessor = function(j$) { const defaultMin = Infinity; const defaultMax = 1 - Infinity; @@ -11429,14 +11429,17 @@ getJasmineRequireObj().TreeProcessor = function() { segmentChildren(node, orderedChildren, this.#stats, executableIndex); - if ( - !node.canBeReentered() && - this.#stats[node.id].segments.length > 1 - ) { - this.#stats = { valid: false }; - throw new Error( - 'Invalid order: would cause a beforeAll or afterAll to be run multiple times' - ); + if (this.#stats[node.id].segments.length > 1) { + if (node.canBeReentered()) { + j$.getEnv().deprecated( + 'The specified spec/suite order splits up a suite, running unrelated specs in the middle of it. This will become an error in a future release.' + ); + } else { + this.#stats = { valid: false }; + throw new Error( + 'Invalid order: would cause a beforeAll or afterAll to be run multiple times' + ); + } } } } diff --git a/spec/core/TreeProcessorSpec.js b/spec/core/TreeProcessorSpec.js index 1ae21565..b0efa681 100644 --- a/spec/core/TreeProcessorSpec.js +++ b/spec/core/TreeProcessorSpec.js @@ -241,18 +241,24 @@ describe('TreeProcessor', function() { }); it('marks the run order valid if a node being re-entered allows re-entry', function() { - const leaf1 = new Leaf(), - leaf2 = new Leaf(), - leaf3 = new Leaf(), - reentered = new Node({ children: [leaf1, leaf2] }), - root = new Node({ children: [reentered, leaf3] }), - processor = new jasmineUnderTest.TreeProcessor({ - tree: root, - runnableIds: [leaf1.id, leaf3.id, leaf2.id] - }), - result = processor.processTree(); + const leaf1 = new Leaf(); + const leaf2 = new Leaf(); + const leaf3 = new Leaf(); + const reentered = new Node({ children: [leaf1, leaf2] }); + const root = new Node({ children: [reentered, leaf3] }); + const processor = new jasmineUnderTest.TreeProcessor({ + tree: root, + runnableIds: [leaf1.id, leaf3.id, leaf2.id] + }); + const env = jasmineUnderTest.getEnv(); + spyOn(env, 'deprecated'); + + const result = processor.processTree(); expect(result.valid).toBe(true); + expect(env.deprecated).toHaveBeenCalledWith( + 'The specified spec/suite order splits up a suite, running unrelated specs in the middle of it. This will become an error in a future release.' + ); }); it("marks the run order valid if a node which can't be re-entered is only entered once", function() { diff --git a/src/core/TreeProcessor.js b/src/core/TreeProcessor.js index a2d0e8ff..f6d619a2 100644 --- a/src/core/TreeProcessor.js +++ b/src/core/TreeProcessor.js @@ -1,4 +1,4 @@ -getJasmineRequireObj().TreeProcessor = function() { +getJasmineRequireObj().TreeProcessor = function(j$) { const defaultMin = Infinity; const defaultMax = 1 - Infinity; @@ -128,14 +128,17 @@ getJasmineRequireObj().TreeProcessor = function() { segmentChildren(node, orderedChildren, this.#stats, executableIndex); - if ( - !node.canBeReentered() && - this.#stats[node.id].segments.length > 1 - ) { - this.#stats = { valid: false }; - throw new Error( - 'Invalid order: would cause a beforeAll or afterAll to be run multiple times' - ); + if (this.#stats[node.id].segments.length > 1) { + if (node.canBeReentered()) { + j$.getEnv().deprecated( + 'The specified spec/suite order splits up a suite, running unrelated specs in the middle of it. This will become an error in a future release.' + ); + } else { + this.#stats = { valid: false }; + throw new Error( + 'Invalid order: would cause a beforeAll or afterAll to be run multiple times' + ); + } } } } diff --git a/src/core/requireCore.js b/src/core/requireCore.js index c4ade812..7959c9ff 100644 --- a/src/core/requireCore.js +++ b/src/core/requireCore.js @@ -83,7 +83,7 @@ var getJasmineRequireObj = (function(jasmineGlobal) { j$.Suite = jRequire.Suite(j$); j$.SuiteBuilder = jRequire.SuiteBuilder(j$); j$.Timer = jRequire.Timer(); - j$.TreeProcessor = jRequire.TreeProcessor(); + j$.TreeProcessor = jRequire.TreeProcessor(j$); j$.version = jRequire.version(); j$.Order = jRequire.Order(); j$.DiffBuilder = jRequire.DiffBuilder(j$);