Skip to content

Commit

Permalink
Add new asserts lacksAllClasses and hasSomeClass
Browse files Browse the repository at this point in the history
This also fixes pluralization in messages
Fixes gh-5
  • Loading branch information
arschmitz committed Apr 29, 2015
1 parent 91740d9 commit f488864
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 23 deletions.
30 changes: 29 additions & 1 deletion README.md
Expand Up @@ -24,6 +24,9 @@ assert.lacksClassStart( element, start [, message] );
assert.hasClassPartial( element, partial [, message] );
assert.lacksClassPartial( element, partial [, message] );

assert.lacksAllClasses( element [, message] );
assert.hasSomeClass( element [, message] );

```

Where:
Expand Down Expand Up @@ -147,7 +150,7 @@ QUnit.test('Example hasClassPartial unit test', function( assert ) {
assert.hasClassPartial( element, "foo", "custom message" ); // Fails
});
```
### Example 7: lacksClassPartial
### Example 9: lacksClassPartial
```html
<div class="class1 class2"></div>
```
Expand All @@ -160,4 +163,29 @@ QUnit.test('Example lacksClassStart unit test', function( assert ) {
assert.lacksClassPartial( element, "lass", "custom message" ); // Fails
});
```
### Example 10: lacksAllClasses - checks to make sure an element contains no classes
```html
<div class=""></div>
```

```js
QUnit.test('Example lacksAllClasses unit test', function( assert ) {
var element = document.getElementById( "test" );

assert.lacksAllClasses( element ); // Passes
assert.lacksAllClasses( element, "custom message" ); // Fails
});
```
### Example 10: hasSomeClass - checks to make sure an element has some class does not matter what
```html
<div class="class1 class2"></div>
```

```js
QUnit.test('Example hasSomeClass unit test', function( assert ) {
var element = document.getElementById( "test" );

assert.hasSomeClass( element ); // Passes
assert.hasSomeClass( element, "custom message" ); // Fails
});
```
61 changes: 46 additions & 15 deletions qunit-assert-classes.js
Expand Up @@ -12,7 +12,7 @@
}

function check( element, search ) {
var i, classAttribute, elementClassArray, classArray,
var i, classAttribute, elementClassArray,
missing = [],
found = [];

Expand All @@ -24,25 +24,24 @@
classAttribute = element.getAttribute( "class" );

if ( classAttribute ) {
elementClassArray = classAttribute.match( /\S+/g ) || [];
elementClassArray = splitClasses( classAttribute );
if ( search instanceof RegExp ) {
if ( inArray( elementClassArray, search ) ) {
found.push( search );
} else {
missing.push( search );
}
} else {
classArray = search.match( /\S+/g );
for( i = 0; i < classArray.length; i++ ) {
if ( !inArray( elementClassArray, classArray[ i ] ) ) {
missing.push( classArray[ i ] );
for( i = 0; i < search.length; i++ ) {
if ( !inArray( elementClassArray, search[ i ] ) ) {
missing.push( search[ i ] );
} else {
found.push( classArray[ i ] );
found.push( search[ i ] );
}
}
}
} else {
missing = classArray;
missing = search;
}

return {
Expand All @@ -53,28 +52,40 @@
};
}

function splitClasses( classes ) {
return classes.match( /\S+/g ) || [];
}

function pluralize( message, classes ) {
return message + ( classes.length > 1 ? "es" : "" );
}

QUnit.extend( QUnit.assert, {
hasClasses: function( element, classes, message ) {
var results = check( element, classes );
var classArray = splitClasses( classes ),
results = check( element, classArray );

message = message || "Element must have classes";
message = pluralize( message || "Element must have class", classArray );

this.push( !results.missing.length, results.found.join( " " ), classes, message );
},
lacksClasses: function( element, classes, message ) {
var results = check( element, classes );
var classArray = splitClasses( classes ),
results = check( element, classArray );

message = message || "Element must not have classes";
message = pluralize( message || "Element must not have class", classArray );

this.push( !results.found.length, results.found.join( " " ), classes, message );
},
hasClassesStrict: function( element, classes, message ) {
var result, results = check( element, classes );
var result,
classArray = splitClasses( classes ),
results = check( element, classArray );

message = message || "Element must only have classes";
message = pluralize( message || "Element must only have class", classArray );

result = !results.missing.length && results.element.getAttribute( "class" ) &&
( results.element.getAttribute( "class" ).match( /\S+/g ) || [] ).length ===
splitClasses( results.element.getAttribute( "class" ) ).length ===
results.found.length;

this.push( result, results.found.join( " " ), classes, message );
Expand Down Expand Up @@ -120,6 +131,26 @@
message = message || "Element must not have class containing '" + partialClass + "'";

this.push( results.missing.length, results.missing.join( " " ), partialClass, message );
},
lacksAllClasses: function( element, message ) {
element = element.jquery ? element[ 0 ] : element;

var classAttribute = element.getAttribute( "class" ) || "",
classes = splitClasses( classAttribute );

message = message || "Element must not have any classes";

this.push( !classes.length, !classes.length, true, message );
},
hasSomeClass: function( element, message ) {
element = element.jquery ? element[ 0 ] : element;

var classAttribute = element.getAttribute( "class" ) || "",
classes = splitClasses( classAttribute );

message = message || "Element must have a class";

this.push( classes.length, classes.length, true, message );
}
});
})( QUnit );
55 changes: 49 additions & 6 deletions tests/classes-test.js
Expand Up @@ -99,6 +99,23 @@ QUnit.test( "lacksClassPartial", function( assert ) {
assert.lacksClassPartial( element, "iald-", "custom message" );
});

QUnit.test( "lacksAllClasses", function( assert ) {
QUnit.expect( 2 );
var element = $( "#test-empty" ),
elementEmptyAttribute = $( "#test-empty-attribute-exists" );

assert.lacksAllClasses( element );
assert.lacksAllClasses( elementEmptyAttribute,
"Empty existing class attribute works correctly" );
} );

QUnit.test( "hasSomeClass", function( assert ) {
QUnit.expect( 1 );
var element = $( "#test" );

assert.hasSomeClass( element );
} );

QUnit.test( "hasClasses - dom node", function( assert ) {
QUnit.expect( 20 );
var element = $( "#test" )[ 0 ];
Expand Down Expand Up @@ -169,29 +186,38 @@ QUnit.test( "hasClassStart", function( assert ) {
assert.hasClassStart( element, "partial-", "custom message" );
});

QUnit.test( "lacksClassStart", function( assert ) {
QUnit.test( "lacksClassStart - dom node", function( assert ) {
QUnit.expect( 2 );
var element = $( "#test" )[ 0 ];

assert.lacksClassStart( element, "partiald-" );
assert.lacksClassStart( element, "partiald-", "custom message" );
});

QUnit.test( "hasClassPartial", function( assert ) {
QUnit.test( "hasClassPartial - dom node", function( assert ) {
QUnit.expect( 2 );
var element = $( "#test" )[ 0 ];

assert.hasClassPartial( element, "ial-" );
assert.hasClassPartial( element, "ial-", "custom message" );
});

QUnit.test( "lacksClassPartial", function( assert ) {
QUnit.test( "lacksAllClasses", function( assert ) {
QUnit.expect( 2 );
var element = $( "#test-empty" ),
elementEmptyAttribute = $( "#test-empty-attribute-exists" );

assert.lacksAllClasses( element );
assert.lacksAllClasses( elementEmptyAttribute,
"Empty existing class attribute works correctly" );
} );

QUnit.test( "hasSomeClass - dom node", function( assert ) {
QUnit.expect( 1 );
var element = $( "#test" )[ 0 ];

assert.lacksClassPartial( element, "iald-" );
assert.lacksClassPartial( element, "iald-", "custom message" );
});
assert.hasSomeClass( element );
} );

QUnit.module( "Qunit-assert-classes ensure failures", {
beforeEach: function( assert ) {
Expand Down Expand Up @@ -278,3 +304,20 @@ QUnit.test( "lacksClassPartial - failures", function( assert ) {
assert.lacksClassPartial( element, "ial-" );
assert.lacksClassPartial( element, "ial-", "custom message" );
});

QUnit.test( "lacksAllClasses - failures", function( assert ) {
QUnit.expect( 1 );
var element = $( "#test" );

assert.lacksAllClasses( element );
} );

QUnit.test( "hasSomeClass - failures", function( assert ) {
QUnit.expect( 2 );
var element = $( "#test-empty" )[ 0 ],
elementEmptyAttribute = $( "#test-empty-attribute-exists" )[ 0 ];

assert.hasSomeClass( element );
assert.hasSomeClass( elementEmptyAttribute,
"custom message" );
} );
3 changes: 2 additions & 1 deletion tests/index.html
Expand Up @@ -15,7 +15,8 @@
<body>
<div id="qunit"></div>
<div id="test" class="one two three extra partial-match"></div>
<div id="#test-empty"></div>
<div id="test-empty"></div>
<div id="test-empty-attribute-exists" class=""></div>
<div></div>
</body>
</html>

0 comments on commit f488864

Please sign in to comment.