import XCTest @testable import LChatCore // 🤖 Pins the notification monogram to the Avatar view's rules (initial + // djb2 palette pick) so a person's banner face can't drift from their in-app // face, and smoke-tests the render. final class MonogramImageTests: XCTestCase { func testInitialMirrorsAvatarView() { XCTAssertEqual(MonogramImage.initial(for: "paul"), "P") XCTAssertEqual(MonogramImage.initial(for: " Éowyn "), "É") XCTAssertEqual(MonogramImage.initial(for: " "), "?") XCTAssertEqual(MonogramImage.initial(for: "🦊 Fox"), "🦊") } func testPaletteIndexIsDeterministicDjb2() { // djb2("Eleven") computed by the Avatar view's exact loop. var h = 5381 for b in "Eleven".utf8 { h = (h &* 33) &+ Int(b) } XCTAssertEqual(MonogramImage.paletteIndex(for: "Eleven"), abs(h) % 8) XCTAssertEqual(MonogramImage.paletteIndex(for: "Eleven"), MonogramImage.paletteIndex(for: "Eleven")) XCTAssertTrue((0..<8).contains(MonogramImage.paletteIndex(for: "任意の名前"))) } func testRendersNonEmptyPNG() throws { let data = try XCTUnwrap(MonogramImage.pngData(name: "Paul")) // PNG magic — a real encode, not junk bytes. XCTAssertEqual(Array(data.prefix(4)), [0x89, 0x50, 0x4E, 0x47]) XCTAssertGreaterThan(data.count, 500) } }