Permalink
Please sign in to comment.
Showing
with
194 additions
and 48 deletions.
- +1 −2 .travis.yml
- +8 −1 package.json
- +0 −1 seed/challenges/advanced-bonfires.json
- +30 −5 seed/challenges/angularjs.json
- +2 −6 seed/challenges/basic-bonfires.json
- +21 −22 seed/challenges/intermediate-bonfires.json
- +19 −0 seed/getChallenges.js
- +5 −11 seed/index.js
- +108 −0 seed/test-challenges.js
3
.travis.yml
@@ -1,7 +1,6 @@ | |||
language: node_js | language: node_js | ||
node_js: | node_js: | ||
- - 'node' | + - '4.2.1' | ||
- - '1.6.4' | |||
sudo: false | sudo: false |
9
package.json
1
seed/challenges/advanced-bonfires.json
35
seed/challenges/angularjs.json
8
seed/challenges/basic-bonfires.json
43
seed/challenges/intermediate-bonfires.json
19
seed/getChallenges.js
@@ -0,0 +1,19 @@ | |||
+var fs = require('fs'); | |||
+var path = require('path'); | |||
+ | |||
+ | |||
+function getFilesFor(dir) { | |||
+ return fs.readdirSync(path.join(__dirname, '/' + dir)); | |||
+} | |||
+ | |||
+module.exports = function getChallenges() { | |||
+ try { | |||
+ return getFilesFor('challenges') | |||
+ .map(function(file) { | |||
+ return require('./challenges/' + file); | |||
+ }); | |||
+ } catch (e) { | |||
+ console.log('error', e); | |||
+ return []; | |||
+ } | |||
+}; |
16
seed/index.js
108
seed/test-challenges.js
@@ -0,0 +1,108 @@ | |||
+/* eslint-disable no-eval, no-process-exit */ | |||
+import _ from 'lodash'; | |||
+import { Observable } from 'rx'; | |||
+import tape from 'tape'; | |||
+import getChallenges from './getChallenges'; | |||
+ | |||
+ | |||
+function createIsAssert(t, isThing) { | |||
+ const { assert } = t; | |||
+ return function() { | |||
+ const args = [...arguments]; | |||
+ args[0] = isThing(args[0]); | |||
+ assert.apply(t, args); | |||
+ }; | |||
+} | |||
+ | |||
+function fillAssert(t) { | |||
+ const assert = t.assert; | |||
+ | |||
+ assert.isArray = createIsAssert(t, _.isArray); | |||
+ assert.isBoolean = createIsAssert(t, _.isBoolean); | |||
+ assert.isString = createIsAssert(t, _.isString); | |||
+ assert.isNumber = createIsAssert(t, _.isNumber); | |||
+ assert.isUndefined = createIsAssert(t, _.isUndefined); | |||
+ | |||
+ assert.deepEqual = t.deepEqual; | |||
+ assert.equal = t.equal; | |||
+ assert.strictEqual = t.equal; | |||
+ | |||
+ assert.sameMembers = function sameMembers() { | |||
+ const [ first, second, ...args] = arguments; | |||
+ assert.apply( | |||
+ t, | |||
+ [ | |||
+ _.difference(first, second).length === 0 && | |||
+ _.difference(second, first).length === 0 | |||
+ ].concat(args) | |||
+ ); | |||
+ }; | |||
+ | |||
+ assert.includeMembers = function includeMembers() { | |||
+ const [ first, second, ...args] = arguments; | |||
+ assert.apply(t, [_.difference(second, first).length === 0].concat(args)); | |||
+ }; | |||
+ | |||
+ assert.match = function match() { | |||
+ const [value, regex, ...args] = arguments; | |||
+ assert.apply(t, [regex.test(value)].concat(args)); | |||
+ }; | |||
+ | |||
+ return assert; | |||
+} | |||
+ | |||
+function createTest({ title, tests = [], solutions = [] }) { | |||
+ const plan = tests.length; | |||
+ return Observable.fromCallback(tape)(title) | |||
+ .doOnNext(t => solutions.length ? t.plan(plan) : t.end()) | |||
+ .flatMap(t => { | |||
+ if (solutions.length <= 0) { | |||
+ t.comment('No solutions for ' + title); | |||
+ return Observable.just({ | |||
+ title, | |||
+ type: 'missing' | |||
+ }); | |||
+ } | |||
+ | |||
+ return Observable.just(t) | |||
+ .map(fillAssert) | |||
+ /* eslint-disable no-unused-vars */ | |||
+ // assert is used within the eval | |||
+ .doOnNext(assert => { | |||
+ /* eslint-enable no-unused-vars */ | |||
+ solutions.forEach(solution => { | |||
+ tests.forEach(test => { | |||
+ eval(solution + ';;' + test); | |||
+ }); | |||
+ }); | |||
+ }) | |||
+ .map(() => ({ title })); | |||
+ }); | |||
+} | |||
+ | |||
+Observable.from(getChallenges()) | |||
+ .flatMap(challengeSpec => { | |||
+ return Observable.from(challengeSpec.challenges); | |||
+ }) | |||
+ .flatMap(challenge => { | |||
+ return createTest(challenge); | |||
+ }) | |||
+ .map(({ title, type }) => { | |||
+ if (type === 'missing') { | |||
+ return title; | |||
+ } | |||
+ return false; | |||
+ }) | |||
+ .filter(title => !!title) | |||
+ .toArray() | |||
+ .subscribe( | |||
+ (noSolutions) => { | |||
+ console.log( | |||
+ '# These challenges have no solutions\n- [ ] ' + | |||
+ noSolutions.join('\n- [ ] ') | |||
+ ); | |||
+ }, | |||
+ err => { throw err; }, | |||
+ () => process.exit(0) | |||
+ ); | |||
+ |
0 comments on commit
921080f