Skip to content

Commit 98c2e9d

Browse files
authored
Merge pull request #149 from nanlioniya/313553005
[LAB2] 313553005
2 parents 410ce1d + fa00c55 commit 98c2e9d

1 file changed

Lines changed: 123 additions & 5 deletions

File tree

lab2/main_test.js

Lines changed: 123 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,124 @@
1-
const test = require('node:test');
2-
const assert = require('assert');
3-
const { Application, MailSystem } = require('./main');
1+
const { test } = require('node:test');
2+
const assert = require('node:assert');
3+
const { Application, MailSystem } = require('./main.js');
4+
const fs = require('fs');
5+
6+
/*
7+
function coverage testing:
8+
- MailSystem
9+
- write
10+
- send
11+
- Application
12+
- getNames
13+
- getRandomPerson
14+
- selectNextPerson
15+
- notifySelected
16+
*/
17+
18+
test('MailSystem write test', (t) => {
19+
const mail = new MailSystem();
20+
const result = mail.write('Test');
21+
assert.equal(result, 'Congrats, Test!');
22+
});
23+
24+
// Test Stub
25+
test('MailSystem send test', (t) => {
26+
const mail = new MailSystem();
27+
const originalRandom = Math.random;
28+
29+
// Test success case
30+
Math.random = () => 1;
31+
assert.equal(mail.send('Test', 'content'), true);
32+
33+
// Test failure case
34+
Math.random = () => 0;
35+
assert.equal(mail.send('Test', 'content'), false);
36+
37+
Math.random = originalRandom;
38+
});
39+
40+
// Application tests
41+
test('Application initialization test', async (t) => {
42+
// 準備測試檔案
43+
fs.writeFileSync('name_list.txt', 'Test1\nTest2\nTest3');
44+
45+
try {
46+
const app = new Application();
47+
await new Promise(resolve => setTimeout(resolve, 100)); // 等待初始化完成
48+
49+
assert(Array.isArray(app.people));
50+
assert(Array.isArray(app.selected));
51+
assert.equal(app.people.length, 3);
52+
assert.equal(app.selected.length, 0);
53+
} finally {
54+
// 清理測試檔案
55+
fs.unlinkSync('name_list.txt');
56+
}
57+
});
58+
59+
60+
test('Application selectNextPerson test', async (t) => {
61+
// 準備測試檔案
62+
fs.writeFileSync('name_list.txt', 'Test1\nTest2\nTest3');
63+
64+
try {
65+
const app = new Application();
66+
await new Promise(resolve => setTimeout(resolve, 100)); // 等待初始化完成
67+
68+
const person1 = app.selectNextPerson();
69+
assert(app.people.includes(person1));
70+
assert.equal(app.selected.length, 1);
71+
72+
const person2 = app.selectNextPerson();
73+
assert(app.people.includes(person2));
74+
assert.equal(app.selected.length, 2);
75+
assert.notEqual(person1, person2);
76+
77+
const person3 = app.selectNextPerson();
78+
assert(app.people.includes(person3));
79+
assert.equal(app.selected.length, 3);
80+
81+
// 當所有人都被選中後,應該返回 null
82+
const person4 = app.selectNextPerson();
83+
assert.equal(person4, null);
84+
} finally {
85+
// 清理測試檔案
86+
fs.unlinkSync('name_list.txt');
87+
}
88+
});
89+
90+
91+
// Mock Object
92+
test('Application notifySelected test', async (t) => {
93+
// 準備測試檔案
94+
fs.writeFileSync('name_list.txt', 'Test1\nTest2');
95+
96+
try {
97+
const app = new Application();
98+
await new Promise(resolve => setTimeout(resolve, 100)); // 等待初始化完成
99+
100+
app.selectNextPerson(); // 選擇第一個人
101+
app.selectNextPerson(); // 選擇第二個人
102+
103+
// Mock MailSystem methods
104+
let writeCount = 0;
105+
let sendCount = 0;
106+
app.mailSystem.write = (name) => {
107+
writeCount++;
108+
return `Congrats, ${name}!`;
109+
};
110+
app.mailSystem.send = (name, context) => {
111+
sendCount++;
112+
return true;
113+
};
114+
115+
app.notifySelected();
116+
assert.equal(writeCount, 2);
117+
assert.equal(sendCount, 2);
118+
} finally {
119+
// 清理測試檔案
120+
fs.unlinkSync('name_list.txt');
121+
}
122+
});
123+
4124

5-
// TODO: write your tests here
6-
// Remember to use Stub, Mock, and Spy when necessary

0 commit comments

Comments
 (0)