diff --git a/spec/core/EnvSpec.js b/spec/core/EnvSpec.js index cc3d139c..a175aa84 100644 --- a/spec/core/EnvSpec.js +++ b/spec/core/EnvSpec.js @@ -100,465 +100,3 @@ describe("Env", function() { }); }); -// TODO: move these into a separate file -describe("Env integration", function() { - - it("Suites execute as expected (no nesting)", function(done) { - var env = new j$.Env(), - calls = []; - - var assertions = function() { - expect(calls).toEqual([ - "with a spec", - "and another spec" - ]); - - done(); - }; - - env.addReporter({ jasmineDone: assertions}); - - env.describe("A Suite", function() { - env.it("with a spec", function() { - calls.push("with a spec"); - }); - env.it("and another spec", function() { - calls.push("and another spec"); - }); - }); - - env.execute(); - }); - - it("Nested Suites execute as expected", function(done) { - var env = new j$.Env(), - calls = []; - - var assertions = function() { - expect(calls).toEqual([ - 'an outer spec', - 'an inner spec', - 'another inner spec' - ]); - - done(); - }; - - env.addReporter({ jasmineDone: assertions }); - - env.describe("Outer suite", function() { - env.it("an outer spec", function() { - calls.push('an outer spec') - }); - env.describe("Inner suite", function() { - env.it("an inner spec", function() { - calls.push('an inner spec'); - }); - env.it("another inner spec", function() { - calls.push('another inner spec'); - }); - }); - }); - - env.execute(); - }); - - it("Multiple top-level Suites execute as expected", function(done) { - var env = new j$.Env(), - calls = []; - - var assertions = function() { - expect(calls).toEqual([ - 'an outer spec', - 'an inner spec', - 'another inner spec', - 'a 2nd outer spec' - ]); - - done(); - }; - - env.addReporter({ jasmineDone: assertions }); - - - env.describe("Outer suite", function() { - env.it("an outer spec", function() { - calls.push('an outer spec') - }); - env.describe("Inner suite", function() { - env.it("an inner spec", function() { - calls.push('an inner spec'); - }); - env.it("another inner spec", function() { - calls.push('another inner spec'); - }); - }); - }); - - env.describe("Another outer suite", function() { - env.it("a 2nd outer spec", function() { - calls.push('a 2nd outer spec') - }); - }); - - env.execute(); - }); - - it("calls associated befores/specs/afters with the same 'this'", function(done) { - var env = new j$.Env(); - - env.addReporter({jasmineDone: done}); - - env.describe("tests", function() { - var firstTimeThrough = true, firstSpecContext, secondSpecContext; - - env.beforeEach(function() { - if (firstTimeThrough) { - firstSpecContext = this; - } else { - secondSpecContext = this; - } - expect(this).toEqual({}); - }); - - env.it("sync spec", function() { - expect(this).toBe(firstSpecContext); - }); - - env.it("another sync spec", function() { - expect(this).toBe(secondSpecContext); - }); - - env.afterEach(function() { - if (firstTimeThrough) { - expect(this).toBe(firstSpecContext); - firstTimeThrough = false; - } else { - expect(this).toBe(secondSpecContext); - } - }); - }); - - env.execute(); - }); - - it("calls associated befores/its/afters with the same 'this' for an async spec", function(done) { - var env = new j$.Env(); - - env.addReporter({jasmineDone: done}); - - env.describe("with an async spec", function() { - var specContext; - - env.beforeEach(function() { - specContext = this; - expect(this).toEqual({}); - }); - - env.it("sync spec", function(underTestCallback) { - expect(this).toBe(specContext); - underTestCallback(); - }); - - env.afterEach(function() { - expect(this).toBe(specContext); - }); - }); - - env.execute(); - }); - - it("Allows specifying which specs and suites to run", function(done) { - var env = new j$.Env(), - calls = [], - suiteCallback = jasmine.createSpy('suite callback'), - firstSpec, - secondSuite; - - var assertions = function() { - expect(calls).toEqual([ - 'third spec', - 'first spec' - ]); - expect(suiteCallback).toHaveBeenCalled(); - done(); - }; - - env.addReporter({jasmineDone: assertions, suiteDone: suiteCallback}); - - env.describe("first suite", function() { - firstSpec = env.it("first spec", function() { - calls.push('first spec'); - }); - env.it("second spec", function() { - calls.push('second spec'); - }); - }); - - secondSuite = env.describe("second suite", function() { - env.it("third spec", function() { - calls.push('third spec'); - }); - }); - - env.execute([secondSuite.id, firstSpec.id]); - }); - - it("Mock clock can be installed and used in tests", function(done) { - var globalSetTimeout = jasmine.createSpy('globalSetTimeout'), - delayedFunctionForGlobalClock = jasmine.createSpy('delayedFunctionForGlobalClock'), - delayedFunctionForMockClock = jasmine.createSpy('delayedFunctionForMockClock'), - env = new j$.Env({global: { setTimeout: globalSetTimeout }}); - - var assertions = function() { - expect(delayedFunctionForMockClock).toHaveBeenCalled(); - expect(globalSetTimeout).toHaveBeenCalledWith(delayedFunctionForGlobalClock, 100); - - done(); - }; - - env.addReporter({ jasmineDone: assertions }); - - env.describe("tests", function() { - env.it("test with mock clock", function() { - env.clock.install(); - env.clock.setTimeout(delayedFunctionForMockClock, 100); - env.clock.tick(100); - env.clock.uninstall(); - }); - env.it("test without mock clock", function() { - env.clock.setTimeout(delayedFunctionForGlobalClock, 100); - }); - }); - - expect(globalSetTimeout).not.toHaveBeenCalled(); - expect(delayedFunctionForMockClock).not.toHaveBeenCalled(); - - env.execute(); - }); - - it("should run async specs in order, waiting for them to complete", function(done) { - var env = new j$.Env(), mutatedVar; - - env.describe("tests", function() { - env.beforeEach(function() { - mutatedVar = 2; - }); - - env.it("async spec", function(underTestCallback) { - setTimeout(function() { - expect(mutatedVar).toEqual(2); - underTestCallback(); - done(); - }, 0); - }); - - env.it("after async spec", function() { - mutatedVar = 3; - }); - }); - - env.execute(); - }); - - describe("with a mock clock", function() { - var originalTimeout; - - beforeEach(function() { - originalTimeout = j$.DEFAULT_TIMEOUT_INTERVAL; - jasmine.getEnv().clock.install(); - }); - - afterEach(function() { - jasmine.getEnv().clock.uninstall(); - j$.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; - }); - - it("should wait a specified interval before failing specs haven't called done yet", function(done) { - var env = new j$.Env(), - reporter = jasmine.createSpyObj('fakeReporter', [ "specDone" ]); - - reporter.specDone.and.callFake(function() { - expect(reporter.specDone).toHaveBeenCalledWith(jasmine.objectContaining({status: 'failed'})); - done(); - }); - - env.addReporter(reporter); - j$.DEFAULT_TIMEOUT_INTERVAL = 8414; - - env.it("async spec that doesn't call done", function(underTestCallback) { - env.expect(true).toBeTruthy(); - jasmine.getEnv().clock.tick(8414); - }); - - env.execute(); - }); - }); - - // TODO: something is wrong with this spec - it("should report as expected", function(done) { - var env = new j$.Env(), - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - reporter.jasmineDone.and.callFake(function() { - expect(reporter.jasmineStarted).toHaveBeenCalledWith({ - totalSpecsDefined: 3 - }); - var suiteResult = reporter.suiteStarted.calls.first().args[0]; - expect(suiteResult.description).toEqual("A Suite"); - - done(); - }); - - env.addReporter(reporter); - - env.describe("A Suite", function() { - env.it("with a top level spec", function() { - env.expect(true).toBe(true); - }); - env.describe("with a nested suite", function() { - env.xit("with a pending spec", function() { - env.expect(true).toBe(true); - }); - env.it("with a spec", function() { - env.expect(true).toBe(false); - }); - }); - }); - - env.execute(); - }); - - it("should be possible to get full name from a spec", function() { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - topLevelSpec, nestedSpec, doublyNestedSpec; - - env.describe("my tests", function() { - topLevelSpec = env.it("are sometimes top level", function() { - }); - env.describe("are sometimes", function() { - nestedSpec = env.it("singly nested", function() { - }); - env.describe("even", function() { - doublyNestedSpec = env.it("doubly nested", function() { - }); - }); - }); - }); - - expect(topLevelSpec.getFullName()).toBe("my tests are sometimes top level"); - expect(nestedSpec.getFullName()).toBe("my tests are sometimes singly nested"); - expect(doublyNestedSpec.getFullName()).toBe("my tests are sometimes even doubly nested"); - }); - - it("Custom equality testers should be per spec", function(done) { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - reporter.jasmineDone.and.callFake(function() { - var firstSpecResult = reporter.specDone.calls.first().args[0], - secondSpecResult = reporter.specDone.calls.mostRecent().args[0]; - - expect(firstSpecResult.status).toEqual("passed"); - expect(secondSpecResult.status).toEqual("failed"); - - done(); - }); - - env.addReporter(reporter); - - env.describe("testing custom equality testers", function() { - env.it("with a custom tester", function() { - env.addCustomEqualityTester(function(a, b) { return true; }); - env.expect("a").toEqual("b"); - }); - - env.it("without a custom tester", function() { - env.expect("a").toEqual("b"); - }); - }); - - env.execute(); - }); - - it("Custom matchers should be per spec", function() { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - matchers = { - toFoo: function() {} - }, - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - env.addReporter(reporter); - - env.describe("testing custom matchers", function() { - env.it("with a custom matcher", function() { - env.addMatchers(matchers); - expect(env.expect().toFoo).toBeDefined(); - }); - - env.it("without a custom matcher", function() { - expect(env.expect().toFoo).toBeUndefined(); - }); - }); - - env.execute(); - }); - - it("Custom equality testers for toContain should be per spec", function(done) { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - reporter.jasmineDone.and.callFake(function() { - var firstSpecResult = reporter.specDone.calls.first().args[0], - secondSpecResult = reporter.specDone.calls.mostRecent().args[0]; - - expect(firstSpecResult.status).toEqual("passed"); - expect(secondSpecResult.status).toEqual("failed"); - - done(); - }); - - env.addReporter(reporter); - - env.describe("testing custom equality testers", function() { - env.it("with a custom tester", function() { - env.addCustomEqualityTester(function(a, b) { return true; }); - env.expect(["a"]).toContain("b"); - }); - - env.it("without a custom tester", function() { - env.expect("a").toContain("b"); - }); - }); - - env.execute(); - }); -}); diff --git a/spec/core/CustomMatchersSpec.js b/spec/core/integration/CustomMatchersSpec.js similarity index 100% rename from spec/core/CustomMatchersSpec.js rename to spec/core/integration/CustomMatchersSpec.js diff --git a/spec/core/integration/EnvSpec.js b/spec/core/integration/EnvSpec.js new file mode 100644 index 00000000..f3ae6699 --- /dev/null +++ b/spec/core/integration/EnvSpec.js @@ -0,0 +1,462 @@ +describe("Env integration", function() { + + it("Suites execute as expected (no nesting)", function(done) { + var env = new j$.Env(), + calls = []; + + var assertions = function() { + expect(calls).toEqual([ + "with a spec", + "and another spec" + ]); + + done(); + }; + + env.addReporter({ jasmineDone: assertions}); + + env.describe("A Suite", function() { + env.it("with a spec", function() { + calls.push("with a spec"); + }); + env.it("and another spec", function() { + calls.push("and another spec"); + }); + }); + + env.execute(); + }); + + it("Nested Suites execute as expected", function(done) { + var env = new j$.Env(), + calls = []; + + var assertions = function() { + expect(calls).toEqual([ + 'an outer spec', + 'an inner spec', + 'another inner spec' + ]); + + done(); + }; + + env.addReporter({ jasmineDone: assertions }); + + env.describe("Outer suite", function() { + env.it("an outer spec", function() { + calls.push('an outer spec') + }); + env.describe("Inner suite", function() { + env.it("an inner spec", function() { + calls.push('an inner spec'); + }); + env.it("another inner spec", function() { + calls.push('another inner spec'); + }); + }); + }); + + env.execute(); + }); + + it("Multiple top-level Suites execute as expected", function(done) { + var env = new j$.Env(), + calls = []; + + var assertions = function() { + expect(calls).toEqual([ + 'an outer spec', + 'an inner spec', + 'another inner spec', + 'a 2nd outer spec' + ]); + + done(); + }; + + env.addReporter({ jasmineDone: assertions }); + + + env.describe("Outer suite", function() { + env.it("an outer spec", function() { + calls.push('an outer spec') + }); + env.describe("Inner suite", function() { + env.it("an inner spec", function() { + calls.push('an inner spec'); + }); + env.it("another inner spec", function() { + calls.push('another inner spec'); + }); + }); + }); + + env.describe("Another outer suite", function() { + env.it("a 2nd outer spec", function() { + calls.push('a 2nd outer spec') + }); + }); + + env.execute(); + }); + + it("calls associated befores/specs/afters with the same 'this'", function(done) { + var env = new j$.Env(); + + env.addReporter({jasmineDone: done}); + + env.describe("tests", function() { + var firstTimeThrough = true, firstSpecContext, secondSpecContext; + + env.beforeEach(function() { + if (firstTimeThrough) { + firstSpecContext = this; + } else { + secondSpecContext = this; + } + expect(this).toEqual({}); + }); + + env.it("sync spec", function() { + expect(this).toBe(firstSpecContext); + }); + + env.it("another sync spec", function() { + expect(this).toBe(secondSpecContext); + }); + + env.afterEach(function() { + if (firstTimeThrough) { + expect(this).toBe(firstSpecContext); + firstTimeThrough = false; + } else { + expect(this).toBe(secondSpecContext); + } + }); + }); + + env.execute(); + }); + + it("calls associated befores/its/afters with the same 'this' for an async spec", function(done) { + var env = new j$.Env(); + + env.addReporter({jasmineDone: done}); + + env.describe("with an async spec", function() { + var specContext; + + env.beforeEach(function() { + specContext = this; + expect(this).toEqual({}); + }); + + env.it("sync spec", function(underTestCallback) { + expect(this).toBe(specContext); + underTestCallback(); + }); + + env.afterEach(function() { + expect(this).toBe(specContext); + }); + }); + + env.execute(); + }); + + it("Allows specifying which specs and suites to run", function(done) { + var env = new j$.Env(), + calls = [], + suiteCallback = jasmine.createSpy('suite callback'), + firstSpec, + secondSuite; + + var assertions = function() { + expect(calls).toEqual([ + 'third spec', + 'first spec' + ]); + expect(suiteCallback).toHaveBeenCalled(); + done(); + }; + + env.addReporter({jasmineDone: assertions, suiteDone: suiteCallback}); + + env.describe("first suite", function() { + firstSpec = env.it("first spec", function() { + calls.push('first spec'); + }); + env.it("second spec", function() { + calls.push('second spec'); + }); + }); + + secondSuite = env.describe("second suite", function() { + env.it("third spec", function() { + calls.push('third spec'); + }); + }); + + env.execute([secondSuite.id, firstSpec.id]); + }); + + it("Mock clock can be installed and used in tests", function(done) { + var globalSetTimeout = jasmine.createSpy('globalSetTimeout'), + delayedFunctionForGlobalClock = jasmine.createSpy('delayedFunctionForGlobalClock'), + delayedFunctionForMockClock = jasmine.createSpy('delayedFunctionForMockClock'), + env = new j$.Env({global: { setTimeout: globalSetTimeout }}); + + var assertions = function() { + expect(delayedFunctionForMockClock).toHaveBeenCalled(); + expect(globalSetTimeout).toHaveBeenCalledWith(delayedFunctionForGlobalClock, 100); + + done(); + }; + + env.addReporter({ jasmineDone: assertions }); + + env.describe("tests", function() { + env.it("test with mock clock", function() { + env.clock.install(); + env.clock.setTimeout(delayedFunctionForMockClock, 100); + env.clock.tick(100); + env.clock.uninstall(); + }); + env.it("test without mock clock", function() { + env.clock.setTimeout(delayedFunctionForGlobalClock, 100); + }); + }); + + expect(globalSetTimeout).not.toHaveBeenCalled(); + expect(delayedFunctionForMockClock).not.toHaveBeenCalled(); + + env.execute(); + }); + + it("should run async specs in order, waiting for them to complete", function(done) { + var env = new j$.Env(), mutatedVar; + + env.describe("tests", function() { + env.beforeEach(function() { + mutatedVar = 2; + }); + + env.it("async spec", function(underTestCallback) { + setTimeout(function() { + expect(mutatedVar).toEqual(2); + underTestCallback(); + done(); + }, 0); + }); + + env.it("after async spec", function() { + mutatedVar = 3; + }); + }); + + env.execute(); + }); + + describe("with a mock clock", function() { + var originalTimeout; + + beforeEach(function() { + originalTimeout = j$.DEFAULT_TIMEOUT_INTERVAL; + jasmine.getEnv().clock.install(); + }); + + afterEach(function() { + jasmine.getEnv().clock.uninstall(); + j$.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + }); + + it("should wait a specified interval before failing specs haven't called done yet", function(done) { + var env = new j$.Env(), + reporter = jasmine.createSpyObj('fakeReporter', [ "specDone" ]); + + reporter.specDone.and.callFake(function() { + expect(reporter.specDone).toHaveBeenCalledWith(jasmine.objectContaining({status: 'failed'})); + done(); + }); + + env.addReporter(reporter); + j$.DEFAULT_TIMEOUT_INTERVAL = 8414; + + env.it("async spec that doesn't call done", function(underTestCallback) { + env.expect(true).toBeTruthy(); + jasmine.getEnv().clock.tick(8414); + }); + + env.execute(); + }); + }); + + // TODO: something is wrong with this spec + it("should report as expected", function(done) { + var env = new j$.Env(), + reporter = jasmine.createSpyObj('fakeReporter', [ + "jasmineStarted", + "jasmineDone", + "suiteStarted", + "suiteDone", + "specStarted", + "specDone" + ]); + + reporter.jasmineDone.and.callFake(function() { + expect(reporter.jasmineStarted).toHaveBeenCalledWith({ + totalSpecsDefined: 3 + }); + var suiteResult = reporter.suiteStarted.calls.first().args[0]; + expect(suiteResult.description).toEqual("A Suite"); + + done(); + }); + + env.addReporter(reporter); + + env.describe("A Suite", function() { + env.it("with a top level spec", function() { + env.expect(true).toBe(true); + }); + env.describe("with a nested suite", function() { + env.xit("with a pending spec", function() { + env.expect(true).toBe(true); + }); + env.it("with a spec", function() { + env.expect(true).toBe(false); + }); + }); + }); + + env.execute(); + }); + + it("should be possible to get full name from a spec", function() { + var env = new j$.Env({global: { setTimeout: setTimeout }}), + topLevelSpec, nestedSpec, doublyNestedSpec; + + env.describe("my tests", function() { + topLevelSpec = env.it("are sometimes top level", function() { + }); + env.describe("are sometimes", function() { + nestedSpec = env.it("singly nested", function() { + }); + env.describe("even", function() { + doublyNestedSpec = env.it("doubly nested", function() { + }); + }); + }); + }); + + expect(topLevelSpec.getFullName()).toBe("my tests are sometimes top level"); + expect(nestedSpec.getFullName()).toBe("my tests are sometimes singly nested"); + expect(doublyNestedSpec.getFullName()).toBe("my tests are sometimes even doubly nested"); + }); + + it("Custom equality testers should be per spec", function(done) { + var env = new j$.Env({global: { setTimeout: setTimeout }}), + reporter = jasmine.createSpyObj('fakeReporter', [ + "jasmineStarted", + "jasmineDone", + "suiteStarted", + "suiteDone", + "specStarted", + "specDone" + ]); + + reporter.jasmineDone.and.callFake(function() { + var firstSpecResult = reporter.specDone.calls.first().args[0], + secondSpecResult = reporter.specDone.calls.mostRecent().args[0]; + + expect(firstSpecResult.status).toEqual("passed"); + expect(secondSpecResult.status).toEqual("failed"); + + done(); + }); + + env.addReporter(reporter); + + env.describe("testing custom equality testers", function() { + env.it("with a custom tester", function() { + env.addCustomEqualityTester(function(a, b) { return true; }); + env.expect("a").toEqual("b"); + }); + + env.it("without a custom tester", function() { + env.expect("a").toEqual("b"); + }); + }); + + env.execute(); + }); + + it("Custom matchers should be per spec", function() { + var env = new j$.Env({global: { setTimeout: setTimeout }}), + matchers = { + toFoo: function() {} + }, + reporter = jasmine.createSpyObj('fakeReporter', [ + "jasmineStarted", + "jasmineDone", + "suiteStarted", + "suiteDone", + "specStarted", + "specDone" + ]); + + env.addReporter(reporter); + + env.describe("testing custom matchers", function() { + env.it("with a custom matcher", function() { + env.addMatchers(matchers); + expect(env.expect().toFoo).toBeDefined(); + }); + + env.it("without a custom matcher", function() { + expect(env.expect().toFoo).toBeUndefined(); + }); + }); + + env.execute(); + }); + + it("Custom equality testers for toContain should be per spec", function(done) { + var env = new j$.Env({global: { setTimeout: setTimeout }}), + reporter = jasmine.createSpyObj('fakeReporter', [ + "jasmineStarted", + "jasmineDone", + "suiteStarted", + "suiteDone", + "specStarted", + "specDone" + ]); + + reporter.jasmineDone.and.callFake(function() { + var firstSpecResult = reporter.specDone.calls.first().args[0], + secondSpecResult = reporter.specDone.calls.mostRecent().args[0]; + + expect(firstSpecResult.status).toEqual("passed"); + expect(secondSpecResult.status).toEqual("failed"); + + done(); + }); + + env.addReporter(reporter); + + env.describe("testing custom equality testers", function() { + env.it("with a custom tester", function() { + env.addCustomEqualityTester(function(a, b) { return true; }); + env.expect(["a"]).toContain("b"); + }); + + env.it("without a custom tester", function() { + env.expect("a").toContain("b"); + }); + }); + + env.execute(); + }); +}); + diff --git a/spec/core/SpecRunningSpec.js b/spec/core/integration/SpecRunningSpec.js similarity index 99% rename from spec/core/SpecRunningSpec.js rename to spec/core/integration/SpecRunningSpec.js index 476a429e..3adf8d06 100644 --- a/spec/core/SpecRunningSpec.js +++ b/spec/core/integration/SpecRunningSpec.js @@ -1,4 +1,3 @@ -// TODO: This should really be part of the Env Integration Spec describe("jasmine spec running", function () { var env; var fakeTimer;