Files
node-metaverse/lib/classes/llsd/LLSDNotationParser.spec.ts

205 lines
7.4 KiB
TypeScript
Raw Normal View History

import * as assert from 'assert';
import { LLSDNotationParser } from './LLSDNotationParser';
import { LLSDMap } from './LLSDMap';
import { UUID } from '../UUID';
describe('LLSDNotationParser', () =>
{
describe('parse', () =>
{
it('can parse a complex LLSD Notation document', () =>
{
const notationDoc = `{
'nested_map': {
'nested_again': {
'array': [
i0,
'string',
"string2",
[
"another",
"array",
r4.3,
i22,
!,
{
'isThis': i42
}
]
]
}
},
'undef': !,
'booleans': [
true,
false,
1,
0,
T,
F,
t,
f,
TRUE,
FALSE
],
'integer': i69,
'negInt': i-69,
'real': r3.141,
'realNeg': r-3.141,
'uuid': ufb54f6b1-8120-40c9-9aa3-f9abef1a168f,
'string1': "gday\\"mate",
'string2': 'gday\\'mate',
'string3': s(11)"hello"there",
'uri': l"https://secondlife.com/",
'date': d"2023-11-10T13:32:32.93Z",
'binary': b64"amVsbHlmaXNo",
'binary2': b16"6261636F6E62697473",
'binary3': b(32)"KÚ~¬\béGÀt|ϓ˜h,9µEK¹*;]ÆÁåb/"
}`;
const parsed = LLSDNotationParser.parse(notationDoc);
if (!(parsed instanceof LLSDMap))
{
assert('Parsed document is not a map');
return;
}
const nested = parsed.get('nested_map');
if (nested instanceof LLSDMap)
{
const nestedAgain = nested.get('nested_again');
if (nestedAgain instanceof LLSDMap)
{
const arr = nestedAgain.get('array');
if (!Array.isArray(arr))
{
assert(false, 'Nested array is not an array');
}
else
{
assert.equal(arr.length, 4);
assert.equal(arr[0], 0);
assert.equal(arr[1], 'string');
assert.equal(arr[2], 'string2');
const nestedAgainArr = arr[3];
if (!Array.isArray(nestedAgainArr))
{
assert(false, 'Nested again array is not an array');
}
else
{
assert.equal(nestedAgainArr.length, 6);
assert.equal(nestedAgainArr[0], 'another');
assert.equal(nestedAgainArr[1], 'array');
assert.equal(nestedAgainArr[2], 4.3);
assert.equal(nestedAgainArr[3], 22);
assert.equal(nestedAgainArr[4], null);
const thirdNestedMap = nestedAgainArr[5];
if (thirdNestedMap instanceof LLSDMap)
{
assert.equal(thirdNestedMap.get('isThis'), 42);
}
else
{
assert(false, 'Third nested map is not a map');
}
}
}
}
else
{
assert(false, 'NestedAgain is not a map');
}
}
else
{
assert(false, 'Nested is not a map');
}
assert.equal(parsed.get('undef'), null);
const bools = parsed.get('booleans');
if (!Array.isArray(bools))
{
assert(false, 'Booleans array is not bools');
}
else
{
assert.equal(bools.length, 10);
assert.equal(bools[0], true);
assert.equal(bools[1], false);
assert.equal(bools[2], true);
assert.equal(bools[3], false);
assert.equal(bools[4], true);
assert.equal(bools[5], false);
assert.equal(bools[6], true);
assert.equal(bools[7], false);
assert.equal(bools[8], true);
assert.equal(bools[9], false);
}
/*
'string1': "gday\"mate",
'string2': 'gday\'mate',
'string3': s(11)"hello"there",
'uri': l"https://secondlife.com/",
'date': d"2023-11-10T13:32:32.93Z",
'binary': b64"amVsbHlmaXNo",
'binary2': b16"6261636F6E62697473",
'binary3': b(32)"KÚ~¬éGÀt|ϓ˜h,9µEK¹*;]ÆÁåb/"
*/
assert.equal(parsed.get('integer'), 69);
assert.equal(parsed.get('negInt'), -69);
assert.equal(parsed.get('real'), 3.141);
assert.equal(parsed.get('realNeg'), -3.141);
const u = parsed.get('uuid');
if (u instanceof UUID)
{
assert.equal(u.equals('fb54f6b1-8120-40c9-9aa3-f9abef1a168f'), true);
}
else
{
assert(false, 'UUID is not a UUID');
}
assert.equal(parsed.get('string1'), 'gday"mate');
assert.equal(parsed.get('string2'), 'gday\'mate');
assert.equal(parsed.get('string3'), 'hello"there');
assert.equal(parsed.get('uri'), 'https://secondlife.com/');
const d = parsed.get('date');
if (d instanceof Date)
{
assert.equal(d.getTime(), 1699623152930);
}
else
{
assert(false, 'Date entry is not a date');
}
const buf1 = parsed.get('binary');
if (buf1 instanceof Buffer)
{
assert.equal(buf1.toString('utf-8'), 'jellyfish');
}
else
{
assert(false, 'Buf1 is not a buffer');
}
const buf2 = parsed.get('binary2');
if (buf2 instanceof Buffer)
{
assert.equal(buf2.toString('utf-8'), 'baconbits');
}
else
{
assert(false, 'Buf2 is not a buffer');
}
const buf3 = parsed.get('binary3');
if (buf3 instanceof Buffer)
{
assert.equal(buf3.equals(Buffer.from('KÚ~¬\béGÀt|ϓ˜h,9µEK¹*;]ÆÁåb/', 'binary')), true);
}
else
{
assert(false, 'Buf3 is not a buffer');
}
});
});
});