blob: 3b7d90ee4fa04660a303f254e7dde04c66402a30 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
*/
describe("accelerometer", function () {
var accelerometer = require("cordova/plugin/accelerometer"),
exec = require('cordova/exec');
beforeEach(function() {
exec.reset();
});
var fakeAccelObject = {x:1,y:2,z:3};
function callSuccess() {
exec.mostRecentCall.args[0](fakeAccelObject);
}
function callError() {
exec.mostRecentCall.args[1](fakeAccelObject);
}
describe("getCurrentAcceleration", function () {
describe("failure", function () {
it("should throw exception if bad success callback passed in", function () {
expect(function() {
accelerometer.getCurrentAcceleration();
}).toThrow();
expect(function() {
accelerometer.getCurrentAcceleration(null);
}).toThrow();
expect(function() {
accelerometer.getCurrentAcceleration({call:function(){}, apply:function(){}});
}).toThrow();
});
});
describe("success", function() {
afterEach(function() {
// Calling the success callback for getCurrent methods should clear out the listeners
// This way we are "starting fresh" before each test.
callSuccess();
});
it("should call the exec method each time with no other listeners", function () {
var success = function () {},
error = function () {};
accelerometer.getCurrentAcceleration(success, error, {});
expect(exec).toHaveBeenCalledWith(jasmine.any(Function), jasmine.any(Function), "Accelerometer", "start", []);
});
});
});
describe("watchAcceleration", function () {
describe("failure", function () {
it("throws an exception if bad successCallback", function () {
expect(function() {
accelerometer.watchAcceleration();
}).toThrow();
expect(function() {
accelerometer.watchAcceleration(null);
}).toThrow();
expect(function() {
accelerometer.watchAcceleration({call:function(){}, apply:function(){}});
}).toThrow();
});
});
describe('success', function() {
var id;
afterEach(function() {
// Clear the watch
accelerometer.clearWatch(id);
});
it("should call exec if no other listeners exist", function () {
var success = jasmine.createSpy(),
fail = jasmine.createSpy();
id = accelerometer.watchAcceleration(success, fail, {frequency: 11});
expect(exec).toHaveBeenCalledWith(jasmine.any(Function), jasmine.any(Function), "Accelerometer", "start", []);
});
it("should set a timer with the provided frequency", function() {
spyOn(window, "setInterval");
id = accelerometer.watchAcceleration(function(){}, function(){}, {frequency:50});
expect(window.setInterval).toHaveBeenCalledWith(jasmine.any(Function), 50);
});
it("should fire the timer immediately for a watch call if the accelerometer is running", function() {
var someId = accelerometer.watchAcceleration(function(){}, function(){}, {frequency:50});
var success = jasmine.createSpy();
runs(function() {
id = accelerometer.watchAcceleration(success, function(){}, {frequency:75});
});
waits(5);
runs(function() {
expect(success).toHaveBeenCalled();
accelerometer.clearWatch(someId);
});
});
it("should NOT fire the timer immediately for a watch call if the accelerometer is NOT running", function() {
var success = jasmine.createSpy();
runs(function() {
id = accelerometer.watchAcceleration(success, function(){}, {frequency:75});
});
waits(5);
runs(function() {
expect(success).not.toHaveBeenCalled();
});
waits(71);
runs(function() {
expect(success).toHaveBeenCalled();
});
});
it("should fire the success callback on the appropriate interval, not based on how quickly the framework returns accel objects", function() {
var success = jasmine.createSpy();
runs(function() {
id = accelerometer.watchAcceleration(success, function(){}, {frequency:250});
});
waits(25);
runs(function() {
callSuccess();
expect(success).not.toHaveBeenCalled();
});
waits(25);
runs(function() {
callSuccess();
expect(success).not.toHaveBeenCalled();
});
waits(210);
runs(function() {
expect(success).toHaveBeenCalled();
});
});
});
});
describe("clearWatch", function () {
it("doesn't clear anything if the timer doesn't exist", function () {
accelerometer.clearWatch("Never Gonna Give you Up");
expect(exec).not.toHaveBeenCalled();
});
it("should clear the watch if a timer exists", function() {
var success = jasmine.createSpy(),
id;
runs(function() {
id = accelerometer.watchAcceleration(success, function() {}, {frequency: 50});
});
waits(25);
runs(function() {
accelerometer.clearWatch(id);
});
waits(26);
runs(function() {
expect(success).not.toHaveBeenCalled();
});
});
it("should call exec with stop after the last timer is cleared", function() {
var idone,
idtwo;
idone = accelerometer.watchAcceleration(function(){}, function() {}, {frequency: 50});
exec.reset();
idtwo = accelerometer.watchAcceleration(function(){}, function() {}, {frequency: 50});
accelerometer.clearWatch(idone);
expect(exec).not.toHaveBeenCalled();
accelerometer.clearWatch(idtwo);
expect(exec).toHaveBeenCalledWith(null, null, "Accelerometer", "stop", []);
});
});
});