import { describe, it, expect } from 'vitest'; import { deriveCantidades } from '@/budget/derive'; import type { BudgetInputs, PricingConfig } from '@/budget/types'; const config: PricingConfig = { alturaTechoDefault: 2.5, factorZona: {}, manoObra: { demolicion: 0, impermeabilizacion: 0, fontaneria: 0, electricidad: 0, mano_de_obra: 0 }, }; function inputs(partial: Partial): BudgetInputs { return { tipoReforma: 'cocina', m2Suelo: null, alturaTecho: null, calidadGlobal: 'media', estructural: false, provincia: null, materialSelections: {}, ...partial, }; } describe('deriveCantidades', () => { it('usa m² aportados y deriva perímetro y paredes con números limpios', () => { // m2Suelo=16 -> sqrt=4 -> perimetro=16 -> pared=16*2.5=40 -> mobiliario=16*0.5=8 (cocina) const c = deriveCantidades(inputs({ m2Suelo: 16 }), config); expect(c.m2Suelo).toBe(16); expect(c.perimetro).toBe(16); expect(c.m2Pared).toBe(40); expect(c.mlMobiliario).toBe(8); expect(c.alturaTecho).toBe(2.5); }); it('cae a la mediana por tipo cuando no hay m²', () => { const c = deriveCantidades(inputs({ tipoReforma: 'bano', m2Suelo: null }), config); expect(c.m2Suelo).toBe(5); // mediana baño }); it('usa la altura aportada por encima del default', () => { const c = deriveCantidades(inputs({ m2Suelo: 16, alturaTecho: 3 }), config); expect(c.alturaTecho).toBe(3); expect(c.m2Pared).toBe(48); // 16 * 3 }); it('no calcula mobiliario para tipos sin cocina/baño', () => { const c = deriveCantidades(inputs({ tipoReforma: 'salon', m2Suelo: 16 }), config); expect(c.mlMobiliario).toBe(0); }); });