@deepkit/bson
Version:
Deepkit BSON parser
59 lines (45 loc) • 1.98 kB
text/typescript
import 'reflect-metadata';
import { expect, test } from '@jest/globals';
import { createReference, entity, isReference, t } from '@deepkit/type';
import { randomBytes } from 'crypto';
import { getBSONSerializer, getBSONSizer } from '../../src/bson-serialize';
import { getBSONDecoder } from '../../src/bson-jit-parser';
import { ObjectId } from '../../src/model';
test('self-reference', () => {
.name('explorer/block').collectionName('blocks')
class ExplorerBlock {
.primary.mongoId public _id!: string;
level: number = 0;
transactions: number = 0;
constructor(
public hash: Uint8Array,
public created: Date,
.reference().optional public previous?: ExplorerBlock
) {
}
}
const blocks: ExplorerBlock[] = [];
let previous: ExplorerBlock | undefined = undefined;
for (let i = 0; i < 10; i++) {
const prev = previous ? createReference(ExplorerBlock, { _id: previous._id }) : undefined;
previous = new ExplorerBlock(randomBytes(16), new Date, prev);
previous._id = ObjectId.generate();
previous.level = Math.ceil(Math.random() * 1000);
previous.transactions = Math.ceil(Math.random() * 1000);
blocks.push(previous);
}
const serializer = getBSONSerializer(ExplorerBlock);
const sizer = getBSONSizer(ExplorerBlock);
const decoder = getBSONDecoder(ExplorerBlock);
for (const block of blocks) {
expect(block.level).toBeGreaterThan(0);
expect(isReference(block)).toBe(false);
if (block.previous) expect(isReference(block.previous)).toBe(true);
expect(sizer(block)).toBeGreaterThan(10);
const bson = serializer(block);
const back = decoder(bson);
if (back.previous) expect(typeof back.previous._id).toBe('string');
expect(back.level).toBe(block.level);
expect(isReference(back)).toBe(false);
}
});