');
});
it('should prepend to content', function() {
var root = jqLite('
text');
});
it('should prepend text to content', function() {
var root = jqLite('
');
expect(root.prepend('abc')).toEqual(root);
expect(root.html().toLowerCase()).toEqual('abctext');
});
it('should prepend array to empty in the right order', function() {
var root = jqLite('
');
expect(root.prepend([a, b, c])).toBe(root);
expect(sortedHtml(root)).
toBe('
');
});
it('should prepend array to content in the right order', function() {
var root = jqLite('
text
');
expect(root.prepend([a, b, c])).toBe(root);
expect(sortedHtml(root)).
toBe('
');
});
});
describe('remove', function() {
it('should remove', function() {
var root = jqLite('
abc
');
var span = root.find('span');
expect(span.remove()).toEqual(span);
expect(root.html()).toEqual('');
});
});
describe('detach', function() {
it('should detach', function() {
var root = jqLite('
abc
');
var span = root.find('span');
expect(span.detach()).toEqual(span);
expect(root.html()).toEqual('');
});
});
describe('after', function() {
it('should after', function() {
var root = jqLite('
');
var span = root.find('span');
expect(span.after('
')).toEqual(span);
expect(root.html().toLowerCase()).toEqual('
');
});
it('should allow taking text', function() {
var root = jqLite('
');
var span = root.find('span');
span.after('abc');
expect(root.html().toLowerCase()).toEqual('
abc');
});
it('should not throw when the element has no parent', function() {
var span = jqLite('
');
expect(function() { span.after('abc'); }).not.toThrow();
expect(span.length).toBe(1);
expect(span[0].outerHTML).toBe('
');
});
});
describe('parent', function() {
it('should return parent or an empty set when no parent', function() {
var parent = jqLite('
'),
child = parent.find('p');
expect(parent.parent()).toBeTruthy();
expect(parent.parent().length).toEqual(0);
expect(child.parent().length).toBe(1);
expect(child.parent()[0]).toBe(parent[0]);
});
it('should return empty set when no parent', function() {
var element = jqLite('
abc
');
expect(element.parent()).toBeTruthy();
expect(element.parent().length).toEqual(0);
});
it('should return empty jqLite object when parent is a document fragment', function() {
//this is quite unfortunate but jQuery 1.5.1 behaves this way
var fragment = document.createDocumentFragment(),
child = jqLite('
foo
');
fragment.appendChild(child[0]);
expect(child[0].parentNode).toBe(fragment);
expect(child.parent().length).toBe(0);
});
});
describe('next', function() {
it('should return next sibling', function() {
var element = jqLite('
bi
');
var b = element.find('b');
var i = element.find('i');
expect(b.next()).toJqEqual([i]);
});
it('should ignore non-element siblings', function() {
var element = jqLite('
bTextNodei
');
var b = element.find('b');
var i = element.find('i');
expect(b.next()).toJqEqual([i]);
});
});
describe('find', function() {
it('should find child by name', function() {
var root = jqLite('
');
var innerDiv = root.find('div');
expect(innerDiv.length).toEqual(1);
expect(innerDiv.html()).toEqual('text');
});
it('should find child by name and not care about text nodes', function() {
var divs = jqLite('
aa
text
bb
');
var innerSpan = divs.find('span');
expect(innerSpan.length).toEqual(2);
});
});
describe('eq', function() {
it('should select the nth element ', function() {
var element = jqLite('
aa
bb
');
expect(element.find('span').eq(0).html()).toBe('aa');
expect(element.find('span').eq(-1).html()).toBe('bb');
expect(element.find('span').eq(20).length).toBe(0);
});
});
describe('triggerHandler', function() {
it('should trigger all registered handlers for an event', function() {
var element = jqLite('
poke'),
pokeSpy = jasmine.createSpy('poke'),
clickSpy1 = jasmine.createSpy('clickSpy1'),
clickSpy2 = jasmine.createSpy('clickSpy2');
element.on('poke', pokeSpy);
element.on('click', clickSpy1);
element.on('click', clickSpy2);
expect(pokeSpy).not.toHaveBeenCalled();
expect(clickSpy1).not.toHaveBeenCalled();
expect(clickSpy2).not.toHaveBeenCalled();
element.triggerHandler('poke');
expect(pokeSpy).toHaveBeenCalledOnce();
expect(clickSpy1).not.toHaveBeenCalled();
expect(clickSpy2).not.toHaveBeenCalled();
element.triggerHandler('click');
expect(clickSpy1).toHaveBeenCalledOnce();
expect(clickSpy2).toHaveBeenCalledOnce();
});
it('should pass in a dummy event', function() {
// we need the event to have at least preventDefault because AngularJS will call it on
// all anchors with no href automatically
var element = jqLite('
poke'),
pokeSpy = jasmine.createSpy('poke'),
event;
element.on('click', pokeSpy);
element.triggerHandler('click');
event = pokeSpy.calls.mostRecent().args[0];
expect(event.preventDefault).toBeDefined();
expect(event.target).toEqual(element[0]);
expect(event.type).toEqual('click');
});
it('should pass extra parameters as an additional argument', function() {
var element = jqLite('
poke'),
pokeSpy = jasmine.createSpy('poke'),
data;
element.on('click', pokeSpy);
element.triggerHandler('click', [{hello: 'world'}]);
data = pokeSpy.calls.mostRecent().args[1];
expect(data.hello).toBe('world');
});
it('should mark event as prevented if preventDefault is called', function() {
var element = jqLite('
poke'),
pokeSpy = jasmine.createSpy('poke'),
event;
element.on('click', pokeSpy);
element.triggerHandler('click');
event = pokeSpy.calls.mostRecent().args[0];
expect(event.isDefaultPrevented()).toBe(false);
event.preventDefault();
expect(event.isDefaultPrevented()).toBe(true);
});
it('should support handlers that deregister themselves', function() {
var element = jqLite('
poke'),
clickSpy = jasmine.createSpy('click'),
clickOnceSpy = jasmine.createSpy('clickOnce').and.callFake(function() {
element.off('click', clickOnceSpy);
});
element.on('click', clickOnceSpy);
element.on('click', clickSpy);
element.triggerHandler('click');
expect(clickOnceSpy).toHaveBeenCalledOnce();
expect(clickSpy).toHaveBeenCalledOnce();
element.triggerHandler('click');
expect(clickOnceSpy).toHaveBeenCalledOnce();
expect(clickSpy).toHaveBeenCalledTimes(2);
});
it('should accept a custom event instead of eventName', function() {
var element = jqLite('
poke'),
pokeSpy = jasmine.createSpy('poke'),
customEvent = {
type: 'click',
someProp: 'someValue'
},
actualEvent;
element.on('click', pokeSpy);
element.triggerHandler(customEvent);
actualEvent = pokeSpy.calls.mostRecent().args[0];
expect(actualEvent.preventDefault).toBeDefined();
expect(actualEvent.someProp).toEqual('someValue');
expect(actualEvent.target).toEqual(element[0]);
expect(actualEvent.type).toEqual('click');
});
it('should stop triggering handlers when stopImmediatePropagation is called', function() {
var element = jqLite(a),
clickSpy1 = jasmine.createSpy('clickSpy1'),
clickSpy2 = jasmine.createSpy('clickSpy2').and.callFake(function(event) { event.stopImmediatePropagation(); }),
clickSpy3 = jasmine.createSpy('clickSpy3');
element.on('click', clickSpy1);
element.on('click', clickSpy2);
element.on('click', clickSpy3);
element.triggerHandler('click');
expect(clickSpy1).toHaveBeenCalled();
expect(clickSpy2).toHaveBeenCalled();
expect(clickSpy3).not.toHaveBeenCalled();
});
it('should have event.isImmediatePropagationStopped method', function() {
var element = jqLite(a),
clickSpy = jasmine.createSpy('clickSpy'),
event;
element.on('click', clickSpy);
element.triggerHandler('click');
event = clickSpy.calls.mostRecent().args[0];
expect(event.isImmediatePropagationStopped()).toBe(false);
event.stopImmediatePropagation();
expect(event.isImmediatePropagationStopped()).toBe(true);
});
});
describe('kebabToCamel', function() {
it('should leave non-dashed strings alone', function() {
expect(kebabToCamel('foo')).toBe('foo');
expect(kebabToCamel('')).toBe('');
expect(kebabToCamel('fooBar')).toBe('fooBar');
});
it('should convert dash-separated strings to camelCase', function() {
expect(kebabToCamel('foo-bar')).toBe('fooBar');
expect(kebabToCamel('foo-bar-baz')).toBe('fooBarBaz');
expect(kebabToCamel('foo:bar_baz')).toBe('foo:bar_baz');
});
it('should convert leading dashes followed by a lowercase letter', function() {
expect(kebabToCamel('-foo-bar')).toBe('FooBar');
});
it('should not convert dashes followed by a non-letter', function() {
expect(kebabToCamel('foo-42- -a-B')).toBe('foo-42- A-B');
});
it('should not convert browser specific css properties in a special way', function() {
expect(kebabToCamel('-ms-foo-bar')).toBe('MsFooBar');
expect(kebabToCamel('-moz-foo-bar')).toBe('MozFooBar');
expect(kebabToCamel('-webkit-foo-bar')).toBe('WebkitFooBar');
});
it('should not collapse sequences of dashes', function() {
expect(kebabToCamel('foo---bar-baz--qaz')).toBe('foo--BarBaz-Qaz');
});
});
describe('jqLiteDocumentLoaded', function() {
function createMockWindow(readyState) {
return {
document: {readyState: readyState || 'loading'},
setTimeout: jasmine.createSpy('window.setTimeout'),
addEventListener: jasmine.createSpy('window.addEventListener'),
removeEventListener: jasmine.createSpy('window.removeEventListener')
};
}
it('should execute the callback via a timeout if the document has already completed loading', function() {
function onLoadCallback() { }
var mockWindow = createMockWindow('complete');
jqLiteDocumentLoaded(onLoadCallback, mockWindow);
expect(mockWindow.addEventListener).not.toHaveBeenCalled();
expect(mockWindow.setTimeout.calls.mostRecent().args[0]).toBe(onLoadCallback);
});
it('should register a listener for the `load` event', function() {
var onLoadCallback = jasmine.createSpy('onLoadCallback');
var mockWindow = createMockWindow();
jqLiteDocumentLoaded(onLoadCallback, mockWindow);
expect(mockWindow.addEventListener).toHaveBeenCalledOnce();
});
it('should execute the callback only once the document completes loading', function() {
var onLoadCallback = jasmine.createSpy('onLoadCallback');
var mockWindow = createMockWindow();
jqLiteDocumentLoaded(onLoadCallback, mockWindow);
expect(onLoadCallback).not.toHaveBeenCalled();
jqLite(mockWindow).triggerHandler('load');
expect(onLoadCallback).toHaveBeenCalledOnce();
});
});
describe('bind/unbind', function() {
if (!_jqLiteMode) return;
it('should alias bind() to on()', function() {
var element = jqLite(a);
expect(element.bind).toBe(element.on);
});
it('should alias unbind() to off()', function() {
var element = jqLite(a);
expect(element.unbind).toBe(element.off);
});
});
});