@futpib/parser 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/allSettledStream.js +32 -14
- package/build/allSettledStream.test.js +32 -0
- package/build/androidPackage.d.ts +39 -0
- package/build/androidPackageParser.d.ts +17 -0
- package/build/androidPackageParser.js +183 -0
- package/build/{apkParser.test.js → androidPackageParser.test.js} +6 -6
- package/build/androidPackageUnparser.d.ts +4 -0
- package/build/{apkUnparser.js → androidPackageUnparser.js} +23 -23
- package/build/androidPackageUnparser.test.js +26 -0
- package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
- package/build/arbitrarilySlicedAsyncInterable.js +3 -3
- package/build/arrayParser.test.js +3 -3
- package/build/backsmali.d.ts +1 -0
- package/build/backsmali.js +22 -0
- package/build/bsonParser.js +6 -2
- package/build/customInvariant.d.ts +1 -1
- package/build/dalvikBytecodeParser/formatParsers.d.ts +97 -0
- package/build/dalvikBytecodeParser/formatParsers.js +169 -0
- package/build/dalvikBytecodeParser.d.ts +107 -0
- package/build/dalvikBytecodeParser.js +836 -0
- package/build/dalvikExecutable.d.ts +158 -0
- package/build/dalvikExecutable.js +20 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
- package/build/dalvikExecutableParser/typeParsers.d.ts +10 -0
- package/build/dalvikExecutableParser/typeParsers.js +34 -0
- package/build/dalvikExecutableParser/typedNumbers.d.ts +90 -0
- package/build/dalvikExecutableParser/typedNumbers.js +19 -0
- package/build/dalvikExecutableParser.d.ts +5 -0
- package/build/dalvikExecutableParser.js +1439 -0
- package/build/dalvikExecutableParser.test.js +70 -0
- package/build/dalvikExecutableParserAgainstSmaliParser.test.js +298 -0
- package/build/debugLogInputParser.d.ts +4 -0
- package/build/debugLogInputParser.js +16 -0
- package/build/debugLogParser.js +14 -3
- package/build/disjunctionParser.d.ts +2 -1
- package/build/disjunctionParser.js +4 -2
- package/build/elementTerminatedArrayParser.d.ts +3 -0
- package/build/elementTerminatedArrayParser.js +18 -0
- package/build/elementTerminatedArrayParser.test.js +52 -0
- package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
- package/build/elementTerminatedSequenceArrayParser.js +32 -0
- package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
- package/build/elementTerminatedSequenceParser.d.ts +3 -0
- package/build/elementTerminatedSequenceParser.js +27 -0
- package/build/elementTerminatedSequenceParser.test.js +34 -0
- package/build/exactElementParser.js +10 -5
- package/build/exactSequenceParser.d.ts +2 -1
- package/build/exactSequenceParser.js +12 -2
- package/build/fetchCid.d.ts +1 -0
- package/build/fetchCid.js +107 -0
- package/build/fixedLengthSequenceParser.d.ts +1 -0
- package/build/fixedLengthSequenceParser.js +18 -1
- package/build/fixedLengthSequenceParser.test.js +41 -0
- package/build/hasExecutable.d.ts +1 -0
- package/build/hasExecutable.js +8 -0
- package/build/highResolutionTimer.d.ts +16 -0
- package/build/highResolutionTimer.js +42 -0
- package/build/inputReader.d.ts +11 -0
- package/build/inputReader.js +37 -0
- package/build/inputReader.test.js +165 -0
- package/build/inputReaderState.d.ts +10 -0
- package/build/inputReaderState.js +16 -0
- package/build/inspect.d.ts +1 -0
- package/build/inspect.js +7 -0
- package/build/javaKeyStoreParser.test.js +2 -2
- package/build/jsonParser.d.ts +2 -0
- package/build/jsonParser.js +11 -14
- package/build/leb128Parser.d.ts +7 -0
- package/build/leb128Parser.js +82 -0
- package/build/leb128Parser.test.js +107 -0
- package/build/lookaheadParser.d.ts +2 -0
- package/build/lookaheadParser.js +14 -0
- package/build/negativeLookaheadParser.js +21 -15
- package/build/negativeLookaheadParser.test.js +30 -0
- package/build/nonEmptyArrayParser.d.ts +2 -0
- package/build/nonEmptyArrayParser.js +32 -0
- package/build/nonEmptyArrayParser.test.js +16 -0
- package/build/parser.d.ts +10 -1
- package/build/parser.js +66 -31
- package/build/parser.test.js +79 -12
- package/build/parserAccessorParser.js +9 -1
- package/build/parserConsumedSequenceParser.js +20 -15
- package/build/parserContext.d.ts +14 -0
- package/build/parserContext.js +56 -27
- package/build/parserContext.test.js +27 -0
- package/build/parserCreatorCompose.d.ts +1 -0
- package/build/parserCreatorCompose.js +8 -2
- package/build/parserError.d.ts +6 -0
- package/build/parserError.js +6 -6
- package/build/parserInputCompanion.d.ts +15 -0
- package/build/parserInputCompanion.js +38 -0
- package/build/promiseCompose.d.ts +1 -1
- package/build/promiseCompose.js +12 -1
- package/build/promiseSettled.d.ts +1 -0
- package/build/promiseSettled.js +4 -0
- package/build/separatedArrayParser.d.ts +2 -0
- package/build/separatedArrayParser.js +39 -0
- package/build/separatedArrayParser.test.d.ts +1 -0
- package/build/separatedArrayParser.test.js +21 -0
- package/build/sequenceBuffer.d.ts +10 -0
- package/build/sequenceBuffer.js +54 -2
- package/build/sequenceBuffer.test.js +57 -0
- package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
- package/build/sequenceTerminatedSequenceParser.js +32 -0
- package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
- package/build/sequenceTerminatedSequenceParser.test.js +37 -0
- package/build/skipParser.d.ts +1 -1
- package/build/skipParser.js +4 -2
- package/build/skipToParser.d.ts +2 -0
- package/build/skipToParser.js +11 -0
- package/build/sliceBoundedParser.d.ts +1 -1
- package/build/sliceBoundedParser.js +7 -2
- package/build/sliceBoundedParser.test.js +35 -1
- package/build/smali.d.ts +1 -0
- package/build/smali.js +17 -0
- package/build/smaliParser.d.ts +12 -0
- package/build/smaliParser.js +656 -0
- package/build/smaliParser.test.d.ts +1 -0
- package/build/smaliParser.test.js +115 -0
- package/build/terminatedArrayParser.d.ts +3 -1
- package/build/terminatedArrayParser.js +79 -2
- package/build/terminatedArrayParser.test.d.ts +1 -0
- package/build/terminatedArrayParser.test.js +131 -0
- package/build/toAsyncIterable.d.ts +1 -0
- package/build/toAsyncIterable.js +7 -0
- package/build/toAsyncIterator.d.ts +1 -0
- package/build/toAsyncIterator.js +33 -0
- package/build/tupleParser.d.ts +4 -0
- package/build/tupleParser.js +1 -5
- package/build/unionParser.d.ts +2 -1
- package/build/unionParser.js +27 -12
- package/build/unionParser.test.d.ts +1 -0
- package/build/unionParser.test.js +60 -0
- package/build/zipParser.d.ts +7 -2
- package/build/zipParser.js +36 -12
- package/build/zipUnparser.d.ts +4 -1
- package/build/zipUnparser.js +55 -26
- package/build/zipUnparser.test.js +14 -14
- package/package.json +23 -7
- package/src/allSettledStream.test.ts +40 -0
- package/src/allSettledStream.ts +47 -15
- package/src/androidPackage.ts +48 -0
- package/src/{apkParser.test.ts → androidPackageParser.test.ts} +6 -7
- package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
- package/src/androidPackageParser.test.ts.snap +0 -0
- package/src/androidPackageParser.ts +440 -0
- package/src/androidPackageUnparser.test.ts +36 -0
- package/src/androidPackageUnparser.ts +120 -0
- package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
- package/src/arrayParser.test.ts +3 -3
- package/src/backsmali.ts +30 -0
- package/src/bsonParser.ts +13 -2
- package/src/customInvariant.ts +1 -1
- package/src/dalvikBytecodeParser/formatParsers.ts +421 -0
- package/src/dalvikBytecodeParser.ts +2074 -0
- package/src/dalvikExecutable.ts +220 -0
- package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
- package/src/dalvikExecutableParser/typeParsers.ts +65 -0
- package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
- package/src/dalvikExecutableParser.test.ts +89 -0
- package/src/dalvikExecutableParser.test.ts.md +634 -0
- package/src/dalvikExecutableParser.test.ts.snap +0 -0
- package/src/dalvikExecutableParser.ts +2768 -0
- package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +346 -0
- package/src/debugLogInputParser.ts +28 -0
- package/src/debugLogParser.ts +19 -3
- package/src/disjunctionParser.ts +10 -5
- package/src/elementTerminatedArrayParser.test.ts +99 -0
- package/src/elementTerminatedArrayParser.ts +31 -0
- package/src/elementTerminatedSequenceArrayParser.test.ts +54 -0
- package/src/elementTerminatedSequenceArrayParser.ts +52 -0
- package/src/elementTerminatedSequenceParser.test.ts +54 -0
- package/src/elementTerminatedSequenceParser.ts +43 -0
- package/src/exactElementParser.ts +17 -11
- package/src/exactSequenceParser.ts +23 -2
- package/src/fetchCid.ts +125 -0
- package/src/fixedLengthSequenceParser.test.ts +77 -0
- package/src/fixedLengthSequenceParser.ts +28 -1
- package/src/hasExecutable.ts +11 -0
- package/src/highResolutionTimer.ts +49 -0
- package/src/inputReader.test.ts +209 -0
- package/src/inputReader.ts +75 -0
- package/src/inputReaderState.ts +33 -0
- package/src/inspect.ts +9 -0
- package/src/javaKeyStoreParser.test.ts +2 -3
- package/src/jsonParser.ts +13 -25
- package/src/leb128Parser.test.ts +171 -0
- package/src/leb128Parser.ts +125 -0
- package/src/lookaheadParser.ts +19 -0
- package/src/negativeLookaheadParser.test.ts +53 -0
- package/src/negativeLookaheadParser.ts +26 -14
- package/src/nonEmptyArrayParser.test.ts +20 -0
- package/src/nonEmptyArrayParser.ts +44 -0
- package/src/optionalParser.ts +1 -0
- package/src/parser.test.ts +131 -12
- package/src/parser.test.ts.md +21 -21
- package/src/parser.test.ts.snap +0 -0
- package/src/parser.ts +149 -45
- package/src/parserAccessorParser.ts +12 -2
- package/src/parserConsumedSequenceParser.ts +25 -16
- package/src/parserContext.test.ts +31 -0
- package/src/parserContext.ts +109 -37
- package/src/parserCreatorCompose.ts +20 -2
- package/src/parserError.ts +9 -6
- package/src/parserInputCompanion.ts +55 -0
- package/src/promiseCompose.ts +17 -3
- package/src/promiseSettled.ts +6 -0
- package/src/separatedArrayParser.test.ts +34 -0
- package/src/separatedArrayParser.ts +55 -0
- package/src/sequenceBuffer.test.ts +70 -0
- package/src/sequenceBuffer.ts +88 -2
- package/src/sequenceTerminatedSequenceParser.test.ts +60 -0
- package/src/sequenceTerminatedSequenceParser.ts +62 -0
- package/src/skipParser.ts +7 -5
- package/src/skipToParser.ts +16 -0
- package/src/sliceBoundedParser.test.ts +43 -1
- package/src/sliceBoundedParser.ts +19 -1
- package/src/smali.ts +24 -0
- package/src/smaliParser.test.ts +132 -0
- package/src/smaliParser.test.ts.md +2320 -0
- package/src/smaliParser.test.ts.snap +0 -0
- package/src/smaliParser.ts +1166 -0
- package/src/terminatedArrayParser.test.ts +258 -0
- package/src/terminatedArrayParser.ts +108 -3
- package/src/toAsyncIterable.ts +7 -0
- package/src/toAsyncIterator.ts +48 -0
- package/src/tupleParser.ts +8 -5
- package/src/unionParser.test.ts +79 -0
- package/src/unionParser.ts +44 -16
- package/src/zipParser.ts +77 -18
- package/src/zipUnparser.test.ts +18 -18
- package/src/zipUnparser.ts +88 -27
- package/build/apk.d.ts +0 -39
- package/build/apkParser.d.ts +0 -16
- package/build/apkParser.js +0 -164
- package/build/apkUnparser.d.ts +0 -4
- package/build/apkUnparser.test.js +0 -26
- package/build/arbitraryDosDate.d.ts +0 -2
- package/build/arbitraryDosDate.js +0 -8
- package/build/arbitraryZipEntry.d.ts +0 -3
- package/build/arbitraryZipEntry.js +0 -26
- package/build/createDisjunctionParser.d.ts +0 -2
- package/build/createDisjunctionParser.js +0 -47
- package/build/createExactParser.d.ts +0 -2
- package/build/createExactParser.js +0 -12
- package/build/createSequentialUnionParser.d.ts +0 -2
- package/build/createSequentialUnionParser.js +0 -69
- package/build/fixedLengthChunkParser.d.ts +0 -2
- package/build/fixedLengthChunkParser.js +0 -12
- package/build/fixedLengthParser.d.ts +0 -2
- package/build/fixedLengthParser.js +0 -12
- package/build/inputChunkBuffer.d.ts +0 -15
- package/build/inputChunkBuffer.js +0 -40
- package/build/inputChunkBuffer.test.js +0 -34
- package/build/inputCompanion.d.ts +0 -18
- package/build/inputCompanion.js +0 -28
- package/build/invariantDefined.d.ts +0 -1
- package/build/invariantDefined.js +0 -5
- package/build/invariantIdentity.d.ts +0 -3
- package/build/invariantIdentity.js +0 -5
- package/build/javaKeystoreParser.d.ts +0 -2
- package/build/javaKeystoreParser.js +0 -7
- package/build/jsonParser2.d.ts +0 -3
- package/build/jsonParser2.js +0 -52
- package/build/jsonParser2.test.js +0 -22
- package/build/negativeLookahead.d.ts +0 -2
- package/build/negativeLookahead.js +0 -18
- package/build/parserCompose.d.ts +0 -3
- package/build/parserCompose.js +0 -7
- package/build/parserImplementationInvariantInvariant.d.ts +0 -3
- package/build/parserImplementationInvariantInvariant.js +0 -15
- package/build/parserInvariant.d.ts +0 -4
- package/build/parserInvariant.js +0 -11
- package/build/promiseFish.d.ts +0 -1
- package/build/promiseFish.js +0 -3
- package/build/sequenceParser.d.ts +0 -3
- package/build/sequenceParser.js +0 -10
- package/build/terminatedSequenceParser.d.ts +0 -2
- package/build/terminatedSequenceParser.js +0 -24
- package/build/unparserInputCompanion.d.ts +0 -15
- package/build/unparserInputCompanion.js +0 -13
- package/build/zipEntry.d.ts +0 -28
- package/build/zipFile.d.ts +0 -32
- package/build/zipFileEntry.d.ts +0 -6
- package/src/apk.ts +0 -48
- package/src/apkParser.test.ts.snap +0 -0
- package/src/apkParser.ts +0 -392
- package/src/apkUnparser.test.ts +0 -37
- package/src/apkUnparser.ts +0 -120
- package/src/invariantDefined.ts +0 -6
- package/src/invariantIdentity.ts +0 -8
- /package/build/{apk.js → androidPackage.js} +0 -0
- /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
- /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
- /package/build/{arbitraryDosPermissions.d.ts → dalvikExecutableParser.test.d.ts} +0 -0
- /package/build/{arbitraryDosPermissions.js → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
- /package/build/{inputChunkBuffer.test.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
- /package/build/{jsonParser2.test.d.ts → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
- /package/build/{parserParsingInvariant.d.ts → elementTerminatedSequenceParser.test.d.ts} +0 -0
- /package/build/{parserParsingInvariant.js → fixedLengthSequenceParser.test.d.ts} +0 -0
- /package/build/{zipEntry.js → leb128Parser.test.d.ts} +0 -0
- /package/build/{zipFile.js → negativeLookaheadParser.test.d.ts} +0 -0
- /package/build/{zipFileEntry.js → nonEmptyArrayParser.test.d.ts} +0 -0
package/src/inputReader.test.ts
CHANGED
|
@@ -2,6 +2,8 @@ import test from 'ava';
|
|
|
2
2
|
import { InputReaderImplementation } from './inputReader.js';
|
|
3
3
|
import { stringParserInputCompanion } from './parserInputCompanion.js';
|
|
4
4
|
import { ParserImplementationError } from './parserError.js';
|
|
5
|
+
import { toAsyncIterable } from './toAsyncIterable.js';
|
|
6
|
+
import { InputReaderState } from './inputReaderState.js';
|
|
5
7
|
|
|
6
8
|
test('inputReader', async t => {
|
|
7
9
|
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
@@ -46,6 +48,53 @@ test('inputReader', async t => {
|
|
|
46
48
|
t.is(await inputReader.peek(0), undefined);
|
|
47
49
|
});
|
|
48
50
|
|
|
51
|
+
test('inputReader peekSequence', async t => {
|
|
52
|
+
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
53
|
+
yield '';
|
|
54
|
+
yield 'abc';
|
|
55
|
+
yield 'def';
|
|
56
|
+
yield '';
|
|
57
|
+
yield 'gh';
|
|
58
|
+
})());
|
|
59
|
+
|
|
60
|
+
t.is(await inputReader.peekSequence(0, 0), '');
|
|
61
|
+
t.is(await inputReader.peekSequence(0, 1), 'a');
|
|
62
|
+
|
|
63
|
+
inputReader.skip(0);
|
|
64
|
+
|
|
65
|
+
t.is(await inputReader.peekSequence(1, 2), 'b');
|
|
66
|
+
|
|
67
|
+
inputReader.skip(1);
|
|
68
|
+
|
|
69
|
+
t.is(await inputReader.peekSequence(1, 7), 'bcdefgh'.slice(1, 7));
|
|
70
|
+
t.is(await inputReader.peekSequence(1, 8), undefined);
|
|
71
|
+
|
|
72
|
+
inputReader.skip(6);
|
|
73
|
+
|
|
74
|
+
t.is(await inputReader.peekSequence(0, 0), '');
|
|
75
|
+
t.is(await inputReader.peekSequence(0, 1), 'h');
|
|
76
|
+
t.is(await inputReader.peekSequence(1, 2), undefined);
|
|
77
|
+
t.is(await inputReader.peekSequence(2, 2), undefined);
|
|
78
|
+
|
|
79
|
+
inputReader.skip(1);
|
|
80
|
+
|
|
81
|
+
t.is(await inputReader.peekSequence(0, 0), '');
|
|
82
|
+
t.is(await inputReader.peekSequence(0, 1), undefined);
|
|
83
|
+
t.is(await inputReader.peekSequence(1, 1), undefined);
|
|
84
|
+
|
|
85
|
+
inputReader.skip(0);
|
|
86
|
+
|
|
87
|
+
t.is(await inputReader.peekSequence(0, 0), '');
|
|
88
|
+
t.is(await inputReader.peekSequence(0, 1), undefined);
|
|
89
|
+
t.is(await inputReader.peekSequence(1, 1), undefined);
|
|
90
|
+
|
|
91
|
+
inputReader.skip(1);
|
|
92
|
+
|
|
93
|
+
t.is(await inputReader.peekSequence(0, 0), undefined);
|
|
94
|
+
t.is(await inputReader.peekSequence(0, 1), undefined);
|
|
95
|
+
t.is(await inputReader.peekSequence(1, 1), undefined);
|
|
96
|
+
});
|
|
97
|
+
|
|
49
98
|
test('inputReader.peek concurrent', async t => {
|
|
50
99
|
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
51
100
|
yield * 'abcdefgh';
|
|
@@ -68,6 +117,64 @@ test('inputReader.peek concurrent', async t => {
|
|
|
68
117
|
t.deepEqual(peeks, [ 'a', 'a', 'a', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ]);
|
|
69
118
|
});
|
|
70
119
|
|
|
120
|
+
test('inputReader.peekSequence concurrent', async t => {
|
|
121
|
+
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
122
|
+
yield * 'abcdefgh';
|
|
123
|
+
})());
|
|
124
|
+
|
|
125
|
+
const peeks = await Promise.all([1, 2, 3].flatMap(length => [
|
|
126
|
+
inputReader.peekSequence(0, 0 + length),
|
|
127
|
+
inputReader.peekSequence(0, 0 + length),
|
|
128
|
+
inputReader.peekSequence(0, 0 + length),
|
|
129
|
+
inputReader.peekSequence(0, 0 + length),
|
|
130
|
+
inputReader.peekSequence(1, 1 + length),
|
|
131
|
+
inputReader.peekSequence(2, 2 + length),
|
|
132
|
+
inputReader.peekSequence(3, 3 + length),
|
|
133
|
+
inputReader.peekSequence(4, 4 + length),
|
|
134
|
+
inputReader.peekSequence(5, 5 + length),
|
|
135
|
+
inputReader.peekSequence(6, 6 + length),
|
|
136
|
+
inputReader.peekSequence(7, 7 + length),
|
|
137
|
+
]));
|
|
138
|
+
|
|
139
|
+
t.deepEqual(peeks, [
|
|
140
|
+
'a',
|
|
141
|
+
'a',
|
|
142
|
+
'a',
|
|
143
|
+
'a',
|
|
144
|
+
'b',
|
|
145
|
+
'c',
|
|
146
|
+
'd',
|
|
147
|
+
'e',
|
|
148
|
+
'f',
|
|
149
|
+
'g',
|
|
150
|
+
'h',
|
|
151
|
+
|
|
152
|
+
'ab',
|
|
153
|
+
'ab',
|
|
154
|
+
'ab',
|
|
155
|
+
'ab',
|
|
156
|
+
'bc',
|
|
157
|
+
'cd',
|
|
158
|
+
'de',
|
|
159
|
+
'ef',
|
|
160
|
+
'fg',
|
|
161
|
+
'gh',
|
|
162
|
+
undefined,
|
|
163
|
+
|
|
164
|
+
'abc',
|
|
165
|
+
'abc',
|
|
166
|
+
'abc',
|
|
167
|
+
'abc',
|
|
168
|
+
'bcd',
|
|
169
|
+
'cde',
|
|
170
|
+
'def',
|
|
171
|
+
'efg',
|
|
172
|
+
'fgh',
|
|
173
|
+
undefined,
|
|
174
|
+
undefined,
|
|
175
|
+
]);
|
|
176
|
+
});
|
|
177
|
+
|
|
71
178
|
test('inputReader skip while peeking', async t => {
|
|
72
179
|
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
73
180
|
yield * 'abcdefgh';
|
|
@@ -77,8 +184,33 @@ test('inputReader skip while peeking', async t => {
|
|
|
77
184
|
|
|
78
185
|
inputReader.skip(1);
|
|
79
186
|
|
|
187
|
+
const peekAfterSkipPromise = inputReader.peek(0);
|
|
188
|
+
const peekSequenceAfterSkipPromise = inputReader.peekSequence(0, 5);
|
|
189
|
+
|
|
80
190
|
t.is(await peekPromise, 'a');
|
|
81
191
|
t.is(await inputReader.peek(0), 'b');
|
|
192
|
+
|
|
193
|
+
t.is(await peekAfterSkipPromise, 'b');
|
|
194
|
+
t.is(await peekSequenceAfterSkipPromise, 'bcdef');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('inputReader skip while peeking sequence', async t => {
|
|
198
|
+
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
199
|
+
yield * 'abcdefgh';
|
|
200
|
+
})());
|
|
201
|
+
|
|
202
|
+
const peekPromise = inputReader.peekSequence(1, 5);
|
|
203
|
+
|
|
204
|
+
inputReader.skip(1);
|
|
205
|
+
|
|
206
|
+
const peekAfterSkipPromise = inputReader.peek(0);
|
|
207
|
+
const peekSequenceAfterSkipPromise = inputReader.peekSequence(0, 4);
|
|
208
|
+
|
|
209
|
+
t.is(await peekPromise, 'bcde', 'peekPromise');
|
|
210
|
+
t.is(await inputReader.peekSequence(0, 4), 'bcde', 'inputReader.peekSequence(0, 4)');
|
|
211
|
+
|
|
212
|
+
t.is(await peekAfterSkipPromise, 'b', 'peekAfterSkipPromise');
|
|
213
|
+
t.is(await peekSequenceAfterSkipPromise, 'bcde', 'peekSequenceAfterSkipPromise');
|
|
82
214
|
});
|
|
83
215
|
|
|
84
216
|
test('inputReader.lookahead', async t => {
|
|
@@ -236,3 +368,80 @@ test('inputReader.lookahead skip position', async t => {
|
|
|
236
368
|
t.is(await lookahead.peek(0), 'c');
|
|
237
369
|
t.is(await lookahead1.peek(0), 'd');
|
|
238
370
|
});
|
|
371
|
+
|
|
372
|
+
const END_OF_CONSUMED_SEQUENCES = Symbol('END_OF_CONSUMED_SEQUENCES');
|
|
373
|
+
const END_OF_BUFFERED_SEQUENCES = Symbol('END_OF_BUFFERED_SEQUENCES');
|
|
374
|
+
|
|
375
|
+
async function inputReaderStateToArray<Sequence>({
|
|
376
|
+
unconsumedBufferedSequences,
|
|
377
|
+
consumedBufferedSequences,
|
|
378
|
+
unbufferedSequences,
|
|
379
|
+
}: InputReaderState<Sequence>): Promise<(Sequence | typeof END_OF_CONSUMED_SEQUENCES | typeof END_OF_BUFFERED_SEQUENCES)[]> {
|
|
380
|
+
const unconsumedBufferedSequencesArray = unconsumedBufferedSequences.slice();
|
|
381
|
+
const consumedBufferedSequencesArray = consumedBufferedSequences.slice();
|
|
382
|
+
|
|
383
|
+
const unbufferedSequencesArray = [];
|
|
384
|
+
if (unbufferedSequences) {
|
|
385
|
+
for await (const sequence of toAsyncIterable(unbufferedSequences)) {
|
|
386
|
+
unbufferedSequencesArray.push(sequence);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return [
|
|
391
|
+
...consumedBufferedSequencesArray,
|
|
392
|
+
END_OF_CONSUMED_SEQUENCES,
|
|
393
|
+
...unconsumedBufferedSequencesArray,
|
|
394
|
+
END_OF_BUFFERED_SEQUENCES,
|
|
395
|
+
...unbufferedSequencesArray,
|
|
396
|
+
];
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
for (const [
|
|
400
|
+
input,
|
|
401
|
+
position,
|
|
402
|
+
expected,
|
|
403
|
+
] of [
|
|
404
|
+
[
|
|
405
|
+
[ '', 'abc', 'def', '', 'gh' ],
|
|
406
|
+
0,
|
|
407
|
+
[ END_OF_CONSUMED_SEQUENCES, 'abc', END_OF_BUFFERED_SEQUENCES, 'def', '', 'gh' ],
|
|
408
|
+
],
|
|
409
|
+
[
|
|
410
|
+
[ '', 'abc', 'def', '', 'gh' ],
|
|
411
|
+
1,
|
|
412
|
+
[ 'a', END_OF_CONSUMED_SEQUENCES, 'bc', END_OF_BUFFERED_SEQUENCES, 'def', '', 'gh' ],
|
|
413
|
+
],
|
|
414
|
+
[
|
|
415
|
+
[ '', 'abc', 'def', '', 'gh' ],
|
|
416
|
+
2,
|
|
417
|
+
[ 'ab', END_OF_CONSUMED_SEQUENCES, 'c', END_OF_BUFFERED_SEQUENCES, 'def', '', 'gh' ],
|
|
418
|
+
],
|
|
419
|
+
[
|
|
420
|
+
[ '', 'abc', 'def', '', 'gh' ],
|
|
421
|
+
3,
|
|
422
|
+
[ END_OF_CONSUMED_SEQUENCES, 'def', END_OF_BUFFERED_SEQUENCES, '', 'gh' ],
|
|
423
|
+
],
|
|
424
|
+
[
|
|
425
|
+
[ '', 'abc', 'def', '', 'gh' ],
|
|
426
|
+
4,
|
|
427
|
+
[ 'd', END_OF_CONSUMED_SEQUENCES, 'ef', END_OF_BUFFERED_SEQUENCES, '', 'gh' ],
|
|
428
|
+
],
|
|
429
|
+
[
|
|
430
|
+
[ '', 'abc', 'def', '', 'gh' ],
|
|
431
|
+
8,
|
|
432
|
+
[ END_OF_CONSUMED_SEQUENCES, END_OF_BUFFERED_SEQUENCES ],
|
|
433
|
+
],
|
|
434
|
+
] as const) {
|
|
435
|
+
test('inputReader.toInputReaderState ' + JSON.stringify({ input, position }), async t => {
|
|
436
|
+
const inputReader = new InputReaderImplementation(stringParserInputCompanion, (async function * () {
|
|
437
|
+
yield * input;
|
|
438
|
+
})());
|
|
439
|
+
|
|
440
|
+
inputReader.skip(position);
|
|
441
|
+
await inputReader.peek(0);
|
|
442
|
+
|
|
443
|
+
const actual = await inputReaderStateToArray(inputReader.toInputReaderState());
|
|
444
|
+
|
|
445
|
+
t.deepEqual(actual, expected);
|
|
446
|
+
});
|
|
447
|
+
}
|
package/src/inputReader.ts
CHANGED
|
@@ -3,14 +3,18 @@ import invariant from 'invariant';
|
|
|
3
3
|
import { type SequenceBuffer, SequenceBufferImplementation } from './sequenceBuffer.js';
|
|
4
4
|
import { type ParserInputCompanion } from './parserInputCompanion.js';
|
|
5
5
|
import { parserImplementationInvariant } from './parserImplementationInvariant.js';
|
|
6
|
+
import { InputReaderState } from './inputReaderState.js';
|
|
6
7
|
|
|
7
8
|
export type InputReader<Sequence, Element> = {
|
|
8
9
|
get position(): number;
|
|
9
10
|
|
|
10
11
|
peek(offset: number): Promise<Element | undefined>;
|
|
12
|
+
peekSequence(start: number, end: number): Promise<Sequence | undefined>;
|
|
11
13
|
skip(offset: number): void;
|
|
12
14
|
|
|
13
15
|
lookahead(): InputReader<Sequence, Element>;
|
|
16
|
+
|
|
17
|
+
toInputReaderState(): InputReaderState<Sequence>;
|
|
14
18
|
};
|
|
15
19
|
|
|
16
20
|
let inputReaderId = 0;
|
|
@@ -20,6 +24,7 @@ export class InputReaderImplementation<Sequence, Element> implements InputReader
|
|
|
20
24
|
|
|
21
25
|
private _position = 0;
|
|
22
26
|
private _uncommitedSkipOffset = 0;
|
|
27
|
+
private _inputAsyncIteratorDone = false;
|
|
23
28
|
|
|
24
29
|
private readonly _promiseMutex = new PromiseMutex();
|
|
25
30
|
|
|
@@ -66,6 +71,8 @@ export class InputReaderImplementation<Sequence, Element> implements InputReader
|
|
|
66
71
|
const inputIteratorResult = await this._inputAsyncIterator.next();
|
|
67
72
|
|
|
68
73
|
if (inputIteratorResult.done) {
|
|
74
|
+
this._inputAsyncIteratorDone = true;
|
|
75
|
+
|
|
69
76
|
return undefined;
|
|
70
77
|
}
|
|
71
78
|
|
|
@@ -85,6 +92,47 @@ export class InputReaderImplementation<Sequence, Element> implements InputReader
|
|
|
85
92
|
});
|
|
86
93
|
}
|
|
87
94
|
|
|
95
|
+
async peekSequence(start: number, end: number): Promise<Sequence | undefined> {
|
|
96
|
+
parserImplementationInvariant(
|
|
97
|
+
start >= 0,
|
|
98
|
+
'start (%s) >= 0',
|
|
99
|
+
start,
|
|
100
|
+
);
|
|
101
|
+
parserImplementationInvariant(
|
|
102
|
+
end >= start,
|
|
103
|
+
'end (%s) >= start (%s)',
|
|
104
|
+
start,
|
|
105
|
+
end,
|
|
106
|
+
);
|
|
107
|
+
parserImplementationInvariant(
|
|
108
|
+
Number.isSafeInteger(start),
|
|
109
|
+
'start (%s) is not a safe integer',
|
|
110
|
+
start,
|
|
111
|
+
);
|
|
112
|
+
parserImplementationInvariant(
|
|
113
|
+
Number.isSafeInteger(end),
|
|
114
|
+
'end (%s) is not a safe integer',
|
|
115
|
+
end,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
start += this._uncommitedSkipOffset;
|
|
119
|
+
end += this._uncommitedSkipOffset;
|
|
120
|
+
|
|
121
|
+
const sequence = this._sequenceBuffer.peekSequence(start, end);
|
|
122
|
+
|
|
123
|
+
if (sequence !== undefined) {
|
|
124
|
+
return sequence;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const lastElement = await this.peek(Math.max(0, end - 1));
|
|
128
|
+
|
|
129
|
+
if (lastElement === undefined) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return this._sequenceBuffer.peekSequence(start, end);
|
|
134
|
+
}
|
|
135
|
+
|
|
88
136
|
skip(offset: number) {
|
|
89
137
|
parserImplementationInvariant(offset >= 0, 'offset >= 0');
|
|
90
138
|
|
|
@@ -101,6 +149,20 @@ export class InputReaderImplementation<Sequence, Element> implements InputReader
|
|
|
101
149
|
lookahead(): InputReader<Sequence, Element> {
|
|
102
150
|
return new InputReaderLookaheadImplementation(this);
|
|
103
151
|
}
|
|
152
|
+
|
|
153
|
+
toInputReaderState() {
|
|
154
|
+
const {
|
|
155
|
+
consumedBufferedSequences,
|
|
156
|
+
unconsumedBufferedSequences,
|
|
157
|
+
} = this._sequenceBuffer.toSequenceBufferState();
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
consumedBufferedSequences,
|
|
161
|
+
unconsumedBufferedSequences,
|
|
162
|
+
unbufferedSequences: this._inputAsyncIteratorDone ? undefined : this._inputAsyncIterator,
|
|
163
|
+
position: this._position,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
104
166
|
}
|
|
105
167
|
|
|
106
168
|
class InputReaderLookaheadImplementation<Sequence, Element> implements InputReader<Sequence, Element> {
|
|
@@ -134,6 +196,15 @@ class InputReaderLookaheadImplementation<Sequence, Element> implements InputRead
|
|
|
134
196
|
return this._inputReader.peek(this._offset + offset);
|
|
135
197
|
}
|
|
136
198
|
|
|
199
|
+
async peekSequence(start: number, end: number): Promise<Sequence | undefined> {
|
|
200
|
+
const inputReaderMovedForward = this._inputReader.position - this._initialInputReaderPosition;
|
|
201
|
+
|
|
202
|
+
this._initialInputReaderPosition = this._inputReader.position;
|
|
203
|
+
this._offset -= inputReaderMovedForward;
|
|
204
|
+
|
|
205
|
+
return this._inputReader.peekSequence(this._offset + start, this._offset + end);
|
|
206
|
+
}
|
|
207
|
+
|
|
137
208
|
skip(offset: number) {
|
|
138
209
|
parserImplementationInvariant(offset >= 0, 'offset >= 0');
|
|
139
210
|
|
|
@@ -156,4 +227,8 @@ class InputReaderLookaheadImplementation<Sequence, Element> implements InputRead
|
|
|
156
227
|
|
|
157
228
|
return lookahead;
|
|
158
229
|
}
|
|
230
|
+
|
|
231
|
+
toInputReaderState() {
|
|
232
|
+
return invariant(false, 'Not implemented');
|
|
233
|
+
}
|
|
159
234
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type InputReaderState<Sequence> = {
|
|
2
|
+
position: number;
|
|
3
|
+
consumedBufferedSequences: Sequence[];
|
|
4
|
+
unconsumedBufferedSequences: Sequence[];
|
|
5
|
+
unbufferedSequences: undefined | AsyncIterator<Sequence>;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const inputReaderStateCompanion = {
|
|
9
|
+
isDone<Sequence>({
|
|
10
|
+
unconsumedBufferedSequences,
|
|
11
|
+
unbufferedSequences,
|
|
12
|
+
}: InputReaderState<Sequence>): boolean {
|
|
13
|
+
return (
|
|
14
|
+
unconsumedBufferedSequences.length === 0
|
|
15
|
+
&& unbufferedSequences === undefined
|
|
16
|
+
);
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
async * toRemainingInputAsyncIterator<Sequence>({
|
|
20
|
+
unconsumedBufferedSequences,
|
|
21
|
+
unbufferedSequences,
|
|
22
|
+
}: InputReaderState<Sequence>): AsyncIterable<Sequence> {
|
|
23
|
+
yield * unconsumedBufferedSequences;
|
|
24
|
+
|
|
25
|
+
if (unbufferedSequences !== undefined) {
|
|
26
|
+
yield * {
|
|
27
|
+
[Symbol.asyncIterator]() {
|
|
28
|
+
return unbufferedSequences;
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
package/src/inspect.ts
ADDED
|
@@ -2,6 +2,7 @@ import test from 'ava';
|
|
|
2
2
|
import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
|
|
3
3
|
import { runParser } from './parser.js';
|
|
4
4
|
import { javaKeyStoreParser } from './javaKeyStoreParser.js';
|
|
5
|
+
import { fetchCid } from './fetchCid.js';
|
|
5
6
|
|
|
6
7
|
for (const javaKeyStoreCid of [
|
|
7
8
|
'bafkreig6k53b6p7bdvfjxc5mcb4qv3mffqls5ymqerxkqd6ih2xy5cs3n4',
|
|
@@ -9,9 +10,7 @@ for (const javaKeyStoreCid of [
|
|
|
9
10
|
test(
|
|
10
11
|
'javaKeyStore ' + javaKeyStoreCid,
|
|
11
12
|
async t => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const javaKeyStoreStream = javaKeyStoreResponse.body!;
|
|
13
|
+
const javaKeyStoreStream = await fetchCid(javaKeyStoreCid);
|
|
15
14
|
|
|
16
15
|
const actual = await runParser(javaKeyStoreParser, javaKeyStoreStream, uint8ArrayParserInputCompanion, {
|
|
17
16
|
errorJoinMode: 'all',
|
package/src/jsonParser.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { createArrayParser } from './arrayParser.js';
|
|
|
13
13
|
import { createParserAccessorParser } from './parserAccessorParser.js';
|
|
14
14
|
import { createElementParser } from './elementParser.js';
|
|
15
15
|
import { parserCreatorCompose } from './parserCreatorCompose.js';
|
|
16
|
+
import { createSeparatedArrayParser } from './separatedArrayParser.js';
|
|
16
17
|
|
|
17
18
|
const whitespaceParser: Parser<unknown, string> = createArrayParser(
|
|
18
19
|
createUnionParser([
|
|
@@ -65,7 +66,7 @@ const jsonStringCharacterParser: Parser<string, string> = createDisjunctionParse
|
|
|
65
66
|
)(),
|
|
66
67
|
]);
|
|
67
68
|
|
|
68
|
-
const jsonStringParser: Parser<string, string> = promiseCompose(
|
|
69
|
+
export const jsonStringParser: Parser<string, string> = promiseCompose(
|
|
69
70
|
createTupleParser([
|
|
70
71
|
createExactSequenceParser('"'),
|
|
71
72
|
promiseCompose(
|
|
@@ -79,7 +80,7 @@ const jsonStringParser: Parser<string, string> = promiseCompose(
|
|
|
79
80
|
([ , string ]) => string,
|
|
80
81
|
);
|
|
81
82
|
|
|
82
|
-
const jsonNumberParser: Parser<number, string> = parserCreatorCompose(
|
|
83
|
+
export const jsonNumberParser: Parser<number, string> = parserCreatorCompose(
|
|
83
84
|
() => createArrayParser(
|
|
84
85
|
parserCreatorCompose(
|
|
85
86
|
() => elementParser,
|
|
@@ -189,30 +190,17 @@ const jsonArrayParser: Parser<JsonArray, string> = promiseCompose(
|
|
|
189
190
|
createTupleParser([
|
|
190
191
|
createExactSequenceParser('['),
|
|
191
192
|
whitespaceParser,
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
createExactSequenceParser(','),
|
|
200
|
-
whitespaceParser,
|
|
201
|
-
]),
|
|
202
|
-
([ value ]) => value,
|
|
203
|
-
),
|
|
204
|
-
promiseCompose(
|
|
205
|
-
createTupleParser([
|
|
206
|
-
createParserAccessorParser(() => jsonValueParser),
|
|
207
|
-
whitespaceParser,
|
|
208
|
-
]),
|
|
209
|
-
([ value ]) => value,
|
|
210
|
-
),
|
|
211
|
-
]),
|
|
212
|
-
createExactSequenceParser(']'),
|
|
213
|
-
),
|
|
214
|
-
([ values ]) => values,
|
|
193
|
+
createSeparatedArrayParser(
|
|
194
|
+
createParserAccessorParser(() => jsonValueParser),
|
|
195
|
+
createTupleParser([
|
|
196
|
+
whitespaceParser,
|
|
197
|
+
createExactSequenceParser(','),
|
|
198
|
+
whitespaceParser,
|
|
199
|
+
]),
|
|
215
200
|
),
|
|
201
|
+
whitespaceParser,
|
|
202
|
+
createExactSequenceParser(']'),
|
|
203
|
+
whitespaceParser,
|
|
216
204
|
]),
|
|
217
205
|
([ _bracket, _whitespace, values ]) => values,
|
|
218
206
|
);
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { testProp, fc } from '@fast-check/ava';
|
|
2
|
+
import test from 'ava';
|
|
3
|
+
// @ts-expect-error
|
|
4
|
+
import leb128 from 'leb128';
|
|
5
|
+
import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
|
|
6
|
+
import { runParser } from './parser.js';
|
|
7
|
+
import { uleb128Parser, sleb128Parser, uleb128NumberParser, sleb128NumberParser } from './leb128Parser.js';
|
|
8
|
+
|
|
9
|
+
test('sleb128, uleb128, uleb128p1', async t => {
|
|
10
|
+
for (const [
|
|
11
|
+
input, expectedSleb128, expectedUleb128,
|
|
12
|
+
] of [
|
|
13
|
+
[ Buffer.from('00', 'hex'), 0n, 0n ],
|
|
14
|
+
[ Buffer.from('01', 'hex'), 1n, 1n ],
|
|
15
|
+
[ Buffer.from('7f', 'hex'), -1n, 127n ],
|
|
16
|
+
[ Buffer.from('807f', 'hex'), -128n, 16256n ],
|
|
17
|
+
] as const) {
|
|
18
|
+
const actualSleb128 = await runParser(sleb128Parser, input, uint8ArrayParserInputCompanion);
|
|
19
|
+
const actualUleb128 = await runParser(uleb128Parser, input, uint8ArrayParserInputCompanion);
|
|
20
|
+
|
|
21
|
+
t.is(actualSleb128, expectedSleb128, 'sleb128');
|
|
22
|
+
t.is(actualUleb128, expectedUleb128, 'uleb128');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
for (const [
|
|
26
|
+
input, expectedUleb128,
|
|
27
|
+
] of [
|
|
28
|
+
[ new Uint8Array([ 2 ]), 2n ],
|
|
29
|
+
[ new Uint8Array([ 127 ]), 127n ],
|
|
30
|
+
[ new Uint8Array([ 0 + 0x80, 1 ]), 128n ],
|
|
31
|
+
[ new Uint8Array([ 1 + 0x80, 1 ]), 129n ],
|
|
32
|
+
[ new Uint8Array([ 57 + 0x80, 100 ]), 12857n ],
|
|
33
|
+
] as const) {
|
|
34
|
+
const actualUleb128 = await runParser(uleb128Parser, input, uint8ArrayParserInputCompanion);
|
|
35
|
+
|
|
36
|
+
t.is(actualUleb128, expectedUleb128, 'uleb128');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for (const [
|
|
40
|
+
input, expectedSleb128,
|
|
41
|
+
] of [
|
|
42
|
+
[ new Uint8Array([ 2 ]), 2n ],
|
|
43
|
+
[ new Uint8Array([ 0x7e ]), -2n ],
|
|
44
|
+
[ new Uint8Array([ 127 + 0x80, 0 ]), 127n ],
|
|
45
|
+
[ new Uint8Array([ 1 + 0x80, 0x7f ]), -127n ],
|
|
46
|
+
[ new Uint8Array([ 0 + 0x80, 1 ]), 128n ],
|
|
47
|
+
[ new Uint8Array([ 0 + 0x80, 0x7f ]), -128n ],
|
|
48
|
+
[ new Uint8Array([ 1 + 0x80, 1 ]), 129n ],
|
|
49
|
+
[ new Uint8Array([ 0x7f + 0x80, 0x7e ]), -129n ],
|
|
50
|
+
] as const) {
|
|
51
|
+
const actualSleb128 = await runParser(sleb128Parser, input, uint8ArrayParserInputCompanion);
|
|
52
|
+
|
|
53
|
+
t.is(actualSleb128, expectedSleb128, 'sleb128');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
testProp(
|
|
58
|
+
'uleb128NumberParser on small number',
|
|
59
|
+
[
|
|
60
|
+
fc.nat(),
|
|
61
|
+
],
|
|
62
|
+
async (t, natural) => {
|
|
63
|
+
const uleb128 = leb128.unsigned.encode(natural);
|
|
64
|
+
|
|
65
|
+
const actualUleb128 = await runParser(uleb128NumberParser, uleb128, uint8ArrayParserInputCompanion);
|
|
66
|
+
|
|
67
|
+
t.is(actualUleb128, natural, 'uleb128');
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
verbose: true,
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
testProp(
|
|
75
|
+
'sleb128NumberParser on small number',
|
|
76
|
+
[
|
|
77
|
+
fc.integer(),
|
|
78
|
+
],
|
|
79
|
+
async (t, integer) => {
|
|
80
|
+
const sleb128 = leb128.signed.encode(integer);
|
|
81
|
+
|
|
82
|
+
const actualSleb128 = await runParser(sleb128NumberParser, sleb128, uint8ArrayParserInputCompanion);
|
|
83
|
+
|
|
84
|
+
t.is(actualSleb128, integer, 'sleb128');
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
verbose: true,
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
// TODO?
|
|
92
|
+
testProp.skip(
|
|
93
|
+
'uleb128NumberParser on large number',
|
|
94
|
+
[
|
|
95
|
+
fc.maxSafeNat(),
|
|
96
|
+
],
|
|
97
|
+
async (t, natural) => {
|
|
98
|
+
const uleb128 = leb128.unsigned.encode(natural);
|
|
99
|
+
|
|
100
|
+
if (natural > (2 ** 32) - 1) {
|
|
101
|
+
await t.throwsAsync(() => runParser(uleb128NumberParser, uleb128, uint8ArrayParserInputCompanion));
|
|
102
|
+
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const actualUleb128 = await runParser(uleb128NumberParser, uleb128, uint8ArrayParserInputCompanion);
|
|
107
|
+
|
|
108
|
+
t.is(actualUleb128, natural, 'uleb128');
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
verbose: true,
|
|
112
|
+
},
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// TODO?
|
|
116
|
+
testProp.skip(
|
|
117
|
+
'sleb128NumberParser on large number',
|
|
118
|
+
[
|
|
119
|
+
fc.maxSafeInteger(),
|
|
120
|
+
],
|
|
121
|
+
async (t, integer) => {
|
|
122
|
+
const sleb128 = leb128.signed.encode(integer);
|
|
123
|
+
|
|
124
|
+
if (integer > (2 ** 32) - 1 || integer < -(2 ** 32)) {
|
|
125
|
+
await t.throwsAsync(() => runParser(sleb128NumberParser, sleb128, uint8ArrayParserInputCompanion));
|
|
126
|
+
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const actualSleb128 = await runParser(sleb128NumberParser, sleb128, uint8ArrayParserInputCompanion);
|
|
131
|
+
|
|
132
|
+
t.is(actualSleb128, integer, 'sleb128');
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
verbose: true,
|
|
136
|
+
},
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
testProp(
|
|
140
|
+
'uleb128Parser on bigint',
|
|
141
|
+
[
|
|
142
|
+
fc.bigInt({ min: 0n }),
|
|
143
|
+
],
|
|
144
|
+
async (t, bigInt) => {
|
|
145
|
+
const uleb128 = leb128.unsigned.encode(bigInt);
|
|
146
|
+
|
|
147
|
+
const actualUleb128 = await runParser(uleb128Parser, uleb128, uint8ArrayParserInputCompanion);
|
|
148
|
+
|
|
149
|
+
t.is(actualUleb128, bigInt, 'uleb128');
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
verbose: true,
|
|
153
|
+
},
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
testProp(
|
|
157
|
+
'sleb128Parser on bigint',
|
|
158
|
+
[
|
|
159
|
+
fc.bigInt(),
|
|
160
|
+
],
|
|
161
|
+
async (t, bigInt) => {
|
|
162
|
+
const sleb128 = leb128.signed.encode(bigInt);
|
|
163
|
+
|
|
164
|
+
const actualSleb128 = await runParser(sleb128Parser, sleb128, uint8ArrayParserInputCompanion);
|
|
165
|
+
|
|
166
|
+
t.is(actualSleb128, bigInt, 'sleb128');
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
verbose: true,
|
|
170
|
+
},
|
|
171
|
+
);
|