Skip to content

Commit

Permalink
fix: incorrect tests & a refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
thetayloredman committed Feb 18, 2023
1 parent a061606 commit 8294489
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 23 deletions.
8 changes: 8 additions & 0 deletions src/lib/sizeHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@

// A series of helper functions for dealing with sizes (KB, GB, TB, etc.)

/**
* Does literally nothing with the passed value.
* @param size The size in bytes
*/
export function bytes(size: number): number {
return size;
}

/**
* Convert a size in kilobytes to bytes.
* @param size The size in kilobytes
Expand Down
45 changes: 24 additions & 21 deletions src/stream/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

import SafeEventEmitter from "../lib/SafeEventEmitter";
import { kb, mb } from "../lib/sizeHelpers";
import { bytes, kb, mb } from "../lib/sizeHelpers";
import { type SizedControlCharacters, ControlCharacters } from "./controlCharacters";

export enum StreamEvents {
Expand Down Expand Up @@ -213,6 +213,25 @@ export default class Stream extends SafeEventEmitter<StreamEventArguments> {
this._bufferSize -= count;
}

/**
* Do some funny math to calculate the return value for {@link Stream._bestControlCharacter}.
*
* @param controlCharacter The control character being suggested
* @param size The size in bytes
* @param sizeFn The size function to use (probably one of {@link kb}, {@link mb}, or {@link bytes})
*/
private _calculateControlCharacterRemainder(
controlCharacter: SizedControlCharacters,
size: number,
sizeFn: (s: number) => number
): { controlCharacter: SizedControlCharacters; number: number; remainder: number } {
return {
controlCharacter,
number: Math.min(255, Math.floor(size / sizeFn(4)) - 1),
remainder: size - sizeFn(4) * (Math.min(255, Math.floor(size / sizeFn(4)) - 1) + 1)
};
}

/**
* Determine the best suitable control character for a given size, along with the remainder after
* using that control character.
Expand All @@ -222,29 +241,13 @@ export default class Stream extends SafeEventEmitter<StreamEventArguments> {
size: number
):
| { controlCharacter: ControlCharacters.ReadByte; number: -1; remainder: number }
| { controlCharacter: Exclude<SizedControlCharacters, ControlCharacters.ReadByte>; number: number; remainder: number }
| { controlCharacter: SizedControlCharacters; number: number; remainder: number }
| false {
if (size < 1) return false;
if (size < 4) return { controlCharacter: ControlCharacters.ReadByte, number: -1, remainder: size - 1 };
if (size < kb(4))
return {
controlCharacter: ControlCharacters.ReadBytes,
number: Math.min(255, Math.floor(size / 4) - 1),
// In the case that we have a larger value than can fit in one read, we simply
// just return the max value a read can take and the remainder from that
remainder: Math.floor(size / 4) - 1 > 255 ? size - 4 * 256 : size % 4
};
if (size < mb(4))
return {
controlCharacter: ControlCharacters.ReadKB,
number: Math.min(255, Math.floor(size / kb(4)) - 1),
remainder: Math.floor(size / kb(4)) - 1 > 255 ? size - kb(256) : size % kb(4)
};
return {
controlCharacter: ControlCharacters.ReadMB,
number: Math.min(255, Math.floor(size / mb(4)) - 1),
remainder: Math.floor(size / mb(4)) - 1 > 255 ? size - mb(256) : size % mb(4)
};
if (size < kb(4)) return this._calculateControlCharacterRemainder(ControlCharacters.ReadBytes, size, bytes);
if (size < mb(4)) return this._calculateControlCharacterRemainder(ControlCharacters.ReadKB, size, kb);
return this._calculateControlCharacterRemainder(ControlCharacters.ReadMB, size, mb);
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/tests/stream/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,12 +218,12 @@ describe("Stream", () => {
factory("4kb => ReadKB", kb(4), { controlCharacter: ControlCharacters.ReadKB, number: 0, remainder: 0 });
factory("5kb => ReadKB", kb(5), { controlCharacter: ControlCharacters.ReadKB, number: 0, remainder: kb(1) });
factory("8kb => ReadKB", kb(8), { controlCharacter: ControlCharacters.ReadKB, number: 1, remainder: 0 });
factory("2000kb yields number=255", kb(2000), { controlCharacter: ControlCharacters.ReadKB, number: 255, remainder: kb(2000 - 256) });
factory("2000kb yields number=255", kb(2000), { controlCharacter: ControlCharacters.ReadKB, number: 255, remainder: kb(2000) - 4 * kb(256) });

factory("4mb => ReadMB", mb(4), { controlCharacter: ControlCharacters.ReadMB, number: 0, remainder: 0 });
factory("5mb => ReadMB", mb(5), { controlCharacter: ControlCharacters.ReadMB, number: 0, remainder: mb(1) });
factory("8mb => ReadMB", mb(8), { controlCharacter: ControlCharacters.ReadMB, number: 1, remainder: 0 });
factory("2000mb yields number=255", mb(2000), { controlCharacter: ControlCharacters.ReadMB, number: 255, remainder: mb(2000 - 256) });
factory("2000mb yields number=255", mb(2000), { controlCharacter: ControlCharacters.ReadMB, number: 255, remainder: mb(2000) - 4 * mb(256) });
});

describe("encode", () => {
Expand Down

0 comments on commit 8294489

Please sign in to comment.