Skip to content

Commit

Permalink
add rule tests
Browse files Browse the repository at this point in the history
  • Loading branch information
yaniswang committed Mar 18, 2013
1 parent e67ee47 commit 4f1ac3a
Show file tree
Hide file tree
Showing 13 changed files with 259 additions and 8 deletions.
2 changes: 1 addition & 1 deletion LICENSE.md
Expand Up @@ -2,7 +2,7 @@
The MIT License
================

Copyright (c) 2012 Yanis Wang \<yanis.wang@gmail.com\>
Copyright (c) 2013 Yanis Wang \<yanis.wang@gmail.com\>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion coverage.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion lib/htmlhint.js

Large diffs are not rendered by default.

8 changes: 5 additions & 3 deletions src/rules/id-class-value.js
Expand Up @@ -31,20 +31,22 @@ HTMLHint.addRule({
var regId = rule.regId,
message = rule.message;
parser.addListener('tagstart', function(event){
var attrs = event.attrs, attr;
var attrs = event.attrs,
attr,
col = event.col + event.tagName.length + 1;
for(var i=0, l1=attrs.length;i<l1;i++){
attr = attrs[i];
if(attr.name.toLowerCase() === 'id'){
if(regId.test(attr.value) === false){
reporter.error(message, event.line, event.col, self, attr.raw);
reporter.error(message, event.line, col + attr.index, self, attr.raw);
}
}
if(attr.name.toLowerCase() === 'class'){
var arrClass = attr.value.split(/\s+/g), classValue;
for(var j=0, l2=arrClass.length;j<l2;j++){
classValue = arrClass[j];
if(classValue && regId.test(classValue) === false){
reporter.error(message, event.line, event.col, self, classValue);
reporter.error(message, event.line, col + attr.index, self, classValue);
}
}
}
Expand Down
6 changes: 4 additions & 2 deletions src/rules/spec-char-escape.js
Expand Up @@ -8,8 +8,10 @@ HTMLHint.addRule({
init: function(parser, reporter){
var self = this;
parser.addListener('text', function(event){
var match = event.raw.match(/[<>]/);
if(match !== null){
var raw = event.raw,
reSpecChar = /[<>]/g,
match;
while((match = reSpecChar.exec(raw))){
reporter.error('Special characters must be escaped : [ '+match[0]+' ].', event.line, event.col + match.index, self, event.raw);
}
});
Expand Down
29 changes: 29 additions & 0 deletions test/rules/attr-value-empty.spec.js
Expand Up @@ -2,3 +2,32 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: attr-value-empty', function(){

it('Attribute value have no value should result in an error', function(){
var code = '<input disabled>';
var messages = HTMLHint.verify(code, {'attr-value-empty': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('attr-value-empty');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(7);
});

it('Attribute value closed by quote but no value should not result in an error', function(){
var code = '<input disabled="">';
var messages = HTMLHint.verify(code, {'attr-value-empty': true});
expect(messages.length).to.be(0);
});

it('Attribute value closed by quote and have value should not result in an error', function(){
var code = '<input disabled="disabled">';
var messages = HTMLHint.verify(code, {'attr-value-empty': true});
expect(messages.length).to.be(0);
});

});
23 changes: 23 additions & 0 deletions test/rules/doctype-first.spec.js
Expand Up @@ -2,3 +2,26 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: doctype-first', function(){

it('Doctype not be first should result in an error', function(){
var code = '<html></html>';
var messages = HTMLHint.verify(code, {'doctype-first': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('doctype-first');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(1);
});

it('Doctype be first should not result in an error', function(){
var code = '<!DOCTYPE HTML><html>';
var messages = HTMLHint.verify(code, {'doctype-first': true});
expect(messages.length).to.be(0);
});

});
23 changes: 23 additions & 0 deletions test/rules/doctype-html5.spec.js
Expand Up @@ -2,3 +2,26 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: doctype-html5', function(){

it('Doctype not html5 should result in an error', function(){
var code = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html></html>';
var messages = HTMLHint.verify(code, {'doctype-html5': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('doctype-html5');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(1);
});

it('Doctype html5 should not result in an error', function(){
var code = '<!DOCTYPE HTML><html>';
var messages = HTMLHint.verify(code, {'doctype-html5': true});
expect(messages.length).to.be(0);
});

});
32 changes: 32 additions & 0 deletions test/rules/head-script-disabled.spec.js
Expand Up @@ -2,3 +2,35 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: head-script-disabled', function(){

it('External script in head should result in an error', function(){
var code = '<head><script src="test.js"></script></head>';
var messages = HTMLHint.verify(code, {'head-script-disabled': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('head-script-disabled');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(7);
});

it('Internal Script in head should result in an error', function(){
var code = '<head><script>alert(1);</script></head>';
var messages = HTMLHint.verify(code, {'head-script-disabled': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('head-script-disabled');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(7);
});

it('Script in body not result in an error', function(){
var code = '<head></head><body><script src="test.js"></script></body>';
var messages = HTMLHint.verify(code, {'head-script-disabled': true});
expect(messages.length).to.be(0);
});

});
62 changes: 62 additions & 0 deletions test/rules/id-class-value.spec.js
Expand Up @@ -2,3 +2,65 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: id-class-value', function(){

it('Id and class value be not lower case and split by underline should result in an error', function(){
var code = '<div id="aaaBBB" class="ccc-ddd">';
var messages = HTMLHint.verify(code, {'id-class-value': 'underline'});
expect(messages.length).to.be(2);
expect(messages[0].rule.id).to.be('id-class-value');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(5);
expect(messages[1].rule.id).to.be('id-class-value');
expect(messages[1].line).to.be(1);
expect(messages[1].col).to.be(17);
});

it('Id and class value be lower case and split by underline should not result in an error', function(){
var code = '<div id="aaa_bbb" class="ccc_ddd">';
var messages = HTMLHint.verify(code, {'id-class-value': 'underline'});
expect(messages.length).to.be(0);
});

it('Id and class value be not lower case and split by dash should result in an error', function(){
var code = '<div id="aaaBBB" class="ccc_ddd">';
var messages = HTMLHint.verify(code, {'id-class-value': 'dash'});
expect(messages.length).to.be(2);
expect(messages[0].rule.id).to.be('id-class-value');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(5);
expect(messages[1].rule.id).to.be('id-class-value');
expect(messages[1].line).to.be(1);
expect(messages[1].col).to.be(17);
});

it('Id and class value be lower case and split by dash should not result in an error', function(){
var code = '<div id="aaa-bbb" class="ccc-ddd">';
var messages = HTMLHint.verify(code, {'id-class-value': 'dash'});
expect(messages.length).to.be(0);
});

it('Id and class value be not meet hump style should result in an error', function(){
var code = '<div id="aaa_bb" class="ccc-ddd">';
var messages = HTMLHint.verify(code, {'id-class-value': 'hump'});
expect(messages.length).to.be(2);
expect(messages[0].rule.id).to.be('id-class-value');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(5);
expect(messages[1].rule.id).to.be('id-class-value');
expect(messages[1].line).to.be(1);
expect(messages[1].col).to.be(17);
});

it('Id and class value be meet hump style should not result in an error', function(){
var code = '<div id="aaaBbb" class="cccDdd">';
var messages = HTMLHint.verify(code, {'id-class-value': 'hump'});
expect(messages.length).to.be(0);
});

});
29 changes: 29 additions & 0 deletions test/rules/img-alt-require.spec.js
Expand Up @@ -2,3 +2,32 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: img-alt-require', function(){

it('Img tag have not alt attr should result in an error', function(){
var code = '<img width="200" height="300">';
var messages = HTMLHint.verify(code, {'img-alt-require': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('img-alt-require');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(1);
});

it('Img tag have alt attr should not result in an error', function(){
var code = '<img width="200" height="300" alt="test">';
var messages = HTMLHint.verify(code, {'img-alt-require': true});
expect(messages.length).to.be(0);
});

it('Img tag have empty alt attr should not result in an error', function(){
var code = '<img width="200" height="300" alt="">';
var messages = HTMLHint.verify(code, {'img-alt-require': true});
expect(messages.length).to.be(0);
});

});
26 changes: 26 additions & 0 deletions test/rules/spec-char-escape.spec.js
Expand Up @@ -2,3 +2,29 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: spec-char-escape', function(){

it('Special characters: <> should result in an error', function(){
var code = '<p>aaa>bbb< ccc</p>';
var messages = HTMLHint.verify(code, {'spec-char-escape': true});
expect(messages.length).to.be(2);
expect(messages[0].rule.id).to.be('spec-char-escape');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(7);
expect(messages[1].rule.id).to.be('spec-char-escape');
expect(messages[1].line).to.be(1);
expect(messages[1].col).to.be(11);
});

it('Normal text should not result in an error', function(){
var code = '<p>abc</p>';
var messages = HTMLHint.verify(code, {'spec-char-escape': true});
expect(messages.length).to.be(0);
});

});
23 changes: 23 additions & 0 deletions test/rules/style-disabled.spec.js
Expand Up @@ -2,3 +2,26 @@
* Copyright (c) 2013, Yanis Wang <yanis.wang@gmail.com>
* MIT Licensed
*/

var expect = require("expect.js");

var HTMLHint = require("../../index").HTMLHint;

describe('Rules: style-disabled', function(){

it('Style tag should result in an error', function(){
var code = '<body><style>body{}</style></body>';
var messages = HTMLHint.verify(code, {'style-disabled': true});
expect(messages.length).to.be(1);
expect(messages[0].rule.id).to.be('style-disabled');
expect(messages[0].line).to.be(1);
expect(messages[0].col).to.be(7);
});

it('Stylesheet link should not result in an error', function(){
var code = '<body><link rel="stylesheet" href="test.css" /></body>';
var messages = HTMLHint.verify(code, {'style-disabled': true});
expect(messages.length).to.be(0);
});

});

0 comments on commit 4f1ac3a

Please sign in to comment.