You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.3 KiB
112 lines
3.3 KiB
/*
|
|
* This is a AssemblyScript port of the original Java version, which was written by
|
|
* Gil Tene as described in
|
|
* https://github.com/HdrHistogram/HdrHistogram
|
|
* and released to the public domain, as explained at
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
import ByteBuffer from "../ByteBuffer";
|
|
import ZigZagEncoding from "../ZigZagEncoding";
|
|
|
|
describe("Zig Zag Encoding", () => {
|
|
it("should encode int using one byte when value is less than 64", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(4);
|
|
// when
|
|
ZigZagEncoding.encode(buffer, 56);
|
|
// then
|
|
expect(buffer.data).toHaveLength(4);
|
|
expect(buffer.data[0]).toBe(112);
|
|
});
|
|
|
|
it("should encode int using several bytes when value is more than 64", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(4);
|
|
// when
|
|
ZigZagEncoding.encode(buffer, 456);
|
|
// then
|
|
expect(buffer.data).toHaveLength(4);
|
|
expect(buffer.data[0]).toBe(144);
|
|
expect(buffer.data[1]).toBe(7);
|
|
expect(buffer.data[2]).toBe(0);
|
|
expect(buffer.data[3]).toBe(0);
|
|
});
|
|
|
|
it("should encode negative int using several bytes when value is more than 64", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(4);
|
|
// when
|
|
ZigZagEncoding.encode(buffer, -456);
|
|
// then
|
|
expect(buffer.data).toHaveLength(4);
|
|
expect(buffer.data[0]).toBe(143);
|
|
expect(buffer.data[1]).toBe(7);
|
|
expect(buffer.data[2]).toBe(0);
|
|
expect(buffer.data[3]).toBe(0);
|
|
});
|
|
|
|
it("should encode large safe int greater than 2^32", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(4);
|
|
// when
|
|
ZigZagEncoding.encode(buffer, <i64>Math.pow(2, 50));
|
|
// then
|
|
expect(buffer.data).toHaveLength(8);
|
|
expect(buffer.data[0]).toBe(128);
|
|
expect(buffer.data[1]).toBe(128);
|
|
expect(buffer.data[2]).toBe(128);
|
|
expect(buffer.data[3]).toBe(128);
|
|
expect(buffer.data[4]).toBe(128);
|
|
expect(buffer.data[5]).toBe(128);
|
|
expect(buffer.data[6]).toBe(128);
|
|
expect(buffer.data[7]).toBe(4);
|
|
});
|
|
|
|
it("should decode int using one byte", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(8);
|
|
ZigZagEncoding.encode(buffer, 56);
|
|
buffer.resetPosition();
|
|
// when
|
|
const value = ZigZagEncoding.decode(buffer);
|
|
// then
|
|
expect(value).toBe(56);
|
|
});
|
|
|
|
it("should decode int using multiple bytes", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(8);
|
|
ZigZagEncoding.encode(buffer, 70000);
|
|
ZigZagEncoding.encode(buffer, 56);
|
|
buffer.resetPosition();
|
|
// when
|
|
const value = ZigZagEncoding.decode(buffer);
|
|
// then
|
|
expect(value).toBe(70000);
|
|
});
|
|
|
|
it("should decode negative int using multiple bytes", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(8);
|
|
ZigZagEncoding.encode(buffer, -1515);
|
|
ZigZagEncoding.encode(buffer, 56);
|
|
buffer.resetPosition();
|
|
// when
|
|
const value = ZigZagEncoding.decode(buffer);
|
|
// then
|
|
expect(value).toBe(-1515);
|
|
});
|
|
|
|
it("should decode large safe int greater than 2^32", () => {
|
|
// given
|
|
const buffer = ByteBuffer.allocate(4);
|
|
ZigZagEncoding.encode(buffer, <i64>(Math.pow(2, 50) + 1234));
|
|
ZigZagEncoding.encode(buffer, 56);
|
|
buffer.resetPosition();
|
|
// when
|
|
const value = ZigZagEncoding.decode(buffer);
|
|
// then
|
|
expect(value).toBe(<i64>Math.pow(2, 50) + 1234);
|
|
});
|
|
});
|