Skip to content

Commit 53ab8e1

Browse files
authored
Merge branch 'master' into solutions
2 parents f4deaa5 + 03b12ac commit 53ab8e1

5 files changed

Lines changed: 154 additions & 121 deletions

File tree

KataParser.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,21 @@ const _ = {
4141

4242
};
4343

44-
44+
// Paste the languages into the array
4545
let languages = [
4646
`JavaScript`,
4747
`CoffeeScript`,
4848
`Crystal`,
4949
`Python`,
5050
`Ruby`
5151
];
52-
52+
// Paste the tags into the array
5353
let tags = [
5454
`FUNDAMENTALS`,
5555
`STRINGS`,
5656
];
5757

58-
58+
// Paste the Test Suite here
5959
let tests = [
6060
`
6161
Test.describe("generateRange(2, 10, 2)", function() {
@@ -104,11 +104,14 @@ Test.describe("generateRange for random", function() {
104104

105105
];
106106

107+
108+
// Paste the example script here
107109
let examples = [
108110
`Test.assertSimilar(generateRange(2, 10, 2), [2,4,6,8,10]);`,
109111
`Test.assertSimilar(generateRange(1, 10, 1), [1,2,3,4,5,6,7,8,9,10]);`,
110112
];
111113

114+
// Introduction to the Kata Here
112115
let description =
113116
`Modify the kebabize function so that it converts a camel case string into a kebab case.
114117
@@ -118,22 +121,23 @@ Notes:
118121
119122
the returned string should only contain lowercase letters
120123
`;
121-
124+
// Paste the starting script here
122125
let startScript = `function generateRange(min, max, step){}`;
123126

127+
128+
// Paste your winning script here
124129
let winScript = `
125-
function generateRange(min, max, step){
126-
let arr = [];
127-
for (let i=min; i<=max; i += step) {
128-
arr.push(i);
129-
}
130-
return arr;
130+
function kebabize(str) {
131+
return str.replace(/[^a-z]/ig, '').
132+
replace(/^[A-Z]/, c => c.toLowerCase()).
133+
replace(/[A-Z]/g, c => \`-\${c.toLowerCase()}\`);
131134
}
132135
133136
`;
134137

135138

136-
139+
// When this js file is ran you will get an output in your console of all the info in a format
140+
// ready to go into the Sql DB Start files to then copy into those tables
137141
console.log('\nTags');
138142
console.log(_.JSON(tags));
139143
console.log('\nLanguages');

controllers/testCtrl.js

Lines changed: 123 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -6,73 +6,125 @@
66
*/
77

88

9-
let test = {
10-
type: `test`,
11-
value: `Test Passed: Value == 'Some Value'`,
12-
passed: true
13-
};
14-
let it = {
15-
type: `it`,
16-
value: `Fixed tests or random tests`,
17-
time: 2, //Milliseconds
18-
array: [test]
19-
};
20-
let describe = {
21-
type: `describe`,
22-
value: `Tests of something`,
23-
time: 2, //Milliseconds
24-
array: [it]
25-
};
26-
let main = {
27-
array: [describe],
28-
testCount: 1,
29-
passedCount: 1
30-
};
9+
const app = require('../server');
10+
const db = app.get('db');
11+
const Q = require('q');
12+
const exec = require('child_process').exec;
3113

3214

3315

16+
function timeParser(str) {
17+
str = str.replace(/<COMPLETEDIN::>/, '');
18+
if (!parseInt(str)) {
19+
return 0
20+
} else {
21+
return parseInt(str)
22+
}
23+
}
3424

3525

36-
let exampleRes = {
37-
array: [
38-
describe,
39-
it,
40-
test,
41-
{
42-
type: `test`,
43-
value: `Test Passed: Value == 'Some Value'`,
44-
passed: false
45-
},
46-
47-
],
48-
testCount: 4,
49-
passedcount: 3
50-
};
5126

52-
const app = require('../server');
53-
const db = app.get('db');
54-
const Q = require('q');
55-
const exec = require('child_process').exec;
27+
function objectifer(arr) {
28+
return arr.map((ele, i) => {
29+
if (ele.search(/<DESCRIBE::>/) > -1) {
30+
return {
31+
type: `describe`,
32+
value: ele.replace(/<DESCRIBE::>/, ''),
33+
time: null,
34+
nest: []
35+
}
36+
37+
} else if (ele.search(/<IT::>/) > -1) {
38+
return {
39+
type: `it`,
40+
value: ele.replace(/<IT::>/, ''),
41+
time: null,
42+
nest: []
43+
}
44+
45+
} else if (ele.search(/<PASSED::>/) > -1) {
46+
return {
47+
type: 'test',
48+
passed: true,
49+
value: ele.replace(/<PASSED::>/, ''),
50+
}
51+
} else if (ele.search(/<FAILED::>/) > -1) {
52+
return {
53+
type: 'test',
54+
passed: false,
55+
value: ele.replace(/<FAILED::>/, ''),
56+
}
57+
58+
} else if (ele.search(/<COMPLETEDIN::>/) > -1) {
59+
return {type: 'completed', time: timeParser(ele)}
60+
}
61+
});
62+
}
63+
64+
65+
66+
function nester(arr) {
67+
let count = 0;
68+
let testCount = 0;
69+
let passCount = 0;
70+
for (let i = arr.length - 1; i >= 0; i--) {
71+
if (arr[i].type === 'describe' || arr[i].type === 'it') {
72+
73+
count += 1;
74+
let j = i + 1;
75+
let recurs = true;
76+
while (recurs) {
77+
78+
if (arr[j].type !== 'completed') {
79+
if (arr[j].type == 'it') count += 1;
80+
if (arr[j].type == 'test') {
81+
testCount += 1;
82+
if (arr[j].passed == true) passCount += 1
83+
}
84+
85+
arr[i].nest.push(arr.splice(j, 1))
86+
} else {
87+
count -= 1;
88+
arr.splice(j, 1);
89+
recurs = false
90+
91+
}
92+
93+
94+
}
95+
}
96+
}
97+
98+
99+
100+
return {
101+
nest: arr,
102+
testCount: testCount,
103+
passCount: passCount
104+
}
105+
}
56106

57107

58108

59109
function testRunner(script, test) {
60110
let defer = Q.defer();
61111

112+
62113
exec(`docker run --rm codewars/node-runner run -l javascript -c "${script}" -t cw -f "${test}"`,
63114
(err, stdOut, stdErr) => {
64115
if (err) console.log(err);
65116
if (stdErr) {
117+
console.log('stdErr');
66118
console.log(stdErr);
67-
defer.resolve(stdErr);
68119
} else {
69-
console.log(stdOut)
70-
120+
let output = stdOut.split(/\n/g);
121+
for (let i = output.length - 1; i >= 0; i--) if (output[i] === '') output.splice(i, 1);
122+
let newArr = objectifer(output);
123+
newArr = nester(newArr);
124+
defer.resolve(newArr)
71125
}
72-
73-
74-
});
75-
126+
}
127+
);
76128

77129
return defer.promise
78130
}
@@ -81,60 +133,41 @@ function testRunner(script, test) {
81133

82134
module.exports = {
83135
testKata: (req, res, next) => {
84-
85136
let body = req.body;
86137

87-
db.read.kata_for_test([req.params.kataId], (err, kataArray) => {
138+
db.read.kata_for_test([req.params.kataid], (err, kataArray) => {
88139
if (err) console.log(err);
89-
let kata = kataArray[0];
90-
let promiseArr = [];
140+
let test = kataArray[0].test_script[0].test;
91141

92-
kata.test_script.forEach((ele, i) => {
93-
94-
let deffered = Q.defer();
95-
exec(`docker run --rm codewars/node-runner run -l javascript -c "${body.script}" -t cw -f "${ele.test}"`,
96-
(err, stdOut, stdErr) => {
97-
if (err) {
98-
console.log(err);
99-
} else if (stdOut) {
100-
if (stdOut.search(/passed/gi) > 0) {
101-
ele.passed = true
102-
} else {
103-
ele.passed = false;
104-
}
105-
ele.result = stdOut.replace(/</g, '\n<');
106-
deffered.resolve(stdOut);
107-
} else if (stdErr) {
108-
console.log(stdErr);
109-
ele.result = stdErr;
110-
deffered.resolve(stdErr);
111-
}
112-
});
113-
promiseArr.push(deffered.promise)
142+
testRunner(body.script, test).then((response) => {
143+
res.json(response)
114144
});
115-
116-
117-
Q.all(promiseArr).then((response) => {
118-
res.json(kata.test_script);
119-
})
120145
});
121-
122-
123146
},
124147

125148
testExamplesKata: (req, res, next) => {
126149
let body = req.body;
127-
console.log(body.script);
128150

129-
130-
console.log(exampleRes);
131-
res.json(exampleRes)
151+
testRunner(body.script, body.examples).then((response) => {
152+
res.json(response)
153+
});
132154
}
133155
};
134156

135-
136-
137-
138-
139-
157+
158+
159+
function isValidWalk(walk) {
160+
return walk.length == 10 && !walk.reduce(function (w, step) {
161+
return w + {"n": -1, "s": 1, "e": 99, "w": -99}[step]
162+
}, 0)
163+
}
164+
165+
function generateRange(min, max, step) {
166+
let rtn = [];
167+
for (let i = min; i <= max; i += step) {
168+
rtn.push(i)
169+
}
170+
return rtn
171+
}
172+
140173

db/start/katas.sql

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
INSERT INTO katas (kyu, name, tags, languages, starter_code, description, examples, test_script)
2-
VALUES (8, 'Generate range of integers', '["ALGORITHMS"]', '["Javascript","C#","Elixir"]', 'function generateRange(min, max, step){}', 'Implement a function named generateRange(min, max, step), which takes three arguments and generates a range of integers from min to max, with the step. The first integer is the minimum value, the second is the maximum of the range and the third is the step. (min < max)', '[{"test":"Test.assertSimilar(generateRange(2, 10, 2), [2,4,6,8,10]);","result":""}]','[{"test":" Test.describe(''generateRange(2, 10, 2)'', function() { Test.assertSimilar(generateRange(2, 10, 2), [2,4,6,8,10]); }); Test.describe(''generateRange(1, 10, 3)'', function() { Test.assertSimilar(generateRange(1, 10, 3), [1,4,7,10]); }); Test.describe(''generateRange(1, 10, 1)'', function() { Test.assertSimilar(generateRange(1, 10, 1), [1,2,3,4,5,6,7,8,9,10]); }); Test.describe(''generateRange(1, 10, 4)'', function() { Test.assertSimilar(generateRange(1, 10, 4), [1,5,9]); }); Test.describe(''generateRange(1, 10, 5)'', function() { Test.assertSimilar(generateRange(1, 10, 5), [1,6]); }); Test.describe(''generateRange for random'', function() { var generateRandom = function(min, max){ return Math.floor(Math.random() * max) + min; }; var range = function(min, max, step){ var z = []; for(var i = min; i <= max; i += step){ z.push(i); } return z; }; for(var i = 0; i < 10; i++){ var randomMax = generateRandom(30, 100), randomMin = generateRandom(1, 20), randomStep = generateRandom(1, 10); Test.assertSimilar(generateRange(randomMin, randomMax, randomStep), range(randomMin, randomMax, randomStep)); } }); "}]'),
2+
VALUES (8, 'var a should equal 1', 'var a = 1', 'Sumbit This','["Fake"]', '["JavaScript"]', '[{"test":"Test.assertEquals(a, 1)","result":""}]', '[{"test":"Test.assertEquals(a, 0)","result":""},{"test":"Test.assertEquals(a, 2)","result":""},{"test":"Test.assertEquals(a, 1)","result":""}]'),
3+
4+
(8, 'Generate range of integers', '["ALGORITHMS"]', '["Javascript","C#","Elixir"]', 'function generateRange(min, max, step){}', 'Implement a function named generateRange(min, max, step), which takes three arguments and generates a range of integers from min to max, with the step. The first integer is the minimum value, the second is the maximum of the range and the third is the step. (min < max)', '[{"test":"Test.assertSimilar(generateRange(2, 10, 2), [2,4,6,8,10]);","result":""}]','[{"test":" Test.describe(''generateRange(2, 10, 2)'', function() { Test.assertSimilar(generateRange(2, 10, 2), [2,4,6,8,10]); }); Test.describe(''generateRange(1, 10, 3)'', function() { Test.assertSimilar(generateRange(1, 10, 3), [1,4,7,10]); }); Test.describe(''generateRange(1, 10, 1)'', function() { Test.assertSimilar(generateRange(1, 10, 1), [1,2,3,4,5,6,7,8,9,10]); }); Test.describe(''generateRange(1, 10, 4)'', function() { Test.assertSimilar(generateRange(1, 10, 4), [1,5,9]); }); Test.describe(''generateRange(1, 10, 5)'', function() { Test.assertSimilar(generateRange(1, 10, 5), [1,6]); }); Test.describe(''generateRange for random'', function() { var generateRandom = function(min, max){ return Math.floor(Math.random() * max) + min; }; var range = function(min, max, step){ var z = []; for(var i = min; i <= max; i += step){ z.push(i); } return z; }; for(var i = 0; i < 10; i++){ var randomMax = generateRandom(30, 100), randomMin = generateRandom(1, 20), randomStep = generateRandom(1, 10); Test.assertSimilar(generateRange(randomMin, randomMax, randomStep), range(randomMin, randomMax, randomStep)); } }); "}]'),
35

46
(7, 'Descending Order', '["FUNDAMENTALS","FUNCTIONS","CONTROL FLOW","BASIC LANGUAGE FEATURES"]', '["Javascript","C#","Haskell","Java","Clojure","Python","Ruby","Rust","Swift"]', 'function descendingOrder(n){}', 'Descending Order', '[{"test":"Test.assertEquals(descendingOrder(15), 51)","result":""}]', '[{"test":"Test.assertEquals(descendingOrder(0), 0)","result":""},{"test":"Test.assertEquals(descendingOrder(1), 1)","result":""},{"test":"Test.assertEquals(descendingOrder(111), 111)","result":""},{"test":"Test.assertEquals(descendingOrder(15), 51)","result":""},{"test":"Test.assertEquals(descendingOrder(1021), 2110)","result":""},{"test":"Test.assertEquals(descendingOrder(123456789), 987654321)","result":""}]'),
57

@@ -128,3 +130,11 @@ VALUES (1, 2, "function generateRange(min, max, step){
128130
129131
return str;
130132
}"),
133+
(1, 1, 'var a = 1'),
134+
(1,1, 'let a = 1'),
135+
(1, 8, 'function kebabize(str) { return str.replace(/[^a-z]/ig, ''). replace(/^[A-Z]/, c => c.toLowerCase()). replace(/[A-Z]/g, c => `-${c.toLowerCase()}`); }')
136+
;
137+
138+
INSERT INTO ratings (user_id, solution_id, liked)
139+
VALUES (1, 1, true);
140+

db/start/tables.sql

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,3 @@ CREATE TABLE ratings (
4040
INSERT INTO users (github_id, name, email, username, picture_url, points)
4141
VALUES ('12', 'Bob Smith', 'bob@smith.com', 'bobIScool', null, 25);
4242

43-
INSERT INTO katas (kyu, description, starter_code, name, tags, languages, examples, test_script)
44-
VALUES (8, 'var a should equal 1', 'var a = 1', 'Sumbit This','["Fake"]', '["JavaScript"]', '[{"test":"Test.assertEquals(a, 1)","result":""}]', '[{"test":"Test.assertEquals(a, 0)","result":""},{"test":"Test.assertEquals(a, 2)","result":""},{"test":"Test.assertEquals(a, 1)","result":""}]');
45-
46-
INSERT INTO solutions (user_id, kata_id, script)
47-
VALUES (1, 1, 'var a = 1'),
48-
(1,1, 'let a = 1');
49-
50-
INSERT INTO ratings (user_id, solution_id, liked)
51-
VALUES (1, 1, true);

src/components/training/trainingCtrl.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,11 @@ angular.module('app').controller('trainingCtrl', function($scope, $state, mainSe
6565
solutions = solutions.replace(/\n/g, " ");
6666
solutions = solutions.replace(/\s+/g, " ");
6767
var examplesArr = [];
68-
examples = examples.split(/\n/);
69-
examples.forEach(example => examplesArr.push({test: example}));
70-
mainService.testExamples(solutions, examplesArr).then((response) => {
71-
console.log(response.data);
68+
examples = examples.replace(/\n\s*\./g, `.`)
69+
.replace(/\n/g, ` `)
70+
.replace(/\s+/g, ` `);
71+
console.log(examples);
72+
mainService.testExamples(solutions, examples).then((response) => {
7273
});
7374

7475
}
@@ -79,12 +80,6 @@ angular.module('app').controller('trainingCtrl', function($scope, $state, mainSe
7980
solutions = solutions.replace(/\n/g, " ");
8081
solutions = solutions.replace(/\s+/g, " ");
8182
mainService.testSuite(solutions, $scope.kataid).then((response) => {
82-
$scope.passed = true
83-
$scope.output = [];
84-
response.data.forEach((ele, i) => {
85-
$scope.output.push(ele);
86-
if (!ele.passed) {$scope.passed = false}
87-
});
8883
console.log(response.data);
8984
});
9085
};

0 commit comments

Comments
 (0)