fix: return after peer color cache hit

Color(peerSeed:isDark:) checked the cache but never returned on a hit,
so every call recomputed the hue/saturation/brightness math and
overwrote the cache entry with an identical value. The cache never
actually short-circuited anything.
This commit is contained in:
Taksh 2026-08-07 20:56:25 +05:30
parent 1f59e814f9
commit 16e0a3d090
2 changed files with 56 additions and 1 deletions

View File

@ -10,12 +10,22 @@ import SwiftUI
extension Color {
private static var peerColorCache: [String: Color] = [:]
#if DEBUG
/// Counts cache-miss computations; exposed only so regression tests can
/// verify a repeated seed hits the cache instead of recomputing.
static var _peerColorComputeCountForTesting = 0
#endif
init(peerSeed: String, isDark: Bool) {
let cacheKey = peerSeed + (isDark ? "|dark" : "|light")
if let cached = Self.peerColorCache[cacheKey] {
self = cached
return
}
#if DEBUG
Self._peerColorComputeCountForTesting += 1
#endif
let h = peerSeed.djb2()
var hue = Double(h % 1000) / 1000.0
let orange = 30.0 / 360.0

View File

@ -0,0 +1,45 @@
//
// ColorPeerTests.swift
// bitchatTests
//
// Tests for Color(peerSeed:isDark:) caching
//
import Testing
import SwiftUI
@testable import bitchat
struct ColorPeerTests {
@Test func repeatedSeedHitsCacheInsteadOfRecomputing() {
let seed = "cache-hit-\(UUID().uuidString)"
let before = Color._peerColorComputeCountForTesting
let first = Color(peerSeed: seed, isDark: true)
let afterFirst = Color._peerColorComputeCountForTesting
let second = Color(peerSeed: seed, isDark: true)
let afterSecond = Color._peerColorComputeCountForTesting
#expect(afterFirst == before + 1)
#expect(afterSecond == afterFirst)
#expect(first == second)
}
@Test func differentAppearanceForSameSeedIsNotCachedTogether() {
let seed = "appearance-\(UUID().uuidString)"
let before = Color._peerColorComputeCountForTesting
_ = Color(peerSeed: seed, isDark: true)
_ = Color(peerSeed: seed, isDark: false)
let after = Color._peerColorComputeCountForTesting
#expect(after == before + 2)
}
@Test func sameSeedProducesSameColor() {
let seed = "deterministic-\(UUID().uuidString)"
let a = Color(peerSeed: seed, isDark: false)
let b = Color(peerSeed: seed, isDark: false)
#expect(a == b)
}
}