mirror of
https://github.com/olehomelchenko/astrolabe.git
synced 2026-08-08 02:02:33 +00:00
Add compact JSON formatter with format-on-paste (§03A)
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { formatJson } from './json-format';
|
||||
|
||||
describe('formatJson', () => {
|
||||
it('pretty-prints a valid object with the default indent', () => {
|
||||
expect(formatJson('{"a":1,"b":2}')).toBe('{"a": 1, "b": 2}');
|
||||
});
|
||||
|
||||
it('keeps short arrays compact (Vega house style)', () => {
|
||||
expect(formatJson('{"values":[1,2,3]}')).toBe('{"values": [1, 2, 3]}');
|
||||
});
|
||||
|
||||
it('wraps content that exceeds the line-length budget', () => {
|
||||
expect(formatJson('{"a":1,"b":2,"c":3}', { maxLength: 5 })).toBe(
|
||||
'{\n "a": 1,\n "b": 2,\n "c": 3\n}',
|
||||
);
|
||||
});
|
||||
|
||||
it('respects a custom indent width', () => {
|
||||
const out = formatJson('{"a":1,"b":2}', { indent: 4, maxLength: 5 });
|
||||
expect(out).toBe('{\n "a": 1,\n "b": 2\n}');
|
||||
});
|
||||
|
||||
it('returns null for invalid JSON so callers can skip', () => {
|
||||
expect(formatJson('{"a":')).toBeNull();
|
||||
expect(formatJson('not json')).toBeNull();
|
||||
});
|
||||
|
||||
it('returns null for empty or whitespace-only input', () => {
|
||||
expect(formatJson('')).toBeNull();
|
||||
expect(formatJson(' \n ')).toBeNull();
|
||||
});
|
||||
|
||||
it('is idempotent — formatting formatted text changes nothing', () => {
|
||||
const once = formatJson('{"a":1,"b":[1,2,3],"c":{"d":4}}');
|
||||
expect(once).not.toBeNull();
|
||||
expect(formatJson(once!)).toBe(once);
|
||||
});
|
||||
|
||||
it('handles top-level arrays and primitives', () => {
|
||||
expect(formatJson('[1,2,3]')).toBe('[1, 2, 3]');
|
||||
expect(formatJson('42')).toBe('42');
|
||||
expect(formatJson('true')).toBe('true');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user