import { describe, expect, it } from 'vitest' import { buildLayerStyleContext, canonicalMapKeysKey, computeChoroplethMax, resolvePathStyle, } from '@/lib/bahiaMapStyle' describe('bahiaMapStyle', () => { const baseContext = buildLayerStyleContext({ values: { '2927408': 500, '2905701': 200 }, fillMode: 'sequential', highlightKey: '', selectedKey: null, }) describe('computeChoroplethMax', () => { it('uses scaleMax when provided', () => { expect(computeChoroplethMax({ '2927408': 999 }, 'sequential', 1)).toBe(1) }) it('derives max from positive values in sequential mode', () => { expect(computeChoroplethMax({ '2927408': 100, '2905701': 300 }, 'sequential')).toBe(300) }) it('uses absolute max in diverging mode', () => { expect(computeChoroplethMax({ '2927408': -40, '2905701': 100 }, 'diverging')).toBe(100) }) }) describe('canonicalMapKeysKey', () => { it('sorts keys for stable identity', () => { expect(canonicalMapKeysKey(['2927408', '2905701'])).toBe('2905701,2927408') expect(canonicalMapKeysKey(['2905701', '2927408'])).toBe('2905701,2927408') }) it('returns empty string for empty input', () => { expect(canonicalMapKeysKey([])).toBe('') }) }) describe('resolvePathStyle', () => { it('highlights hovered feature over selected', () => { const context = { ...baseContext, selectedKey: '2905701', hoveredKey: '2927408', } expect(resolvePathStyle(context, '2927408').weight).toBe(2) expect(resolvePathStyle(context, '2905701').weight).toBe(1) }) it('highlights selected feature when not hovering', () => { const context = { ...baseContext, selectedKey: '2905701', hoveredKey: null, } expect(resolvePathStyle(context, '2905701').weight).toBe(2) }) it('reveals selected highlight after hover clears on a different feature', () => { const context = { ...baseContext, selectedKey: '2905701', hoveredKey: null, } expect(resolvePathStyle(context, '2927408').weight).toBe(1) expect(resolvePathStyle(context, '2905701').weight).toBe(2) }) it('highlights keys in highlightSet', () => { const context = { ...baseContext, highlightSet: new Set(['2927408']), } expect(resolvePathStyle(context, '2927408').weight).toBe(2) }) it('keeps fillOpacity when highlighted', () => { const base = resolvePathStyle(baseContext, '2927408') const highlighted = resolvePathStyle( { ...baseContext, hoveredKey: '2927408' }, '2927408', ) expect(highlighted.fillOpacity).toBe(base.fillOpacity) expect(highlighted.color).toBe('#c51414') }) it('uses diverging fill for negative metrics', () => { const context = buildLayerStyleContext({ values: { '2927408': -100 }, fillMode: 'diverging', scaleMax: 200, highlightKey: '', selectedKey: null, }) expect(resolvePathStyle(context, '2927408').fillColor).toMatch(/^rgb\(/) }) it('returns neutral style for missing feature key', () => { const style = resolvePathStyle(baseContext, '') expect(style.fillOpacity).toBe(0.35) expect(style.weight).toBe(1) }) }) })