(function () {
	'use strict';

	beforeEach(function () {
		delete Router.__instance;
		this.router = new Router();
	});


	describe('Класс Router', function () {
		it('instance of Router is singletone', function () {
			expect(new Router()).toEqual(this.router);
		});
	});

	describe('Router.fn.start', function () {
		beforeEach(function () {
			spyOn(Route.prototype, 'navigate');
		});

		it('Не происходит переходов на роуты до вызова метода', function () {
			this.router.addRoute('/path1', View);
			this.router.addRoute('/path2', View);
			this.router.addRoute('/path3', View);
			expect(Route.prototype.navigate).not.toHaveBeenCalled();

			// имитирует переход по клику по ссылке
			this.router.history.pushState({}, '', '/path1');
			expect(Route.prototype.navigate).not.toHaveBeenCalled();

			this.router.go('/path2');
			expect(Route.prototype.navigate).not.toHaveBeenCalled();

			this.router.go('/path3');
			expect(Route.prototype.navigate).not.toHaveBeenCalled();

		});

		it('После вызова метода переходы по роутам происходят', function () {
			this.router.addRoute('/path1', View);
			this.router.addRoute('/path2', View);
			this.router.start();
			this.router.go('/path1');
			expect(Route.prototype.navigate).toHaveBeenCalledWith('/path1', {});
			this.router.go('/path2');
			expect(Route.prototype.navigate).toHaveBeenCalledWith('/path2', {});

		});


		it('Переходит на текущий роут', function () {
			history.pushState({}, '', '/hello');
			this.router.addRoute('/hello', View);
			this.router.start();
			expect(Route.prototype.navigate).toHaveBeenCalledWith('/hello', {});
		});

	});

	describe('Router.fn.addRoute', function () {
		it('создаёт новый Route', function () {
			this.router.addRoute('/path1', View);
			this.router.addRoute('/path2', View);
			expect(this.router.routes[0] instanceof Route).toBe(true);
			expect(this.router.routes[1] instanceof Route).toBe(true);
			expect(this.router.routes.length).toBe(2);
		});


		it('прокидывает свой инстанс в новый роут', function () {
			this.router.addRoute('/path1', View);
			expect(this.router.routes[0].__router).toEqual(this.router);
		});
	});

	describe('Router.fn.go', function () {
		beforeEach(function () {
			this.router.start();
			spyOn(this.router, 'onroute');
		});

		it('меняет pathname страницы', function () {
			this.router.go('/path1');
			expect(window.location.pathname).toBe('/path1');
		});

		it('вызывает метод onroute c новым путём', function () {
			this.router.go('/path2');
			expect(this.router.onroute).toHaveBeenCalledWith('/path2', {});
		});

		it('вызывает метод onroute только если новый путь отличался от старого', function () {
			this.router.history.pushState({}, '', '/hello');
			this.router.go('/hello');
			expect(this.router.onroute).not.toHaveBeenCalled();
		});
	});

})();

@@ -2801,14 +2801,419 @@
 ;%0A%09%7D);%0A%0A
+%09describe('Router.fn.onroute', function () %7B%0A%09%09beforeEach(function () %7B%0A%09%09%09this.router.addRoute('/path1', View);%0A%09%09%09this.router.addRoute('/path2', View);%0A%09%09%09this.router.start();%0A%09%09%09spyOn(this.router.routes%5B1%5D, 'navigate');%0A%09%09%7D);%0A%0A%09%09it('%D0%BC%D0%B5%D1%82%D0%BE%D0%B4 %D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B8%D1%82 %D0%BD%D0%B0 %D0%BE%D0%B4%D0%B8%D0%BD %D0%B8%D0%B7 %D1%80%D0%BE%D1%83%D1%82%D0%BE%D0%B2', function () %7B%0A%09%09%09this.router.go('/path2');%0A%09%09%09expect(this.router.routes%5B1%5D.navigate).toHaveBeenCalledWith('/path2', %7B%7D);%0A%09%09%7D)%0A%09%7D);%0A%09%0A
 %7D)();%0A

Add some tests