Skip to content

Commit 6a03b0f

Browse files
committed
Build: Update to qunit-assert-classes to V 1.0.2
Closes jquerygh-1547
1 parent 8b89f8c commit 6a03b0f

File tree

3 files changed

+141
-20
lines changed

3 files changed

+141
-20
lines changed

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"jquery-simulate": "1.0.0",
1616
"jshint": "2.4.4",
1717
"qunit": "1.18.0",
18-
"qunit-assert-classes": "0.1.5",
18+
"qunit-assert-classes": "1.0.2",
1919
"qunit-assert-close": "JamesMGreene/qunit-assert-close#v1.1.1",
2020
"qunit-composite": "JamesMGreene/qunit-composite#v1.1.0",
2121
"requirejs": "2.1.14",
Lines changed: 140 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,169 @@
1-
( function( QUnit ) {
1+
( function( factory ) {
2+
if ( typeof define === "function" && define.amd ) {
3+
4+
// AMD. Register as an anonymous module.
5+
define( [
6+
"qunit"
7+
], factory );
8+
} else {
9+
10+
// Browser globals
11+
factory( QUnit );
12+
}
13+
}( function( QUnit ) {
14+
215
function inArray( haystack, needle ) {
316
for ( var i = 0; i < haystack.length; i++ ) {
4-
if ( haystack[ i ] === needle ) {
17+
if (
18+
( needle instanceof RegExp && needle.test( haystack[ i ] ) )||
19+
( typeof needle === "string" && haystack[ i ] === needle )
20+
) {
521
return true;
622
}
723
}
824
return false;
925
}
10-
function check( element, classes, stateVal, message ) {
11-
var i, result, classAttribute, elementClassArray,
12-
classArray = classes.split( " " ),
26+
27+
function check( element, search ) {
28+
var i, classAttribute, elementClassArray,
1329
missing = [],
1430
found = [];
1531

1632
if ( element.jquery && element.length !== 1 ) {
17-
throw( "Class checks can only be performed on a single element on a collection" );
33+
throw new Error( "Class checks can only be performed on a single element on a collection" );
1834
}
35+
1936
element = element.jquery ? element[ 0 ] : element;
2037
classAttribute = element.getAttribute( "class" );
21-
message = message || "Element must " + ( stateVal? "" : "not " ) + "have classes";
38+
2239
if ( classAttribute ) {
23-
elementClassArray = classAttribute.split( " " );
24-
for( i = 0; i < classArray.length; i++ ) {
25-
if ( !inArray( elementClassArray, classArray[ i ] ) ) {
26-
missing.push( classArray[ i ] );
40+
elementClassArray = splitClasses( classAttribute );
41+
if ( search instanceof RegExp ) {
42+
if ( inArray( elementClassArray, search ) ) {
43+
found.push( search );
2744
} else {
28-
found.push( classArray[ i ] );
45+
missing.push( search );
46+
}
47+
} else {
48+
for( i = 0; i < search.length; i++ ) {
49+
if ( !inArray( elementClassArray, search[ i ] ) ) {
50+
missing.push( search[ i ] );
51+
} else {
52+
found.push( search[ i ] );
53+
}
2954
}
3055
}
3156
} else {
32-
missing = classArray;
57+
missing = search;
3358
}
3459

35-
result = stateVal ? !missing.length : !found.length;
36-
QUnit.push( result, classes, result ? classes : found.join( " " ), message );
60+
return {
61+
missing: missing,
62+
found: found,
63+
element: element,
64+
classAttribute: classAttribute
65+
};
66+
}
67+
68+
function splitClasses( classes ) {
69+
return classes.match( /\S+/g ) || [];
70+
}
71+
72+
function pluralize( message, classes ) {
73+
return message + ( classes.length > 1 ? "es" : "" );
3774
}
3875

3976
QUnit.extend( QUnit.assert, {
4077
hasClasses: function( element, classes, message ) {
41-
check( element, classes, true, message );
78+
var classArray = splitClasses( classes ),
79+
results = check( element, classArray );
80+
81+
message = message || pluralize( "Element must have class", classArray );
82+
83+
this.push( !results.missing.length, results.found.join( " " ), classes, message );
4284
},
4385
lacksClasses: function( element, classes, message ) {
44-
check( element, classes, false, message );
86+
var classArray = splitClasses( classes ),
87+
results = check( element, classArray );
88+
89+
message = message || pluralize( "Element must not have class", classArray );
90+
91+
this.push( !results.found.length, results.found.join( " " ), classes, message );
92+
},
93+
hasClassesStrict: function( element, classes, message ) {
94+
var result,
95+
classArray = splitClasses( classes ),
96+
results = check( element, classArray );
97+
98+
message = message || pluralize( "Element must only have class", classArray );
99+
100+
result = !results.missing.length && results.element.getAttribute( "class" ) &&
101+
splitClasses( results.element.getAttribute( "class" ) ).length ===
102+
results.found.length;
103+
104+
this.push( result, results.found.join( " " ), classes, message );
105+
},
106+
hasClassRegex: function( element, regex, message ) {
107+
var results = check( element, regex );
108+
109+
message = message || "Element must have class matching " + regex;
110+
111+
this.push( !!results.found.length, results.found.join( " " ), regex, message );
112+
},
113+
lacksClassRegex: function( element, regex, message ) {
114+
var results = check( element, regex );
115+
116+
message = message || "Element must not have class matching " + regex;
117+
118+
this.push( results.missing.length, results.missing.join( " " ), regex, message );
119+
},
120+
hasClassStart: function( element, partialClass, message ) {
121+
var results = check( element, new RegExp( "^" + partialClass ) );
122+
123+
message = message || "Element must have class starting with " + partialClass;
124+
125+
this.push( results.found.length, results.found.join( " " ), partialClass, message );
126+
},
127+
lacksClassStart: function( element, partialClass, message ) {
128+
var results = check( element, new RegExp( "^" + partialClass ) );
129+
130+
message = message || "Element must not have class starting with " + partialClass;
131+
132+
this.push( results.missing.length, results.missing.join( " " ), partialClass, message );
133+
},
134+
hasClassPartial: function( element, partialClass, message ) {
135+
var results = check( element, new RegExp( partialClass ) );
136+
137+
message = message || "Element must have class containing '" + partialClass + "'";
138+
139+
this.push( results.found.length, results.found.join( " " ), partialClass, message );
140+
},
141+
lacksClassPartial: function( element, partialClass, message ) {
142+
var results = check( element, new RegExp( partialClass ) );
143+
144+
message = message || "Element must not have class containing '" + partialClass + "'";
145+
146+
this.push( results.missing.length, results.missing.join( " " ), partialClass, message );
147+
},
148+
lacksAllClasses: function( element, message ) {
149+
element = element.jquery ? element[ 0 ] : element;
150+
151+
var classAttribute = element.getAttribute( "class" ) || "",
152+
classes = splitClasses( classAttribute );
153+
154+
message = message || "Element must not have any classes";
155+
156+
this.push( !classes.length, !classes.length, true, message );
157+
},
158+
hasSomeClass: function( element, message ) {
159+
element = element.jquery ? element[ 0 ] : element;
160+
161+
var classAttribute = element.getAttribute( "class" ) || "",
162+
classes = splitClasses( classAttribute );
163+
164+
message = message || "Element must have a class";
165+
166+
this.push( classes.length, classes.length, true, message );
45167
}
46168
});
47-
})( QUnit );
169+
} ) );

tests/lib/bootstrap.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ requirejs.config({
1818
shim: {
1919
"globalize/ja-JP": [ "globalize" ],
2020
"jquery-simulate": [ "jquery" ],
21-
"qunit-assert-classes": [ "qunit" ],
2221
"qunit-assert-close": [ "qunit" ],
2322
"testswarm": [ "qunit" ]
2423
}

0 commit comments

Comments
 (0)