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