diff options
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() +      ); +    }); +  }); +}); +  | 
