auto-git:
[add] tests/unit/quantized-environment-blend-cache.test.ts
This commit is contained in:
135
tests/unit/quantized-environment-blend-cache.test.ts
Normal file
135
tests/unit/quantized-environment-blend-cache.test.ts
Normal file
@@ -0,0 +1,135 @@
|
||||
import { Texture } from "three";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import {
|
||||
createQuantizedEnvironmentBlendCacheKey,
|
||||
getQuantizedEnvironmentBlendAmount,
|
||||
QuantizedEnvironmentBlendCache,
|
||||
quantizeEnvironmentBlendBucket
|
||||
} from "../../src/rendering/quantized-environment-blend-cache";
|
||||
|
||||
describe("quantized environment blend cache helpers", () => {
|
||||
it("quantizes twilight blend amounts into fixed buckets", () => {
|
||||
expect(quantizeEnvironmentBlendBucket(0, 8)).toBe(0);
|
||||
expect(quantizeEnvironmentBlendBucket(0.24, 8)).toBe(2);
|
||||
expect(quantizeEnvironmentBlendBucket(0.51, 8)).toBe(4);
|
||||
expect(quantizeEnvironmentBlendBucket(1, 8)).toBe(8);
|
||||
expect(getQuantizedEnvironmentBlendAmount(5, 8)).toBeCloseTo(0.625);
|
||||
});
|
||||
|
||||
it("keys cached blends by ordered source pair and bucket", () => {
|
||||
const dayTexture = new Texture();
|
||||
const nightTexture = new Texture();
|
||||
|
||||
expect(
|
||||
createQuantizedEnvironmentBlendCacheKey(dayTexture, nightTexture, 3)
|
||||
).not.toBe(
|
||||
createQuantizedEnvironmentBlendCacheKey(nightTexture, dayTexture, 3)
|
||||
);
|
||||
expect(
|
||||
createQuantizedEnvironmentBlendCacheKey(dayTexture, nightTexture, 2)
|
||||
).not.toBe(
|
||||
createQuantizedEnvironmentBlendCacheKey(dayTexture, nightTexture, 3)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("QuantizedEnvironmentBlendCache", () => {
|
||||
it("queues exact bucket builds, reuses the nearest cached bucket while pending, and disposes cached entries", () => {
|
||||
const scheduledBuilds: Array<() => void> = [];
|
||||
const disposeSpies: Array<ReturnType<typeof vi.fn>> = [];
|
||||
const buildBlendTexture = vi.fn(
|
||||
(
|
||||
_baseTexture: Texture,
|
||||
_overlayTexture: Texture,
|
||||
_blendAmount: number
|
||||
) => {
|
||||
const dispose = vi.fn();
|
||||
disposeSpies.push(dispose);
|
||||
|
||||
return {
|
||||
texture: new Texture(),
|
||||
dispose
|
||||
};
|
||||
}
|
||||
);
|
||||
const onTextureReady = vi.fn();
|
||||
const cache = new QuantizedEnvironmentBlendCache({
|
||||
bucketCount: 8,
|
||||
buildBlendTexture,
|
||||
onTextureReady,
|
||||
scheduleBuild: (callback) => {
|
||||
scheduledBuilds.push(callback);
|
||||
}
|
||||
});
|
||||
const dayTexture = new Texture();
|
||||
const nightTexture = new Texture();
|
||||
|
||||
expect(cache.resolveBlendTexture(dayTexture, nightTexture, 0.26)).toBeNull();
|
||||
expect(buildBlendTexture).not.toHaveBeenCalled();
|
||||
expect(scheduledBuilds).toHaveLength(1);
|
||||
|
||||
scheduledBuilds.shift()?.();
|
||||
|
||||
expect(buildBlendTexture).toHaveBeenCalledWith(
|
||||
dayTexture,
|
||||
nightTexture,
|
||||
0.25
|
||||
);
|
||||
expect(onTextureReady).toHaveBeenCalledTimes(1);
|
||||
|
||||
const firstBlendTexture = cache.resolveBlendTexture(
|
||||
dayTexture,
|
||||
nightTexture,
|
||||
0.24
|
||||
);
|
||||
|
||||
expect(firstBlendTexture).not.toBeNull();
|
||||
expect(
|
||||
cache.resolveBlendTexture(dayTexture, nightTexture, 0.62)
|
||||
).toBe(firstBlendTexture);
|
||||
expect(scheduledBuilds).toHaveLength(1);
|
||||
|
||||
scheduledBuilds.shift()?.();
|
||||
|
||||
const laterBlendTexture = cache.resolveBlendTexture(
|
||||
dayTexture,
|
||||
nightTexture,
|
||||
0.62
|
||||
);
|
||||
|
||||
expect(laterBlendTexture).not.toBe(firstBlendTexture);
|
||||
expect(onTextureReady).toHaveBeenCalledTimes(2);
|
||||
|
||||
cache.clear();
|
||||
|
||||
expect(disposeSpies).toHaveLength(2);
|
||||
expect(disposeSpies[0]).toHaveBeenCalledTimes(1);
|
||||
expect(disposeSpies[1]).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("returns the authored single-image environment at the quantized endpoints and disposes builder resources", () => {
|
||||
const disposeBuildResources = vi.fn();
|
||||
const buildBlendTexture = vi.fn();
|
||||
const cache = new QuantizedEnvironmentBlendCache({
|
||||
bucketCount: 8,
|
||||
buildBlendTexture,
|
||||
disposeBuildResources,
|
||||
scheduleBuild: () => undefined
|
||||
});
|
||||
const dayTexture = new Texture();
|
||||
const nightTexture = new Texture();
|
||||
|
||||
expect(cache.resolveBlendTexture(dayTexture, nightTexture, 0.01)).toBe(
|
||||
dayTexture
|
||||
);
|
||||
expect(cache.resolveBlendTexture(dayTexture, nightTexture, 0.99)).toBe(
|
||||
nightTexture
|
||||
);
|
||||
expect(buildBlendTexture).not.toHaveBeenCalled();
|
||||
|
||||
cache.dispose();
|
||||
|
||||
expect(disposeBuildResources).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user