Skip to content

Commit dc2c6e8

Browse files
committed
Merge pull request #47 from SomeoneWeird/refactor-compare
Refactor comparison function.
2 parents b0f445f + 4f94db9 commit dc2c6e8

65 files changed

Lines changed: 723 additions & 291 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

compare-solution.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
require("colors");
2+
3+
var path = require("path");
4+
var diff = require("diff");
5+
var run = require(path.join(__dirname, "run-solution"));
6+
7+
module.exports = function(solution, attempt, cb) {
8+
9+
run(solution, function(err, solutionResult) {
10+
11+
if(err) {
12+
console.error(err);
13+
return cb(false);
14+
}
15+
16+
run(attempt, function(err, attemptResult) {
17+
18+
if(err) {
19+
if(err.code !== 8) {
20+
console.error(err);
21+
}
22+
return cb(false);
23+
}
24+
25+
if(solutionResult === attemptResult) {
26+
return cb(true);
27+
}
28+
29+
cb(false, {
30+
solution: solutionResult,
31+
attempt: attemptResult,
32+
diff: generateDiff(solutionResult, attemptResult)
33+
});
34+
35+
});
36+
37+
});
38+
39+
}
40+
41+
function generateDiff(solution, attempt) {
42+
43+
var parts = diff.diffChars(solution, attempt);
44+
45+
var result = "";
46+
47+
parts.forEach(function(part) {
48+
49+
if(part.added) {
50+
result += part.value["bgRed"];
51+
} else if(part.removed) {
52+
result += part.value["bgGreen"];
53+
} else {
54+
result += part.value;
55+
}
56+
57+
});
58+
59+
return result;
60+
61+
}

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
"preferGlobal": true,
1313
"dependencies": {
1414
"adventure": "^2.8.0",
15-
"cli-md": "^0.1.0"
15+
"cli-md": "^0.1.0",
16+
"colors": "^1.0.3",
17+
"diff": "^1.2.1"
1618
}
1719
}

problems/array-filtering/index.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,41 @@
11
var path = require('path');
22
var getFile = require('../../get-file');
3-
var run = require('../../run-solution');
3+
var compare = require('../../compare-solution');
44

5-
exports.problem = getFile(path.join(__dirname, 'problem.md'));
5+
var problemName = __dirname.split('/');
6+
problemName = problemName[problemName.length-1];
67

8+
exports.problem = getFile(path.join(__dirname, 'problem.md'));
79
exports.solution = getFile(path.join(__dirname, 'solution.md'));
810

9-
exports.fail = getFile(path.join(__dirname, 'troubleshooting.md'));
11+
var solutionPath = path.resolve(__dirname, "../../solutions", problemName, "index.js");
12+
var troubleshootingPath = path.resolve(__dirname, "../../troubleshooting.md");
1013

1114
exports.verify = function (args, cb) {
12-
run(args[0], function (err, result) {
13-
var expected = "[ 2, 4, 6, 8, 10 ]\n";
14-
if (result === expected) cb(true);
15-
else cb(false);
15+
16+
var attemptPath = path.resolve(process.cwd(), args[0]);
17+
compare(solutionPath, attemptPath, function(match, obj) {
18+
19+
if(match) {
20+
return cb(true);
21+
}
22+
23+
if(!obj) {
24+
// An error occured, we've already printed an error
25+
return;
26+
}
27+
28+
var message = getFile(troubleshootingPath);
29+
30+
message = message.replace(/%solution%/g, obj.solution);
31+
message = message.replace(/%attempt%/g, obj.attempt);
32+
message = message.replace(/%diff%/g, obj.diff);
33+
message = message.replace(/%filename%/g, args[0]);
34+
35+
exports.fail = message;
36+
37+
cb(false);
38+
1639
});
1740
};
1841

problems/array-filtering/readme.md

Whitespace-only changes.

problems/array-filtering/troubleshooting.md

Lines changed: 0 additions & 7 deletions
This file was deleted.

problems/arrays/index.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,41 @@
11
var path = require('path');
22
var getFile = require('../../get-file');
3-
var run = require('../../run-solution');
3+
var compare = require('../../compare-solution');
44

5-
exports.problem = getFile(path.join(__dirname, 'problem.md'));
5+
var problemName = __dirname.split('/');
6+
problemName = problemName[problemName.length-1];
67

8+
exports.problem = getFile(path.join(__dirname, 'problem.md'));
79
exports.solution = getFile(path.join(__dirname, 'solution.md'));
810

9-
exports.fail = getFile(path.join(__dirname, 'troubleshooting.md'));
11+
var solutionPath = path.resolve(__dirname, "../../solutions", problemName, "index.js");
12+
var troubleshootingPath = path.resolve(__dirname, "../../troubleshooting.md");
1013

1114
exports.verify = function (args, cb) {
12-
run(args[0], function (err, result) {
13-
var expected = "[ 'tomato sauce', 'cheese', 'pepperoni' ]\n";
14-
if (result && result.replace('"', "'") === expected) cb(true);
15-
else cb(false);
15+
16+
var attemptPath = path.resolve(process.cwd(), args[0]);
17+
compare(solutionPath, attemptPath, function(match, obj) {
18+
19+
if(match) {
20+
return cb(true);
21+
}
22+
23+
if(!obj) {
24+
// An error occured, we've already printed an error
25+
return;
26+
}
27+
28+
var message = getFile(troubleshootingPath);
29+
30+
message = message.replace(/%solution%/g, obj.solution);
31+
message = message.replace(/%attempt%/g, obj.attempt);
32+
message = message.replace(/%diff%/g, obj.diff);
33+
message = message.replace(/%filename%/g, args[0]);
34+
35+
exports.fail = message;
36+
37+
cb(false);
38+
1639
});
1740
};
1841

problems/arrays/readme.md

Whitespace-only changes.

problems/arrays/troubleshooting.md

Lines changed: 0 additions & 7 deletions
This file was deleted.

problems/for-loop/index.js

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,41 @@
11
var path = require('path');
22
var getFile = require('../../get-file');
3-
var run = require('../../run-solution');
3+
var compare = require('../../compare-solution');
44

5-
exports.problem = getFile(path.join(__dirname, 'problem.md'));
5+
var problemName = __dirname.split('/');
6+
problemName = problemName[problemName.length-1];
67

8+
exports.problem = getFile(path.join(__dirname, 'problem.md'));
79
exports.solution = getFile(path.join(__dirname, 'solution.md'));
810

9-
exports.fail = getFile(path.join(__dirname, 'troubleshooting.md'));
11+
var solutionPath = path.resolve(__dirname, "../../solutions", problemName, "index.js");
12+
var troubleshootingPath = path.resolve(__dirname, "../../troubleshooting.md");
1013

1114
exports.verify = function (args, cb) {
12-
run(args[0], function (err, result) {
13-
if (/^45\n$/.test(result)) cb(true);
14-
else cb(false);
15+
16+
var attemptPath = path.resolve(process.cwd(), args[0]);
17+
compare(solutionPath, attemptPath, function(match, obj) {
18+
19+
if(match) {
20+
return cb(true);
21+
}
22+
23+
if(!obj) {
24+
// An error occured, we've already printed an error
25+
return;
26+
}
27+
28+
var message = getFile(troubleshootingPath);
29+
30+
message = message.replace(/%solution%/g, obj.solution);
31+
message = message.replace(/%attempt%/g, obj.attempt);
32+
message = message.replace(/%diff%/g, obj.diff);
33+
message = message.replace(/%filename%/g, args[0]);
34+
35+
exports.fail = message;
36+
37+
cb(false);
38+
1539
});
1640
};
1741

problems/for-loop/readme.md

Whitespace-only changes.

0 commit comments

Comments
 (0)