react-native-mask-segment-c.../__tests__/paintShader.test.ts

80 lines
2.3 KiB
TypeScript
Raw Normal View History

jest.mock('../src/utils/opencvAdapter', () => ({
__esModule: true,
default: {},
}));
import {
buildPaintColorMapImage,
} from '../src/utils/paintColorMapTexture';
import {
bgrBufferToRgbaBuffer,
bgrToLabL,
prepareFreqLayersFromBgrBuffer,
} from '../src/utils/freqLayerPrep';
import { getRegionPaintEffect } from '../src/utils/paintShaderRuntime';
jest.mock('@shopify/react-native-skia', () => {
const makeImage = jest.fn(() => ({
dispose: jest.fn(),
width: () => 2,
height: () => 2,
}));
return {
Skia: {
Data: { fromBytes: jest.fn(() => ({})) },
Image: { MakeImage: makeImage },
RuntimeEffect: {
Make: jest.fn(() => ({
getUniformCount: () => 4,
getUniformName: (i: number) =>
['colorBaseOpacity', 'lLightOpacity', 'textureOpacity', 'showOrigin'][
i
],
})),
},
},
AlphaType: { Opaque: 1, Unpremul: 3 },
ColorType: { RGBA_8888: 4 },
TileMode: { Clamp: 0 },
ImageFormat: { PNG: 4 },
Canvas: 'Canvas',
Fill: 'Fill',
Shader: 'Shader',
ImageShader: 'ImageShader',
Group: 'Group',
drawAsImage: jest.fn(),
};
});
test('bgrToLabL returns clamped 0-255', () => {
expect(bgrToLabL(0, 0, 0)).toBeGreaterThanOrEqual(0);
expect(bgrToLabL(255, 255, 255)).toBeLessThanOrEqual(255);
expect(bgrToLabL(128, 128, 128)).toBeGreaterThan(0);
});
test('bgrBufferToRgbaBuffer swaps BGR to RGBA', () => {
const bgr = new Uint8Array([10, 20, 30]);
const rgba = bgrBufferToRgbaBuffer(bgr, 1, 1);
expect(Array.from(rgba)).toEqual([30, 20, 10, 255]);
});
test('buildPaintColorMapImage marks painted pixels', () => {
const pick = new Uint8Array([0, 1, 2]);
const painted = new Map([
[0, { b: 1, g: 2, r: 3 }],
[1, { b: 4, g: 5, r: 6 }],
]);
const image = buildPaintColorMapImage(pick, 3, 1, painted);
expect(image).toBeTruthy();
expect(require('@shopify/react-native-skia').Skia.Image.MakeImage).toHaveBeenCalled();
});
test('prepareFreqLayersFromBgrBuffer rejects invalid buffer size', async () => {
await expect(prepareFreqLayersFromBgrBuffer(new Uint8Array(2), 1, 1)).resolves.toBeNull();
});
test('regionPaint SkSL compiles via RuntimeEffect', () => {
const effect = getRegionPaintEffect();
expect(effect.getUniformCount()).toBe(4);
});