'use strict';
describe('ngShow / ngHide', function() {
  var element;
  afterEach(function() {
    dealoc(element);
  });
  describe('ngShow', function() {
    it('should show and hide an element', inject(function($rootScope, $compile) {
      element = jqLite('
');
      element = $compile(element)($rootScope);
      $rootScope.$digest();
      expect(isCssVisible(element)).toEqual(false);
      $rootScope.exp = true;
      $rootScope.$digest();
      expect(isCssVisible(element)).toEqual(true);
    }));
    it('should make hidden element visible', inject(function($rootScope, $compile) {
      element = jqLite('');
      element = $compile(element)($rootScope);
      expect(isCssVisible(element)).toBe(false);
      $rootScope.exp = true;
      $rootScope.$digest();
      expect(isCssVisible(element)).toBe(true);
    }));
  });
  describe('ngHide', function() {
    it('should hide an element', inject(function($rootScope, $compile) {
      element = jqLite('');
      element = $compile(element)($rootScope);
      expect(isCssVisible(element)).toBe(true);
      $rootScope.exp = true;
      $rootScope.$digest();
      expect(isCssVisible(element)).toBe(false);
    }));
  });
});
describe('ngShow / ngHide - ngAnimate', function() {
  var window;
  var vendorPrefix;
  var body, element, $rootElement;
  function html(html) {
    body.append($rootElement);
    $rootElement.html(html);
    element = $rootElement.children().eq(0);
    return element;
  }
  beforeEach(function() {
    // we need to run animation on attached elements;
    body = jqLite(document.body);
  });
  afterEach(function(){
    dealoc(body);
    dealoc(element);
    body.removeAttr('ng-animation-running');
  });
  beforeEach(module(function($animationProvider, $provide) {
    $provide.value('$window', window = angular.mock.createMockWindow());
    return function($sniffer, _$rootElement_, $animator) {
      vendorPrefix = '-' + $sniffer.vendorPrefix + '-';
      $rootElement = _$rootElement_;
      $animator.enabled(true);
    };
  }));
  describe('ngShow', function() {
    it('should fire off the animator.show and animator.hide animation', inject(function($compile, $rootScope, $sniffer) {
      var $scope = $rootScope.$new();
      $scope.on = true;
      element = $compile(html(
        '' +
        '
'
      ))($scope);
      $scope.$digest();
      if ($sniffer.transitions) {
        expect(element.attr('class')).toContain('custom-show');
        window.setTimeout.expect(1).process();
        expect(element.attr('class')).toContain('custom-show-active');
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      expect(element.attr('class')).not.toContain('custom-show-active');
      expect(element.attr('class')).not.toContain('custom-show');
      $scope.on = false;
      $scope.$digest();
      if ($sniffer.transitions) {
        expect(element.attr('class')).toContain('custom-hide');
        window.setTimeout.expect(1).process();
        expect(element.attr('class')).toContain('custom-hide-active');
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      expect(element.attr('class')).not.toContain('custom-hide-active');
      expect(element.attr('class')).not.toContain('custom-hide');
    }));
    it('should skip animation if parent animation running', function() {
      var fired = false;
      inject(function($animator, $compile, $rootScope, $sniffer) {
        $animator.enabled(true);
        $rootScope.$digest();
        $rootScope.val = true;
        var element = $compile(html('123
'))($rootScope);
        $rootElement.controller('ngAnimate').running = true;
        element.css('display','none');
        expect(element.css('display')).toBe('none');
        $rootScope.$digest();
        expect(element[0].style.display).toBe('');
        expect(fired).toBe(false);
        $rootElement.controller('ngAnimate').running = false;
        $rootScope.val = false;
        $rootScope.$digest();
        if ($sniffer.transitions) {
          window.setTimeout.expect(1).process();
          window.setTimeout.expect(0).process();
        } else {
          expect(window.setTimeout.queue).toEqual([]);
        }
        expect(element[0].style.display).toBe('none');
      });
    });
  });
  describe('ngHide', function() {
    it('should fire off the animator.show and animator.hide animation', inject(function($compile, $rootScope, $sniffer) {
      var $scope = $rootScope.$new();
      $scope.off = true;
      element = $compile(html(
          '' +
          '
'
      ))($scope);
      $scope.$digest();
      if ($sniffer.transitions) {
        expect(element.attr('class')).toContain('custom-hide');
        window.setTimeout.expect(1).process();
        expect(element.attr('class')).toContain('custom-hide-active');
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      expect(element.attr('class')).not.toContain('custom-hide-active');
      expect(element.attr('class')).not.toContain('custom-hide');
      $scope.off = false;
      $scope.$digest();
      if ($sniffer.transitions) {
        expect(element.attr('class')).toContain('custom-show');
        window.setTimeout.expect(1).process();
        expect(element.attr('class')).toContain('custom-show-active');
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      expect(element.attr('class')).not.toContain('custom-show-active');
      expect(element.attr('class')).not.toContain('custom-show');
    }));
    it('should disable animation when parent animation is running', function() {
      var fired = false;
      module(function($animationProvider) {
        $animationProvider.register('destructive-animation', function() {
          return {
            setup : function() {},
            start : function(element, done) {
              fired = true;
            }
          };
        });
      });
      inject(function($compile, $rootScope) {
        $rootScope.val = false;
        var element = $compile(html('123
'))($rootScope);
        $rootElement.controller('ngAnimate').running = true;
        element.css('display','block');
        expect(element.css('display')).toBe('block');
        $rootScope.val = true;
        $rootScope.$digest();
        expect(element.css('display')).toBe('none');
        expect(fired).toBe(false);
      });
    });
  });
});