'use strict';
describe('ngBind*', function() {
  var element;
  afterEach(function() {
    dealoc(element);
  });
  describe('ngBind', function() {
    it('should set text', inject(function($rootScope, $compile) {
      element = $compile('
')($rootScope);
      expect(element.text()).toEqual('');
      $rootScope.a = 'misko';
      $rootScope.$digest();
      expect(element.hasClass('ng-binding')).toEqual(true);
      expect(element.text()).toEqual('misko');
    }));
    it('should set text to blank if undefined', inject(function($rootScope, $compile) {
      element = $compile('')($rootScope);
      $rootScope.a = 'misko';
      $rootScope.$digest();
      expect(element.text()).toEqual('misko');
      $rootScope.a = undefined;
      $rootScope.$digest();
      expect(element.text()).toEqual('');
      $rootScope.a = null;
      $rootScope.$digest();
      expect(element.text()).toEqual('');
    }));
    it('should suppress rendering of falsy values', inject(function($rootScope, $compile) {
      element = $compile('' +
                              '' +
                              '-' +
                              '' +
                              '' +
                          '
')($rootScope);
      $rootScope.$digest();
      expect(element.text()).toEqual('-0false');
    }));
  });
  describe('ngBindTemplate', function() {
    it('should ngBindTemplate', inject(function($rootScope, $compile) {
      element = $compile('')($rootScope);
      $rootScope.name = 'Misko';
      $rootScope.$digest();
      expect(element.hasClass('ng-binding')).toEqual(true);
      expect(element.text()).toEqual('Hello Misko!');
    }));
    it('should render object as JSON ignore $$', inject(function($rootScope, $compile) {
      element = $compile('{{ {key:"value", $$key:"hide"}  }}')($rootScope);
      $rootScope.$digest();
      expect(fromJson(element.text())).toEqual({key:'value'});
    }));
  });
  describe('ngBindHtml', function() {
    describe('SCE disabled', function() {
      beforeEach(function() {
        module(function($sceProvider) { $sceProvider.enabled(false); });
      });
      it('should set html', inject(function($rootScope, $compile) {
        element = $compile('')($rootScope);
        $rootScope.html = 'hello
';
        $rootScope.$digest();
        expect(angular.lowercase(element.html())).toEqual('hello
');
      }));
    });
    describe('SCE enabled', function() {
      it('should NOT set html for untrusted values', inject(function($rootScope, $compile) {
        element = $compile('')($rootScope);
        $rootScope.html = 'hello
';
        expect($rootScope.$digest).toThrow();
      }));
      it('should NOT set html for wrongly typed values', inject(function($rootScope, $compile, $sce) {
        element = $compile('')($rootScope);
        $rootScope.html = $sce.trustAsCss('hello
');
        expect($rootScope.$digest).toThrow();
      }));
      it('should set html for trusted values', inject(function($rootScope, $compile, $sce) {
        element = $compile('')($rootScope);
        $rootScope.html = $sce.trustAsHtml('hello
');
        $rootScope.$digest();
        expect(angular.lowercase(element.html())).toEqual('hello
');
      }));
      it('should watch the string value to avoid infinite recursion', inject(function($rootScope, $compile, $sce) {
        // Ref: https://github.com/angular/angular.js/issues/3932
        // If the binding is a function that creates a new value on every call via trustAs, we'll
        // trigger an infinite digest if we don't take care of it.
        element = $compile('')($rootScope);
        $rootScope.getHtml = function() {
          return $sce.trustAsHtml('hello
');
        };
        $rootScope.$digest();
        expect(angular.lowercase(element.html())).toEqual('hello
');
      }));
      describe('when $sanitize is available', function() {
        beforeEach(function() { module('ngSanitize'); });
        it('should sanitize untrusted html', inject(function($rootScope, $compile) {
          element = $compile('')($rootScope);
          $rootScope.html = 'hello
';
          $rootScope.$digest();
          expect(angular.lowercase(element.html())).toEqual('hello
');
        }));
      });
    });
  });
});