/* License: MIT.
 * Copyright (C) 2013, 2014, Uri Shaked and contributors.
 */

'use strict';

describe('Directive: us-spinner', function () {
	var Spinner;

	beforeEach(module(function ($provide) {
		Spinner = jasmine.createSpy('Spinner');
		Spinner.prototype.spin = jasmine.createSpy('Spinner.spin');
		Spinner.prototype.stop = jasmine.createSpy('Spinner.spin');

		$provide.value('$window', {
			location: angular.copy(window.location),
			navigator: angular.copy(window.navigator),
			document: window.document,
			Spinner: Spinner
		});
	}));

	beforeEach(module('angularSpinner'));

	it('should create a spinner object', inject(function ($rootScope, $compile) {
		var element = angular.element('<div us-spinner></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner).toHaveBeenCalled();
	}));

	it('should start spinning the spinner automatically', inject(function ($rootScope, $compile) {
		var element = angular.element('<div us-spinner></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner.prototype.spin).toHaveBeenCalled();
		expect(Spinner.prototype.stop).not.toHaveBeenCalled();
	}));

	it('should start spinning the second spinner without stopping the first one', inject(function ($rootScope, $compile) {
		var element = angular.element('<div us-spinner></div>');
		element = $compile(element)($rootScope);
		var secondElement = angular.element('<div us-spinner></div>');
		secondElement = $compile(secondElement)($rootScope);
		$rootScope.$digest();
		expect(Spinner.prototype.spin.calls.count()).toBe(2);
		expect(Spinner.prototype.stop).not.toHaveBeenCalled();
	}));

	it('should set spinner options as given in attribute', inject(function ($rootScope, $compile) {
		var element = angular.element('<div us-spinner="{width:15}"></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner).toHaveBeenCalledWith({width: 15});
	}));

	it('should update spinner options in response to scope updates', inject(function ($rootScope, $compile) {
		$rootScope.actualWidth = 25;
		var element = angular.element('<div us-spinner="{width:actualWidth}"></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner).toHaveBeenCalledWith({width:25});
		expect(Spinner.prototype.stop).not.toHaveBeenCalled();

		$rootScope.actualWidth = 72;
		$rootScope.$digest();
		expect(Spinner).toHaveBeenCalledWith({width:72});
		expect(Spinner.prototype.stop).toHaveBeenCalled();
		expect(Spinner.prototype.spin.calls.count()).toBe(2);
	}));

	it('should stop the spinner when the scope is destroyed', inject(function ($rootScope, $compile) {
		var scope = $rootScope.$new();
		var element = angular.element('<div us-spinner></div>');
		element = $compile(element)(scope);
		$rootScope.$digest();
		expect(Spinner.prototype.stop).not.toHaveBeenCalled();
		scope.$destroy();
		expect(Spinner.prototype.stop).toHaveBeenCalled();
	}));

	it('should not start spinning automatically', inject(function ($rootScope, $compile) {
		var element = angular.element('<div us-spinner spinner-key="spinner"></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner.prototype.spin).not.toHaveBeenCalled();
	}));

	it('should start spinning when service trigger the spin event', inject(function ($rootScope, $compile, usSpinnerService) {
		var element = angular.element('<div us-spinner spinner-key="spinner"></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner.prototype.spin).not.toHaveBeenCalled();
		usSpinnerService.spin('spinner');
		expect(Spinner.prototype.spin).toHaveBeenCalled();
	}));

	it('should start spinning the spinner automatically and stop when service trigger the stop event', inject(function ($rootScope, $compile, usSpinnerService) {
		var element = angular.element('<div us-spinner spinner-key="spinner" spinner-start-active="1"></div>');
		element = $compile(element)($rootScope);
		$rootScope.$digest();
		expect(Spinner.prototype.spin).toHaveBeenCalled();
		usSpinnerService.stop('spinner');
		expect(Spinner.prototype.stop).toHaveBeenCalled();
	}));

	it('should start spinning the second spinner without starting the first one', inject(function ($rootScope, $compile, usSpinnerService) {
		var element = angular.element('<div us-spinner spinner-key="spinner"></div>');
		element = $compile(element)($rootScope);
		var secondElement = angular.element('<div us-spinner spinner-key="spinner2"></div>');
		secondElement = $compile(secondElement)($rootScope);
		$rootScope.$digest();
		usSpinnerService.spin('spinner2');
		expect(Spinner.prototype.spin.calls.count()).toBe(1);
		expect(Spinner.prototype.stop).not.toHaveBeenCalled();
	}));

	it('should start spinning the spinners with the same key', inject(function ($rootScope, $compile, usSpinnerService) {
		$compile('<div us-spinner spinner-key="spinner"></div>')($rootScope);
		$compile('<div us-spinner spinner-key="spinner2"></div>')($rootScope);
		$compile('<div us-spinner spinner-key="spinner"></div>')($rootScope);
		$compile('<div us-spinner spinner-key="spinner2"></div>')($rootScope);
		$compile('<div us-spinner spinner-key="spinner"></div>')($rootScope);
		$rootScope.$digest();
		usSpinnerService.spin('spinner');
		expect(Spinner.prototype.spin.calls.count()).toBe(3);
		expect(Spinner.prototype.stop).not.toHaveBeenCalled();
		usSpinnerService.stop('spinner');
		expect(Spinner.prototype.stop.calls.count()).toBe(3);
		usSpinnerService.spin('spinner2');
		expect(Spinner.prototype.spin.calls.count()).toBe(5);
		usSpinnerService.stop('spinner2');
		expect(Spinner.prototype.stop.calls.count()).toBe(5);
	}));
});
