import XCTest @testable import LChatCore // Pure-rule twins of web/static/ui.js displayNameFor / renameNotice (#577) — // the same cases test/ui.test.mjs pins on the web side, so the two // implementations can't drift apart. final class NicknamesTests: XCTestCase { func testDisplayNameMyNameWins() { XCTAssertEqual(Nicknames.displayName(.init(name: "Dermo", seen: "Dermo"), label: "Dermot"), "Dermo") XCTAssertEqual(Nicknames.displayName(nil, label: "Dermot"), "Dermot") XCTAssertEqual(Nicknames.displayName(nil, label: nil), "") // Empty nickname = no nickname. XCTAssertEqual(Nicknames.displayName(.init(name: "", seen: ""), label: "Dermot"), "Dermot") } func testRenameNoticeFiresOncePerUnacknowledgedRename() { // The #577 scenario: invited as Dermo, renames to Dermot → the choice. let fresh = Nicknames.renameNotice(.init(name: "Dermo", seen: "Dermo"), label: "Dermot") XCTAssertEqual(fresh?.from, "Dermo") XCTAssertEqual(fresh?.to, "Dermot") // Acknowledged (kept my name): seen catches up, no more prompting. XCTAssertNil(Nicknames.renameNotice(.init(name: "Dermo", seen: "Dermot"), label: "Dermot")) // …until they rename AGAIN. let again = Nicknames.renameNotice(.init(name: "Dermo", seen: "Dermot"), label: "Diarmuid") XCTAssertEqual(again?.to, "Diarmuid") // They renamed to exactly what I call them — nothing to ask. XCTAssertNil(Nicknames.renameNotice(.init(name: "Dermo", seen: "x"), label: "Dermo")) // No nickname / no published name yet → never a notice. XCTAssertNil(Nicknames.renameNotice(nil, label: "Dermot")) XCTAssertNil(Nicknames.renameNotice(.init(name: "Dermo", seen: "Dermo"), label: "")) } }