From 1567bb19c7b66fd5abdaf497e21ac72935d8c0dd Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Sun, 6 Jan 2019 03:10:20 -0800 Subject: [PATCH] Support arrays --- assembly/decoder.ts | 29 ++++++++++++++++++++--------- tests/assembly/decoder.spec.as.ts | 20 ++++++++++++++++---- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/assembly/decoder.ts b/assembly/decoder.ts index ddf86eb..62db96c 100644 --- a/assembly/decoder.ts +++ b/assembly/decoder.ts @@ -20,9 +20,6 @@ export abstract class JSONHandler { setInteger(name: string, value: i32): void { } - setUint8Array(name: string, value: Uint8Array): void { - } - pushArray(name: string): bool { return true; } @@ -61,10 +58,6 @@ export class ThrowingJSONHandler extends JSONHandler { assert(false, 'Unexpected integer field ' + name + ' : ' + arr.toString()); } - setUint8Array(name: string, value: Uint8Array): void { - assert(false, 'Unexpected byte array field ' + name); - } - pushArray(name: string): bool { assert(false, 'Unexpected array field' + name); return true; @@ -152,8 +145,26 @@ export class JSONDecoder { } private parseArray(): bool { - // TODO - return false; + if (this.peekChar() != "[".charCodeAt(0)) { + return false; + } + this.handler.pushArray(this.lastKey); + this.lastKey = null; + this.readChar(); + this.skipWhitespace(); + + let firstItem = true; + while (this.peekChar() != "]".charCodeAt(0)) { + if (!firstItem) { + assert(this.readChar() == ",".charCodeAt(0), "Expected ','"); + } else { + firstItem = false; + } + this.parseValue(); + } + assert(this.readChar() == "]".charCodeAt(0), "Unexpected end of array"); + this.handler.popArray(); + return true;; } private parseString(): bool { diff --git a/tests/assembly/decoder.spec.as.ts b/tests/assembly/decoder.spec.as.ts index 1e785b4..522ed66 100644 --- a/tests/assembly/decoder.spec.as.ts +++ b/tests/assembly/decoder.spec.as.ts @@ -30,10 +30,6 @@ class JSONTestHandler extends JSONHandler { this.writeInteger(value); } - setUint8Array(name: string, value: Uint8Array): void { - assert(false, "Not implemented"); - } - pushArray(name: string): bool { this.writeKey(name); this.write("["); @@ -144,6 +140,22 @@ export class StringConversionTests { return this.roundripTest('{"str":"foo","obj":{"a":1,"b":-123456}}'); } + static shouldHandleEmptyArray(): bool { + return this.roundripTest('[]'); + } + + static shouldHandleArray(): bool { + return this.roundripTest('[1,2,3]'); + } + + static shouldHandleNestedArrays(): bool { + return this.roundripTest('[[1,2,3],[4,[5,6]]]'); + } + + static shouldHandleNestedObjectsAndArrays(): bool { + return this.roundripTest('{"str":"foo","arr":[{"obj":{"a":1,"b":-123456}}]}'); + } + static shouldHandleWhitespace(): bool { return this.roundripTest( ' { "str":"foo","obj": {"a":1, "b" :\n -123456} } ',