diff options
| author | Misko Hevery | 2012-03-23 14:03:24 -0700 |
|---|---|---|
| committer | Misko Hevery | 2012-03-28 11:16:35 -0700 |
| commit | 2430f52bb97fa9d682e5f028c977c5bf94c5ec38 (patch) | |
| tree | e7529b741d70199f36d52090b430510bad07f233 /test/ng/anchorScrollSpec.js | |
| parent | 944098a4e0f753f06b40c73ca3e79991cec6c2e2 (diff) | |
| download | angular.js-2430f52bb97fa9d682e5f028c977c5bf94c5ec38.tar.bz2 | |
chore(module): move files around in preparation for more modules
Diffstat (limited to 'test/ng/anchorScrollSpec.js')
| -rw-r--r-- | test/ng/anchorScrollSpec.js | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/test/ng/anchorScrollSpec.js b/test/ng/anchorScrollSpec.js new file mode 100644 index 00000000..7e4b3aa3 --- /dev/null +++ b/test/ng/anchorScrollSpec.js @@ -0,0 +1,186 @@ +describe('$anchorScroll', function() { + + var elmSpy; + + function addElements() { + var elements = sliceArgs(arguments); + + return function() { + forEach(elements, function(identifier) { + var match = identifier.match(/(\w* )?(\w*)=(\w*)/), + jqElm = jqLite('<' + (match[1] || 'a ') + match[2] + '="' + match[3] + '"/>'), + elm = jqElm[0]; + + elmSpy[identifier] = spyOn(elm, 'scrollIntoView'); + jqLite(document.body).append(jqElm); + }); + }; + } + + function changeHashAndScroll(hash) { + return function($location, $anchorScroll) { + $location.hash(hash); + $anchorScroll(); + }; + } + + function expectScrollingToTop($window) { + forEach(elmSpy, function(spy, id) { + expect(spy).not.toHaveBeenCalled(); + }); + + expect($window.scrollTo).toHaveBeenCalledWith(0, 0); + } + + function expectScrollingTo(identifier) { + return function($window) { + forEach(elmSpy, function(spy, id) { + if (identifier === id) expect(spy).toHaveBeenCalledOnce(); + else expect(spy).not.toHaveBeenCalled(); + }); + expect($window.scrollTo).not.toHaveBeenCalled(); + }; + } + + function expectNoScrolling() { + return expectScrollingTo(NaN); + } + + + beforeEach(module(function($provide) { + elmSpy = {}; + $provide.value('$window', { + scrollTo: jasmine.createSpy('$window.scrollTo'), + document: document + }); + })); + + + it('should scroll to top of the window if empty hash', inject( + changeHashAndScroll(''), + expectScrollingToTop)); + + + it('should not scroll if hash does not match any element', inject( + addElements('id=one', 'id=two'), + changeHashAndScroll('non-existing'), + expectNoScrolling())); + + + it('should scroll to anchor element with name', inject( + addElements('a name=abc'), + changeHashAndScroll('abc'), + expectScrollingTo('a name=abc'))); + + + it('should not scroll to other than anchor element with name', inject( + addElements('input name=xxl', 'select name=xxl', 'form name=xxl'), + changeHashAndScroll('xxl'), + expectNoScrolling())); + + + it('should scroll to anchor even if other element with given name exist', inject( + addElements('input name=some', 'a name=some'), + changeHashAndScroll('some'), + expectScrollingTo('a name=some'))); + + + it('should scroll to element with id with precedence over name', inject( + addElements('name=abc', 'id=abc'), + changeHashAndScroll('abc'), + expectScrollingTo('id=abc'))); + + + it('should scroll to top if hash == "top" and no matching element', inject( + changeHashAndScroll('top'), + expectScrollingToTop)); + + + it('should scroll to element with id "top" if present', inject( + addElements('id=top'), + changeHashAndScroll('top'), + expectScrollingTo('id=top'))); + + + describe('watcher', function() { + + function initLocation(config) { + return function($provide, $locationProvider) { + $provide.value('$sniffer', {history: config.historyApi}); + $locationProvider.html5Mode(config.html5Mode); + }; + } + + function changeHashTo(hash) { + return function ($location, $rootScope, $anchorScroll) { + $rootScope.$apply(function() { + $location.hash(hash); + }); + }; + } + + function disableAutoScrolling() { + return function($anchorScrollProvider) { + $anchorScrollProvider.disableAutoScrolling(); + }; + } + + afterEach(inject(function($document) { + dealoc($document); + })); + + + it('should scroll to element when hash change in hashbang mode', function() { + module(initLocation({html5Mode: false, historyApi: true})); + inject( + addElements('id=some'), + changeHashTo('some'), + expectScrollingTo('id=some') + ); + }); + + + it('should scroll to element when hash change in html5 mode with no history api', function() { + module(initLocation({html5Mode: true, historyApi: false})); + inject( + addElements('id=some'), + changeHashTo('some'), + expectScrollingTo('id=some') + ); + }); + + + it('should not scroll when element does not exist', function() { + module(initLocation({html5Mode: false, historyApi: false})); + inject( + addElements('id=some'), + changeHashTo('other'), + expectNoScrolling() + ); + }); + + + it('should scroll when html5 mode with history api', function() { + module(initLocation({html5Mode: true, historyApi: true})); + inject( + addElements('id=some'), + changeHashTo('some'), + expectScrollingTo('id=some') + ); + }); + + + it('should not scroll when disabled', function() { + module( + disableAutoScrolling(), + initLocation({html5Mode: false, historyApi: false}) + ); + inject( + addElements('id=fake'), + changeHashTo('fake'), + expectNoScrolling() + ); + }); + }); +}); + |
