| import { autorun } from "mobx"; |
| import { Person } from "./Person.mjs"; |
| import { Room } from "./Room.mjs"; |
| import { Message } from "./Message.mjs"; |
| import { Notifications } from "./Notifications.mjs"; |
| |
| function assert(condition) { |
| if (!condition) throw new Error("Assertion failure"); |
| } |
| |
| export function runTest() { |
| const logs = []; |
| const customLog = (...args) => logs.push(args.join(" ")); |
| |
| // --- Setup --- |
| const techRoom = new Room("Tech Talk"); |
| const generalRoom = new Room("General Chat"); |
| const largeRoom = new Room("Large Meeting Room"); |
| |
| const alice = new Person(1, "Alice"); |
| const bob = new Person(2, "Bob"); |
| |
| techRoom.addPerson(alice); |
| techRoom.addPerson(bob); |
| generalRoom.addPerson(alice); |
| |
| const rooms = [techRoom, generalRoom, largeRoom]; |
| const notifications = new Notifications(rooms); |
| |
| // --- Large Room Setup --- |
| customLog("\n--- Setting up Large Meeting Room ---"); |
| const largeRoomMembers = []; |
| for (let i = 3; i < 203; i++) { |
| const person = new Person(i, `Person ${i}`); |
| largeRoomMembers.push(person); |
| largeRoom.addPerson(person); |
| } |
| customLog(`[INFO] Added ${largeRoom.peopleCount} members to the large room.`); |
| |
| // Add Alice and Bob to the large room |
| largeRoom.addPerson(alice); |
| largeRoom.addPerson(bob); |
| customLog("[INFO] Added Alice and Bob to the Large Meeting Room."); |
| |
| // Verify Person.rooms with Set |
| assert(alice.rooms.size === 3); |
| assert( |
| alice.rooms.has(techRoom) && |
| alice.rooms.has(generalRoom) && |
| alice.rooms.has(largeRoom) |
| ); |
| assert( |
| bob.rooms.size === 2 && bob.rooms.has(techRoom) && bob.rooms.has(largeRoom) |
| ); |
| customLog("[PASS] Verified Person.rooms associations with Set."); |
| |
| // --- autorun for global notifications --- |
| const notificationsDisposer = autorun(() => { |
| customLog("\n--- Global Notifications (Last Messages) ---"); |
| if (notifications.lastMessages.size === 0) { |
| customLog("No messages yet."); |
| } else { |
| notifications.lastMessages.forEach((message, roomName) => { |
| customLog(`[${roomName}] "${message.text}" - ${message.author.name}`); |
| }); |
| } |
| customLog("------------------------------------------"); |
| }); |
| |
| // --- autorun for room updates --- |
| const roomUpdatesDisposer = autorun(() => { |
| rooms.forEach((room) => { |
| if (room.roomUpdates.length > 0) { |
| customLog( |
| `[${room.name} Update] ${ |
| room.roomUpdates[room.roomUpdates.length - 1] |
| }` |
| ); |
| } |
| }); |
| }); |
| |
| // --- Status Update Scenario --- |
| customLog("\n--- Status Update Scenario ---"); |
| |
| alice.setStatus("Away"); |
| assert(techRoom.roomUpdates.includes("Alice is now Away")); |
| assert(generalRoom.roomUpdates.includes("Alice is now Away")); |
| assert(largeRoom.roomUpdates.includes("Alice is now Away")); |
| customLog( |
| "[PASS] Verified that status updates are sent to all of Alice's rooms." |
| ); |
| |
| bob.setStatus("Busy"); |
| assert(techRoom.roomUpdates.includes("Bob is now Busy")); |
| assert(!generalRoom.roomUpdates.includes("Bob is now Busy")); |
| assert(largeRoom.roomUpdates.includes("Bob is now Busy")); |
| customLog( |
| "[PASS] Verified that status updates are only sent to Bob's rooms." |
| ); |
| |
| // --- Messaging and Verification --- |
| customLog("\n--- Sending Messages & Verifying Notifications ---"); |
| |
| // Message 1: Tech Room |
| const msg1 = new Message("First message to Tech Talk!", alice); |
| techRoom.addMessage(msg1); |
| assert(notifications.lastMessages.get("Tech Talk") === msg1); |
| customLog("[PASS] Verified Tech Talk notification."); |
| |
| // Message 2: General Chat |
| for (let i = 0; i < 20; i++) { |
| const msg2 = new Message(`ping ${i}`, alice); |
| generalRoom.addMessage(msg2); |
| assert(notifications.lastMessages.get("General Chat") === msg2); |
| } |
| customLog("[PASS] Verified General Chat notification."); |
| |
| // Message 3: Large Meeting Room |
| for (let i = 0; i <= 5; i++) { |
| for (const member of largeRoomMembers) { |
| const msg = new Message(`Hi, I am ${member.name}`, member); |
| largeRoom.addMessage(msg); |
| assert(largeRoom.lastMessage == msg); |
| assert(notifications.lastMessages.get("Large Meeting Room") === msg); |
| } |
| } |
| customLog("[PASS] Verified Large Meeting Room notification."); |
| |
| // Message 4: Tech Room again |
| for (let i = 0; i < 20; i++) { |
| const msg4 = new Message(`ping ${i}`, bob); |
| techRoom.addMessage(msg4); |
| assert(notifications.lastMessages.get("Tech Talk") === msg4); |
| } |
| customLog("[PASS] Verified Tech Talk notification update."); |
| |
| const tempRooms = []; |
| for (let i = 0; i < 10; i++) { |
| const roomId = `General Chat ${i}`; |
| const tempRoom = new Room(roomId); |
| tempRooms.push(tempRoom); |
| notifications.addRoom(tempRoom); |
| for (const person of largeRoomMembers.slice(0, 10)) { |
| tempRoom.addPerson(person); |
| } |
| for (const person of tempRoom.members.slice(0, 5)) { |
| const msg = new Message(`ping ${i}`, person); |
| tempRoom.addMessage(msg); |
| assert(notifications.lastMessages.get(roomId) === msg); |
| } |
| } |
| tempRooms.forEach((room) => room.dispose(notifications)); |
| |
| // --- Clean up --- |
| notificationsDisposer(); |
| roomUpdatesDisposer(); // Added disposer for room updates |
| techRoom.dispose(notifications); |
| generalRoom.dispose(notifications); |
| largeRoom.dispose(notifications); |
| |
| return logs; |
| } |