# Test Scenarios (JSON Format)

This directory contains structured test scenarios in JSON format for automated testing of specific chess game behaviors.

## Scenario Format

```json
{
  "id": "unique-scenario-id",
  "name": "Scenario Name",
  "description": "Detailed description",
  "category": "category-name",
  "priority": "high|medium|low",
  "setup": {
    "fen": "FEN string",
    "description": "Setup description"
  },
  "steps": [
    {
      "action": "action-type",
      "params": {},
      "expected": {}
    }
  ],
  "assertions": [
    {
      "type": "assertion-type",
      "expected": "expected-value"
    }
  ]
}
```

## Available Scenarios

### Basic Movement Scenarios

#### Pawn Movement
**File**: `pawn-movement.json`
```json
{
  "id": "pawn-001",
  "name": "Pawn Initial Two-Square Move",
  "description": "Verify pawn can move two squares from starting position",
  "category": "piece-movement",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "Initial board position"
  },
  "steps": [
    {
      "action": "selectPiece",
      "params": { "square": "e2" },
      "expected": { "validMoves": ["e3", "e4"] }
    },
    {
      "action": "movePiece",
      "params": { "from": "e2", "to": "e4" },
      "expected": { "success": true }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "e4", "expected": "white-pawn" },
    { "type": "pieceAt", "square": "e2", "expected": null },
    { "type": "turn", "expected": "black" }
  ]
}
```

---

#### Knight Jump
**File**: `knight-jump.json`
```json
{
  "id": "knight-001",
  "name": "Knight Jumps Over Pieces",
  "description": "Verify knight can jump over blocking pieces",
  "category": "piece-movement",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "Initial position with pawns blocking"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "b1", "to": "c3" },
      "expected": { "success": true }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "c3", "expected": "white-knight" },
    { "type": "pieceAt", "square": "b1", "expected": null }
  ]
}
```

---

### Special Moves Scenarios

#### En Passant
**File**: `en-passant.json`
```json
{
  "id": "special-001",
  "name": "En Passant Capture",
  "description": "Verify en passant capture works correctly",
  "category": "special-moves",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/ppp1pppp/8/3pP3/8/8/PPPP1PPP/RNBQKBNR w KQkq d6 0 2",
    "description": "White pawn on e5, black just moved d7-d5"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "e5", "to": "d6" },
      "expected": { "success": true, "captureType": "en-passant" }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "d6", "expected": "white-pawn" },
    { "type": "pieceAt", "square": "d5", "expected": null },
    { "type": "pieceAt", "square": "e5", "expected": null },
    { "type": "capturedPieces", "color": "black", "expected": ["pawn"] }
  ]
}
```

---

#### Castling Kingside
**File**: `castling-kingside.json`
```json
{
  "id": "castling-001",
  "name": "Kingside Castling",
  "description": "Verify kingside castling moves both king and rook",
  "category": "special-moves",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQK2R w KQkq - 0 1",
    "description": "Cleared path for kingside castling"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "e1", "to": "g1" },
      "expected": { "success": true, "moveType": "castling" }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "g1", "expected": "white-king" },
    { "type": "pieceAt", "square": "f1", "expected": "white-rook" },
    { "type": "pieceAt", "square": "e1", "expected": null },
    { "type": "pieceAt", "square": "h1", "expected": null },
    { "type": "castlingRights", "white": { "kingside": false, "queenside": true } }
  ]
}
```

---

#### Pawn Promotion
**File**: `pawn-promotion.json`
```json
{
  "id": "promotion-001",
  "name": "Pawn Promotion to Queen",
  "description": "Verify pawn promotes to queen on 8th rank",
  "category": "special-moves",
  "priority": "high",
  "setup": {
    "fen": "4k3/P7/8/8/8/8/8/4K3 w - - 0 1",
    "description": "White pawn on a7 ready to promote"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "a7", "to": "a8", "promotion": "queen" },
      "expected": { "success": true, "moveType": "promotion" }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "a8", "expected": "white-queen" },
    { "type": "pieceAt", "square": "a7", "expected": null }
  ]
}
```

---

### Game State Scenarios

#### Check Detection
**File**: `check-detection.json`
```json
{
  "id": "gamestate-001",
  "name": "Check Detection",
  "description": "Verify check is detected and displayed",
  "category": "game-state",
  "priority": "critical",
  "setup": {
    "fen": "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2",
    "description": "Standard position"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "f1", "to": "c4" },
      "expected": { "success": true }
    },
    {
      "action": "movePiece",
      "params": { "from": "d8", "to": "h4" },
      "expected": { "success": true, "check": true }
    }
  ],
  "assertions": [
    { "type": "inCheck", "color": "white", "expected": true },
    { "type": "checkIndicator", "visible": true },
    { "type": "validMoves", "mustEscapeCheck": true }
  ]
}
```

---

#### Checkmate
**File**: `checkmate-fools-mate.json`
```json
{
  "id": "checkmate-001",
  "name": "Fool's Mate Checkmate",
  "description": "Verify checkmate detection in Fool's Mate",
  "category": "game-state",
  "priority": "critical",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "Initial position"
  },
  "steps": [
    { "action": "movePiece", "params": { "from": "f2", "to": "f3" } },
    { "action": "movePiece", "params": { "from": "e7", "to": "e5" } },
    { "action": "movePiece", "params": { "from": "g2", "to": "g4" } },
    {
      "action": "movePiece",
      "params": { "from": "d8", "to": "h4" },
      "expected": { "success": true, "checkmate": true }
    }
  ],
  "assertions": [
    { "type": "gameOver", "expected": true },
    { "type": "result", "expected": "black-wins" },
    { "type": "reason", "expected": "checkmate" },
    { "type": "inCheckmate", "color": "white", "expected": true }
  ]
}
```

---

#### Stalemate
**File**: `stalemate.json`
```json
{
  "id": "gamestate-003",
  "name": "Stalemate Detection",
  "description": "Verify stalemate results in draw",
  "category": "game-state",
  "priority": "high",
  "setup": {
    "fen": "k7/8/1Q6/8/8/8/8/7K b - - 0 1",
    "description": "Black king with no legal moves, not in check"
  },
  "steps": [],
  "assertions": [
    { "type": "gameOver", "expected": true },
    { "type": "result", "expected": "draw" },
    { "type": "reason", "expected": "stalemate" },
    { "type": "legalMoves", "color": "black", "expected": [] }
  ]
}
```

---

### UI Interaction Scenarios

#### Drag and Drop
**File**: `drag-drop-move.json`
```json
{
  "id": "ui-001",
  "name": "Drag and Drop Valid Move",
  "description": "Verify drag-drop interaction for valid move",
  "category": "ui-interaction",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "Initial position"
  },
  "steps": [
    {
      "action": "dragStart",
      "params": { "square": "e2" },
      "expected": { "dragActive": true, "pieceSelected": true }
    },
    {
      "action": "dragOver",
      "params": { "square": "e4" },
      "expected": { "validMoveHighlight": true }
    },
    {
      "action": "drop",
      "params": { "square": "e4" },
      "expected": { "success": true, "pieceAt": "e4" }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "e4", "expected": "white-pawn" },
    { "type": "dragActive", "expected": false }
  ]
}
```

---

#### Click to Move
**File**: `click-to-move.json`
```json
{
  "id": "ui-002",
  "name": "Click-Select-Click-Move",
  "description": "Verify click-based move selection",
  "category": "ui-interaction",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "Initial position"
  },
  "steps": [
    {
      "action": "click",
      "params": { "square": "e2" },
      "expected": { "pieceSelected": true, "validMovesHighlighted": ["e3", "e4"] }
    },
    {
      "action": "click",
      "params": { "square": "e4" },
      "expected": { "success": true }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "e4", "expected": "white-pawn" },
    { "type": "selectedSquare", "expected": null }
  ]
}
```

---

### Error Handling Scenarios

#### Invalid Move
**File**: `invalid-move.json`
```json
{
  "id": "error-001",
  "name": "Invalid Move Rejection",
  "description": "Verify invalid moves are rejected with feedback",
  "category": "error-handling",
  "priority": "high",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "Initial position"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "e2", "to": "e5" },
      "expected": { "success": false, "error": "Invalid move" }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "e2", "expected": "white-pawn" },
    { "type": "pieceAt", "square": "e5", "expected": null },
    { "type": "errorMessage", "visible": true }
  ]
}
```

---

#### Move Opponent's Piece
**File**: `wrong-color-move.json`
```json
{
  "id": "error-002",
  "name": "Cannot Move Opponent's Piece",
  "description": "Verify player cannot move opponent's pieces",
  "category": "error-handling",
  "priority": "critical",
  "setup": {
    "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
    "description": "White to move"
  },
  "steps": [
    {
      "action": "movePiece",
      "params": { "from": "e7", "to": "e5" },
      "expected": { "success": false, "error": "Wrong turn" }
    }
  ],
  "assertions": [
    { "type": "pieceAt", "square": "e7", "expected": "black-pawn" },
    { "type": "turn", "expected": "white" }
  ]
}
```

---

## Usage in Tests

```javascript
import scenario from './test-data/scenarios/pawn-movement.json';

describe(scenario.name, () => {
  test(scenario.description, async () => {
    // Setup
    const chess = new Chess(scenario.setup.fen);

    // Execute steps
    for (const step of scenario.steps) {
      const result = executeAction(step.action, step.params);
      expect(result).toMatchObject(step.expected);
    }

    // Verify assertions
    for (const assertion of scenario.assertions) {
      verifyAssertion(chess, assertion);
    }
  });
});
```

## Scenario Categories

- **piece-movement**: Basic piece movements
- **special-moves**: Castling, en passant, promotion
- **game-state**: Check, checkmate, stalemate
- **ui-interaction**: Drag-drop, click-to-move
- **error-handling**: Invalid moves, wrong turn
- **performance**: Load testing, stress testing

## Adding New Scenarios

1. Create JSON file with proper structure
2. Validate JSON syntax
3. Test scenario manually
4. Add to appropriate category
5. Update this README

## Validation

```javascript
const validateScenario = (scenario) => {
  return (
    scenario.id &&
    scenario.name &&
    scenario.category &&
    scenario.priority &&
    scenario.setup &&
    scenario.steps &&
    Array.isArray(scenario.assertions)
  );
};
```
