/* * ★ 나눠 묻고 합치는 규율 — 갈래마다 상한까지 받아야 합친 결과가 정확하다. * * ── 왜 이 시험이 있나 (2026-08-28) ────────────────────────────────────────── * 「종류 IN + 시각순」은 색인을 못 쓴다. 그래서 종류를 하나씩 정확일치로 묻고 합치는데, 그때 함정이 * 하나 있다 — UX 레인이 구현 전에 짚어 주었다. * * 「갈래마다 상한을 걸면 합친 결과가 시각순으로 온전하지 않다. * 종류 A 의 마지막이 종류 B 의 첫째보다 이를 수 있다.」 * * 그 지적은 **갈래마다 상한보다 적게 받을 때** 참이다. 상한까지 받으면 성질이 선다: 어떤 갈래에서 빠진 * 행은 그 갈래의 상한 번째보다 뒤이고, 우리는 전체에서 상한 개만 취하므로 그 행이 이 페이지에 들어올 수 * 없다. 이 시험이 그 성질을 못박는다. */ import { test } from 'node:test' import assert from 'node:assert/strict' import { mergeStreams } from '../server/service/twin-journal/event-type-split-shape.js' const byN = (a: { n: number }, b: { n: number }) => a.n - b.n const seq = (from: number, count: number) => Array.from({ length: count }, (_, i) => ({ n: from + i })) test('★ 한 갈래가 앞을 다 차지해도 전체에서 앞 limit 개가 나온다 — 짚어 준 그 경우다', () => { /* * A 가 1~5, B 가 100~104. limit 3 이면 답은 A 의 1,2,3 이다. B 는 한 건도 들어오지 않는 것이 맞다. */ const r = mergeStreams([seq(1, 5), seq(100, 5)], 3, byN) assert.deepEqual(r.items.map(x => x.n), [1, 2, 3]) assert.equal(r.capped, true, '더 있었다는 사실을 말해야 한다') }) test('★ 갈래를 섞어도 시각순이 유지된다', () => { const a = [{ n: 1 }, { n: 4 }, { n: 7 }] const b = [{ n: 2 }, { n: 5 }, { n: 8 }] const c = [{ n: 3 }, { n: 6 }, { n: 9 }] const r = mergeStreams([a, b, c], 9, byN) assert.deepEqual(r.items.map(x => x.n), [1, 2, 3, 4, 5, 6, 7, 8, 9]) assert.equal(r.capped, false, '상한에 닿지 않았으면 잘리지 않았다') }) test('★ 상한에 닿은 갈래가 있으면 잘렸다고 말한다 — 숫자가 알리지 않고 작아지지 않게', () => { /* 한 갈래가 정확히 상한만큼 받아 왔으면 그 갈래에 더 있었을 수 있다. */ const r = mergeStreams([seq(1, 3), seq(10, 1)], 3, byN) assert.equal(r.items.length, 3) assert.equal(r.capped, true) }) test('상한에 못 닿았고 합쳐도 상한 미만이면 잘리지 않았다', () => { const r = mergeStreams([seq(1, 2), seq(10, 2)], 10, byN) assert.deepEqual(r.items.map(x => x.n), [1, 2, 10, 11]) assert.equal(r.capped, false) }) test('빈 갈래가 섞여도 답이 같다 — 그 종류가 그 구간에 없는 것은 정상이다', () => { const r = mergeStreams([[], seq(5, 2), []], 10, byN) assert.deepEqual(r.items.map(x => x.n), [5, 6]) assert.equal(r.capped, false) }) test('★ 갈래가 상한보다 많이 받아 오면 그 사실을 말한다 — 있을 수 없는 일이다', () => { /* 부르는 쪽이 상한을 잘못 걸었다는 뜻이고, 그 상태로 답하면 합친 결과를 믿을 수 없다. */ const r = mergeStreams([seq(1, 5)], 3, byN) assert.equal(r.underfilled, true) }) test('갈래가 하나면 그냥 앞에서 자른 것과 같다', () => { const r = mergeStreams([seq(1, 5)], 5, byN) assert.deepEqual(r.items.map(x => x.n), [1, 2, 3, 4, 5]) assert.equal(r.underfilled, false) })