288 lines
8.1 KiB
Bash
Executable File
288 lines
8.1 KiB
Bash
Executable File
#!/bin/bash
|
||
# FTC Project Generator - Test Runner
|
||
# Copyright (c) 2026 Nexus Workshops LLC
|
||
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Test results
|
||
TESTS_RUN=0
|
||
TESTS_PASSED=0
|
||
TESTS_FAILED=0
|
||
FAILED_TESTS=()
|
||
|
||
# Helper functions
|
||
pass() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
((TESTS_PASSED++))
|
||
((TESTS_RUN++))
|
||
}
|
||
|
||
fail() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
FAILED_TESTS+=("$1")
|
||
((TESTS_FAILED++))
|
||
((TESTS_RUN++))
|
||
}
|
||
|
||
info() {
|
||
echo -e "${YELLOW}ℹ${NC} $1"
|
||
}
|
||
|
||
section() {
|
||
echo ""
|
||
echo -e "${BLUE}▶${NC} $1"
|
||
echo "────────────────────────────────────────────────────────────────"
|
||
}
|
||
|
||
# Test suite selection
|
||
RUN_UNIT=true
|
||
RUN_SYSTEM=true
|
||
|
||
if [ "$1" = "unit" ]; then
|
||
RUN_SYSTEM=false
|
||
elif [ "$1" = "system" ]; then
|
||
RUN_UNIT=false
|
||
fi
|
||
|
||
echo "════════════════════════════════════════════════════════════════"
|
||
echo " FTC Project Generator - Test Suite"
|
||
echo "════════════════════════════════════════════════════════════════"
|
||
echo ""
|
||
|
||
# Unit Tests
|
||
if [ "$RUN_UNIT" = true ]; then
|
||
echo "Running Unit Tests..."
|
||
echo "────────────────────────────────────────────────────────────────"
|
||
|
||
# Source the library for testing
|
||
source "$PROJECT_ROOT/linux/lib.sh"
|
||
|
||
# Test: Template processing
|
||
TEST_DIR=$(mktemp -d)
|
||
echo "Hello {{PROJECT_NAME}}" > "$TEST_DIR/test.template"
|
||
export PROJECT_NAME="TestProject"
|
||
export FTC_SDK_DIR="/tmp/sdk"
|
||
export FTC_VERSION="v1.0.0"
|
||
export GENERATOR_VERSION="1.0.0-test"
|
||
|
||
process_template "$TEST_DIR/test.template" "$TEST_DIR/output.txt"
|
||
if grep -q "Hello TestProject" "$TEST_DIR/output.txt"; then
|
||
pass "Template processing replaces PROJECT_NAME"
|
||
else
|
||
fail "Template processing failed"
|
||
fi
|
||
|
||
# Test: Version extraction
|
||
VERS=$(get_generator_version)
|
||
if [ -n "$VERS" ]; then
|
||
pass "Version extraction works (got: $VERS)"
|
||
else
|
||
fail "Version extraction failed"
|
||
fi
|
||
|
||
# Test: Template files exist
|
||
TEMPLATE_DIR="$PROJECT_ROOT/linux/templates"
|
||
REQUIRED_TEMPLATES=(
|
||
"Pose2d.java"
|
||
"Drive.java"
|
||
"DriveTest.java"
|
||
"MecanumDrive.java"
|
||
"TeleOp.java"
|
||
"build.gradle.kts"
|
||
"settings.gradle.kts.template"
|
||
"gitignore.template"
|
||
"README.md.template"
|
||
"build.sh"
|
||
)
|
||
|
||
for template in "${REQUIRED_TEMPLATES[@]}"; do
|
||
if [ -f "$TEMPLATE_DIR/$template" ]; then
|
||
pass "Template exists: $template"
|
||
else
|
||
fail "Template missing: $template"
|
||
fi
|
||
done
|
||
|
||
rm -rf "$TEST_DIR"
|
||
echo ""
|
||
fi
|
||
|
||
# System Tests
|
||
if [ "$RUN_SYSTEM" = true ]; then
|
||
echo "Running System Tests..."
|
||
echo "────────────────────────────────────────────────────────────────"
|
||
|
||
# Create temporary directory for test projects
|
||
TEST_WORKSPACE=$(mktemp -d)
|
||
cd "$TEST_WORKSPACE"
|
||
|
||
export FTC_SDK_DIR="$TEST_WORKSPACE/test-sdk"
|
||
|
||
# Test: Create minimal mock SDK
|
||
info "Creating mock FTC SDK..."
|
||
mkdir -p "$FTC_SDK_DIR/TeamCode/src/main/java"
|
||
cd "$FTC_SDK_DIR"
|
||
git init > /dev/null 2>&1
|
||
git config user.email "test@test.com"
|
||
git config user.name "Test"
|
||
|
||
# Create minimal build.gradle.kts for SDK
|
||
cat > build.gradle.kts << 'EOF'
|
||
plugins {
|
||
java
|
||
}
|
||
EOF
|
||
|
||
git add . > /dev/null 2>&1
|
||
git commit -m "Initial commit" > /dev/null 2>&1
|
||
git tag -a v10.1.1 -m "Test version" > /dev/null 2>&1
|
||
|
||
cd "$TEST_WORKSPACE"
|
||
|
||
# Test: Project creation
|
||
info "Creating test project..."
|
||
"$PROJECT_ROOT/ftc-new-project" test-robot > /dev/null 2>&1
|
||
|
||
if [ -d "test-robot" ]; then
|
||
pass "Project directory created"
|
||
else
|
||
fail "Project directory not created"
|
||
fi
|
||
|
||
# Test: Project structure
|
||
REQUIRED_DIRS=(
|
||
"test-robot/src/main/java/robot/subsystems"
|
||
"test-robot/src/main/java/robot/hardware"
|
||
"test-robot/src/main/java/robot/opmodes"
|
||
"test-robot/src/test/java/robot/subsystems"
|
||
"test-robot/gradle/wrapper"
|
||
)
|
||
|
||
for dir in "${REQUIRED_DIRS[@]}"; do
|
||
if [ -d "$dir" ]; then
|
||
pass "Directory exists: $(basename $dir)"
|
||
else
|
||
fail "Directory missing: $(basename $dir)"
|
||
fi
|
||
done
|
||
|
||
# Test: Required files
|
||
REQUIRED_FILES=(
|
||
"test-robot/build.gradle.kts"
|
||
"test-robot/settings.gradle.kts"
|
||
"test-robot/.gitignore"
|
||
"test-robot/README.md"
|
||
"test-robot/build.sh"
|
||
"test-robot/deploy-to-robot.sh"
|
||
"test-robot/.ftc-generator-version"
|
||
"test-robot/src/main/java/robot/Pose2d.java"
|
||
"test-robot/src/main/java/robot/subsystems/Drive.java"
|
||
"test-robot/src/test/java/robot/subsystems/DriveTest.java"
|
||
)
|
||
|
||
for file in "${REQUIRED_FILES[@]}"; do
|
||
if [ -f "$file" ]; then
|
||
pass "File exists: $(basename $file)"
|
||
else
|
||
fail "File missing: $(basename $file)"
|
||
fi
|
||
done
|
||
|
||
# Test: Git repository initialized
|
||
if [ -d "test-robot/.git" ]; then
|
||
pass "Git repository initialized"
|
||
else
|
||
fail "Git repository not initialized"
|
||
fi
|
||
|
||
# Test: Version marker
|
||
if [ -f "test-robot/.ftc-generator-version" ]; then
|
||
VERSION=$(cat "test-robot/.ftc-generator-version")
|
||
pass "Version marker exists (v$VERSION)"
|
||
else
|
||
fail "Version marker missing"
|
||
fi
|
||
|
||
# Test: Project builds
|
||
cd test-robot
|
||
if ./gradlew build > /tmp/gradle-build.log 2>&1; then
|
||
pass "Project builds successfully"
|
||
else
|
||
fail "Project build failed (see /tmp/gradle-build.log)"
|
||
fi
|
||
|
||
# Test: Tests pass
|
||
if ./gradlew test > /tmp/gradle-test.log 2>&1; then
|
||
pass "Project tests pass"
|
||
else
|
||
fail "Project tests failed (see /tmp/gradle-test.log)"
|
||
fi
|
||
|
||
cd "$TEST_WORKSPACE"
|
||
|
||
# Test: Upgrade functionality
|
||
info "Testing project upgrade..."
|
||
|
||
# Modify a file that should be upgraded
|
||
echo "# Modified" >> test-robot/.gitignore
|
||
|
||
"$PROJECT_ROOT/ftc-new-project" test-robot --upgrade > /dev/null 2>&1
|
||
|
||
if [ -f "test-robot/.ftc-generator-version" ]; then
|
||
pass "Project upgraded successfully"
|
||
else
|
||
fail "Project upgrade failed"
|
||
fi
|
||
|
||
# Test: Duplicate project detection
|
||
if "$PROJECT_ROOT/ftc-new-project" test-robot 2>&1 | grep -q "already exists"; then
|
||
pass "Duplicate project detection works"
|
||
else
|
||
fail "Duplicate project detection failed"
|
||
fi
|
||
|
||
# Cleanup
|
||
cd /
|
||
rm -rf "$TEST_WORKSPACE"
|
||
|
||
echo ""
|
||
fi
|
||
|
||
# Summary
|
||
echo "════════════════════════════════════════════════════════════════"
|
||
echo " Test Summary"
|
||
echo "════════════════════════════════════════════════════════════════"
|
||
echo ""
|
||
echo "Total: $TESTS_RUN"
|
||
echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
|
||
echo -e "${RED}Failed: $TESTS_FAILED${NC}"
|
||
|
||
if [ $TESTS_FAILED -gt 0 ]; then
|
||
echo ""
|
||
echo "Failed tests:"
|
||
for test in "${FAILED_TESTS[@]}"; do
|
||
echo -e " ${RED}✗${NC} $test"
|
||
done
|
||
fi
|
||
|
||
echo ""
|
||
|
||
if [ $TESTS_FAILED -eq 0 ]; then
|
||
echo -e "${GREEN}✓ All tests passed!${NC}"
|
||
echo ""
|
||
exit 0
|
||
else
|
||
echo -e "${RED}✗ Some tests failed${NC}"
|
||
echo ""
|
||
exit 1
|
||
fi |