From f488864f69b3586e35041db16932d30fc6e9b751 Mon Sep 17 00:00:00 2001 From: Alexander Schmitz Date: Wed, 29 Apr 2015 10:44:42 -0400 Subject: [PATCH] Add new asserts lacksAllClasses and hasSomeClass This also fixes pluralization in messages Fixes gh-5 --- README.md | 30 +++++++++++++++++++- qunit-assert-classes.js | 61 +++++++++++++++++++++++++++++++---------- tests/classes-test.js | 55 +++++++++++++++++++++++++++++++++---- tests/index.html | 3 +- 4 files changed, 126 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index eff483e..eec1ae0 100644 --- a/README.md +++ b/README.md @@ -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: @@ -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
``` @@ -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 +
+``` +```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 +
+``` + +```js +QUnit.test('Example hasSomeClass unit test', function( assert ) { + var element = document.getElementById( "test" ); + + assert.hasSomeClass( element ); // Passes + assert.hasSomeClass( element, "custom message" ); // Fails +}); +``` diff --git a/qunit-assert-classes.js b/qunit-assert-classes.js index 412feec..779d325 100644 --- a/qunit-assert-classes.js +++ b/qunit-assert-classes.js @@ -12,7 +12,7 @@ } function check( element, search ) { - var i, classAttribute, elementClassArray, classArray, + var i, classAttribute, elementClassArray, missing = [], found = []; @@ -24,7 +24,7 @@ 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 ); @@ -32,17 +32,16 @@ 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 { @@ -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 ); @@ -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 ); diff --git a/tests/classes-test.js b/tests/classes-test.js index 203dfb3..d1455db 100644 --- a/tests/classes-test.js +++ b/tests/classes-test.js @@ -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 ]; @@ -169,7 +186,7 @@ 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 ]; @@ -177,7 +194,7 @@ QUnit.test( "lacksClassStart", function( assert ) { 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 ]; @@ -185,13 +202,22 @@ QUnit.test( "hasClassPartial", function( assert ) { 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 ) { @@ -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" ); +} ); diff --git a/tests/index.html b/tests/index.html index 81978f8..a4ff596 100644 --- a/tests/index.html +++ b/tests/index.html @@ -15,7 +15,8 @@
-
+
+
\ No newline at end of file