-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathmain_test.js
More file actions
99 lines (82 loc) · 3.53 KB
/
main_test.js
File metadata and controls
99 lines (82 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
const test = require('node:test');
const assert = require('assert');
const fs = require('fs');
// 模擬 fs.readFile
function mockReadFile(path, encoding, callback) {
callback(null, 'Alice\nBob\nCharlie'); // Stub
}
const mockFsRead = test.mock.method(fs, 'readFile', mockReadFile);
const { Application, MailSystem } = require('./main');
test('MailSystem: write()', () => {
const mailSystem = new MailSystem;
assert.strictEqual(mailSystem.write('Alice'), 'Congrats, Alice!');
});
test('MailSystem: send() success case', () => {
function returnHigh() { return 0.9; } // Stub
const mailSystem = new MailSystem();
const mockRandom = test.mock.method(Math, 'random', returnHigh);
assert.strictEqual(mailSystem.send('Alice', 'Congrats, Alice!'), true);
mockRandom.mock.restore();
});
test('MailSystem: send() failure case', () => {
function returnLow() { return 0.1; } // Stub
const mailSystem = new MailSystem();
const mockRandom = test.mock.method(Math, 'random', returnLow);
assert.strictEqual(mailSystem.send('Alice', 'Congrats, Alice!'), false);
mockRandom.mock.restore();
});
test('Application: constructor initializes names', async () => {
const app = new Application();
await new Promise((resolve) => setTimeout(resolve, 10)); // Wait for async init
assert.deepStrictEqual(app.people, ['Alice', 'Bob', 'Charlie']);
assert.deepStrictEqual(app.selected, []);
});
test('Application: getRandomPerson()', () => {
function returnFirst() { return 0; }
const app = new Application();
const mockRandom = test.mock.method(Math, 'random', returnFirst);
assert.strictEqual(app.getRandomPerson(), 'Alice');
mockRandom.mock.restore();
});
test('Application: selectNextPerson()', async () => {
const application = new Application();
await new Promise(resolve => setTimeout(resolve, 50));
function returnApple() {
return 'Apple';
}
const mockrandompersonA = test.mock.method(application, 'getRandomPerson', returnApple);
assert.strictEqual(application.selectNextPerson(), 'Apple');
assert.deepStrictEqual(application.selected, ['Apple']);
mockrandompersonA.mock.restore();
let cnt = 0;
function returnAppleThenBanana() {
return cnt++ === 0 ? 'Apple' : 'Banana';
}
const mockrandompersonAB = test.mock.method(application, 'getRandomPerson', returnAppleThenBanana);
assert.strictEqual(application.selectNextPerson(), 'Banana');
assert.deepStrictEqual(application.selected, ['Apple', 'Banana']);
mockrandompersonAB.mock.restore();
function returnOrange() {
return 'Orange';
}
const mockrandompersonO = test.mock.method(application, 'getRandomPerson', returnOrange);
assert.strictEqual(application.selectNextPerson(), 'Orange');
assert.deepStrictEqual(application.selected, ['Apple', 'Banana', 'Orange']);
mockrandompersonO.mock.restore();
assert.strictEqual(application.selectNextPerson(), null);
});
test('Application: notifySelected()', () => {
const app = new Application();
app.selected = ['Alice', 'Bob'];
const mockWrite = test.mock.method(app.mailSystem, 'write');
const mockSend = test.mock.method(app.mailSystem, 'send');
app.notifySelected();
assert.strictEqual(mockWrite.mock.callCount(), 2);
assert.strictEqual(mockSend.mock.callCount(), 2);
mockWrite.mock.restore();
mockSend.mock.restore();
});
=======
const { Application, MailSystem } = require('./main');
// TODO: write your tests here
// Remember to use Stub, Mock, and Spy when necessary