blob: a716cc12632f1ab2f8e6aa96a400e749ac7f1f3a [file] [log] [blame]
// Copyright 2014 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Tests for goog.dom.animationFrame.
*/
goog.setTestOnly();
goog.require('goog.dom.animationFrame');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.jsunit');
var NEXT_FRAME = goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT;
var mockClock;
var t0, t1;
var result;
function setUp() {
mockClock = new goog.testing.MockClock(true);
result = '';
t0 = goog.dom.animationFrame.createTask({
measure: function() {
result += 'me0';
},
mutate: function() {
result += 'mu0';
}
});
t1 = goog.dom.animationFrame.createTask({
measure: function() {
result += 'me1';
},
mutate: function() {
result += 'mu1';
}
});
assertEquals('', result);
}
function tearDown() {
mockClock.dispose();
}
function testCreateTask_one() {
t0();
assertEquals('', result);
mockClock.tick(NEXT_FRAME);
assertEquals('me0mu0', result);
mockClock.tick(NEXT_FRAME);
assertEquals('me0mu0', result);
t0();
t0(); // Should do nothing.
mockClock.tick(NEXT_FRAME);
assertEquals('me0mu0me0mu0', result);
}
function testCreateTask_onlyMutate() {
t0 = goog.dom.animationFrame.createTask({
mutate: function() {
result += 'mu0';
}
});
t0();
assertEquals('', result);
mockClock.tick(NEXT_FRAME);
assertEquals('mu0', result);
}
function testCreateTask_onlyMeasure() {
t0 = goog.dom.animationFrame.createTask({
mutate: function() {
result += 'me0';
}
});
t0();
assertEquals('', result);
mockClock.tick(NEXT_FRAME);
assertEquals('me0', result);
}
function testCreateTask_two() {
t0();
t1();
assertEquals('', result);
mockClock.tick(NEXT_FRAME);
assertEquals('me0me1mu0mu1', result);
mockClock.tick(NEXT_FRAME);
assertEquals('me0me1mu0mu1', result);
t0();
t1();
t0();
t1();
mockClock.tick(NEXT_FRAME);
assertEquals('me0me1mu0mu1me0me1mu0mu1', result);
}
function testCreateTask_recurse() {
var stop = false;
var recurse = goog.dom.animationFrame.createTask({
measure: function() {
if (!stop) {
recurse();
}
result += 're0';
},
mutate: function() {
result += 'ru0';
}
});
recurse();
mockClock.tick(NEXT_FRAME);
assertEquals('re0ru0', result);
mockClock.tick(NEXT_FRAME);
assertEquals('re0ru0re0ru0', result);
mockClock.tick(NEXT_FRAME);
assertEquals('re0ru0re0ru0re0ru0', result);
t0();
stop = true;
mockClock.tick(NEXT_FRAME);
assertEquals('re0ru0re0ru0re0ru0re0me0ru0mu0', result);
// Recursion should have stopped now.
mockClock.tick(NEXT_FRAME);
assertEquals('re0ru0re0ru0re0ru0re0me0ru0mu0', result);
assertFalse(goog.dom.animationFrame.requestedFrame_);
mockClock.tick(NEXT_FRAME);
assertEquals('re0ru0re0ru0re0ru0re0me0ru0mu0', result);
assertFalse(goog.dom.animationFrame.requestedFrame_);
}
function testCreateTask_recurseTwoMethodsWithState() {
var stop = false;
var recurse1 = goog.dom.animationFrame.createTask({
measure: function(state) {
if (!stop) {
recurse2();
}
result += 'r1e0';
state.text = 'T0';
},
mutate: function(state) {
result += 'r1u0' + state.text;
}
});
var recurse2 = goog.dom.animationFrame.createTask({
measure: function(state) {
if (!stop) {
recurse1();
}
result += 'r2e0';
state.text = 'T1';
},
mutate: function(state) {
result += 'r2u0' + state.text;
}
});
var taskLength = goog.dom.animationFrame.tasks_[0].length;
recurse1();
mockClock.tick(NEXT_FRAME);
// Only recurse1 executed.
assertEquals('r1e0r1u0T0', result);
mockClock.tick(NEXT_FRAME);
// Recurse2 executed and queueup recurse1.
assertEquals('r1e0r1u0T0r2e0r2u0T1', result);
mockClock.tick(NEXT_FRAME);
// Recurse1 executed and queueup recurse2.
assertEquals('r1e0r1u0T0r2e0r2u0T1r1e0r1u0T0', result);
stop = true;
mockClock.tick(NEXT_FRAME);
// Recurse2 executed and should have stopped.
assertEquals('r1e0r1u0T0r2e0r2u0T1r1e0r1u0T0r2e0r2u0T1', result);
assertFalse(goog.dom.animationFrame.requestedFrame_);
mockClock.tick(NEXT_FRAME);
assertEquals('r1e0r1u0T0r2e0r2u0T1r1e0r1u0T0r2e0r2u0T1', result);
assertFalse(goog.dom.animationFrame.requestedFrame_);
mockClock.tick(NEXT_FRAME);
assertEquals('r1e0r1u0T0r2e0r2u0T1r1e0r1u0T0r2e0r2u0T1', result);
assertFalse(goog.dom.animationFrame.requestedFrame_);
}
function testCreateTask_args() {
var context = {context: true};
var s = goog.dom.animationFrame.createTask({
measure: function(state) {
assertEquals(context, this);
assertUndefined(state.foo);
state.foo = 'foo';
},
mutate: function(state) {
assertEquals(context, this);
result += state.foo;
}
}, context);
s();
mockClock.tick(NEXT_FRAME);
assertEquals('foo', result);
var dynamicContext = goog.dom.animationFrame.createTask({
measure: function(state) {
assertEquals(context, this);
},
mutate: function(state) {
assertEquals(context, this);
result += 'bar';
}
});
dynamicContext.call(context);
mockClock.tick(NEXT_FRAME);
assertEquals('foobar', result);
var moreArgs = goog.dom.animationFrame.createTask({
measure: function(event, state) {
assertEquals(context, this);
assertEquals('event', event);
state.baz = 'baz';
},
mutate: function(event, state) {
assertEquals('event', event);
assertEquals(context, this);
result += state.baz;
}
});
moreArgs.call(context, 'event');
mockClock.tick(NEXT_FRAME);
assertEquals('foobarbaz', result);
}
function testIsRunning() {
var result = '';
var task = goog.dom.animationFrame.createTask({
measure: function() {
result += 'me';
assertTrue(goog.dom.animationFrame.isRunning());
},
mutate: function() {
result += 'mu';
assertTrue(goog.dom.animationFrame.isRunning());
}
});
task();
assertFalse(goog.dom.animationFrame.isRunning());
mockClock.tick(NEXT_FRAME);
assertFalse(goog.dom.animationFrame.isRunning());
assertEquals('memu', result);
}