---
epic: 2
story: 2.1
title: "Unit Registry & Base Conversion"
status: draft
---

## Epic 2 — Unit Conversion System
**Goal:** Support 200+ units across all major categories with SI prefix support.

### Story 2.1: Unit Registry & Base Conversion

As a CalcPad user,
I want a comprehensive unit registry covering all major measurement categories with correct base-unit conversions,
So that I can convert between any supported units accurately.

**Acceptance Criteria:**

**Given** the unit registry is initialized
**When** the list of supported categories is queried
**Then** it includes length, mass, volume, area, speed, temperature, data, angle, time, pressure, energy, power, and force
**And** at least 200 units are registered across all categories

**Given** a linear unit conversion such as `5 miles in km`
**When** the engine evaluates it
**Then** it converts via the base unit (meters) using the stored conversion ratio
**And** the result is `8.04672 km`

**Given** a non-linear unit conversion such as `100 °F in °C`
**When** the engine evaluates it
**Then** it applies the formula `(F - 32) * 5/9` rather than a simple ratio
**And** the result is `37.777... °C`

**Given** a conversion between units in the same category such as `1 gallon in liters`
**When** the engine evaluates it
**Then** it converts via the base unit for volume
**And** the result is `3.78541 liters` (US gallon)

**Given** a conversion between incompatible categories such as `5 kg in meters`
**When** the engine evaluates it
**Then** it returns a `CalcResult::Error` indicating that mass and length are incompatible

**Given** the registry data
**When** the engine is compiled
**Then** the registry is static (built at compile time, not loaded at runtime)
**And** lookup of any unit by name or abbreviation is O(1) or near-O(1)

**Given** a unit that has multiple common names (e.g., `meter`, `metre`, `m`)
**When** any of these names is used in an expression
**Then** they all resolve to the same unit definition
