@@ -2,5 +2,123 @@ const test = require('node:test');
22const assert = require ( 'assert' ) ;
33const { Application, MailSystem } = require ( './main' ) ;
44
5- // TODO: write your tests here
6- // Remember to use Stub, Mock, and Spy when necessary
5+ /*
6+ function coverage testing:
7+ - MailSystem
8+ - write
9+ - send
10+ - Application
11+ - getNames
12+ - getRandomPerson
13+ - selectNextPerson
14+ - notifySelected
15+ */
16+
17+ // MailSystem test
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+
124+
0 commit comments