'use strict';
describe('ngIf', function () {
  var $scope, $compile, element;
  beforeEach(inject(function ($rootScope, _$compile_) {
    $scope = $rootScope.$new();
    $compile = _$compile_;
    element = $compile('
')($scope);
  }));
  afterEach(function () {
    dealoc(element);
  });
  function makeIf(expr) {
    element.append($compile('')($scope));
    $scope.$apply();
  }
  it('should immediately remove element if condition is false', function () {
    makeIf('false');
    expect(element.children().length).toBe(0);
  });
  it('should leave the element if condition is true', function () {
    makeIf('true');
    expect(element.children().length).toBe(1);
  });
  it('should create then remove the element if condition changes', function () {
    $scope.hello = true;
    makeIf('hello');
    expect(element.children().length).toBe(1);
    $scope.$apply('hello = false');
    expect(element.children().length).toBe(0);
  });
  it('should create a new scope', function () {
    $scope.$apply('value = true');
    element.append($compile(
      '
'
    )($scope));
    $scope.$apply();
    expect(element.children('div').length).toBe(1);
  });
  it('should play nice with other elements beside it', function () {
    $scope.values = [1, 2, 3, 4];
    element.append($compile(
      '' +
        '' +
        ''
    )($scope));
    $scope.$apply();
    expect(element.children().length).toBe(9);
    $scope.$apply('values.splice(0,1)');
    expect(element.children().length).toBe(6);
    $scope.$apply('values.push(1)');
    expect(element.children().length).toBe(9);
  });
  it('should restore the element to its compiled state', function() {
    $scope.value = true;
    makeIf('value');
    expect(element.children().length).toBe(1);
    jqLite(element.children()[0]).removeClass('my-class');
    expect(element.children()[0].className).not.toContain('my-class');
    $scope.$apply('value = false');
    expect(element.children().length).toBe(0);
    $scope.$apply('value = true');
    expect(element.children().length).toBe(1);
    expect(element.children()[0].className).toContain('my-class');
  });
});
describe('ngIf ngAnimate', function () {
  var vendorPrefix, window;
  var body, element, $rootElement;
  function html(html) {
    $rootElement.html(html);
    element = $rootElement.children().eq(0);
    return element;
  }
  beforeEach(module(function() {
    // we need to run animation on attached elements;
    return function(_$rootElement_) {
      $rootElement = _$rootElement_;
      body = jqLite(document.body);
      body.append($rootElement);
    };
  }));
  afterEach(function(){
    dealoc(body);
    dealoc(element);
  });
  beforeEach(module(function($animationProvider, $provide) {
    $provide.value('$window', window = angular.mock.createMockWindow());
    return function($sniffer, $animator) {
      vendorPrefix = '-' + $sniffer.vendorPrefix + '-';
      $animator.enabled(true);
    };
  }));
  it('should fire off the enter animation + add and remove the css classes',
    inject(function($compile, $rootScope, $sniffer) {
      var $scope = $rootScope.$new();
      var style = vendorPrefix + 'transition: 1s linear all';
      element = $compile(html(
        ''
      ))($scope);
      $rootScope.$digest();
      $scope.$apply('value = true');
      expect(element.children().length).toBe(1);
      var first = element.children()[0];
      if ($sniffer.transitions) {
        expect(first.className).toContain('custom-enter');
        window.setTimeout.expect(1).process();
        expect(first.className).toContain('custom-enter-active');
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      expect(first.className).not.toContain('custom-enter');
      expect(first.className).not.toContain('custom-enter-active');
  }));
  it('should fire off the leave animation + add and remove the css classes',
    inject(function ($compile, $rootScope, $sniffer) {
      var $scope = $rootScope.$new();
      var style = vendorPrefix + 'transition: 1s linear all';
      element = $compile(html(
        ''
      ))($scope);
      $scope.$apply('value = true');
      expect(element.children().length).toBe(1);
      var first = element.children()[0];
      if ($sniffer.transitions) {
        window.setTimeout.expect(1).process();
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      $scope.$apply('value = false');
      expect(element.children().length).toBe($sniffer.transitions ? 1 : 0);
      if ($sniffer.transitions) {
        expect(first.className).toContain('custom-leave');
        window.setTimeout.expect(1).process();
        expect(first.className).toContain('custom-leave-active');
        window.setTimeout.expect(1000).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
      expect(element.children().length).toBe(0);
  }));
  it('should catch and use the correct duration for animation',
    inject(function ($compile, $rootScope, $sniffer) {
      var $scope = $rootScope.$new();
      var style = vendorPrefix + 'transition: 0.5s linear all';
      element = $compile(html(
        ''
      ))($scope);
      $scope.$apply('value = true');
      if ($sniffer.transitions) {
        window.setTimeout.expect(1).process();
        window.setTimeout.expect(500).process();
      } else {
        expect(window.setTimeout.queue).toEqual([]);
      }
  }));
});