Files
archived-enquire.js/spec/MediaQueryDispatch.js

157 lines
3.9 KiB
JavaScript

/*global describe: true, it: true, expect: true, spyOn:true, jasmine: true, MediaQueryDispatch:true */
(function(global) {
'use strict';
describe('MediaQueryDispatch', function() {
var query = 'max-width:1000px';
it('throws if matchMedia is not present', function() {
// Arrange
var matchMedia = global.matchMedia;
global.matchMedia = undefined;
// Act & assert
expect(function() {
new MediaQueryDispatch();
}).toThrow('matchMedia not present, legacy browsers require a polyfill');
// Cleanup
global.matchMedia = matchMedia;
});
it('tests for browser capability', function() {
// Arrange
var browserIsCapable = true,
mqd;
spyOn(global, 'matchMedia').andReturn({matches: browserIsCapable});
// Act
mqd = new MediaQueryDispatch();
// Assert
expect(global.matchMedia).toHaveBeenCalled();
expect(mqd.browserIsIncapable).toBe(!browserIsCapable);
});
//TODO: test for isUnconditional
it('allows a match function to be registered', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
mediaQuery;
// Act
mqd.register(query, function(){});
// Assert
mediaQuery = mqd.queries[query];
expect(mediaQuery).not.toBe(undefined);
expect(mediaQuery.handlers.length).toBe(1);
});
it('allows handler objects to be registered', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
mediaQuery;
// Act
mqd.register(query, {});
// Assert
mediaQuery = mqd.queries[query];
expect(mediaQuery.handlers.length).toBe(1);
});
it('allows arrays of handlers to be registered', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
handlers = [{}, {}, {}],
mediaQuery;
// Act
mqd.register(query, handlers);
// Assert
mediaQuery = mqd.queries[query];
expect(mediaQuery.handlers.length).toBe(handlers.length);
});
it('allows multiple handlers for same query to be registered at different times', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
instanceSpy = jasmine.createSpyObj('mediaQueryInstance', ['addHandler']),
constructorSpy = spyOn(global, 'MediaQuery').andReturn(instanceSpy);
// Act
mqd.register(query, {});
mqd.register(query, {});
// Assert
expect(constructorSpy.calls.length).toBe(1);
expect(instanceSpy.addHandler.calls.length).toBe(2);
});
it('allows entire queries to be unregistered', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
destroy = spyOn(global.QueryHandler.prototype, 'destroy'),
handlers = [
jasmine.createSpyObj('handler1', ['match']),
jasmine.createSpyObj('handler2', ['match'])
];
mqd.register(query, handlers);
// Act
mqd.unregister(query);
// Assert
expect(destroy.calls.length).toBe(handlers.length);
expect(mqd.queries[query]).toBe(undefined);
});
it('allows individual handlers to be unregistered', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
removeSpy = spyOn(global.MediaQuery.prototype, 'removeHandler'),
handlers = [
jasmine.createSpyObj('handler1', ['match']),
jasmine.createSpyObj('handler2', ['match'])
];
// Act
mqd.register(query, handlers);
mqd.unregister(query, handlers[1]);
// Assert
expect(removeSpy.calls.length).toBe(1);
});
it('returns if unregistering unrecognised media query', function() {
// Arrange
var mqd = new MediaQueryDispatch(),
removeSpy = spyOn(global.MediaQuery.prototype, 'removeHandler'),
destroySpy = spyOn(global.QueryHandler.prototype, 'destroy'),
handler = jasmine.createSpyObj('handler1', ['match']),
result;
// Act
mqd.register(query, handler);
result = mqd.unregister('klgfjglkfdsajflkj', handler);
// Assert
expect(removeSpy).not.toHaveBeenCalled();
expect(destroySpy).not.toHaveBeenCalled();
expect(result).toBe(mqd);
});
});
}(this));