/** * AriaEngine Page — 页面核心逻辑测试 * * v0.4.5: 页面层精简后仅保留生产代码实际使用的函数: * - initPageHeader(FileManager 创建空页面) * - createPage(BufferPool 分配新页面) * - PAGE_HEADER_SIZE / PAGE_SIZE 常量 * 页面内容为 SSTable 原始字节切片(PageSSTableStore 管理),无行级 slot 结构。 */ import { createPage } from '../../src/engine/aria/page/format'; import { initPageHeader } from '../../src/engine/aria/page/header'; import { PAGE_SIZE, PAGE_HEADER_SIZE, PageType } from '../../src/engine/aria/types'; describe('AriaEngine — Page 核心', () => { it('initPageHeader 初始化 4KB 页面头部字段', () => { const buf = new ArrayBuffer(PAGE_SIZE); initPageHeader(buf, 42, PageType.DATA); const view = new DataView(buf); expect(view.getUint32(0, false)).toBe(42); // page_id expect(view.getUint8(4)).toBe(PageType.DATA); // type expect(view.getUint16(5, false)).toBe(PAGE_HEADER_SIZE); // free_start expect(view.getUint16(7, false)).toBe(PAGE_SIZE); // free_end expect(view.getUint16(9, false)).toBe(0); // slot_count expect(view.getUint8(15)).toBe(0); // reserved }); it('initPageHeader 支持不同页面类型', () => { const buf = new ArrayBuffer(PAGE_SIZE); initPageHeader(buf, 1, PageType.META); expect(new DataView(buf).getUint8(4)).toBe(PageType.META); }); it('createPage 创建脏页面(pins=0,初始化头部)', () => { const page = createPage(7, PageType.DATA); expect(page.pageId).toBe(7); expect(page.type).toBe(PageType.DATA); expect(page.data.byteLength).toBe(PAGE_SIZE); expect(page.dirty).toBe(true); expect(page.pins).toBe(0); // 头部已初始化 expect(new DataView(page.data).getUint32(0, false)).toBe(7); expect(new DataView(page.data).getUint8(4)).toBe(PageType.DATA); }); it('页面数据区从头部之后开始(跳过 16 字节头)', () => { const page = createPage(1, PageType.DATA); // 头部之后写入数据,头部字段不受影响 const view = new Uint8Array(page.data); view[PAGE_HEADER_SIZE] = 0xAB; view[PAGE_HEADER_SIZE + 1] = 0xCD; expect(view[PAGE_HEADER_SIZE]).toBe(0xAB); expect(view[PAGE_HEADER_SIZE + 1]).toBe(0xCD); // 头部字段保持 expect(new DataView(page.data).getUint32(0, false)).toBe(1); }); it('createPage 的 dirty 标记在写入后保持(PageSSTableStore 依赖)', () => { const page = createPage(2, PageType.DATA); new Uint8Array(page.data)[100] = 0x01; expect(page.dirty).toBe(true); }); });