46 lines
1.7 KiB
Markdown
46 lines
1.7 KiB
Markdown
---
|
|
epic: 2
|
|
story: 2.6
|
|
title: "Custom User-Defined Units"
|
|
status: draft
|
|
---
|
|
|
|
## Epic 2 — Unit Conversion System
|
|
**Goal:** Support 200+ units across all major categories with SI prefix support.
|
|
|
|
### Story 2.6: Custom User-Defined Units
|
|
|
|
As a CalcPad user,
|
|
I want to define my own units such as `1 sprint = 2 weeks` or `1 story_point = 4 hours`,
|
|
So that I can use domain-specific units in my calculations.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
**Given** the user writes `1 sprint = 2 weeks` on a line
|
|
**When** the engine evaluates the sheet
|
|
**Then** it registers `sprint` as a custom unit convertible to and from `weeks`
|
|
**And** subsequent lines can use `sprint` in expressions
|
|
|
|
**Given** a custom unit `1 sprint = 2 weeks` is defined
|
|
**When** the expression `3 sprints in days` is evaluated
|
|
**Then** the result is `42 days`
|
|
|
|
**Given** a custom unit `1 story_point = 4 hours` is defined
|
|
**When** the expression `10 story_points in hours` is evaluated
|
|
**Then** the result is `40 hours`
|
|
|
|
**Given** a custom unit is defined in one sheet
|
|
**When** the user configures it as a global custom unit
|
|
**Then** it is available in all sheets
|
|
**And** sheet-local definitions override global ones if there is a name conflict
|
|
|
|
**Given** a custom unit definition that creates a circular dependency (e.g., `1 foo = 2 bar` and `1 bar = 3 foo`)
|
|
**When** the engine processes these definitions
|
|
**Then** it detects the circular dependency and returns an error
|
|
**And** it does not enter an infinite loop
|
|
|
|
**Given** a custom unit name that conflicts with a built-in unit name
|
|
**When** the user defines it
|
|
**Then** the engine warns that the built-in unit is being shadowed
|
|
**And** the custom definition takes precedence within that sheet
|