import {describe, expect, it} from 'vitest';

import * as rison from '../shared/rison.js';

// Copied from https://github.com/Nanonid/rison/blob/master/python/rison/tests.py
const py_testcases = {
    '(a:0,b:1)': {a: 0, b: 1},
    "(a:0,b:foo,c:'23skidoo')": {a: 0, c: '23skidoo', b: 'foo'},
    '!t': true,
    '!f': false,
    '!n': null,
    "''": '',
    0: 0,
    1.5: 1.5,
    '-3': -3,
    '1e30': 1e30,
    '1e-30': 1.0000000000000001e-30,
    'G.': 'G.',
    a: 'a',
    "'0a'": '0a',
    "'abc def'": 'abc def',
    '()': {},
    '(a:0)': {a: 0},
    '(id:!n,type:/common/document)': {type: '/common/document', id: null},
    '!()': [],
    "!(!t,!f,!n,'')": [true, false, null, ''],
    "'-h'": '-h',
    'a-z': 'a-z',
    "'wow!!'": 'wow!',
    'domain.com': 'domain.com',
    "'user@domain.com'": 'user@domain.com',
    "'US $10'": 'US $10',
    "'can!'t'": "can't",
};

const encode_testcases = {
    "can't": "'can!'t'",
    '"can\'t"': "'\"can!'t\"'",
    "'can't'": "'!'can!'t!''",
};

describe('Rison test cases', () => {
    for (const [r, obj] of Object.entries(py_testcases)) {
        it(`Should decode "${r}"`, () => {
            // hack to get around "TypeError: Cannot read properties of null (reading 'should')"
            expect(rison.decode(r)).toEqual(obj);
        });
        it(`Should encode ${JSON.stringify(obj)}`, () => {
            expect(rison.encode(obj)).toEqual(r);
        });
    }
    for (const [obj, r] of Object.entries(encode_testcases)) {
        it(`Should encode ${JSON.stringify(obj)}`, () => {
            expect(rison.encode(obj)).toEqual(r);
        });
    }
});
