mirror of https://github.com/01-edu/public.git
add tell-me-how-many subject + tests
This commit is contained in:
parent
bf744fe353
commit
722d2f5cd6
|
@ -0,0 +1,70 @@
|
|||
import * as cp from 'child_process'
|
||||
import fs from 'fs/promises'
|
||||
import { join, resolve, isAbsolute } from 'path'
|
||||
import { tmpdir } from 'os'
|
||||
import { promisify } from 'util'
|
||||
const mkdir = fs.mkdir
|
||||
const rmdir = fs.rmdir
|
||||
const writeFile = fs.writeFile
|
||||
|
||||
const exec = promisify(cp.exec)
|
||||
|
||||
export const tests = []
|
||||
export const setup = async () => {
|
||||
const randomFilesNumber = Math.floor(Math.random() * (30 - 1) + 1)
|
||||
const dir = tmpdir()
|
||||
|
||||
// check if already exists and rm?
|
||||
await mkdir(`${dir}/random`)
|
||||
for (let i = 0; i < randomFilesNumber; i++) {
|
||||
await writeFile(`${dir}/random/${i}.txt`, '', 'utf8')
|
||||
}
|
||||
|
||||
return { randomFilesNumber, tmpPath: dir }
|
||||
}
|
||||
const countDirLength = async ({ dirLength, arg, ctx, path, eq }) => {
|
||||
const scriptPath = join(resolve(), path)
|
||||
const { stdout } = await exec(`node ${scriptPath} ${arg}`, {
|
||||
cwd: arg ? `${ctx.tmpPath}` : `${ctx.tmpPath}/random`,
|
||||
})
|
||||
|
||||
// await rmdir(`${ctx.tmpPath}/random`, { recursive: true })
|
||||
return eq(Number(stdout.trim()), dirLength)
|
||||
}
|
||||
|
||||
tests.push(async ({ path, eq, ctx }) => {
|
||||
// will execute the script with "random" as an argument
|
||||
// `random` folder has a random file number
|
||||
return countDirLength({
|
||||
path,
|
||||
eq,
|
||||
ctx,
|
||||
arg: 'random',
|
||||
dirLength: ctx.randomFilesNumber,
|
||||
})
|
||||
})
|
||||
|
||||
tests.push(async ({ path, eq, ctx }) => {
|
||||
// will execute the script without argument
|
||||
// in the `random` folder
|
||||
return countDirLength({
|
||||
path,
|
||||
eq,
|
||||
ctx,
|
||||
arg: '',
|
||||
dirLength: ctx.randomFilesNumber,
|
||||
})
|
||||
})
|
||||
|
||||
tests.push(async ({ path, eq, ctx }) => {
|
||||
// will execute the script with `random` folder's absolute path as argument
|
||||
return countDirLength({
|
||||
path,
|
||||
eq,
|
||||
ctx,
|
||||
arg: `${ctx.tmpPath}/random`,
|
||||
dirLength: ctx.randomFilesNumber,
|
||||
})
|
||||
})
|
||||
|
||||
Object.freeze(tests)
|
|
@ -0,0 +1,33 @@
|
|||
## tell-me-how-many
|
||||
|
||||
### Instructions
|
||||
|
||||
Your very special partner's birthday is coming soon. So you've decided to organise a very special party. Invitations has been sent for a while... and good news: answers are back. We didn't count it, you've been too generous. But we saved every one of them as a file in a special folder for you. Have fun!
|
||||
|
||||
Create a `tell-me-how-many.mjs` script that:
|
||||
- takes a relative or absolute folder path as argument from the command line
|
||||
- read this directory path
|
||||
- get the number of entries in this folder
|
||||
- print the result in console
|
||||
|
||||
### Notions
|
||||
|
||||
- [Node file system: `readdir`](https://nodejs.org/api/fs.html#fs_fspromises_readdir_path_options)
|
||||
- [Node path: `isAbsolute`](https://nodejs.org/api/path.html#path_path_isabsolute_path)
|
||||
|
||||
<!-- + check if is directory ?? -->
|
||||
- [Node stat](https://nodejs.org/docs/latest/api/fs.html#fs_fspromises_stat_path_options)
|
||||
- [Node stat: `isDirectory`](https://nodejs.org/docs/latest/api/fs.html#fs_stats_isdirectory)
|
||||
<!--
|
||||
again?
|
||||
- [Node process: `argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv)
|
||||
- [Node path: `resolve`](https://nodejs.org/api/path.html#path_path_resolve_paths)
|
||||
- [Node path: `join`](https://nodejs.org/api/path.html#path_path_join_paths)
|
||||
-->
|
||||
|
||||
|
||||
### Provided files
|
||||
|
||||
Download [`tell-me-how-many.zip`](https://assets.01-edu.org/tell-me-how-many) to have at your disposal the `guests` folder containing the files to count in your script. You must save it in your `tell-me-how-many` exercise folder to test your script on it.
|
||||
|
||||
|
Loading…
Reference in New Issue