149 lines
5.1 KiB
TypeScript
149 lines
5.1 KiB
TypeScript
import { PythonParser } from './PythonParser';
|
|
|
|
import * as assert from 'assert';
|
|
import { PythonDict } from './PythonDict';
|
|
import { PythonList } from './PythonList';
|
|
import { PythonTuple } from './PythonTuple';
|
|
|
|
describe('PythonParser', () =>
|
|
{
|
|
describe('parse', () =>
|
|
{
|
|
it('can parse a complex python dictionary notation', () =>
|
|
{
|
|
const notationDoc = `{
|
|
"nested_dict": {
|
|
"key1": "value1",
|
|
"key2": {
|
|
"inner_key": "inner_value"
|
|
}
|
|
},
|
|
"list": [1, 2, 3, [4, 5]],
|
|
"boolean": True,
|
|
"tuple": (1, 2, ("nested_tuple", 3)),
|
|
"bytes": b'hello',
|
|
"float": 3.14,
|
|
'integer': 42,
|
|
"hex_number": 0x1A,
|
|
"octal_number": 0o52,
|
|
"string_single": 'single-quoted\\' string',
|
|
"string_double": "double-quoted \\" string",
|
|
"string_triple_single": '''triple-quoted\'
|
|
single-quoted string''',
|
|
"string_triple_double": """triple-quoted\"
|
|
double-quoted string""",
|
|
"raw_string_single": r'raw single-quoted\\ string',
|
|
"raw_string_double": r"raw double-quoted\\ string",
|
|
"raw_string_triple_single": r'''raw triple\\''-quoted
|
|
single-quoted string''',
|
|
"raw_string_triple_double": r"""raw triple\\""-quoted
|
|
double-quoted string"""
|
|
}`;
|
|
const parsed = PythonParser.parse(notationDoc);
|
|
if (!(parsed instanceof PythonDict))
|
|
{
|
|
assert(false);
|
|
return;
|
|
}
|
|
|
|
const nested = parsed.get('nested_dict');
|
|
assert.ok(nested);
|
|
if (!(nested instanceof PythonDict))
|
|
{
|
|
assert(false);
|
|
}
|
|
else
|
|
{
|
|
assert.equal(nested.get('key1'), 'value1');
|
|
const key2 = nested.get('key2');
|
|
if (!(key2 instanceof PythonDict))
|
|
{
|
|
assert(false);
|
|
}
|
|
else
|
|
{
|
|
assert.equal(key2.get('inner_key'), 'inner_value');
|
|
}
|
|
}
|
|
|
|
const list = parsed.get('list');
|
|
if (!(list instanceof PythonList))
|
|
{
|
|
assert(false);
|
|
}
|
|
else
|
|
{
|
|
assert.equal(list.length, 4);
|
|
assert.equal(list.get(0), 1);
|
|
assert.equal(list.get(1), 2);
|
|
assert.equal(list.get(2), 3);
|
|
const nestedList = list.get(3);
|
|
if (!(nestedList instanceof PythonList))
|
|
{
|
|
assert(false);
|
|
}
|
|
else
|
|
{
|
|
assert.equal(nestedList.get(0), 4);
|
|
assert.equal(nestedList.get(1), 5);
|
|
}
|
|
assert.equal(list.get(4), undefined);
|
|
}
|
|
|
|
assert.equal(parsed.get('boolean'), true);
|
|
const tuple = parsed.get('tuple');
|
|
if (!(tuple instanceof PythonTuple))
|
|
{
|
|
assert(false);
|
|
}
|
|
else
|
|
{
|
|
assert.equal(tuple.get(0), 1);
|
|
assert.equal(tuple.get(1), 2);
|
|
const nestedTuple = tuple.get(2);
|
|
if (!(nestedTuple instanceof PythonTuple))
|
|
{
|
|
assert(false);
|
|
}
|
|
else
|
|
{
|
|
assert.equal(nestedTuple.get(0), 'nested_tuple');
|
|
assert.equal(nestedTuple.get(1), 3);
|
|
}
|
|
assert.equal(tuple.get(3), undefined);
|
|
}
|
|
const buf = parsed.get('bytes');
|
|
if (buf instanceof Buffer)
|
|
{
|
|
assert.equal(Buffer.from('hello', 'binary').compare(buf), 0);
|
|
}
|
|
else
|
|
{
|
|
assert(false);
|
|
}
|
|
assert.equal(parsed.get('float'), 3.14);
|
|
assert.equal(parsed.get('integer'), 42);
|
|
assert.equal(parsed.get('hex_number'), 26);
|
|
assert.equal(parsed.get('octal_number'), 42);
|
|
assert.equal(parsed.get('string_single'), 'single-quoted\\\' string');
|
|
assert.equal(parsed.get('string_double'), 'double-quoted \\" string');
|
|
assert.equal(parsed.get('string_triple_single'), 'triple-quoted\'\nsingle-quoted string');
|
|
assert.equal(parsed.get('string_triple_double'), 'triple-quoted\"\ndouble-quoted string');
|
|
|
|
/*
|
|
raw_string_single": r'raw single-quoted\ string',
|
|
"raw_string_double": r"raw double-quoted\ string",
|
|
"raw_string_triple_single": r'''raw triple\''-quoted
|
|
single-quoted string''',
|
|
"raw_string_triple_double": r"""raw triple\''-quoted
|
|
double-quoted string"""
|
|
*/
|
|
assert.equal(parsed.get('raw_string_single'), 'raw single-quoted\\ string');
|
|
assert.equal(parsed.get('raw_string_double'), 'raw double-quoted\\ string');
|
|
assert.equal(parsed.get('raw_string_triple_single'), 'raw triple\\\'\'-quoted\nsingle-quoted string');
|
|
assert.equal(parsed.get('raw_string_triple_double'), 'raw triple\\""-quoted\ndouble-quoted string');
|
|
});
|
|
});
|
|
});
|
|
|