From b434eb3a4944e5ac8c90f11092ba85ebd29e5f27 Mon Sep 17 00:00:00 2001 From: Kai Chappell Date: Sun, 13 Jul 2025 19:36:07 +0100 Subject: [PATCH] nit --- .../data/questions/add-test-cases-prompt.md | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 backend/data/questions/add-test-cases-prompt.md diff --git a/backend/data/questions/add-test-cases-prompt.md b/backend/data/questions/add-test-cases-prompt.md new file mode 100644 index 0000000..bada858 --- /dev/null +++ b/backend/data/questions/add-test-cases-prompt.md @@ -0,0 +1,222 @@ +# Add Test Cases to Question Files - Context Prompt + +## Overview + +This document provides context for adding `function_signature` and `test_cases` sections to question YAML files in the CodeTutor project. + +## Current Status + +- **Total question files**: 401 +- **Files with test cases**: 120 +- **Files needing test cases**: ~281 + +## File Location + +All question files are in: `/mnt/work/dev/portfolio/codetutor/backend/data/questions/` + +## YAML Structure + +Each question file should have `function_signature` and `test_cases` sections placed **after the `patterns` section and before the `description` section**. + +### Example Structure + +```yaml +title: Two Sum +slug: two-sum +difficulty: easy +leetcode_id: 1 +leetcode_url: https://leetcode.com/problems/two-sum/ +categories: + - arrays + - hash-tables +patterns: + - two-pointers + +function_signature: "def two_sum(nums: list[int], target: int) -> list[int]:" + +test_cases: + visible: + - input: { nums: [2, 7, 11, 15], target: 9 } + expected: [0, 1] + - input: { nums: [3, 2, 4], target: 6 } + expected: [1, 2] + - input: { nums: [3, 3], target: 6 } + expected: [0, 1] + hidden: + - input: { nums: [1, 5, 3, 7, 2], target: 10 } + expected: [2, 3] + - input: { nums: [-1, -2, -3, -4, -5], target: -8 } + expected: [2, 4] + - input: { nums: [0, 4, 3, 0], target: 0 } + expected: [0, 3] + +description: | + Given an array of integers... +``` + +## Function Signature Conventions + +- Use Python type hints: `list[int]`, `str`, `int`, `bool`, `list[list[int]]` +- Use snake_case for function and parameter names +- Match LeetCode's function signature where possible, but use Pythonic naming: + - `twoSum` → `two_sum` + - `numCourses` → `num_courses` + - `obstacleGrid` → `obstacle_grid` + +### Special Types + +For linked lists and trees, use: +- `ListNode` for linked list problems +- `TreeNode` for binary tree problems + +Example: +```yaml +function_signature: "def reorder_list(head: ListNode) -> None:" +function_signature: "def diameter_of_binary_tree(root: TreeNode) -> int:" +``` + +## Test Case Guidelines + +### Visible Tests (2-3 cases) +- Include the examples from the problem description +- Cover basic happy path scenarios +- Keep inputs simple and easy to understand + +### Hidden Tests (5-7 cases) +- **Edge cases**: empty inputs, single elements, nulls +- **Boundary conditions**: min/max values, overflow scenarios +- **Special patterns**: all same values, strictly increasing/decreasing +- **Negative numbers**: if applicable +- **Large inputs**: for performance edge cases + +### Data Types in YAML + +```yaml +# Arrays +input: { nums: [1, 2, 3] } + +# Strings (use quotes) +input: { s: "hello" } + +# Nested arrays (matrices) +input: { grid: [[0, 0, 0], [0, 1, 0], [0, 0, 0]] } + +# Multiple parameters +input: { nums: [1, 2, 3], target: 6 } + +# Boolean expected values +expected: true +expected: false + +# Linked lists (as arrays) +input: { head: [1, 2, 3, 4] } +expected: [1, 4, 2, 3] + +# Trees (level-order with nulls) +input: { root: [1, 2, 3, null, 4] } +``` + +## Finding Files Without Test Cases + +Run this command to find files missing the `function_signature`: + +```bash +cd /mnt/work/dev/portfolio/codetutor/backend/data/questions +for f in *.yaml; do + if ! grep -q "^function_signature:" "$f"; then + echo "$f" + fi +done +``` + +Or use grep to count: +```bash +grep -L "^function_signature:" *.yaml | wc -l +``` + +## Workflow + +1. **Read the problem file** to understand: + - The function parameters and return type + - Example inputs/outputs from the `examples` section + - Constraints for edge case ideas + +2. **Add the sections** after `patterns:` and before `description:` + +3. **Verify YAML syntax** - ensure proper indentation (2 spaces) + +4. **Commit in batches** with message format: + ``` + feat(content): add test cases for N additional problems + ``` + +## Priority Problems + +Focus on commonly asked interview problems first: +- LeetCode Top 100 +- Blind 75 +- NeetCode 150 + +### Categories Still Needing Coverage + +Run this to see which files still need test cases: +```bash +grep -L "^function_signature:" *.yaml | head -50 +``` + +## Example: Adding Tests to a New File + +### Before (file without tests): +```yaml +patterns: + - sliding-window + +description: | + ... +``` + +### After (file with tests): +```yaml +patterns: + - sliding-window + +function_signature: "def max_sliding_window(nums: list[int], k: int) -> list[int]:" + +test_cases: + visible: + - input: { nums: [1, 3, -1, -3, 5, 3, 6, 7], k: 3 } + expected: [3, 3, 5, 5, 6, 7] + - input: { nums: [1], k: 1 } + expected: [1] + hidden: + - input: { nums: [9, 11], k: 2 } + expected: [11] + - input: { nums: [4, 3, 2, 1], k: 2 } + expected: [4, 3, 2] + - input: { nums: [7, 7, 7, 7], k: 3 } + expected: [7, 7] + +description: | + ... +``` + +## Changelog Update + +After committing, update `/mnt/work/dev/portfolio/codetutor/changelog.md`: + +```markdown +## [Unreleased] + +### Added + +- Test cases for N additional questions bringing total to M: + - Category: problem1, problem2, problem3 + - Category: problem4, problem5 +``` + +## Notes + +- The test runner uses Pyodide (Python in WebAssembly) to execute code +- Visible tests run client-side; hidden tests are validated server-side +- Expected outputs must be JSON-serializable +- Order matters for list outputs unless the problem states "any order"