BMAD-METHOD/examples/tdd-demo-calculator/stories/1.1-calculator-basic-operat...

8.7 KiB

Story 1.1: Calculator Basic Operations

Story Metadata

story:
  epic: '1'
  number: '1'
  title: 'Calculator Basic Operations'
  status: 'ready'
  priority: 'high'

# TDD Configuration (only when tdd.enabled=true)
tdd:
  status: 'done' # red|green|refactor|done
  cycle: 1
  coverage_target: 90.0
  tests:
    - id: 'CB-001'
      name: 'Addition operations'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'
    - id: 'CB-002'
      name: 'Subtraction operations'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'
    - id: 'CB-003'
      name: 'Multiplication operations'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'
    - id: 'CB-004'
      name: 'Division operations'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'
    - id: 'CB-005'
      name: 'Division by zero error handling'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'
    - id: 'CB-006'
      name: 'Invalid input handling'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'
    - id: 'CB-008'
      name: 'Performance requirements'
      type: unit
      status: passing
      file_path: 'tests/calculator.test.js'

Story Description

As a user of the calculator application
I want to perform basic mathematical operations (add, subtract, multiply, divide)
So that I can solve simple mathematical problems efficiently

Context

This is the foundational feature for our calculator application. It needs to handle the four basic mathematical operations with proper error handling for edge cases like division by zero. This will serve as the core functionality that other advanced features will build upon.

Acceptance Criteria

Feature: Calculator Basic Operations

Scenario: Addition of two positive numbers
  Given I have a calculator
  When I add 5 and 3
  Then the result should be 8

Scenario: Subtraction operation
  Given I have a calculator
  When I subtract 3 from 10
  Then the result should be 7

Scenario: Multiplication operation
  Given I have a calculator
  When I multiply 4 by 6
  Then the result should be 24

Scenario: Division operation
  Given I have a calculator
  When I divide 15 by 3
  Then the result should be 5

Scenario: Division by zero error handling
  Given I have a calculator
  When I divide 10 by 0
  Then it should throw an error with message "Cannot divide by zero"

Scenario: Invalid input handling
  Given I have a calculator
  When I provide non-numeric input
  Then it should throw an error with message "Invalid input: numbers required"

Technical Requirements

Functional Requirements

  • Support addition, subtraction, multiplication, and division operations
  • Handle positive and negative numbers
  • Handle decimal numbers with proper precision
  • Throw descriptive errors for invalid operations
  • Return numeric results for valid operations

Non-Functional Requirements

  • Performance: Each operation should complete in < 1ms
  • Security: Validate all inputs to prevent injection attacks
  • Reliability: Handle edge cases gracefully with clear error messages
  • Maintainability: Clean, well-documented code following JavaScript best practices

TDD Test Plan (QA Agent Responsibility)

Test Strategy

  • Primary Test Type: unit
  • Mocking Approach: No external dependencies to mock (pure functions)
  • Test Data: Fixed test cases covering all operations and edge cases

Planned Test Scenarios

ID Scenario Type Priority AC Reference
CB-001 Addition operations unit P0 AC1
CB-002 Subtraction operations unit P0 AC2
CB-003 Multiplication operations unit P0 AC3
CB-004 Division operations unit P0 AC4
CB-005 Division by zero handling unit P0 AC5
CB-006 Invalid input handling unit P0 AC6
CB-007 Decimal precision tests unit P1 NFR
CB-008 Performance requirements unit P2 NFR

TDD Progress

Current Phase: REFACTOR COMPLETED - TDD CYCLE DONE ✓

Cycle: 1 Last Updated: 2025-01-01

Red Phase - Cycle 1

Date: 2025-01-01 Agent: QA Agent (TDD Implementation)

Tests Written:

  • CB-001: Addition operations (FAILING )
  • CB-002: Subtraction operations (FAILING )
  • CB-003: Multiplication operations (FAILING )
  • CB-004: Division operations (FAILING )
  • CB-005: Division by zero error handling (FAILING )
  • CB-006: Invalid input handling (FAILING )
  • CB-008: Performance requirements (FAILING )

Test Files:

  • tests/calculator.test.js (21 test cases)

Test Execution Status:

❌ Calculator class not found - Cannot find module '../src/calculator'
✅ Tests fail for correct reason (no implementation exists)
✅ Ready for Green phase implementation

Green Phase - Cycle 1

Date: 2025-01-01 Agent: Dev Agent (TDD Implementation)

Implementation Completed:

  • Calculator class with input validation
  • Addition method with error handling
  • Subtraction method with error handling
  • Multiplication method with error handling
  • Division method with zero-check validation
  • Comprehensive input validation helper method

Test Results:

✅ All 21 tests passing
✅ 100% code coverage achieved (exceeds 90% target)
✅ Performance requirements met (< 1ms per operation)
✅ All acceptance criteria satisfied

Files Created:

  • src/calculator.js (72 lines, fully tested)

Refactor Phase - Cycle 1

Date: 2025-01-01 Agents: Dev Agent & QA Agent (Collaborative TDD Refactoring)

Refactoring Completed:

  • Extracted error message constants for consistency
  • Simplified complex validation condition into _isValidNumber() helper
  • Extracted division-by-zero validation into _validateNotZeroDivisor()
  • Improved code readability and maintainability
  • Enhanced function naming and separation of concerns

Code Quality Improvements:

  • Complex boolean condition replaced with readable helper method
  • Error messages centralized as class constants
  • Validation logic separated into focused, single-purpose methods
  • Code organization improved with better separation of concerns
  • Test coverage maintained at 100%

Files Modified:

  • src/calculator.js (refactored from 87 to 92 lines with better structure)

All Tests Passing:

TDD Cycle Complete: All Red-Green-Refactor phases completed successfully


Implementation Tasks (Dev Agent)

Primary Tasks

  • Create Calculator class with basic structure
  • Implement addition method with validation
  • Implement subtraction method with validation
  • Implement multiplication method with validation
  • Implement division method with zero-check validation
  • Add comprehensive input validation

Subtasks

  • Set up class constructor
  • Create private validation helper methods
  • Implement number type checking
  • Add error handling with descriptive messages
  • Ensure decimal precision handling
  • Add performance optimizations

Definition of Done

TDD-Specific DoD

  • Tests written first (Red phase completed)
  • All tests passing (Green phase completed)
  • Code refactored for quality (Refactor phase completed)
  • Test coverage meets target (90%)
  • All external dependencies properly mocked (N/A - no external deps)
  • No features implemented without corresponding tests

General DoD

  • All acceptance criteria met
  • Code follows project standards
  • Documentation updated
  • Ready for review

Dev Agent Record

Implementation Notes

(Dev agent will document implementation decisions here)

TDD Cycle Log

(Automatic tracking of Red-Green-Refactor progression)

Cycle 1:

  • Red Phase: Pending - Tests to be written
  • Green Phase: Pending - Implementation
  • Refactor Phase: Pending

File List

(Dev agent will list all files created/modified)

  • tests/calculator.test.js (to be created in RED phase)
  • src/calculator.js (to be created in GREEN phase)

Test Execution Log

# Test runs will be logged here during development

QA Results

(QA agent will populate this during review)

Change Log

  • 2025-01-01: Story created from TDD template
  • 2025-01-01: Ready for TDD Red phase initiation

TDD Status: 🔴 RED Phase Ready
Agent Assigned: QA Agent (for test writing)
Estimated Effort: 3 hours