--- /dev/null
+describe('async-callback', function() {
+ var env;
+ beforeEach(function() {
+ env = new jasmine.Env();
+ });
+
+ describe('it', function() {
+
+ it("should time out if callback is not called", function() {
+ env.describe("it", function() {
+ env.it("doesn't wait", function(done) {
+ expect(1+2).toEqual(3);
+ });
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return env.currentRunner().results().totalCount > 0;
+ }, 6000);
+
+ runs(function() {
+ expect(env.currentRunner().results().failedCount).toEqual(1);
+ expect(firstResult(env.currentRunner()).message).toMatch(/timeout/);;
+ });
+ });
+
+ it("should accept timeout for individual spec", function() {
+ env.describe("it", function() {
+ env.it("doesn't wait", function(done) {
+ expect(1+2).toEqual(3);
+ }, 250);
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return env.currentRunner().results().totalCount > 0;
+ }, 500);
+
+ runs(function() {
+ expect(env.currentRunner().results().failedCount).toEqual(1);
+ expect(firstResult(env.currentRunner()).message).toMatch(/timeout/);;
+ });
+ });
+
+ it("should fail if callback is passed error", function() {
+ env.describe("it", function() {
+ env.it("doesn't wait", function(done) {
+ process.nextTick(function() {
+ done("Failed asynchronously");
+ });
+ });
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return env.currentRunner().results().totalCount > 0;
+ });
+
+ runs(function() {
+ expect(env.currentRunner().results().failedCount).toEqual(1);
+ expect(firstResult(env.currentRunner()).message).toEqual("Failed asynchronously");
+ });
+ });
+
+
+ it("should finish after callback is called", function() {
+ env.describe("it", function() {
+ env.it("waits", function(done) {
+ process.nextTick(function() {
+ env.currentSpec.expect(1+2).toEqual(3);
+ done();
+ });
+ });
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return env.currentRunner().results().totalCount > 0;
+ }, 2000);
+
+ runs(function() {
+ expect(env.currentRunner().results().passedCount).toEqual(1);
+ });
+ });
+
+ it('should run in the context of the current spec', function(){
+ var actualContext;
+ var jasmineSpecContext;
+ env.describe("it", function() {
+ env.it("register context", function(done) {
+ actualContext = this;
+ jasmineSpecContext = env.currentSpec;
+ env.expect(this).toBe(jasmineSpecContext);
+ done();
+ });
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return env.currentRunner().results().totalCount > 0;
+ }, 'tested jasmine env runner to run the test', 100);
+
+ runs(function() {
+ expect(actualContext).not.toBe(global);
+ expect(actualContext).toBe(jasmineSpecContext);
+ });
+ });
+
+ });
+
+ describe("beforeEach", function() {
+ it("should wait for callback", function() {
+ env.describe("beforeEach", function() {
+ var waited = false;
+ env.beforeEach(function(done) {
+ process.nextTick(function() {
+ waited = true;
+ done();
+ });
+ });
+ env.it("waited", function() {
+ env.currentSpec.expect(waited).toBeTruthy();
+ });
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return env.currentRunner().results().totalCount > 0;
+ });
+
+ runs(function() {
+ expect(env.currentRunner().results().passedCount).toEqual(1);
+ });
+ });
+ });
+
+ describe("afterEach", function() {
+ it("should be passed async callback", function() {
+ var completed = false;
+ env.describe("afterEach", function() {
+ env.afterEach(function(done) {
+ process.nextTick(function() {
+ done('Failed in afterEach');
+ completed = true;
+ });
+ });
+ env.it("should pass", function() {
+ this.expect(1+2).toEqual(3);
+ });
+ });
+
+ env.currentRunner().execute();
+
+ waitsFor(function() {
+ return completed === true;
+ });
+
+ runs(function() {
+ expect(env.currentRunner().results().passedCount).toEqual(1);
+ expect(env.currentRunner().results().failedCount).toEqual(1);
+ });
+ });
+ });
+});
+
+function firstResult(runner) {
+ return runner.results().getItems()[0].getItems()[0].getItems()[0];
+}