| 216 | * Assert that keyed results match expected, with message count logging |
| 217 | */ |
| 218 | export function assertKeyedResults<K, V>( |
| 219 | testName: string, |
| 220 | actual: KeyedTestResult<K, V>, |
| 221 | expected: Array<[K, V]>, |
| 222 | maxExpectedMessages?: number, |
| 223 | ) { |
| 224 | const expectedSorted = expected.sort((a, b) => { |
| 225 | return JSON.stringify(a[0]).localeCompare(JSON.stringify(b[0])) |
| 226 | }) |
| 227 | |
| 228 | if (LOG_RESULTS) { |
| 229 | console.log( |
| 230 | `${testName}: ${actual.messageCount} messages, ${actual.sortedResults.length} final results per key`, |
| 231 | ) |
| 232 | console.log(` Messages:`, actual.messages) |
| 233 | console.log(` Final results:`, actual.sortedResults) |
| 234 | } |
| 235 | |
| 236 | // Check that materialized results match expected |
| 237 | expect(actual.sortedResults).toEqual(expectedSorted) |
| 238 | |
| 239 | // Check message count constraints if provided |
| 240 | if (maxExpectedMessages !== undefined) { |
| 241 | expect(actual.messageCount).toBeLessThanOrEqual(maxExpectedMessages) |
| 242 | } |
| 243 | |
| 244 | // Log for debugging - use more reasonable threshold |
| 245 | // Account for scenarios where messages cancel out due to object identity |
| 246 | // Allow up to 4x the expected count to accommodate remove/add pairs |
| 247 | const reasonableThreshold = Math.max(expected.length * 4, 2) |
| 248 | if (actual.messageCount > reasonableThreshold) { |
| 249 | console.warn( |
| 250 | `⚠️ ${testName}: High message count (${actual.messageCount} messages for ${expected.length} expected key-value pairs)`, |
| 251 | ) |
| 252 | } |
| 253 | |
| 254 | // Log key insights |
| 255 | const affectedKeys = new Set( |
| 256 | actual.messages.map(([[key, _value], _mult]) => key), |
| 257 | ) |
| 258 | if (LOG_RESULTS) { |
| 259 | console.log( |
| 260 | `${testName}: ✅ ${affectedKeys.size} keys affected, ${actual.sortedResults.length} final keys`, |
| 261 | ) |
| 262 | } |
| 263 | } |
| 264 | |
| 265 | /** |
| 266 | * Extract unique keys from messages to verify incremental behavior |