import { describe, expect, it } from 'vitest'; import { parseSnbt, SnbtError } from '../src/parsers/snbt.ts'; describe('parseSnbt', () => { it('parses newline-separated compound', () => { expect(parseSnbt('{\n\tversion: 1\n\tlock: false\n\tname: "CDOGamer#308a693c"\n}')).toEqual({ version: 1, lock: false, name: 'CDOGamer#308a693c', }); }); it('parses comma-separated compound', () => { expect(parseSnbt('{a: 1, b: "x", c: {d: 2b}}')).toEqual({ a: 1, b: 'x', c: { d: 2 } }); }); it('parses suffixes 1L 2b 1.5f 0.0d -3s', () => { expect(parseSnbt('[1L, 2b, 1.5f, 0.0d, -3s, 1791559740996L]')).toEqual([1, 2, 1.5, 0, -3, 1791559740996]); }); it('parses keys that start with digits and quoted keys with colons', () => { expect( parseSnbt('{ 0000000000000001: 5L\n 308a693c2bd84d6b: { x: 1 }\n "a:B": 2L\n quest.ABC.title: "t" }'), ).toEqual({ '0000000000000001': 5, '308a693c2bd84d6b': { x: 1 }, 'a:B': 2, 'quest.ABC.title': 't' }); }); it('parses typed arrays and empty containers', () => { expect(parseSnbt('{a: [I; 1, 2], b: [L; 3L], c: [B; 1b], d: [], e: { }}')).toEqual({ a: [1, 2], b: [3], c: [1], d: [], e: {}, }); }); it('parses string escapes and single quotes', () => { expect(parseSnbt(`["a\\"b", 'c\\'d', "\\\\"]`)).toEqual(['a"b', "c'd", '\\']); }); it('keeps unquoted non-numeric words as strings', () => { expect(parseSnbt('{type: item, id: 3BC0A50886A3222B}')).toEqual({ type: 'item', id: '3BC0A50886A3222B' }); }); it('reports line on error', () => { try { parseSnbt('{\n a: 1\n b: {\n}'); expect.unreachable(); } catch (e) { expect(e).toBeInstanceOf(SnbtError); expect((e as SnbtError).line).toBe(4); } }); });