diff options
| author | Matias Niemelä | 2013-08-21 21:29:40 -0400 | 
|---|---|---|
| committer | Misko Hevery | 2013-08-23 14:04:35 -0700 | 
| commit | fb3a7db0809b959d50be4cb93a65a91200071dd5 (patch) | |
| tree | 8179dc125231880b7b48b64d5bcf1cf0d14d1cba | |
| parent | 040aa11ceb510d8f8ec8349a3ca99d9db874daf0 (diff) | |
| download | angular.js-fb3a7db0809b959d50be4cb93a65a91200071dd5.tar.bz2 | |
feat(ngMock): add support for creating dynamic style sheets within test code
| -rwxr-xr-x | angularFiles.js | 3 | ||||
| -rw-r--r-- | src/privateMocks.js | 28 | ||||
| -rw-r--r-- | test/ngAnimate/animateSpec.js | 12 | ||||
| -rw-r--r-- | test/privateMocksSpec.js | 36 | 
4 files changed, 74 insertions, 5 deletions
| diff --git a/angularFiles.js b/angularFiles.js index a8509b3f..a20dc21a 100755 --- a/angularFiles.js +++ b/angularFiles.js @@ -79,7 +79,8 @@ angularFiles = {      'src/ngTouch/swipe.js',      'src/ngTouch/directive/ngClick.js',      'src/ngTouch/directive/ngSwipe.js', -    'docs/components/angular-bootstrap/bootstrap.js' +    'docs/components/angular-bootstrap/bootstrap.js', +    'src/privateMocks.js'    ],    'angularScenario': [ diff --git a/src/privateMocks.js b/src/privateMocks.js new file mode 100644 index 00000000..6d9fb34f --- /dev/null +++ b/src/privateMocks.js @@ -0,0 +1,28 @@ +function createMockStyleSheet(doc, wind) { +  doc = doc ? doc[0] : document; +  wind = wind || window; + +  var node = doc.createElement('style'); +  var head = doc.getElementsByTagName('head')[0]; +  head.appendChild(node); + +  var ss = doc.styleSheets[doc.styleSheets.length - 1]; + +  return { +    addRule : function(selector, styles) { +      try { +        ss.insertRule(selector + '{ ' + styles + '}', 0); +      } +      catch(e) { +        try { +          ss.addRule(selector, styles); +        } +        catch(e) {} +      } +    }, + +    destroy : function() { +      head.removeChild(node); +    } +  }; +}; diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index 30bf6ba7..37026640 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -1118,11 +1118,15 @@ describe("ngAnimate", function() {        }));        it("should properly execute CSS animations/transitions and use callbacks when using addClass / removeClass", -        inject(function($animate, $rootScope, $sniffer, $rootElement, $timeout) { +        inject(function($animate, $rootScope, $sniffer, $rootElement, $timeout, $window, $document) { -        var transition = 'transition:11s linear all;'; -        var style = transition + ' ' + vendorPrefix + transition; -        var parent = jqLite('<div><span style="' + style + '"></span></div>'); +        var ss = createMockStyleSheet($document, $window); +        ss.addRule('.klass-add', 'transition:11s linear all'); +        ss.addRule('.klass-add', vendorPrefix  + 'transition:11s linear all'); +        ss.addRule('.klass-remove', 'transition:11s linear all'); +        ss.addRule('.klass-remove', vendorPrefix + 'transition:11s linear all'); + +        var parent = jqLite('<div><span></span></div>');          $rootElement.append(parent);          body.append($rootElement);          var element = jqLite(parent.find('span')); diff --git a/test/privateMocksSpec.js b/test/privateMocksSpec.js new file mode 100644 index 00000000..e58a2b75 --- /dev/null +++ b/test/privateMocksSpec.js @@ -0,0 +1,36 @@ +describe('private mocks', function() { +  describe('createMockStyleSheet', function() { + +    it('should allow custom styles to be created and removed when the stylesheet is destroyed', +      inject(function($compile, $document, $window, $rootElement, $rootScope) { + +      var doc = $document[0]; +      var count = doc.styleSheets.length; +      var stylesheet = createMockStyleSheet($document, $window); +      expect(doc.styleSheets.length).toBe(count + 1); + +      jqLite(doc.body).append($rootElement); + +      var elm = $compile('<div class="padded">...</div>')($rootScope); +      $rootElement.append(elm); + +      expect(getStyle(elm, 'paddingTop')).toBe('0px'); + +      stylesheet.addRule('.padded', 'padding-top:2px'); + +      expect(getStyle(elm, 'paddingTop')).toBe('2px'); + +      stylesheet.destroy(); + +      expect(getStyle(elm, 'paddingTop')).toBe('0px'); + +      function getStyle(element, key) { +        var node = element[0]; +        return node.currentStyle ? +          node.currentStyle[key] : +          $window.getComputedStyle(node)[key]; +      }; +    })); + +  }); +}); | 
