Skip to content

Commit 5c473a6

Browse files
committed
Merge pull request #545 from CSSLint/fix-yuitest-reporter
Testing: Update the YUI Test harness for Grunt
2 parents c59f2e5 + bb572ef commit 5c473a6

File tree

7 files changed

+227
-248
lines changed

7 files changed

+227
-248
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ node_js:
44
- "0.10"
55
- "0.11"
66
before_install:
7-
- npm update npm -g # For "^" dependency compatiblibty in NodeJS 0.8
7+
- '[ "${TRAVIS_NODE_VERSION}" != "0.8" ] || npm install -g [email protected]'
8+
- npm install -g npm@latest
89
- npm install -g grunt-cli

Gruntfile.js

Lines changed: 5 additions & 236 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* jshint camelcase:false, evil:true, node:true */
1+
/* jshint camelcase:false, node:true */
22

33
"use strict";
44

@@ -166,7 +166,7 @@ module.exports = function(grunt) {
166166
jshintrc: ".jshintrc"
167167
},
168168
gruntfile: {
169-
src: "Gruntfile.js"
169+
src: ["Gruntfile.js","tasks/*.js"]
170170
},
171171
demo: {
172172
src: "demos/*.js"
@@ -217,6 +217,9 @@ module.exports = function(grunt) {
217217
grunt.loadNpmTasks("grunt-contrib-watch");
218218
grunt.loadNpmTasks("grunt-include-replace");
219219

220+
// Load custom tasks
221+
grunt.loadTasks("tasks");
222+
220223
// Default task.
221224
grunt.registerTask("default", ["test"]);
222225

@@ -228,238 +231,4 @@ module.exports = function(grunt) {
228231
grunt.registerTask("rhino", ["clean:build", "jshint", "concat", "test_rhino"]);
229232

230233
grunt.registerTask("release", ["test", "clean:release", "copy:release", "includereplace:release", "changelog"]);
231-
232-
//Run the YUITest suite
233-
grunt.registerMultiTask("yuitest", "Run the YUITests for the project", function() {
234-
235-
var YUITest = require("yuitest");
236-
var CSSLint = require("./build/csslint-node").CSSLint; // jshint ignore:line
237-
var files = this.filesSrc;
238-
var TestRunner = YUITest.TestRunner;
239-
var done = this.async();
240-
var errors = [],
241-
failures = [],
242-
stack = [];
243-
244-
//Eval each file so the tests are brought into this scope where CSSLint and YUITest are loaded already
245-
files.forEach(function(filepath) {
246-
eval(grunt.file.read(filepath));
247-
});
248-
249-
// From YUITest Node CLI
250-
function filterStackTrace(stackTrace){
251-
if (stackTrace){
252-
var lines = stackTrace.split("\n"),
253-
result = [],
254-
i, len;
255-
256-
//skip first line, it's the error
257-
for (i=1, len=lines.length; i < len; i++){
258-
if (lines[i].indexOf("yuitest-node") > -1){
259-
break;
260-
} else {
261-
result.push(lines[i]);
262-
}
263-
}
264-
265-
return result.join("\n");
266-
} else {
267-
return "Unavailable.";
268-
}
269-
}
270-
271-
// From YUITest Node CLI with minor colourization changes
272-
function handleEvent(event){
273-
274-
var message = "",
275-
results = event.results,
276-
i, len;
277-
278-
switch(event.type){
279-
case TestRunner.BEGIN_EVENT:
280-
message = "YUITest for Node.js\n";
281-
282-
if (TestRunner._groups){
283-
message += "Filtering on groups '" + TestRunner._groups.slice(1,-1) + "'\n";
284-
}
285-
break;
286-
287-
case TestRunner.COMPLETE_EVENT:
288-
message = "\nTotal tests: " + results.total + ", " +
289-
("Failures: " + results.failed).red + ", " +
290-
("Skipped: " + results.ignored).yellow +
291-
", Time: " + (results.duration/1000) + " seconds\n";
292-
293-
if (failures.length){
294-
message += "\nTests failed:\n".red;
295-
296-
for (i=0,len=failures.length; i < len; i++){
297-
message += "\n" + (i+1) + ") " + failures[i].name + " : " + failures[i].error.getMessage() + "\n";
298-
message += "Stack trace:\n" + filterStackTrace(failures[i].error.stack) + "\n";
299-
}
300-
301-
message += "\n";
302-
}
303-
304-
if (errors.length){
305-
message += "\nErrors:\n".red;
306-
307-
for (i=0,len=errors.length; i < len; i++){
308-
message += "\n" + (i+1) + ") " + errors[i].name + " : " + errors[i].error.message + "\n";
309-
message += "Stack trace:\n" + filterStackTrace(errors[i].error.stack) + "\n";
310-
}
311-
312-
message += "\n";
313-
}
314-
315-
message += "\n\n";
316-
//Tell grunt we're done the async operation
317-
done();
318-
break;
319-
320-
case TestRunner.TEST_FAIL_EVENT:
321-
message = "F".red;
322-
failures.push({
323-
name: stack.concat([event.testName]).join(" > "),
324-
error: event.error
325-
});
326-
327-
break;
328-
329-
case TestRunner.ERROR_EVENT:
330-
errors.push({
331-
name: stack.concat([event.methodName]).join(" > "),
332-
error: event.error
333-
});
334-
335-
break;
336-
337-
case TestRunner.TEST_IGNORE_EVENT:
338-
message = "S".yellow;
339-
break;
340-
341-
case TestRunner.TEST_PASS_EVENT:
342-
message = ".".green;
343-
break;
344-
345-
case TestRunner.TEST_SUITE_BEGIN_EVENT:
346-
stack.push(event.testSuite.name);
347-
break;
348-
349-
case TestRunner.TEST_CASE_COMPLETE_EVENT:
350-
case TestRunner.TEST_SUITE_COMPLETE_EVENT:
351-
stack.pop();
352-
break;
353-
354-
case TestRunner.TEST_CASE_BEGIN_EVENT:
355-
stack.push(event.testCase.name);
356-
break;
357-
358-
//no default
359-
}
360-
361-
grunt.log.write(message);
362-
}
363-
//Add event listeners
364-
TestRunner.subscribe(TestRunner.BEGIN_EVENT, handleEvent);
365-
TestRunner.subscribe(TestRunner.TEST_FAIL_EVENT, handleEvent);
366-
TestRunner.subscribe(TestRunner.TEST_PASS_EVENT, handleEvent);
367-
TestRunner.subscribe(TestRunner.ERROR_EVENT, handleEvent);
368-
TestRunner.subscribe(TestRunner.TEST_IGNORE_EVENT, handleEvent);
369-
TestRunner.subscribe(TestRunner.TEST_CASE_BEGIN_EVENT, handleEvent);
370-
TestRunner.subscribe(TestRunner.TEST_CASE_COMPLETE_EVENT, handleEvent);
371-
TestRunner.subscribe(TestRunner.TEST_SUITE_BEGIN_EVENT, handleEvent);
372-
TestRunner.subscribe(TestRunner.TEST_SUITE_COMPLETE_EVENT, handleEvent);
373-
TestRunner.subscribe(TestRunner.COMPLETE_EVENT, handleEvent);
374-
TestRunner.run();
375-
});
376-
377-
grunt.registerMultiTask("changelog", "Write the changelog file", function() {
378-
var done = this.async();
379-
var lastTag;
380-
var files = this.filesSrc;
381-
382-
383-
grunt.util.spawn({
384-
cmd: "git",
385-
args: ["tag"]
386-
}, function(error, result) {
387-
//Find the latest git tag
388-
var tags = result.stdout.split("\n"),
389-
semver = tags[0].replace("v","").split("."),
390-
major = parseInt(semver[0], 10),
391-
minor = parseInt(semver[1], 10),
392-
patch = parseInt(semver[2], 10);
393-
394-
//A simple array sort can't be used because of the comparison of
395-
//the strings "0.9.9" > "0.9.10"
396-
for (var i = 1, len = tags.length; i < len; i++) {
397-
semver = tags[i].replace("v", "").split(".");
398-
399-
var currentMajor = parseInt(semver[0], 10);
400-
if (currentMajor < major) {
401-
continue;
402-
} else if (currentMajor > major) {
403-
major = currentMajor;
404-
}
405-
406-
var currentMinor = parseInt(semver[1], 10);
407-
if (currentMinor < minor) {
408-
continue;
409-
} else if (currentMinor > minor) {
410-
minor = currentMinor;
411-
}
412-
413-
var currentPatch = parseInt(semver[2], 10);
414-
if (currentPatch < patch) {
415-
continue;
416-
} else if (currentPatch > patch) {
417-
patch = currentPatch;
418-
}
419-
}
420-
421-
lastTag = "v" + major + "." + minor + "." + patch;
422-
423-
grunt.verbose.write("Last tag: " + lastTag).writeln();
424-
425-
//
426-
grunt.util.spawn({
427-
cmd: "git",
428-
args: ["log", "--pretty=format:'* %s (%an)'", lastTag + "..HEAD"]
429-
}, function(error, result) {
430-
var prettyPrint = result.stdout.split("'\n'").join("\n").replace(/\"$/, "").replace(/^\"/, "");
431-
432-
grunt.verbose.writeln().write(prettyPrint).writeln();
433-
434-
var template = "<%= grunt.template.today('mmmm d, yyyy') %> - v<%= pkg.version %>\n\n" +
435-
prettyPrint + "\n\n" +
436-
grunt.file.read(files[0]);
437-
438-
grunt.file.write(files[0], grunt.template.process(template));
439-
440-
done();
441-
});
442-
});
443-
444-
});
445-
446-
//Run test suite through rhino
447-
grunt.registerMultiTask("test_rhino", "Run the test suite through rhino", function() {
448-
var done = this.async();
449-
var files = this.filesSrc;
450-
var progress = files.length;
451-
452-
files.forEach(function(filepath) {
453-
grunt.util.spawn({
454-
cmd: "java",
455-
args: ["-jar", "lib/js.jar", "lib/yuitest-rhino-cli.js", "build/csslint.js", filepath],
456-
opts: {stdio: "inherit"}
457-
}, function() {
458-
progress--;
459-
if (progress === 0) {
460-
done();
461-
}
462-
});
463-
});
464-
});
465234
};

src/rules/order-alphabetical.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,21 @@ CSSLint.addRule({
2020
properties = [];
2121
};
2222

23+
var endRule = function(event){
24+
var currentProperties = properties.join(","),
25+
expectedProperties = properties.sort().join(",");
26+
27+
if (currentProperties !== expectedProperties){
28+
reporter.report("Rule doesn't have all its properties in alphabetical ordered.", event.line, event.col, rule);
29+
}
30+
};
31+
2332
parser.addListener("startrule", startRule);
2433
parser.addListener("startfontface", startRule);
2534
parser.addListener("startpage", startRule);
2635
parser.addListener("startpagemargin", startRule);
2736
parser.addListener("startkeyframerule", startRule);
37+
parser.addListener("startviewport", startRule);
2838

2939
parser.addListener("property", function(event){
3040
var name = event.property.text,
@@ -33,14 +43,12 @@ CSSLint.addRule({
3343
properties.push(lowerCasePrefixLessName);
3444
});
3545

36-
parser.addListener("endrule", function(event){
37-
var currentProperties = properties.join(","),
38-
expectedProperties = properties.sort().join(",");
39-
40-
if (currentProperties !== expectedProperties){
41-
reporter.report("Rule doesn't have all its properties in alphabetical ordered.", event.line, event.col, rule);
42-
}
43-
});
46+
parser.addListener("endrule", endRule);
47+
parser.addListener("endfontface", endRule);
48+
parser.addListener("endpage", endRule);
49+
parser.addListener("endpagemargin", endRule);
50+
parser.addListener("endkeyframerule", endRule);
51+
parser.addListener("endviewport", endRule);
4452
}
4553

4654
});

tasks/changelog.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/* jshint node:true */
2+
module.exports = function( grunt ) {
3+
"use strict";
4+
grunt.registerMultiTask("changelog", "Write the changelog file", function() {
5+
var done = this.async();
6+
var lastTag;
7+
var files = this.filesSrc;
8+
9+
10+
grunt.util.spawn({
11+
cmd: "git",
12+
args: ["tag"]
13+
}, function(error, result) {
14+
//Find the latest git tag
15+
var tags = result.stdout.split("\n"),
16+
semver = tags[0].replace("v","").split("."),
17+
major = parseInt(semver[0], 10),
18+
minor = parseInt(semver[1], 10),
19+
patch = parseInt(semver[2], 10);
20+
21+
//A simple array sort can't be used because of the comparison of
22+
//the strings "0.9.9" > "0.9.10"
23+
for (var i = 1, len = tags.length; i < len; i++) {
24+
semver = tags[i].replace("v", "").split(".");
25+
26+
var currentMajor = parseInt(semver[0], 10);
27+
if (currentMajor < major) {
28+
continue;
29+
} else if (currentMajor > major) {
30+
major = currentMajor;
31+
}
32+
33+
var currentMinor = parseInt(semver[1], 10);
34+
if (currentMinor < minor) {
35+
continue;
36+
} else if (currentMinor > minor) {
37+
minor = currentMinor;
38+
}
39+
40+
var currentPatch = parseInt(semver[2], 10);
41+
if (currentPatch < patch) {
42+
continue;
43+
} else if (currentPatch > patch) {
44+
patch = currentPatch;
45+
}
46+
}
47+
48+
lastTag = "v" + major + "." + minor + "." + patch;
49+
50+
grunt.verbose.write("Last tag: " + lastTag).writeln();
51+
52+
//
53+
grunt.util.spawn({
54+
cmd: "git",
55+
args: ["log", "--pretty=format:'* %s (%an)'", lastTag + "..HEAD"]
56+
}, function(error, result) {
57+
var prettyPrint = result.stdout.split("'\n'").join("\n").replace(/\"$/, "").replace(/^\"/, "");
58+
59+
grunt.verbose.writeln().write(prettyPrint).writeln();
60+
61+
var template = "<%= grunt.template.today('mmmm d, yyyy') %> - v<%= pkg.version %>\n\n" +
62+
prettyPrint + "\n\n" +
63+
grunt.file.read(files[0]);
64+
65+
grunt.file.write(files[0], grunt.template.process(template));
66+
67+
done();
68+
});
69+
});
70+
71+
});
72+
};

0 commit comments

Comments
 (0)