'use strict'; var tricks = require('../src/js/tricks'); describe('tricks', function() { describe('debounce', function() { var spy; beforeEach(function() { spyOn(window, 'setTimeout'); spy = jasmine.createSpy('debounced?'); }); it('test debounced functions.', function() { var fn = tricks.debounce(spy, 50); fn(); expect(window.setTimeout).toHaveBeenCalledWith(jasmine.any(Function), 50); window.setTimeout.calls.argsFor(0)[0](); expect(spy).toHaveBeenCalled(); }); it('debounced function can accept parameters', function() { var fn; window.setTimeout.and.callFake(function(func) { func(); }); fn = tricks.debounce(spy); fn('hello world!'); expect(spy.calls.argsFor(0)).toEqual(['hello world!']); }); }); describe('throttle', function() { var spy; function reload(arr) { var i = 0, bullet; function fire() { bullet = arr[i]; i += 1; return bullet; } return fire; } beforeEach(function() { spy = jasmine.createSpy('throttled?'); }); it('test throttled functions.', function() { var magazine = [1, 3, 6, 8, 9], fireGun = reload(magazine), fn; spyOn(tricks, 'timestamp').and.callFake(function() { return fireGun(); }); spyOn(tricks, 'debounce').and.returnValue(function() {}); fn = tricks.throttle(spy, 7); fn(); fn(); fn(); fn(); fn(); expect(spy.calls.count()).toBe(2); expect(tricks.debounce).toHaveBeenCalled(); }); it('debounced method must invoke with additional parameter', function() { var magazine = [1, 3, 6, 8, 9], fireGun = reload(magazine), fn, debounced; spyOn(tricks, 'timestamp').and.callFake(function() { return fireGun(); }); debounced = jasmine.createSpy('debounced'); spyOn(tricks, 'debounce').and.returnValue(debounced); fn = tricks.throttle(spy, 7); fn('hello'); fn('hello'); fn('hello'); fn('hello'); fn('hello'); expect(spy.calls.count()).toBe(2); expect(tricks.debounce).toHaveBeenCalled(); expect(debounced.calls.count()).toBe(4); // debounce가 이미 콜백을 apply 처리하고 있는데, Mock을 했기 때문에 // args 를 그냥 넘겨준다 따라서 TC에서만은 각 debounce의 파라미터가 배열 형태임. expect(debounced.calls.allArgs()).toEqual([ [['hello']], [['hello']], [['hello']], [['hello']] ]); }); it('reset can remove slugs related with throttling.', function() { var magazine = [1, 3, 6, 8, 9], fireGun = reload(magazine), fn; spyOn(tricks, 'timestamp').and.callFake(function() { return fireGun(); }); fn = tricks.throttle(spy, 7); fn(); expect(spy.calls.count()).toBe(1); fn.reset(); fireGun = reload(magazine); fn(); expect(spy.calls.count()).toBe(2); }); it('throttled functions can accept parameters.', function() { var fn = tricks.throttle(spy); fn('hello world!'); expect(spy.calls.argsFor(0)).toEqual(['hello world!']); }); }); });