describe('$mdSticky service', function() {

  beforeEach(module('material.components.sticky'));

  it('should compile our cloned element in the same scope', function(done) {
    inject(function($compile, $rootScope, $mdSticky, $timeout) {
      var scope = $rootScope.$new();
      var contentEl = $compile(angular.element(
        '<md-content>' +
        '<sticky-directive>Sticky Element</sticky-directive>' +
        '</md-content>'
      ))(scope);

      document.body.appendChild(contentEl[0]);

      var stickyEl = contentEl.children().eq(0);
      $mdSticky(scope, stickyEl);

      // Flush the `$$sticky.add()` timeout.
      $timeout.flush();

      // When the current browser, which executes that spec, supports the sticky position, then we will always succeed
      // the test, because otherwise our test will fail.
      if (stickyEl.css('position')) {
        expect(true).toBe(true);
      } else {
        expect(contentEl.children().length).toBe(2);

        var stickyClone = contentEl[0].querySelector('.md-sticky-clone');
        expect(stickyClone).toBeTruthy();

        expect(angular.element(stickyClone).scope()).toBe(scope);
      }

      contentEl.remove();

      done();
    });
  });

  it('should not compile our self specified clone in the given scope', function(done) {
    inject(function($compile, $rootScope, $mdSticky, $timeout) {
      var scope = $rootScope.$new();
      var cloneScope = $rootScope.$new();

      var contentEl = $compile(angular.element(
        '<md-content>' +
          '<sticky-directive>Sticky Element</sticky-directive>' +
        '</md-content>'
      ))(scope);

      var cloneEl = $compile(angular.element(
        '<sticky-directive>Self-cloned Element</sticky-directive>'
      ))(cloneScope);

      document.body.appendChild(contentEl[0]);

      var stickyEl = contentEl.children().eq(0);
      $mdSticky(scope, stickyEl, cloneEl);

      // Flush the `$$sticky.add()` timeout.
      $timeout.flush();

      // When the current browser, which executes that spec, supports the sticky position, then we will always succeed
      // the test, because otherwise our test will fail.
      if (stickyEl.css('position')) {
        expect(true).toBe(true);
      } else {
        expect(contentEl.children().length).toBe(2);

        var stickyClone = contentEl[0].querySelector('.md-sticky-clone');
        expect(stickyClone).toBeTruthy();

        expect(angular.element(stickyClone).scope()).toBe(cloneScope);
      }

      contentEl.remove();

      done();
    });
  });

});

/*
 * TODO: adjust to work properly with refactors of original code
 */
/*
describe('$mdStickySpec', function() {
  var $document, $compile, $rootScope, $mdSticky;

  beforeEach(module('material.components.sticky'));

  beforeEach(inject(function(_$document_, _$compile_, _$rootScope_, _$mdSticky_) {
    $document = _$document_;
    $rootScope = _$rootScope_;
    $compile = _$compile_;
    $mdSticky = _$mdSticky_;
  }));

  var $container, $firstSticky, $secondSticky, $sticky;
  function setup(opts) {
    opts = opts || {};

    var TEST_HTML = '<md-content><h2>First sticky</h2><h2>Second sticky</h2></md-content>';
    var scope = $rootScope.$new();
    $container = $compile(TEST_HTML)(scope);
    $firstSticky = $container.children().eq(0);
    $secondSticky = $container.children().eq(1);

    // Wire up our special $container instance;
    $firstSticky.controller('mdContent').$element = $container;

    $document.find('body').html('');
    $document.find('body').append($container);


    if(!opts.skipFirst) {
      $mdSticky($rootScope.$new(), $firstSticky);
    }
    if(!opts.skipSecond) {
      $mdSticky($rootScope.$new(), $secondSticky);
    }


    // Overwrite the scrollTop property to return the opts.containerScroll
    if(opts.containerScroll) {
      var originalProp = $container.prop;
      $container.prop = function(prop) {
        if(prop == 'scrollTop') {
          return opts.containerScroll;
        } else {
          originalProp.call($container, prop);
        }
      };
    }

    // Overwrite children() to provide mock rect positions
    if(opts.firstActual) {
      $firstSticky[0].getBoundingClientRect = function() { return opts.firstActual; };
    }
    if(opts.secondActual) {
      $secondSticky[0].getBoundingClientRect = function() { return opts.secondActual; };
    }
    if(opts.firstTarget) {
      var $firstOuter = $firstSticky.parent();
      $firstOuter[0].getBoundingClientRect = function() { return opts.firstTarget; };
    }
    if(opts.secondTarget) {
      var $secondOuter = $secondSticky.parent();
      $secondOuter[0].getBoundingClientRect = function() { return opts.secondTarget; };
    }



    $sticky = $container.data('$sticky');

    if(opts.lastScroll) { $sticky.lastScroll = opts.lastScroll; }

    scope.$digest();
  }

  it('throws an error if uses outside of md-content', inject(function($mdSticky, $compile, $rootScope) {
    var html = '<h2>Hello world!</h2>';
    function useWithoutMdContent() {
      $mdSticky($rootScope.$new(), angular.element(html));
    }
    expect(useWithoutMdContent).toThrow('$mdSticky used outside of md-content');
  }));

  it('adds class md-sticky-active when an element would scroll off screen', function() {
    var firstActual = { top: -10, bottom: 9, height: 19 };
    setup({containerScroll: 10, firstActual: firstActual, skipSecond: true});
    $sticky.check();
    expect($firstSticky.hasClass('md-sticky-active')).toBe(true);
  });

  it('removes class md-sticky-active when an element is no longer sticky', function() {
    var firstTarget = { top: 1, bottom: 10, height: 9 };
    setup({
      containerScroll: 10,
      lastScroll: 11
    });
    $firstSticky.addClass('md-sticky-active');
    $sticky.check();
    expect($firstSticky.hasClass('md-sticky-active')).toBe(false);
  });

  it('pushes the active element when the next sticky element touches it', function() {
    var firstTarget = { top: -10, bottom: 9, height: 19 };
    var firstActual = { top: 0, bottom: 19, height: 19 };
    var secondActual = { top: 18, bottom: 37, height: 19 };
    setup({
      containerScroll: 19,
      firstActual: firstActual,
      firstTarget: firstTarget,
      secondActual: secondActual
    });
    $firstSticky.attr('md-sticky-active', true);
    $sticky.check();
    expect($firstSticky.data('translatedHeight')).toBe(-1);
  });

  it('increments the active element when it is pushed off screen', function() {
    var firstActual = { top: -9, bottom: 0, height: 10 };
    setup({
      containerScroll: 10,
      firstActual: firstActual
    });
    $firstSticky.addClass('md-sticky-active');
    $sticky.check();
    expect($firstSticky.hasClass('md-sticky-active')).toBe(false);
    expect($sticky.targetIndex).toBe(1);
  });

  it('pulls the previous element when the sticky element losens', function() {
    var firstActual = { top: -10, bottom: -1, height: 9 };
    var firstTarget = { top: -50, bottom: -41, height: 9 };
    var secondActual = { top: 0, bottom: 9, height: 9 };
    setup({
      containerScroll: 30,
      lastScroll: 31,
      firstActual: firstActual,
      firstTarget: firstTarget,
      secondTarget: secondActual,
      secondActual: secondActual
    });
    $sticky.targetIndex = 0;
    $firstSticky.data('translatedHeight', -10);
    $firstSticky.addClass('md-sticky-active');
    $sticky.check();
    expect($firstSticky.data('translatedHeight')).toBe(-9);
  });
});
*/
