From 56b27ed4a28309356a9461d7d8ed571711c127a3 Mon Sep 17 00:00:00 2001
From: Bob Olde Hampsink <b.oldehampsink@nerds.company>
Date: Tue, 1 Nov 2016 15:59:00 +0100
Subject: [PATCH] Protractor $timeout workaround

---
 build/loading-bar.js                       |  8 ++---
 build/loading-bar.min.css                  |  2 +-
 build/loading-bar.min.js                   |  2 +-
 src/loading-bar.js                         |  8 ++---
 test/loading-bar-interceptor-config.coffee |  6 ++--
 test/loading-bar-interceptor.coffee        | 36 ++++++++++++----------
 6 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/build/loading-bar.js b/build/loading-bar.js
index 01630c0..ef371c4 100644
--- a/build/loading-bar.js
+++ b/build/loading-bar.js
@@ -175,7 +175,7 @@ angular.module('cfp.loadingBar', [])
     this.spinnerTemplate = '<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>';
     this.loadingBarTemplate = '<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>';
 
-    this.$get = ['$injector', '$document', '$timeout', '$rootScope', function ($injector, $document, $timeout, $rootScope) {
+    this.$get = ['$injector', '$document', '$timeout', '$interval', '$rootScope', function ($injector, $document, $timeout, $interval, $rootScope) {
       var $animate;
       var $parentSelector = this.parentSelector,
         loadingBarContainer = angular.element(this.loadingBarTemplate),
@@ -251,10 +251,10 @@ angular.module('cfp.loadingBar', [])
         // progress but make sure to cancel the previous timeouts so we don't
         // have multiple incs running at the same time.
         if (autoIncrement) {
-          $timeout.cancel(incTimeout);
-          incTimeout = $timeout(function() {
+          $interval.cancel(incTimeout);
+          incTimeout = $interval(function() {
             _inc();
-          }, 250);
+          }, 250, 1);
         }
       }
 
diff --git a/build/loading-bar.min.css b/build/loading-bar.min.css
index 0f9f106..2f2d42f 100644
--- a/build/loading-bar.min.css
+++ b/build/loading-bar.min.css
@@ -1 +1 @@
-#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner 400ms linear infinite;-moz-animation:loading-bar-spinner 400ms linear infinite;-ms-animation:loading-bar-spinner 400ms linear infinite;-o-animation:loading-bar-spinner 400ms linear infinite;animation:loading-bar-spinner 400ms linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
\ No newline at end of file
+#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
\ No newline at end of file
diff --git a/build/loading-bar.min.js b/build/loading-bar.min.js
index e4b18ad..4d59857 100644
--- a/build/loading-bar.min.js
+++ b/build/loading-bar.min.js
@@ -4,4 +4,4 @@
  * Copyright (c) 2016 Wes Cruver
  * License: MIT
  */
-!function(){"use strict";angular.module("angular-loading-bar",["cfp.loadingBarInterceptor"]),angular.module("chieffancypants.loadingBar",["cfp.loadingBarInterceptor"]),angular.module("cfp.loadingBarInterceptor",["cfp.loadingBar"]).config(["$httpProvider",function(a){var b=["$q","$cacheFactory","$timeout","$rootScope","$log","cfpLoadingBar",function(b,c,d,e,f,g){function h(){d.cancel(j),g.complete(),l=0,k=0}function i(b){var d,e=c.get("$http"),f=a.defaults;!b.cache&&!f.cache||b.cache===!1||"GET"!==b.method&&"JSONP"!==b.method||(d=angular.isObject(b.cache)?b.cache:angular.isObject(f.cache)?f.cache:e);var g=void 0!==d?void 0!==d.get(b.url):!1;return void 0!==b.cached&&g!==b.cached?b.cached:(b.cached=g,g)}var j,k=0,l=0,m=g.latencyThreshold;return{request:function(a){return a.ignoreLoadingBar||i(a)||(e.$broadcast("cfpLoadingBar:loading",{url:a.url}),0===k&&(j=d(function(){g.start()},m)),k++,g.set(l/k)),a},response:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),a):(f.error("Broken interceptor detected: Config object not supplied in response:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),a)},responseError:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),b.reject(a)):(f.error("Broken interceptor detected: Config object not supplied in rejection:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),b.reject(a))}}}];a.interceptors.push(b)}]),angular.module("cfp.loadingBar",[]).provider("cfpLoadingBar",function(){this.autoIncrement=!0,this.includeSpinner=!0,this.includeBar=!0,this.latencyThreshold=100,this.startSize=.02,this.parentSelector="body",this.spinnerTemplate='<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>',this.loadingBarTemplate='<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>',this.$get=["$injector","$document","$timeout","$rootScope",function(a,b,c,d){function e(){if(k||(k=a.get("$animate")),c.cancel(m),!r){var e=b[0],g=e.querySelector?e.querySelector(n):b.find(n)[0];g||(g=e.getElementsByTagName("body")[0]);var h=angular.element(g),i=g.lastChild&&angular.element(g.lastChild);d.$broadcast("cfpLoadingBar:started"),r=!0,v&&k.enter(o,h,i),u&&k.enter(q,h,o),f(w)}}function f(a){if(r){var b=100*a+"%";p.css("width",b),s=a,t&&(c.cancel(l),l=c(function(){g()},250))}}function g(){if(!(h()>=1)){var a=0,b=h();a=b>=0&&.25>b?(3*Math.random()+3)/100:b>=.25&&.65>b?3*Math.random()/100:b>=.65&&.9>b?2*Math.random()/100:b>=.9&&.99>b?.005:0;var c=h()+a;f(c)}}function h(){return s}function i(){s=0,r=!1}function j(){k||(k=a.get("$animate")),f(1),c.cancel(m),m=c(function(){var a=k.leave(o,i);a&&a.then&&a.then(i),k.leave(q),d.$broadcast("cfpLoadingBar:completed")},500)}var k,l,m,n=this.parentSelector,o=angular.element(this.loadingBarTemplate),p=o.find("div").eq(0),q=angular.element(this.spinnerTemplate),r=!1,s=0,t=this.autoIncrement,u=this.includeSpinner,v=this.includeBar,w=this.startSize;return{start:e,set:f,status:h,inc:g,complete:j,autoIncrement:this.autoIncrement,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}();
\ No newline at end of file
+!function(){"use strict";angular.module("angular-loading-bar",["cfp.loadingBarInterceptor"]),angular.module("chieffancypants.loadingBar",["cfp.loadingBarInterceptor"]),angular.module("cfp.loadingBarInterceptor",["cfp.loadingBar"]).config(["$httpProvider",function(a){var b=["$q","$cacheFactory","$timeout","$rootScope","$log","cfpLoadingBar",function(b,c,d,e,f,g){function h(){d.cancel(j),g.complete(),l=0,k=0}function i(b){var d,e=c.get("$http"),f=a.defaults;!b.cache&&!f.cache||b.cache===!1||"GET"!==b.method&&"JSONP"!==b.method||(d=angular.isObject(b.cache)?b.cache:angular.isObject(f.cache)?f.cache:e);var g=void 0!==d&&void 0!==d.get(b.url);return void 0!==b.cached&&g!==b.cached?b.cached:(b.cached=g,g)}var j,k=0,l=0,m=g.latencyThreshold;return{request:function(a){return a.ignoreLoadingBar||i(a)||(e.$broadcast("cfpLoadingBar:loading",{url:a.url}),0===k&&(j=d(function(){g.start()},m)),k++,g.set(l/k)),a},response:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),a):(f.error("Broken interceptor detected: Config object not supplied in response:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),a)},responseError:function(a){return a&&a.config?(a.config.ignoreLoadingBar||i(a.config)||(l++,l>=k?(e.$broadcast("cfpLoadingBar:loaded",{url:a.config.url,result:a}),h()):g.set(l/k)),b.reject(a)):(f.error("Broken interceptor detected: Config object not supplied in rejection:\n https://github.com/chieffancypants/angular-loading-bar/pull/50"),b.reject(a))}}}];a.interceptors.push(b)}]),angular.module("cfp.loadingBar",[]).provider("cfpLoadingBar",function(){this.autoIncrement=!0,this.includeSpinner=!0,this.includeBar=!0,this.latencyThreshold=100,this.startSize=.02,this.parentSelector="body",this.spinnerTemplate='<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>',this.loadingBarTemplate='<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>',this.$get=["$injector","$document","$timeout","$interval","$rootScope",function(a,b,c,d,e){function f(){if(l||(l=a.get("$animate")),c.cancel(n),!s){var d=b[0],f=d.querySelector?d.querySelector(o):b.find(o)[0];f||(f=d.getElementsByTagName("body")[0]);var h=angular.element(f),i=f.lastChild&&angular.element(f.lastChild);e.$broadcast("cfpLoadingBar:started"),s=!0,w&&l.enter(p,h,i),v&&l.enter(r,h,p),g(x)}}function g(a){if(s){var b=100*a+"%";q.css("width",b),t=a,u&&(d.cancel(m),m=d(function(){h()},250,1))}}function h(){if(!(i()>=1)){var a=0,b=i();a=b>=0&&b<.25?(3*Math.random()+3)/100:b>=.25&&b<.65?3*Math.random()/100:b>=.65&&b<.9?2*Math.random()/100:b>=.9&&b<.99?.005:0;var c=i()+a;g(c)}}function i(){return t}function j(){t=0,s=!1}function k(){l||(l=a.get("$animate")),g(1),c.cancel(n),n=c(function(){var a=l.leave(p,j);a&&a.then&&a.then(j),l.leave(r),e.$broadcast("cfpLoadingBar:completed")},500)}var l,m,n,o=this.parentSelector,p=angular.element(this.loadingBarTemplate),q=p.find("div").eq(0),r=angular.element(this.spinnerTemplate),s=!1,t=0,u=this.autoIncrement,v=this.includeSpinner,w=this.includeBar,x=this.startSize;return{start:f,set:g,status:i,inc:h,complete:k,autoIncrement:this.autoIncrement,includeSpinner:this.includeSpinner,latencyThreshold:this.latencyThreshold,parentSelector:this.parentSelector,startSize:this.startSize}}]})}();
\ No newline at end of file
diff --git a/src/loading-bar.js b/src/loading-bar.js
index 44e092a..429d851 100644
--- a/src/loading-bar.js
+++ b/src/loading-bar.js
@@ -169,7 +169,7 @@ angular.module('cfp.loadingBar', [])
     this.spinnerTemplate = '<div id="loading-bar-spinner"><div class="spinner-icon"></div></div>';
     this.loadingBarTemplate = '<div id="loading-bar"><div class="bar"><div class="peg"></div></div></div>';
 
-    this.$get = ['$injector', '$document', '$timeout', '$rootScope', function ($injector, $document, $timeout, $rootScope) {
+    this.$get = ['$injector', '$document', '$timeout', '$interval', '$rootScope', function ($injector, $document, $timeout, $interval, $rootScope) {
       var $animate;
       var $parentSelector = this.parentSelector,
         loadingBarContainer = angular.element(this.loadingBarTemplate),
@@ -245,10 +245,10 @@ angular.module('cfp.loadingBar', [])
         // progress but make sure to cancel the previous timeouts so we don't
         // have multiple incs running at the same time.
         if (autoIncrement) {
-          $timeout.cancel(incTimeout);
-          incTimeout = $timeout(function() {
+          $interval.cancel(incTimeout);
+          incTimeout = $interval(function() {
             _inc();
-          }, 250);
+          }, 250, 1);
         }
       }
 
diff --git a/test/loading-bar-interceptor-config.coffee b/test/loading-bar-interceptor-config.coffee
index f29ab1e..4674640 100644
--- a/test/loading-bar-interceptor-config.coffee
+++ b/test/loading-bar-interceptor-config.coffee
@@ -71,11 +71,11 @@ describe 'loadingBarInterceptor Service - config options', ->
     module 'chieffancypants.loadingBar', (cfpLoadingBarProvider) ->
       cfpLoadingBarProvider.autoIncrement = true
       return
-    inject ($timeout, cfpLoadingBar) ->
+    inject ($timeout, $interval, cfpLoadingBar) ->
       cfpLoadingBar.start()
-      $timeout.flush()
+      $interval.flush(250)
       cfpLoadingBar.set(.5)
-      $timeout.flush()
+      $interval.flush(250)
       expect(cfpLoadingBar.status()).toBeGreaterThan .5
       cfpLoadingBar.complete()
       $timeout.flush()
diff --git a/test/loading-bar-interceptor.coffee b/test/loading-bar-interceptor.coffee
index 241967f..0bb13f3 100644
--- a/test/loading-bar-interceptor.coffee
+++ b/test/loading-bar-interceptor.coffee
@@ -11,7 +11,7 @@ flush = null
 
 describe 'loadingBarInterceptor Service', ->
 
-  $http = $httpBackend = $document = $timeout = result = loadingBar = $animate = null
+  $http = $httpBackend = $document = $timeout = $interval = result = loadingBar = $animate = null
   response = {message:'OK'}
   endpoint = '/service'
 
@@ -21,11 +21,12 @@ describe 'loadingBarInterceptor Service', ->
       return
 
     result = null
-    inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$animate_) ->
+    inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$interval_, _$animate_) ->
       $http = _$http_
       $httpBackend = _$httpBackend_
       $document = _$document_
       $timeout = _$timeout_
+      $interval = _$interval_
       $animate = _$animate_
 
     # Angular 1.4 removed triggerCalbacks(), so try them both:
@@ -250,7 +251,7 @@ describe 'loadingBarInterceptor Service', ->
 
   it 'should get and set status', inject (cfpLoadingBar) ->
     cfpLoadingBar.start()
-    $timeout.flush()
+    $interval.flush(250)
 
     cfpLoadingBar.set(0.4)
     expect(cfpLoadingBar.status()).toBe 0.4
@@ -264,13 +265,13 @@ describe 'loadingBarInterceptor Service', ->
 
   it 'should increment things randomly', inject (cfpLoadingBar) ->
     cfpLoadingBar.start()
-    $timeout.flush()
+    $interval.flush(250)
 
     # increments between 3 - 6%
     cfpLoadingBar.set(0.1)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBeBetween(3, 6)
@@ -278,7 +279,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.2)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBeBetween(3, 6)
@@ -287,7 +288,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.25)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBeBetween(0, 3)
@@ -295,7 +296,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.5)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBeBetween(0, 3)
@@ -304,7 +305,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.65)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBeBetween(0, 2)
@@ -312,7 +313,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.75)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBeBetween(0, 2)
@@ -321,7 +322,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.9)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBe 0.5
@@ -329,7 +330,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.97)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBeGreaterThan width
     expect(width2 - width).toBe 0.5
@@ -338,7 +339,7 @@ describe 'loadingBarInterceptor Service', ->
     cfpLoadingBar.set(0.99)
     lbar = angular.element(document.getElementById('loading-bar'))
     width = lbar.children().css('width').slice(0, -1)
-    $timeout.flush()
+    $interval.flush(250)
     width2 = lbar.children().css('width').slice(0, -1)
     expect(width2).toBe width
 
@@ -445,13 +446,14 @@ describe 'loadingBarInterceptor Service', ->
 
 
 describe 'LoadingBar only', ->
-  cfpLoadingBar = $document = $timeout = $animate = null
+  cfpLoadingBar = $document = $timeout = $interval = $animate = null
 
   beforeEach ->
     module 'cfp.loadingBar', 'ngAnimateMock'
 
-    inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$animate_, _cfpLoadingBar_) ->
+    inject (_$http_, _$httpBackend_, _$document_, _$timeout_, _$interval_, _$animate_, _cfpLoadingBar_) ->
       $timeout = _$timeout_
+      $interval = _$interval_
       $document = _$document_
       $animate = _$animate_
       cfpLoadingBar = _cfpLoadingBar_
@@ -459,7 +461,7 @@ describe 'LoadingBar only', ->
   it 'should be capable of being used alone', ->
     # just a simple quick test to make sure:
     cfpLoadingBar.start()
-    $timeout.flush()
+    $interval.flush(250)
 
     # test setting progress
     cfpLoadingBar.set(0.4)
@@ -478,7 +480,7 @@ describe 'LoadingBar only', ->
 
   it 'should start after multiple calls to complete()', ->
     cfpLoadingBar.start()
-    $timeout.flush()
+    $interval.flush(250)
     expect(isLoadingBarInjected($document.find(cfpLoadingBar.parentSelector))).toBe true
 
     cfpLoadingBar.complete()