mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
test(angularOverrides): add tests from jqLite, pass jshint
This commit is contained in:
25
js/ext/angular/src/service/angularOverrides.js
vendored
25
js/ext/angular/src/service/angularOverrides.js
vendored
@@ -1,24 +1,24 @@
|
||||
|
||||
angular.element.prototype.addClass = function(cssClasses) {
|
||||
var x, el, existingClasses;
|
||||
var x, y, cssClass, el, splitClasses, existingClasses;
|
||||
if (cssClasses) {
|
||||
for(x=0; x<this.length; x++) {
|
||||
el = this[x];
|
||||
if(el.setAttribute) {
|
||||
|
||||
if(cssClasses.indexOf(' ') < 0) {
|
||||
el.classList.add(cssClasses)
|
||||
el.classList.add(cssClasses);
|
||||
} else {
|
||||
existingClasses = (' ' + (el.getAttribute('class') || '') + ' ')
|
||||
.replace(/[\n\t]/g, " ");
|
||||
.replace(/[\n\t]/g, " ");
|
||||
splitClasses = cssClasses.split(' ');
|
||||
|
||||
angular.forEach(cssClasses.split(' '), function(cssClass) {
|
||||
cssClass = cssClass.trim();
|
||||
for (y=0; y<splitClasses.length; y++) {
|
||||
cssClass = splitClasses[y].trim();
|
||||
if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
|
||||
existingClasses += cssClass + ' ';
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
el.setAttribute('class', existingClasses.trim());
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ angular.element.prototype.addClass = function(cssClasses) {
|
||||
};
|
||||
|
||||
angular.element.prototype.removeClass = function(cssClasses) {
|
||||
var x, el;
|
||||
var x, y, splitClasses, cssClass, el;
|
||||
if (cssClasses) {
|
||||
for(x=0; x<this.length; x++) {
|
||||
el = this[x];
|
||||
@@ -36,16 +36,19 @@ angular.element.prototype.removeClass = function(cssClasses) {
|
||||
if(cssClasses.indexOf(' ') < 0) {
|
||||
el.classList.remove(cssClasses);
|
||||
} else {
|
||||
angular.forEach(cssClasses.split(' '), function(cssClass) {
|
||||
splitClasses = cssClasses.split(' ');
|
||||
|
||||
for (y=0; y<splitClasses.length; y++) {
|
||||
cssClass = splitClasses[y];
|
||||
el.setAttribute('class', (
|
||||
(" " + (el.getAttribute('class') || '') + " ")
|
||||
.replace(/[\n\t]/g, " ")
|
||||
.replace(" " + cssClass.trim() + " ", " ")).trim()
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
};
|
||||
|
||||
164
js/ext/angular/test/service/angularOverrides.unit.js
Normal file
164
js/ext/angular/test/service/angularOverrides.unit.js
Normal file
@@ -0,0 +1,164 @@
|
||||
describe('tests from angular.js jqLite', function() {
|
||||
var jqLite;
|
||||
var a, b, c;
|
||||
beforeEach(function() {
|
||||
jqLite = angular.element;
|
||||
a = jqLite('<div>A</div>')[0];
|
||||
b = jqLite('<div>B</div>')[0];
|
||||
c = jqLite('<div>C</div>')[0];
|
||||
});
|
||||
|
||||
describe('class', function() {
|
||||
|
||||
// classList changes do not support svg elements!
|
||||
/*
|
||||
it('should properly do with SVG elements', function() {
|
||||
// this is a jqLite & SVG only test
|
||||
if (!window.SVGElement) return;
|
||||
var svg = jqLite('<svg><rect></rect></svg>');
|
||||
var rect = svg.children();
|
||||
|
||||
expect(rect.hasClass('foo-class')).toBe(false);
|
||||
rect.addClass('foo-class');
|
||||
expect(rect.hasClass('foo-class')).toBe(true);
|
||||
rect.removeClass('foo-class');
|
||||
expect(rect.hasClass('foo-class')).toBe(false);
|
||||
});
|
||||
*/
|
||||
|
||||
|
||||
it('should ignore comment elements', function() {
|
||||
var comment = jqLite(document.createComment('something'));
|
||||
|
||||
comment.addClass('whatever');
|
||||
comment.hasClass('whatever');
|
||||
comment.toggleClass('whatever');
|
||||
comment.removeClass('whatever');
|
||||
});
|
||||
|
||||
|
||||
describe('hasClass', function() {
|
||||
it('should check class', function() {
|
||||
var selector = jqLite([a, b]);
|
||||
expect(selector.hasClass('abc')).toEqual(false);
|
||||
});
|
||||
|
||||
|
||||
it('should make sure that partial class is not checked as a subset', function() {
|
||||
var selector = jqLite([a, b]);
|
||||
selector.addClass('a');
|
||||
selector.addClass('b');
|
||||
selector.addClass('c');
|
||||
expect(selector.addClass('abc')).toEqual(selector);
|
||||
expect(selector.removeClass('abc')).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(false);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(false);
|
||||
expect(jqLite(a).hasClass('a')).toEqual(true);
|
||||
expect(jqLite(a).hasClass('b')).toEqual(true);
|
||||
expect(jqLite(a).hasClass('c')).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('addClass', function() {
|
||||
it('should allow adding of class', function() {
|
||||
var selector = jqLite([a, b]);
|
||||
expect(selector.addClass('abc')).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(true);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(true);
|
||||
});
|
||||
|
||||
|
||||
it('should ignore falsy values', function() {
|
||||
var jqA = jqLite(a);
|
||||
expect(jqA[0].className).toBe('');
|
||||
|
||||
jqA.addClass(undefined);
|
||||
expect(jqA[0].className).toBe('');
|
||||
|
||||
jqA.addClass(null);
|
||||
expect(jqA[0].className).toBe('');
|
||||
|
||||
jqA.addClass(false);
|
||||
expect(jqA[0].className).toBe('');
|
||||
});
|
||||
|
||||
|
||||
it('should allow multiple classes to be added in a single string', function() {
|
||||
var jqA = jqLite(a);
|
||||
expect(a.className).toBe('');
|
||||
|
||||
jqA.addClass('foo bar baz');
|
||||
expect(a.className).toBe('foo bar baz');
|
||||
});
|
||||
|
||||
|
||||
it('should not add duplicate classes', function() {
|
||||
var jqA = jqLite(a);
|
||||
expect(a.className).toBe('');
|
||||
|
||||
a.className = 'foo';
|
||||
jqA.addClass('foo');
|
||||
expect(a.className).toBe('foo');
|
||||
|
||||
jqA.addClass('bar foo baz');
|
||||
expect(a.className).toBe('foo bar baz');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('toggleClass', function() {
|
||||
it('should allow toggling of class', function() {
|
||||
var selector = jqLite([a, b]);
|
||||
expect(selector.toggleClass('abc')).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(true);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(true);
|
||||
|
||||
expect(selector.toggleClass('abc')).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(false);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(false);
|
||||
|
||||
expect(selector.toggleClass('abc'), true).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(true);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(true);
|
||||
|
||||
expect(selector.toggleClass('abc'), false).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(false);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(false);
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('removeClass', function() {
|
||||
it('should allow removal of class', function() {
|
||||
var selector = jqLite([a, b]);
|
||||
expect(selector.addClass('abc')).toEqual(selector);
|
||||
expect(selector.removeClass('abc')).toEqual(selector);
|
||||
expect(jqLite(a).hasClass('abc')).toEqual(false);
|
||||
expect(jqLite(b).hasClass('abc')).toEqual(false);
|
||||
});
|
||||
|
||||
|
||||
it('should correctly remove middle class', function() {
|
||||
var element = jqLite('<div class="foo bar baz"></div>');
|
||||
expect(element.hasClass('bar')).toBe(true);
|
||||
|
||||
element.removeClass('bar');
|
||||
|
||||
expect(element.hasClass('foo')).toBe(true);
|
||||
expect(element.hasClass('bar')).toBe(false);
|
||||
expect(element.hasClass('baz')).toBe(true);
|
||||
});
|
||||
|
||||
|
||||
it('should remove multiple classes specified as one string', function() {
|
||||
var jqA = jqLite(a);
|
||||
|
||||
a.className = 'foo bar baz';
|
||||
jqA.removeClass('foo baz noexistent');
|
||||
expect(a.className).toBe('bar');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user