import ByteBuffer from "./ByteBuffer";

describe("ByteBuffer", () => {
  it("should put value moving the position", () => {
    // given
    const buffer = ByteBuffer.allocate(3);
    // when
    buffer.put(123);
    // then
    expect(buffer.data[0]).toBe(123);
    expect(buffer.position).toBe(1);
  });

  it("should resize when values overflow ", () => {
    // given
    const buffer = ByteBuffer.allocate(1);
    buffer.put(123);
    // when
    buffer.put(42);
    // then
    expect(buffer.data[0]).toBe(123);
    expect(buffer.data[1]).toBe(42);
  });

  it("should get value moving the position", () => {
    // given
    const buffer = ByteBuffer.allocate(1);
    buffer.put(123);
    buffer.resetPosition();
    // when
    const value = buffer.get();
    // then
    expect(value).toBe(123);
    expect(buffer.position).toBe(1);
  });

  it("should put int32 value moving the position", () => {
    // given
    const buffer = ByteBuffer.allocate(8);
    // when
    buffer.putInt32(123);
    // then
    expect(buffer.data[3]).toBe(123);
    expect(buffer.position).toBe(4);
  });

  it("should resize when int32 values overflow ", () => {
    // given
    const buffer = ByteBuffer.allocate(1);
    // when
    buffer.putInt32(42);
    // then
    expect(buffer.data[3]).toBe(42);
    expect(buffer.position).toBe(4);
  });

  it("should get int32 value moving the position", () => {
    // given
    const buffer = ByteBuffer.allocate(1);
    buffer.putInt32(123);
    buffer.resetPosition();
    // when
    const value = buffer.getInt32();
    // then
    expect(value).toBe(123);
    expect(buffer.position).toBe(4);
  });

  it("should put int64 value moving the position", () => {
    // given
    const buffer = ByteBuffer.allocate(8);
    // when
    buffer.putInt64(123);
    // then
    expect(buffer.data[7]).toBe(123);
    expect(buffer.position).toBe(8);
  });

  it("should resize when int64 values overflow ", () => {
    // given
    const buffer = ByteBuffer.allocate(1);
    // when
    buffer.putInt64(42);
    // then
    expect(buffer.data[7]).toBe(42);
    expect(buffer.position).toBe(8);
  });

  it("should get int64 value moving the position", () => {
    // given
    const buffer = ByteBuffer.allocate(1);
    buffer.putInt64(Number.MAX_SAFE_INTEGER);
    buffer.resetPosition();
    // when
    const value = buffer.getInt64();
    // then
    expect(value).toBe(Number.MAX_SAFE_INTEGER);
    expect(buffer.position).toBe(8);
  });

  it("should copy all data when putting array", () => {
    // given
    const buffer = ByteBuffer.allocate(1024);
    const array = new Uint8Array([1, 2, 3, 4]);
    // when
    buffer.putArray(array);
    // then
    buffer.resetPosition();
    expect(buffer.get()).toBe(1);
    expect(buffer.get()).toBe(2);
    expect(buffer.get()).toBe(3);
    expect(buffer.get()).toBe(4);
  });

  it("should resize when putting array bigger than capacity", () => {
    // given
    const buffer = ByteBuffer.allocate(1024);
    const array = new Uint8Array([1, 2, 3, 4]);
    // when
    buffer.position = 1022;
    buffer.putArray(array);
    // then
    buffer.position = 1022;
    expect(buffer.get()).toBe(1);
    expect(buffer.get()).toBe(2);
    expect(buffer.get()).toBe(3);
    expect(buffer.get()).toBe(4);
  });
});
