From 715afc9b5e6a79796c780605a483ef0e9fbd6e40 Mon Sep 17 00:00:00 2001 From: Yoshin Date: Fri, 17 Apr 2026 08:25:34 +0900 Subject: [PATCH] chore: remove dead scripts, tests, and stale gitignore entries (#19) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clean up maintenance artifacts that have outlived their purpose: - tests/: test_shadow_calc.c no longer links (calculate_shadow_bias is now static); test_shadow_config binary is an orphan with no source; baselines/metadata.json captured pre-refactor snapshot that is no longer relevant - scripts/: remove one-off validators tied to archived specs (012 cleanup, 013 norminette, BVH integration fix), superseded helpers (create_wiki.sh replaced by .github/scripts/sync-wiki.sh), norm-violating tooling (fix_whitespace.sh converted tabs to spaces), and scripts with broken references (fix_line_continuations.sh) - scripts/test/: all three scripts dead (hardcoded macOS path in test_progress.sh, outdated spec 002 validation) - .gitignore: drop patterns for test binaries that never existed (test_vector, test_parser, test_mlx, etc.) and the removed test_optimizations.sh script Remaining in scripts/: validate_norminette.sh, test_miniRT.sh, test_scenes.sh, bench.sh — all referenced in AGENTS.md and wiki. Co-authored-by: Claude --- .gitignore | 10 --- scripts/analyze_function_usage.sh | 117 -------------------------- scripts/check-commit-format.sh | 33 -------- scripts/check-issue-reference.sh | 32 ------- scripts/compare_renders.sh | 81 ------------------ scripts/create_wiki.sh | 33 -------- scripts/fix_line_continuations.sh | 16 ---- scripts/fix_whitespace.sh | 16 ---- scripts/setup-ci-environment.sh | 52 ------------ scripts/test/test_controls.sh | 66 --------------- scripts/test/test_progress.sh | 7 -- scripts/test/validate_optimization.sh | 111 ------------------------ scripts/validate_42_functions.sh | 60 ------------- scripts/validate_bvh_fix.sh | 85 ------------------- scripts/validate_cleanup.sh | 109 ------------------------ scripts/verify_release.sh | 57 ------------- tests/baselines/metadata.json | 9 -- tests/test_shadow_calc | Bin 16952 -> 0 bytes tests/test_shadow_calc.c | 83 ------------------ tests/test_shadow_config | Bin 16576 -> 0 bytes 20 files changed, 977 deletions(-) delete mode 100755 scripts/analyze_function_usage.sh delete mode 100755 scripts/check-commit-format.sh delete mode 100755 scripts/check-issue-reference.sh delete mode 100755 scripts/compare_renders.sh delete mode 100755 scripts/create_wiki.sh delete mode 100755 scripts/fix_line_continuations.sh delete mode 100755 scripts/fix_whitespace.sh delete mode 100755 scripts/setup-ci-environment.sh delete mode 100755 scripts/test/test_controls.sh delete mode 100644 scripts/test/test_progress.sh delete mode 100755 scripts/test/validate_optimization.sh delete mode 100755 scripts/validate_42_functions.sh delete mode 100755 scripts/validate_bvh_fix.sh delete mode 100755 scripts/validate_cleanup.sh delete mode 100755 scripts/verify_release.sh delete mode 100644 tests/baselines/metadata.json delete mode 100755 tests/test_shadow_calc delete mode 100644 tests/test_shadow_calc.c delete mode 100755 tests/test_shadow_config diff --git a/.gitignore b/.gitignore index 4ab2273..71fba69 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,6 @@ # Executables miniRT -test_vector -test_parser -test_intersections -test_lighting # Libraries *.a @@ -22,9 +18,6 @@ test_lighting # Dependency files *.d -# MinilibX test programs -test_mlx - # IDE and Editor files .vscode/ .idea/ @@ -61,8 +54,5 @@ build/ .codex/skills/ .codex/tmp/ -# Optimization test script -test_optimizations.sh - # Claude Code local settings .claude/settings.local.json diff --git a/scripts/analyze_function_usage.sh b/scripts/analyze_function_usage.sh deleted file mode 100755 index 3b6eeb1..0000000 --- a/scripts/analyze_function_usage.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/bin/bash -# Function usage analysis script -# Created as part of 012-code-cleanup-refactor feature -# Analyzes function declarations and their usage across the codebase - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -OUTPUT_FILE="${1:-/tmp/function_usage_report.txt}" - -echo "=== MiniRT Function Usage Analysis ===" | tee "$OUTPUT_FILE" -echo "Project Root: $PROJECT_ROOT" | tee -a "$OUTPUT_FILE" -echo "Generated: $(date)" | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" - -# Extract all function declarations from headers -echo "=== PART 1: Function Declarations in Headers ===" | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" - -for header in "$PROJECT_ROOT"/includes/*.h; do - header_name=$(basename "$header") - echo "--- $header_name ---" | tee -a "$OUTPUT_FILE" - - # Extract function declarations (simplified pattern) - # Looks for: return_type function_name(params); - grep -E '^[a-z_][a-z0-9_]*\s+[a-z_][a-z0-9_]*\s*\(' "$header" | \ - sed 's/^\([a-z_][a-z0-9_]*\)\s\+\([a-z_][a-z0-9_]*\)\s*(.*/\2/' | \ - sort -u | tee -a "$OUTPUT_FILE" || echo " (no declarations found)" | tee -a "$OUTPUT_FILE" - - echo "" | tee -a "$OUTPUT_FILE" -done - -# Extract all function definitions from source files -echo "=== PART 2: Function Definitions in Source Files ===" | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" - -for src_dir in "$PROJECT_ROOT"/src/*/; do - dir_name=$(basename "$src_dir") - echo "--- $dir_name/ ---" | tee -a "$OUTPUT_FILE" - - # Find all .c files in directory - find "$src_dir" -name "*.c" -exec basename {} \; | while read -r src_file; do - echo " File: $src_file" | tee -a "$OUTPUT_FILE" - - # Extract function definitions (simplified) - grep -E '^[a-z_][a-z0-9_]*\s+[a-z_][a-z0-9_]*\s*\(' "$src_dir$src_file" | \ - sed 's/^\([a-z_][a-z0-9_]*\)\s\+\([a-z_][a-z0-9_]*\)\s*(.*/ \2/' | \ - tee -a "$OUTPUT_FILE" || echo " (no definitions found)" | tee -a "$OUTPUT_FILE" - done - - echo "" | tee -a "$OUTPUT_FILE" -done - -# Analyze function calls -echo "=== PART 3: Function Call Analysis ===" | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" -echo "Searching for function calls in codebase..." | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" - -# Create temporary file with all function names -temp_functions=$(mktemp) - -# Extract function names from headers -for header in "$PROJECT_ROOT"/includes/*.h; do - grep -E '^[a-z_][a-z0-9_]*\s+[a-z_][a-z0-9_]*\s*\(' "$header" | \ - sed 's/^\([a-z_][a-z0-9_]*\)\s\+\([a-z_][a-z0-9_]*\)\s*(.*/\2/' >> "$temp_functions" || true -done - -# Sort and unique -sort -u "$temp_functions" > "${temp_functions}.sorted" -mv "${temp_functions}.sorted" "$temp_functions" - -# For each function, count usages -echo "Function Name | Declaration Count | Call Sites" | tee -a "$OUTPUT_FILE" -echo "--------------|-------------------|------------" | tee -a "$OUTPUT_FILE" - -while IFS= read -r func_name; do - [ -z "$func_name" ] && continue - - # Count declarations (should be 1 ideally) - decl_count=$(grep -r "^[a-z_][a-z0-9_]*\s\+${func_name}\s*(" "$PROJECT_ROOT"/includes/ 2>/dev/null | wc -l | tr -d ' ') - - # Count call sites (usage in .c files) - call_count=$(grep -r "${func_name}(" "$PROJECT_ROOT"/src/ "$PROJECT_ROOT"/main.c 2>/dev/null | wc -l | tr -d ' ') - - echo "$func_name | $decl_count | $call_count" | tee -a "$OUTPUT_FILE" -done < "$temp_functions" - -# Cleanup -rm -f "$temp_functions" - -echo "" | tee -a "$OUTPUT_FILE" -echo "=== PART 4: Potentially Unused Functions ===" | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" -echo "Functions with 0 call sites (may be callbacks or unused):" | tee -a "$OUTPUT_FILE" -echo "" | tee -a "$OUTPUT_FILE" - -# Re-extract and check for zero usage -for header in "$PROJECT_ROOT"/includes/*.h; do - grep -E '^[a-z_][a-z0-9_]*\s+[a-z_][a-z0-9_]*\s*\(' "$header" | \ - sed 's/^\([a-z_][a-z0-9_]*\)\s\+\([a-z_][a-z0-9_]*\)\s*(.*/\2/' | \ - sort -u | while IFS= read -r func_name; do - [ -z "$func_name" ] && continue - - call_count=$(grep -r "${func_name}(" "$PROJECT_ROOT"/src/ "$PROJECT_ROOT"/main.c 2>/dev/null | wc -l | tr -d ' ') - - if [ "$call_count" -eq 0 ]; then - header_name=$(basename "$header") - echo " - $func_name (declared in $header_name)" | tee -a "$OUTPUT_FILE" - fi - done -done - -echo "" | tee -a "$OUTPUT_FILE" -echo "=== Analysis Complete ===" | tee -a "$OUTPUT_FILE" -echo "Report saved to: $OUTPUT_FILE" | tee -a "$OUTPUT_FILE" diff --git a/scripts/check-commit-format.sh b/scripts/check-commit-format.sh deleted file mode 100755 index 23a93f4..0000000 --- a/scripts/check-commit-format.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# check-commit-format.sh -# Validates commit messages follow Conventional Commits format - -set -e - -COMMIT_MSG_FILE=$1 -COMMIT_MSG=$(cat "$COMMIT_MSG_FILE") - -# Conventional commit pattern -PATTERN="^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\(.+\))?: .+" - -if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then - echo "❌ Invalid commit message format" - echo "" - echo "Current message:" - echo " $COMMIT_MSG" - echo "" - echo "Expected format:" - echo " type(scope): description" - echo "" - echo "Examples:" - echo " feat: add soft shadow rendering" - echo " feat(lighting): implement distance attenuation" - echo " fix: resolve segfault in vector operations" - echo " fix(parser): handle empty scene files" - echo " docs: update README with build instructions" - echo "" - echo "Valid types: feat, fix, docs, style, refactor, test, chore, perf, ci, build, revert" - exit 1 -fi - -echo "✓ Commit message format is valid" diff --git a/scripts/check-issue-reference.sh b/scripts/check-issue-reference.sh deleted file mode 100755 index b992cde..0000000 --- a/scripts/check-issue-reference.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# check-issue-reference.sh -# Validates that commits reference an issue number when required - -set -e - -COMMIT_MSG_FILE=$1 -COMMIT_MSG=$(cat "$COMMIT_MSG_FILE") - -# Skip check for certain commit types that don't require issues -if echo "$COMMIT_MSG" | grep -qE "^(chore|docs|style): "; then - echo "✓ Commit type does not require issue reference" - exit 0 -fi - -# Check for issue reference in commit message -if ! echo "$COMMIT_MSG" | grep -qE "(#[0-9]+|issue [0-9]+|closes [0-9]+|fixes [0-9]+|resolves [0-9]+)"; then - echo "⚠️ Warning: No issue reference found in commit message" - echo "" - echo "Current message:" - echo " $COMMIT_MSG" - echo "" - echo "Consider adding an issue reference:" - echo " feat: add feature (#123)" - echo " fix: resolve bug (closes #456)" - echo " refactor: improve code (issue #789)" - echo "" - echo "This is a warning, not an error. Press Enter to continue or Ctrl+C to abort." - read -r -fi - -echo "✓ Issue reference check passed" diff --git a/scripts/compare_renders.sh b/scripts/compare_renders.sh deleted file mode 100755 index ead1672..0000000 --- a/scripts/compare_renders.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash -# Compare rendered images between baseline and current -# Usage: ./scripts/compare_renders.sh [baseline_dir] [current_dir] - -set -e - -BASELINE_DIR="${1:-baseline_renders}" -CURRENT_DIR="${2:-current_renders}" - -echo "=========================================" -echo "Render Comparison Script" -echo "=========================================" -echo "Baseline: $BASELINE_DIR" -echo "Current: $CURRENT_DIR" -echo "" - -if [ ! -d "$BASELINE_DIR" ]; then - echo "✗ ERROR: Baseline directory not found: $BASELINE_DIR" - exit 1 -fi - -if [ ! -d "$CURRENT_DIR" ]; then - echo "✗ ERROR: Current directory not found: $CURRENT_DIR" - exit 1 -fi - -# Count files -baseline_count=$(find "$BASELINE_DIR" -name "*.ppm" -o -name "*.png" | wc -l | tr -d ' ') -current_count=$(find "$CURRENT_DIR" -name "*.ppm" -o -name "*.png" | wc -l | tr -d ' ') - -echo "Baseline images: $baseline_count" -echo "Current images: $current_count" -echo "" - -if [ "$baseline_count" -eq 0 ]; then - echo "✗ ERROR: No baseline images found" - exit 1 -fi - -# Compare each image -pass_count=0 -fail_count=0 -missing_count=0 - -for baseline_img in "$BASELINE_DIR"/*.{ppm,png}; do - [ -f "$baseline_img" ] || continue - - filename=$(basename "$baseline_img") - current_img="$CURRENT_DIR/$filename" - - if [ ! -f "$current_img" ]; then - echo "✗ MISSING: $filename" - ((missing_count++)) - continue - fi - - # Binary comparison - if cmp -s "$baseline_img" "$current_img"; then - echo "✓ IDENTICAL: $filename" - ((pass_count++)) - else - echo "✗ DIFFERS: $filename" - ((fail_count++)) - fi -done - -echo "" -echo "=========================================" -echo "Results:" -echo "=========================================" -echo "Identical: $pass_count" -echo "Different: $fail_count" -echo "Missing: $missing_count" - -if [ "$fail_count" -eq 0 ] && [ "$missing_count" -eq 0 ]; then - echo "✓ PASS: All renders match baseline" - exit 0 -else - echo "✗ FAIL: Some renders differ from baseline" - exit 1 -fi diff --git a/scripts/create_wiki.sh b/scripts/create_wiki.sh deleted file mode 100755 index 5e01326..0000000 --- a/scripts/create_wiki.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -echo "======================================" -echo "GitHub Wiki 자동 생성 스크립트" -echo "======================================" -echo "" - -REPO="gdtknight/miniRT_final" -WIKI_URL="https://github.com/$REPO/wiki" - -echo "1. 브라우저에서 다음 URL을 열어주세요:" -echo " $WIKI_URL" -echo "" -echo "2. 'Create the first page' 버튼을 클릭하세요" -echo "" -echo "3. 아무 내용(예: 'Initial page')을 입력하고 Save 클릭" -echo "" -echo "4. 저장 후 아래 명령어를 실행하세요:" -echo "" -echo " cd /tmp" -echo " git clone git@github.com:$REPO.wiki.git" -echo " cd miniRT_final.wiki" -echo " cp /tmp/miniRT_wiki/*.md ." -echo " git add ." -echo " git commit -m 'Add comprehensive Korean documentation'" -echo " git push origin master" -echo "" -echo "======================================" -echo "" -echo "Wiki 파일 준비 상태:" -ls -lh /tmp/miniRT_wiki/*.md 2>/dev/null | awk '{print " " $9}' || echo " (파일을 다시 생성해야 합니다)" -echo "" -echo "자세한 내용은 WIKI_SETUP.md 를 참고하세요" diff --git a/scripts/fix_line_continuations.sh b/scripts/fix_line_continuations.sh deleted file mode 100755 index f6063e6..0000000 --- a/scripts/fix_line_continuations.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# Fix line continuation indentation issues - -files=( -"src/ray/intersect_cylinder.c" -"src/lighting/lighting.c" -"src/lighting/shadow_attenuation.c" -"src/lighting/shadow_calc.c" -) - -for file in "${files[@]}"; do -if [ -f "$file" ]; then -echo "Processing: $file" -# This is complex - will do manually -fi -done diff --git a/scripts/fix_whitespace.sh b/scripts/fix_whitespace.sh deleted file mode 100755 index 0da4f08..0000000 --- a/scripts/fix_whitespace.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# Fix whitespace issues in source files - -# Convert tabs to spaces in all .c and .h files -find src includes -type f \( -name "*.c" -o -name "*.h" \) -exec bash -c ' - for file; do - # Check if file has issues - if grep -q $'\''\t'\'' "$file"; then - echo "Fixing tabs in: $file" - # Use expand to convert tabs to spaces (tab stop = 4) - expand -t 4 "$file" > "$file.tmp" && mv "$file.tmp" "$file" - fi - done -' bash {} + - -echo "Whitespace fixes complete" diff --git a/scripts/setup-ci-environment.sh b/scripts/setup-ci-environment.sh deleted file mode 100755 index 38ccd92..0000000 --- a/scripts/setup-ci-environment.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# setup-ci-environment.sh -# Sets up CI environment for testing - -set -e - -echo "Setting up CI environment..." - -# Detect OS -if [[ "$OSTYPE" == "linux-gnu"* ]]; then - OS="Linux" - echo "Detected OS: Linux" -elif [[ "$OSTYPE" == "darwin"* ]]; then - OS="macOS" - echo "Detected OS: macOS" -else - OS="Unknown" - echo "Warning: Unknown OS: $OSTYPE" -fi - -# Install dependencies based on OS -if [ "$OS" = "Linux" ]; then - echo "Installing Linux dependencies..." - if command -v apt-get &> /dev/null; then - sudo apt-get update - sudo apt-get install -y gcc make xorg libxext-dev libbsd-dev xvfb - elif command -v yum &> /dev/null; then - sudo yum install -y gcc make libX11-devel libXext-devel - else - echo "Error: No supported package manager found" - exit 1 - fi -elif [ "$OS" = "macOS" ]; then - echo "macOS environment ready (no additional dependencies needed)" -fi - -# Install norminette if not present -if ! command -v norminette &> /dev/null; then - echo "Installing norminette..." - python3 -m pip install --upgrade pip setuptools - python3 -m pip install norminette -fi - -# Verify installations -echo "" -echo "Verifying installations..." -gcc --version | head -1 -make --version | head -1 -norminette --version - -echo "" -echo "✓ CI environment setup complete" diff --git a/scripts/test/test_controls.sh b/scripts/test/test_controls.sh deleted file mode 100755 index ca8b1a4..0000000 --- a/scripts/test/test_controls.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash -# Test script to verify keyboard controls are properly implemented - -echo "Testing miniRT Interactive Controls" -echo "====================================" -echo "" - -# Check if miniRT exists -if [ ! -f "./miniRT" ]; then - echo "Error: miniRT executable not found" - echo "Please run 'make' first" - exit 1 -fi - -# Check for test scene -if [ ! -f "scenes/perf/perf_all_objects.rt" ]; then - echo "Error: Test scene not found" - exit 1 -fi - -echo "✓ miniRT executable found" -echo "✓ Test scene available" -echo "" -echo "Manual Test Instructions:" -echo "==========================" -echo "" -echo "1. Camera Movement (WASD):" -echo " - Launch: ./miniRT scenes/perf/perf_all_objects.rt" -echo " - Press W: Camera should move forward" -echo " - Press S: Camera should move backward" -echo " - Press A: Camera should strafe left" -echo " - Press D: Camera should strafe right" -echo "" -echo "2. Camera Rotation (RF):" -echo " - Press R: Camera should pitch up" -echo " - Press F: Camera should pitch down" -echo "" -echo "3. Object Selection ([/]):" -echo " - Press ]: Select next object" -echo " - Press [: Select previous object" -echo "" -echo "4. Object Movement (Numpad):" -echo " - Select an object first with ]" -echo " - Press Numpad 4/6: Move left/right" -echo " - Press Numpad 2/8: Move down/up" -echo " - Press Numpad 1/3: Move back/forward" -echo "" -echo "5. Light Control (Insert/Home/PgUp/Del/End/PgDn):" -echo " - Press Insert: Move light right" -echo " - Press Delete: Move light left" -echo " - Press Home: Move light up" -echo " - Press End: Move light down" -echo " - Press Page Up: Move light forward" -echo " - Press Page Down: Move light backward" -echo "" -echo "6. Exit:" -echo " - Press ESC to exit" -echo "" -echo "Expected behavior:" -echo "- Scene should re-render after each movement" -echo "- Controls should respond immediately" -echo "- No crashes or memory leaks" -echo "" -echo "To run the interactive test, execute:" -echo " ./miniRT scenes/perf/perf_all_objects.rt" -echo "" diff --git a/scripts/test/test_progress.sh b/scripts/test/test_progress.sh deleted file mode 100644 index 14cad4b..0000000 --- a/scripts/test/test_progress.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -cd /Users/yoshin/dev/working/miniRT -make clean >/dev/null 2>&1 -make 2>&1 | tail -3 -echo "---" -python3 -m norminette src/ includes/ 2>&1 | grep "Error:" | wc -l -python3 -m norminette src/ includes/ 2>&1 | grep "Error:" | awk '{print $2}' | sort | uniq -c | sort -rn diff --git a/scripts/test/validate_optimization.sh b/scripts/test/validate_optimization.sh deleted file mode 100755 index f6c07ac..0000000 --- a/scripts/test/validate_optimization.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -# Rendering Optimization Validation Script -# Validates that BVH and optimization features compile and basic structure is correct - -echo "=== miniRT Rendering Optimization Validation ===" -echo "" - -# Colors -GREEN='\033[0;32m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -PASS=0 -FAIL=0 - -check() { - if [ $? -eq 0 ]; then - echo -e "${GREEN}✓ PASS${NC}: $1" - ((PASS++)) - else - echo -e "${RED}✗ FAIL${NC}: $1" - ((FAIL++)) - fi -} - -echo "1. Checking if miniRT binary exists..." -[ -f ./miniRT ] -check "miniRT binary exists" - -echo "" -echo "2. Checking header files..." -[ -f includes/spatial.h ] -check "includes/spatial.h exists" - -[ -f includes/metrics.h ] -check "includes/metrics.h exists" - -[ -f includes/render_state.h ] -check "includes/render_state.h exists" - -echo "" -echo "3. Checking BVH implementation files..." -[ -f src/spatial/aabb.c ] -check "src/spatial/aabb.c exists" - -[ -f src/spatial/bounds.c ] -check "src/spatial/bounds.c exists" - -[ -f src/spatial/bvh_build.c ] -check "src/spatial/bvh_build.c exists" - -[ -f src/spatial/bvh_init.c ] -check "src/spatial/bvh_init.c exists" - -[ -f src/spatial/bvh_traverse.c ] -check "src/spatial/bvh_traverse.c exists" - -echo "" -echo "4. Checking render state implementation..." -[ -f src/render/render_state.c ] -check "src/render/render_state.c exists" - -[ -f src/utils/timer.c ] -check "src/utils/timer.c exists" - -echo "" -echo "5. Checking test scenes..." -[ -f scenes/perf/perf_spheres_20.rt ] -check "scenes/perf/perf_spheres_20.rt exists" - -[ -f scenes/perf/perf_spheres_50.rt ] -check "scenes/perf/perf_spheres_50.rt exists" - -echo "" -echo "6. Checking for required symbols in binary..." -nm ./miniRT | grep -q "bvh_create" -check "bvh_create function present" - -nm ./miniRT | grep -q "bvh_build" -check "bvh_build function present" - -nm ./miniRT | grep -q "bvh_intersect" -check "bvh_traverse/bvh_intersect function present" - -nm ./miniRT | grep -q "render_state_init" -check "render_state_init function present" - -echo "" -echo "7. Verifying compilation (symbol check complete)" -echo -e "${YELLOW}⚠ INFO${NC}: Scene rendering validation requires GUI (skipped)" - -echo "" -echo "=== Validation Summary ===" -echo -e "Passed: ${GREEN}${PASS}${NC}" -echo -e "Failed: ${RED}${FAIL}${NC}" -echo "" - -if [ $FAIL -eq 0 ]; then - echo -e "${GREEN}✓ All checks passed! BVH optimization is properly implemented.${NC}" - echo "" - echo "Next steps:" - echo "1. Test rendering with: ./miniRT scenes/perf/perf_spheres_20.rt" - echo "2. Toggle BVH with 'B' key during rendering" - echo "3. Compare performance with BVH on vs off" - echo "4. Try larger scene: ./miniRT scenes/perf/perf_spheres_50.rt" - exit 0 -else - echo -e "${RED}✗ Some checks failed. Please review the implementation.${NC}" - exit 1 -fi diff --git a/scripts/validate_42_functions.sh b/scripts/validate_42_functions.sh deleted file mode 100755 index b9bebc5..0000000 --- a/scripts/validate_42_functions.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# 42 Function Constraint Validation Script -# Checks for prohibited functions in miniRT codebase - -set -e - -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" - -echo "=== 42 School Function Constraint Validation ===" -echo "Project: miniRT" -echo "Date: $(date)" -echo "" - -# Prohibited functions list -PROHIBITED_FUNCS=( - "pthread_create" - "pthread_join" - "pthread_mutex_lock" - "pthread_mutex_unlock" - "pthread_mutex_init" - "pthread_mutex_destroy" - "fork" - "pipe" - "waitpid" - "execve" - "system" -) - -violations=0 - -echo "Searching for prohibited functions..." -echo "" - -for func in "${PROHIBITED_FUNCS[@]}"; do - echo -n " Checking $func... " - - # Search in source files and headers - matches=$(grep -r "${func}(" "$PROJECT_ROOT/src/" "$PROJECT_ROOT/includes/" "$PROJECT_ROOT/main.c" 2>/dev/null | wc -l | tr -d ' ') - - if [ "$matches" -gt 0 ]; then - echo "✗ FOUND ($matches occurrences)" - violations=$((violations + matches)) - grep -rn "${func}(" "$PROJECT_ROOT/src/" "$PROJECT_ROOT/includes/" "$PROJECT_ROOT/main.c" 2>/dev/null | head -5 - else - echo "✓ OK" - fi -done - -echo "" -echo "=== Validation Results ===" - -if [ $violations -eq 0 ]; then - echo "✓ PASSED: No prohibited functions found" - echo "✓ Codebase complies with 42 School function constraints" - exit 0 -else - echo "✗ FAILED: $violations prohibited function usage(s) found" - echo "✗ Codebase violates 42 School function constraints" - exit 1 -fi diff --git a/scripts/validate_bvh_fix.sh b/scripts/validate_bvh_fix.sh deleted file mode 100755 index 4d51de3..0000000 --- a/scripts/validate_bvh_fix.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash - -echo "=== BVH Integration Fix Validation ===" -echo "" - -# T011: Check if fixes are applied -echo "T011-T012: Checking BVH fixes..." -if grep -q "bvh_enabled = 1" src/render/render_state.c; then - echo "✅ T006: BVH enabled by default in render_state.c" -else - echo "❌ T006 FAIL: BVH not enabled by default" - exit 1 -fi - -if grep -q "hit_found = 1" src/render/trace.c && grep -q "if (!hit_found)" src/render/trace.c; then - echo "✅ T007-T008: Fallback logic correctly implemented in trace.c" -else - echo "❌ T007-T008 FAIL: Fallback logic not correct" - exit 1 -fi - -# T009: Verify norminette -echo "" -echo "T009: Running norminette..." -if norminette src/render/render_state.c src/render/trace.c > /dev/null 2>&1; then - echo "✅ T009: Norminette check passed" -else - echo "❌ T009 FAIL: Norminette errors found" - exit 1 -fi - -# T010: Verify build -echo "" -echo "T010: Testing build..." -if make re > /dev/null 2>&1; then - echo "✅ T010: Build successful" -else - echo "❌ T010 FAIL: Build failed" - exit 1 -fi - -# T013-T020: Test with simple scene -echo "" -echo "T013-T020: Testing scene loading..." -if [ ! -f "scenes/valid/valid_smoke_simple.rt" ]; then - echo "⚠️ Warning: valid_smoke_simple.rt not found, using perf_all_objects.rt" - TEST_SCENE="scenes/perf/perf_all_objects.rt" -else - TEST_SCENE="scenes/valid/valid_smoke_simple.rt" -fi - -# Test that program can start with a scene (will timeout, but that's expected for GUI) -timeout 2 ./miniRT "$TEST_SCENE" > /dev/null 2>&1 -EXIT_CODE=$? - -if [ $EXIT_CODE -eq 124 ]; then - # Timeout is expected for GUI application - echo "✅ T011-T020: Program starts and loads scene successfully" - echo " (Timed out as expected - GUI application)" -elif [ $EXIT_CODE -eq 0 ]; then - echo "✅ T011-T020: Program executed successfully" -else - echo "❌ T011-T020 FAIL: Program crashed or failed (exit code: $EXIT_CODE)" - exit 1 -fi - -echo "" -echo "=== Summary ===" -echo "✅ Phase 1: Setup & Diagnosis - Complete" -echo "✅ Phase 2: Core BVH Fixes - Complete" -echo "✅ Phase 3: Basic Rendering Tests - Complete" -echo "" -echo "Core fixes successfully implemented:" -echo " 1. BVH enabled by default (render_state.c:37)" -echo " 2. Fallback logic added to trace_ray() (trace.c:159-172)" -echo " 3. Norminette compliant" -echo " 4. Build successful" -echo " 5. Scene loading verified" -echo "" -echo "Next steps:" -echo " - Run with X11 display to visually verify rendering" -echo " - Test BVH toggle functionality if implemented" -echo " - Test with complex scenes for performance validation" -echo "" -echo "✅ BVH FIX VALIDATION PASSED" diff --git a/scripts/validate_cleanup.sh b/scripts/validate_cleanup.sh deleted file mode 100755 index 2f7ac79..0000000 --- a/scripts/validate_cleanup.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/bash -# Validation script for behavior preservation testing -# Created as part of 012-code-cleanup-refactor feature - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -SCENES_DIR="$PROJECT_ROOT/scenes" -BASELINE_DIR="/tmp/minirt_baseline" -CURRENT_DIR="/tmp/minirt_current" - -echo "=== MiniRT Cleanup Validation Script ===" -echo "Project Root: $PROJECT_ROOT" -echo "" - -# Function to render all scenes and save output -render_scenes() { - local output_dir="$1" - mkdir -p "$output_dir" - - echo "Rendering scenes to: $output_dir" - - for scene in "$SCENES_DIR"/*.rt; do - if [ -f "$scene" ]; then - scene_name=$(basename "$scene" .rt) - echo " - Rendering $scene_name..." - # Note: This would need actual screenshot/comparison logic - # For now, just verify the program runs without crash - timeout 2s "$PROJECT_ROOT/miniRT" "$scene" > "$output_dir/${scene_name}.log" 2>&1 || true - fi - done - - echo "Rendering complete." -} - -# Function to compare baseline vs current -compare_results() { - echo "" - echo "=== Comparison Results ===" - - if [ ! -d "$BASELINE_DIR" ]; then - echo "ERROR: No baseline directory found. Run with 'baseline' argument first." - return 1 - fi - - local differences=0 - - for baseline_log in "$BASELINE_DIR"/*.log; do - scene_name=$(basename "$baseline_log") - current_log="$CURRENT_DIR/$scene_name" - - if [ ! -f "$current_log" ]; then - echo " ✗ MISSING: $scene_name" - differences=$((differences + 1)) - continue - fi - - # Simple log comparison (in practice, would compare images) - if diff -q "$baseline_log" "$current_log" > /dev/null 2>&1; then - echo " ✓ PASS: $scene_name" - else - echo " ✗ DIFF: $scene_name" - differences=$((differences + 1)) - fi - done - - echo "" - if [ $differences -eq 0 ]; then - echo "✓ All scenes match baseline - behavior preserved!" - return 0 - else - echo "✗ $differences scene(s) differ from baseline" - return 1 - fi -} - -# Main execution -case "${1:-test}" in - baseline) - echo "Creating baseline..." - make -C "$PROJECT_ROOT" > /dev/null - render_scenes "$BASELINE_DIR" - echo "" - echo "✓ Baseline created successfully in $BASELINE_DIR" - ;; - - test) - echo "Testing current implementation..." - make -C "$PROJECT_ROOT" > /dev/null - render_scenes "$CURRENT_DIR" - compare_results - ;; - - clean) - echo "Cleaning validation data..." - rm -rf "$BASELINE_DIR" "$CURRENT_DIR" - echo "✓ Cleaned" - ;; - - *) - echo "Usage: $0 {baseline|test|clean}" - echo "" - echo " baseline - Create baseline rendering results" - echo " test - Test current implementation against baseline" - echo " clean - Remove validation data" - exit 1 - ;; -esac diff --git a/scripts/verify_release.sh b/scripts/verify_release.sh deleted file mode 100755 index ad0eda6..0000000 --- a/scripts/verify_release.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# miniRT Release Gate Verification Script -# 릴리즈 게이트 체크리스트 자동 검증 스크립트 - -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' - -PASSED=0 -FAILED=0 -WARNINGS=0 - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}miniRT Release Gate Verification${NC}" -echo -e "${BLUE}========================================${NC}\n" - -print_status() { - if [ $1 -eq 0 ]; then - echo -e "${GREEN}✓ PASSED${NC}: $2" - ((PASSED++)) - else - echo -e "${RED}✗ FAILED${NC}: $2" - ((FAILED++)) - fi -} - -print_warning() { - echo -e "${YELLOW}⚠ WARNING${NC}: $1" - ((WARNINGS++)) -} - -# 1. Build System -echo -e "\n${BLUE}[1] Build System${NC}" -make re > /dev/null 2>&1 && print_status 0 "Build success" || print_status 1 "Build failed" -[ -f "miniRT" ] && print_status 0 "Executable exists" || print_status 1 "No executable" - -# 2. Norminette -echo -e "\n${BLUE}[2] Norminette${NC}" -if command -v norminette &> /dev/null; then - norminette src/ includes/ 2>&1 | grep -q "Error" && print_status 1 "Norminette errors" || print_status 0 "Norminette OK" -else - print_warning "norminette not installed" -fi - -# 3. 42 Header -echo -e "\n${BLUE}[3] 42 Headers${NC}" -HEADERS=$(find src includes -name "*.c" -o -name "*.h" | xargs grep -l "/\* \*\*\*" | wc -l) -TOTAL=$(find src includes -name "*.c" -o -name "*.h" | wc -l) -[ $HEADERS -eq $TOTAL ] && print_status 0 "All headers present ($HEADERS/$TOTAL)" || print_status 1 "Missing headers ($HEADERS/$TOTAL)" - -# Summary -echo -e "\n${BLUE}========================================${NC}" -echo -e "${GREEN}Passed: $PASSED${NC} | ${RED}Failed: $FAILED${NC} | ${YELLOW}Warnings: $WARNINGS${NC}" -[ $FAILED -eq 0 ] && echo -e "${GREEN}✓ PASSED${NC}" || echo -e "${RED}✗ FAILED${NC}" diff --git a/tests/baselines/metadata.json b/tests/baselines/metadata.json deleted file mode 100644 index 07724d9..0000000 --- a/tests/baselines/metadata.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "generated_at": "2026-01-14T11:35:15Z", - "commit_hash": "8428e3fddaf54acc72a6de13570a28a3a2afc45a", - "branch": "016-compliance-refactoring", - "miniRT_version": "1.0.0", - "scene_count": 43, - "note": "Baseline captured before compliance refactoring - miniRT is GUI-based, visual validation will be manual during implementation", - "validation_method": "Build success + norminette + memory checks + manual visual verification" -} diff --git a/tests/test_shadow_calc b/tests/test_shadow_calc deleted file mode 100755 index 7071be185348bb1fbbca895fe623afa5690baf11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16952 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 diff --git a/tests/test_shadow_calc.c b/tests/test_shadow_calc.c deleted file mode 100644 index b390655..0000000 --- a/tests/test_shadow_calc.c +++ /dev/null @@ -1,83 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* test_shadow_calc.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: miniRT team +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/12/17 00:00:00 by miniRT #+# #+# */ -/* Updated: 2025/12/17 00:00:00 by miniRT ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "shadow.h" -#include "vec3.h" -#include -#include -#include - -void test_shadow_bias_perpendicular(void) -{ - t_vec3 normal; - t_vec3 light_dir; - double bias; - - printf("Testing shadow bias - perpendicular (90°)...\n"); - normal.x = 0.0; - normal.y = 1.0; - normal.z = 0.0; - light_dir.x = 0.0; - light_dir.y = 1.0; - light_dir.z = 0.0; - bias = calculate_shadow_bias(normal, light_dir, 0.001); - assert(bias >= 0.001 && bias <= 0.0015); - printf("✓ Perpendicular angle test passed (bias: %f)\n", bias); -} - -void test_shadow_bias_parallel(void) -{ - t_vec3 normal; - t_vec3 light_dir; - double bias; - - printf("Testing shadow bias - parallel (0°)...\n"); - normal.x = 0.0; - normal.y = 1.0; - normal.z = 0.0; - light_dir.x = 1.0; - light_dir.y = 0.0; - light_dir.z = 0.0; - bias = calculate_shadow_bias(normal, light_dir, 0.001); - assert(bias >= 0.002); - printf("✓ Parallel angle test passed (bias: %f)\n", bias); -} - -void test_shadow_bias_45_degree(void) -{ - t_vec3 normal; - t_vec3 light_dir; - double bias; - double sqrt2; - - printf("Testing shadow bias - 45° angle...\n"); - sqrt2 = sqrt(2.0); - normal.x = 0.0; - normal.y = 1.0; - normal.z = 0.0; - light_dir.x = sqrt2 / 2.0; - light_dir.y = sqrt2 / 2.0; - light_dir.z = 0.0; - bias = calculate_shadow_bias(normal, light_dir, 0.001); - assert(bias > 0.001 && bias < 0.003); - printf("✓ 45° angle test passed (bias: %f)\n", bias); -} - -int main(void) -{ - printf("\n=== Shadow Calculation Unit Tests ===\n\n"); - test_shadow_bias_perpendicular(); - test_shadow_bias_parallel(); - test_shadow_bias_45_degree(); - printf("\n=== Shadow bias tests passed! ===\n\n"); - return (0); -} diff --git a/tests/test_shadow_config b/tests/test_shadow_config deleted file mode 100755 index 6c322b0c5644efc7214f7b1dd5f7d3c6c9e5e707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16576 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 GisC=Rk6fkz