Skip to content

Commit b1b58d2

Browse files
authored
Merge pull request #1 from aifarfa/reverse-words
Reverse words
2 parents 4b21392 + c6ef462 commit b1b58d2

File tree

7 files changed

+225
-1
lines changed

7 files changed

+225
-1
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"babel-core": "^6.18.2",
1919
"babel-preset-latest": "^6.16.0",
2020
"chai": "^3.5.0",
21-
"mocha": "^3.2.0"
21+
"mocha": "^3.2.0",
22+
"testdouble": "^1.9.0"
2223
}
2324
}

src/reverse-words/B-large-practice.in

Lines changed: 101 additions & 0 deletions
Large diffs are not rendered by default.

src/reverse-words/B-small-practice.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
5
2+
this is a test
3+
foobar
4+
all your base
5+
class
6+
pony along

src/reverse-words/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import reverseWords from './reverse-words.js'
2+
import path from 'path'
3+
4+
const args = process.argv.slice(2)
5+
const filename = args[0] || path.resolve('./src/reverse-words/B-large-practice.in')
6+
reverseWords(filename)

src/reverse-words/reverse-words.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as io from '../utils/io.js'
2+
3+
const readLine = (txt) => txt.split('\n').slice(1)
4+
5+
const notEmpty = txt => txt && txt.length
6+
7+
export const reverseLine = (line) => line.split(' ').reverse().join(' ').trim()
8+
9+
export const reverse = (data) => readLine(data).map(reverseLine).filter(notEmpty)
10+
11+
export const formatOutput = (lines) => lines
12+
.map((line, index) => `Case #${index + 1}: ${line}`)
13+
.join(io.endOfLine())
14+
15+
export default(file) => io.readAsString(file)
16+
.then(reverse)
17+
.then(formatOutput)
18+
.then(result => io.writeFile(result))
19+
// .catch(e => console.error(e))

src/utils/io.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import * as fs from 'fs'
2+
import {EOL} from 'os'
3+
4+
export const endOfLine = () => EOL
5+
6+
const readAsync = (file) => (resolve, reject) => fs.readFile(file, (err, data) => {
7+
if (err) {
8+
reject(err)
9+
} else {
10+
resolve(data.toString())
11+
}
12+
})
13+
14+
const writeAsync = (text) => (resolve, reject) => fs.writeFile('output.log', text, (err) => {
15+
if (err) {
16+
reject(err)
17+
} else {
18+
resolve()
19+
}
20+
})
21+
22+
export const readAsString = (file) => new Promise(readAsync(file))
23+
export const writeFile = (text) => new Promise(writeAsync(text))

test/reverse-words.spec.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import {expect} from 'chai'
2+
import td from 'testdouble'
3+
import * as io from '../src/utils/io.js'
4+
import reverseWords, {reverse, reverseLine, formatOutput} from '../src/reverse-words/reverse-words.js'
5+
6+
describe('reverse words', () => {
7+
8+
beforeEach(function(){
9+
let eol = td.replace(io, 'endOfLine')
10+
td.when(eol()).thenReturn('\n')
11+
})
12+
13+
afterEach(function(){
14+
td.reset()
15+
})
16+
17+
it('inject EOL', () => {
18+
const eol = io.endOfLine()
19+
expect(eol).to.eq('\n')
20+
})
21+
22+
it('reverse line', () => {
23+
expect(reverseLine('this is a test')).to.eq('test a is this')
24+
})
25+
26+
it('do not reverse single word', () => {
27+
expect(reverseLine('foobar')).to.eq('foobar')
28+
})
29+
30+
it('trim white space', () => {
31+
expect(reverseLine(' bar bazz ')).to.eq('bazz bar')
32+
})
33+
34+
it('formatOutput', () => {
35+
const raw = ['foobar', 'boo', 'baz']
36+
const result = formatOutput(raw)
37+
expect(result).to.eq(`Case #1: foobar\nCase #2: boo\nCase #3: baz`)
38+
})
39+
40+
it('reverse words order', () => {
41+
const input = `3
42+
this is a test
43+
foobar
44+
all your base`
45+
const result = reverse(input)
46+
47+
expect(result).to.have.length(3)
48+
expect(result[0]).to.eq('test a is this')
49+
expect(result[1]).to.eq('foobar')
50+
expect(result[2]).to.eq('base your all')
51+
})
52+
53+
it('reverseWords', () => {
54+
const readAsString = td.replace(io, 'readAsString')
55+
const writeFile = td.replace(io, 'writeFile')
56+
const input = `3
57+
this is a test
58+
foobar
59+
all your base`
60+
61+
td.when(readAsString('input.file')).thenReturn(Promise.resolve(input))
62+
63+
return reverseWords('input.file').then(() => {
64+
td.verify(writeFile(`Case #1: test a is this\nCase #2: foobar\nCase #3: base your all`))
65+
})
66+
})
67+
68+
})

0 commit comments

Comments
 (0)