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
+
2
15
function inArray ( haystack , needle ) {
3
16
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
+ ) {
5
21
return true ;
6
22
}
7
23
}
8
24
return false ;
9
25
}
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 ,
13
29
missing = [ ] ,
14
30
found = [ ] ;
15
31
16
32
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" ) ;
18
34
}
35
+
19
36
element = element . jquery ? element [ 0 ] : element ;
20
37
classAttribute = element . getAttribute ( "class" ) ;
21
- message = message || "Element must " + ( stateVal ? "" : "not " ) + "have classes" ;
38
+
22
39
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 ) ;
27
44
} 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
+ }
29
54
}
30
55
}
31
56
} else {
32
- missing = classArray ;
57
+ missing = search ;
33
58
}
34
59
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" : "" ) ;
37
74
}
38
75
39
76
QUnit . extend ( QUnit . assert , {
40
77
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 ) ;
42
84
} ,
43
85
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 ) ;
45
167
}
46
168
} ) ;
47
- } ) ( QUnit ) ;
169
+ } ) ) ;
0 commit comments