|
1 | | -import {h, build, Color} from 'ink'; |
2 | | -import renderToString from 'ink/lib/render-to-string'; |
3 | | -import {stub} from 'sinon'; |
| 1 | +import EventEmitter from 'events'; |
| 2 | +import React from 'react'; |
| 3 | +import {render} from 'ink'; |
| 4 | +import {spy} from 'sinon'; |
4 | 5 | import spinners from 'cli-spinners'; |
5 | 6 | import test from 'ava'; |
| 7 | +import delay from 'delay'; |
6 | 8 | import Spinner from '.'; |
7 | 9 |
|
8 | | -test('render', t => { |
9 | | - let component; |
| 10 | +test('render spinner', async t => { |
| 11 | + const stdout = { |
| 12 | + columns: 100, |
| 13 | + write: spy() |
| 14 | + }; |
10 | 15 |
|
11 | | - function setRef(ref) { |
12 | | - component = ref; |
13 | | - } |
| 16 | + const stdin = new EventEmitter(); |
| 17 | + stdin.setRawMode = () => {}; |
| 18 | + stdin.setEncoding = () => {}; |
| 19 | + stdin.pause = () => {}; |
14 | 20 |
|
15 | 21 | const spinner = spinners.dots; |
16 | | - let tree; |
| 22 | + const app = render(<Spinner/>, { |
| 23 | + stdout, |
| 24 | + stdin, |
| 25 | + debug: true |
| 26 | + }); |
17 | 27 |
|
18 | | - for (let frame = 0; frame < spinner.frames.length; frame++) { |
19 | | - tree = build(<Spinner ref={setRef}/>, tree); |
20 | | - t.is(renderToString(tree), spinner.frames[frame]); |
| 28 | + await delay(spinner.frames.length * spinner.interval); |
| 29 | + app.unmount(); |
21 | 30 |
|
22 | | - component.setState({ |
23 | | - frame: frame + 1 |
24 | | - }); |
25 | | - } |
26 | | -}); |
27 | | - |
28 | | -test('pass props to <Color>', t => { |
29 | | - const spinner = spinners.dots; |
30 | | - |
31 | | - const actual = build(<Spinner green/>); |
32 | | - const expected = build(<Color green>{spinner.frames[0]}</Color>); |
33 | | - |
34 | | - t.is(renderToString(actual), renderToString(expected)); |
35 | | -}); |
36 | | - |
37 | | -test('spin', t => { |
38 | | - stub(Spinner.prototype, 'setState'); |
39 | | - |
40 | | - let component; |
41 | | - |
42 | | - function setRef(ref) { |
43 | | - component = ref; |
44 | | - } |
45 | | - |
46 | | - build(<Spinner ref={setRef}/>); |
47 | | - |
48 | | - const spinner = spinners.dots; |
49 | | - |
50 | | - let frame = 1; |
51 | | - let i = 0; |
52 | | - |
53 | | - while (i < spinner.frames.length * 2) { |
54 | | - component.switchFrame(); |
55 | | - |
56 | | - t.deepEqual(component.setState.getCall(i).args[0], {frame}); |
57 | | - component.state = {frame}; |
| 31 | + const allFrames = stdout.write.args.map(args => args[0]); |
| 32 | + const frames = [...new Set(allFrames)]; |
58 | 33 |
|
59 | | - frame = frame === spinner.frames.length - 1 ? 0 : frame + 1; |
60 | | - i++; |
61 | | - } |
| 34 | + t.deepEqual(frames, spinner.frames); |
| 35 | + t.pass(); |
62 | 36 | }); |
0 commit comments