M1-5: Measure + PNG + full capture UI (TDD)
- measure.js: sampleWidthsPx scanline sampler - inventory.js: prepareInventoryMetadata - +page.svelte: full 4-state capture flow (Add photo, Mask, Axis, Measure) - Canvas overlay: checkerboard mask, bounding rect, axis line - Inventory PNG: 3:4 portrait, slab centered 80% fill, alpha - 77/77 unit tests green
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import * as m from '../../src/lib/core/math.js';
|
||||
import { prepareInventoryMetadata } from '../../src/lib/core/inventory.js';
|
||||
|
||||
describe('prepareInventoryMetadata', () => {
|
||||
it('calculates correct metadata for a 21in x 12in slab at 1.75in thick', () => {
|
||||
const Lpx = 3360, L = 21, scale = 160, thickness = 1.75;
|
||||
const widthPx = 1920; // 12in
|
||||
const maskPx = Lpx * widthPx; // 6,451,200
|
||||
|
||||
const result = prepareInventoryMetadata(
|
||||
maskPx,
|
||||
scale,
|
||||
L,
|
||||
thickness,
|
||||
[1600, 1920, 2080, 1600]
|
||||
);
|
||||
|
||||
// sqft = (6,451,200 / 160^2) / 144 = 1.75
|
||||
expect(result.sqft).toBe(1.75);
|
||||
// bdft = 1.75 * 1.75 = 3.0625 -> 3.06
|
||||
expect(result.bdft).toBe(3.06);
|
||||
expect(result.lengthIn).toBe(21);
|
||||
expect(result.thicknessIn).toBe(1.75);
|
||||
expect(result.minWidth).toBe(10);
|
||||
expect(result.maxWidth).toBe(13);
|
||||
expect(result.avgWidth).toBe(11.25);
|
||||
});
|
||||
|
||||
it('handles zero area', () => {
|
||||
const result = prepareInventoryMetadata(0, 160, 21, 1.75, []);
|
||||
expect(result.sqft).toBe(0);
|
||||
expect(result.bdft).toBe(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user