Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
inokawa committed Dec 24, 2023
1 parent 4b9e452 commit 386fa48
Showing 1 changed file with 39 additions and 119 deletions.
158 changes: 39 additions & 119 deletions src/core/cache.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ const sum = (cache: readonly number[]): number => {
return cache.reduce((acc, c) => acc + c, 0);
};

const initFilledCache = (sizes: number[]): Cache => {
const initFilledCache = (sizes: readonly number[]): Cache => {
return {
_length: sizes.length,
_sizes: sizes,
_sizes: [...sizes],
_computedOffsetIndex: sizes.length - 1,
_offsets: sizes.reduce((acc, s, i) => {
acc.push(i === 0 ? 0 : acc[i - 1]! + s);
Expand All @@ -36,15 +36,21 @@ const initFilledCache = (sizes: number[]): Cache => {
};
};

describe(getItemSize.name, () => {
const sizes = [10, -1];
const cache: Cache = {
const initEmptyCache = (
sizes: readonly number[],
defaultSize: number
): Cache => {
return {
_length: sizes.length,
_sizes: sizes,
_sizes: [...sizes],
_computedOffsetIndex: 0,
_offsets: [0],
_defaultItemSize: 20,
_offsets: range(sizes.length, (i) => (i === 0 ? 0 : -1)),
_defaultItemSize: defaultSize,
};
};

describe(getItemSize.name, () => {
const cache = initEmptyCache([10, -1], 20);

it("should get height", () => {
expect(getItemSize(cache, 0)).toBe(10);
Expand All @@ -58,14 +64,7 @@ describe(setItemSize.name, () => {
describe("with offsets not measured", () => {
it("should set at first", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 20,
};
const cache = initEmptyCache(filledSizes, 20);

setItemSize(cache, 0, 123);
expect(cache._sizes).toEqual([123, 20, 20, 20, 20, 20, 20, 20, 20, 20]);
Expand All @@ -75,14 +74,7 @@ describe(setItemSize.name, () => {

it("should set at middle", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 20,
};
const cache = initEmptyCache(filledSizes, 20);

setItemSize(cache, 4, 123);
expect(cache._sizes).toEqual([20, 20, 20, 20, 123, 20, 20, 20, 20, 20]);
Expand All @@ -92,16 +84,9 @@ describe(setItemSize.name, () => {

it("should set at last", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 20,
};
const cache = initEmptyCache(filledSizes, 20);

setItemSize(cache, emptyOffsets.length - 1, 123);
setItemSize(cache, cache._length - 1, 123);
expect(cache._sizes).toEqual([20, 20, 20, 20, 20, 20, 20, 20, 20, 123]);
expect(cache._offsets).toEqual([0, -1, -1, -1, -1, -1, -1, -1, -1, -1]);
expect(cache._computedOffsetIndex).toBe(0);
Expand Down Expand Up @@ -161,29 +146,15 @@ describe(setItemSize.name, () => {
describe("should return measurement status", () => {
it("should return false if already measured", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 20,
};
const cache = initEmptyCache(filledSizes, 20);

const res = setItemSize(cache, 0, 123);
expect(res).toBe(false);
});

it("should return true if not measured", () => {
const filledSizes = range(10, () => -1);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 20,
};
const emptySizes = range(10, () => -1);
const cache = initEmptyCache(emptySizes, 20);

const res = setItemSize(cache, 0, 123);
expect(res).toBe(true);
Expand All @@ -194,14 +165,8 @@ describe(setItemSize.name, () => {
describe(computeTotalSize.name, () => {
it("should succeed if sizes is filled", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache(filledSizes, 30);

expect(computeTotalSize(cache)).toBe(sum(filledSizes));
expect(cache._offsets).toEqual([
0, 20, 40, 60, 80, 100, 120, 140, 160, 180,
Expand All @@ -210,30 +175,16 @@ describe(computeTotalSize.name, () => {

it("should succeed if sizes is not filled", () => {
const emptySizes = range(10, () => -1);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: emptySizes.length,
_sizes: emptySizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache(emptySizes, 30);

expect(computeTotalSize(cache)).toBe(sum(range(10, () => 30)));
expect(cache._offsets).toEqual([
0, 30, 60, 90, 120, 150, 180, 210, 240, 270,
]);
});

it("should return 0 if cache length is 0", () => {
const filledSizes: number[] = [];
const emptyOffsets: number[] = [];
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache([], 30);
expect(computeTotalSize(cache)).toBe(0);
expect(cache._offsets).toEqual([]);
});
Expand Down Expand Up @@ -274,42 +225,24 @@ describe(computeTotalSize.name, () => {
describe(computeStartOffset.name, () => {
it("should get 0 if index is at start", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache(filledSizes, 30);

expect(computeStartOffset(cache, 0)).toBe(0);
expect(cache._offsets).toEqual([0, -1, -1, -1, -1, -1, -1, -1, -1, -1]);
});

it("should get 1 item if index is at start", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache(filledSizes, 30);

expect(computeStartOffset(cache, 1)).toBe(20);
expect(cache._offsets).toEqual([0, 20, -1, -1, -1, -1, -1, -1, -1, -1]);
});

it("should get total - 1 item if index is at last", () => {
const filledSizes = range(10, () => 20);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: filledSizes.length,
_sizes: filledSizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache(filledSizes, 30);

const last = filledSizes.length - 1;
expect(computeStartOffset(cache, last)).toBe(
sum(filledSizes) - filledSizes[last]!
Expand All @@ -321,14 +254,8 @@ describe(computeStartOffset.name, () => {

it("should resolve default height", () => {
const emptySizes = range(10, () => -1);
const emptyOffsets = range(10, (i) => (i === 0 ? 0 : -1));
const cache: Cache = {
_length: emptySizes.length,
_sizes: emptySizes,
_computedOffsetIndex: 0,
_offsets: emptyOffsets,
_defaultItemSize: 30,
};
const cache = initEmptyCache(emptySizes, 30);

expect(computeStartOffset(cache, 2)).toBe(60);
expect(cache._offsets).toEqual([0, 30, 60, -1, -1, -1, -1, -1, -1, -1]);
});
Expand Down Expand Up @@ -427,18 +354,11 @@ describe(findIndex.name, () => {
[CACHE_LENGTH - 1], // end
])("start from %i", (initialIndex) => {
it("should resolve default height", () => {
const initEmptyCache = (): Cache => {
const emptySizes = range(10, () => -1);
return {
_length: emptySizes.length,
_sizes: emptySizes,
_computedOffsetIndex: 0,
_offsets: [0],
_defaultItemSize: 25,
};
};

expect(findIndex(initEmptyCache(), 100, initialIndex)).toBe(4);
const cache = initEmptyCache(
range(10, () => -1),
25
);
expect(findIndex(cache, 100, initialIndex)).toBe(4);
});

it("should get start if offset is at start", () => {
Expand Down

0 comments on commit 386fa48

Please sign in to comment.