this repo has no description
1#!/bin/bash
2
3# AXe Test Runner Script
4# Automates building AXe executable, playground app, and running tests
5
6set -e # Exit on any error
7
8# Colors for output
9RED='\033[0;31m'
10GREEN='\033[0;32m'
11YELLOW='\033[1;33m'
12BLUE='\033[0;34m'
13NC='\033[0m' # No Color
14
15# Configuration
16SIMULATOR_NAME="iPhone 17"
17SIMULATOR_UDID="7C3FA420-5440-4A08-8A66-A7E83F5EADE1"
18PLAYGROUND_PROJECT="AxePlaygroundApp/AxePlayground.xcodeproj"
19PLAYGROUND_SCHEME="AxePlayground"
20BUNDLE_ID="com.cameroncooke.AxePlayground"
21
22# Print colored messages
23print_info() {
24 echo -e "${BLUE}ℹ️ $1${NC}"
25}
26
27print_success() {
28 echo -e "${GREEN}✅ $1${NC}"
29}
30
31print_warning() {
32 echo -e "${YELLOW}⚠️ $1${NC}"
33}
34
35print_error() {
36 echo -e "${RED}❌ $1${NC}"
37}
38
39print_header() {
40 echo -e "\n${BLUE}================================================${NC}"
41 echo -e "${BLUE}🎯 $1${NC}"
42 echo -e "${BLUE}================================================${NC}\n"
43}
44
45# Function to show usage
46show_usage() {
47 echo "Usage: $0 [OPTIONS] [TEST_FILTER]"
48 echo ""
49 echo "Options:"
50 echo " -h, --help Show this help message"
51 echo " -b, --build-only Only build AXe and playground app (skip tests)"
52 echo " -t, --tests-only Only run tests (skip building)"
53 echo " -c, --clean Clean build before building"
54 echo " -s, --sequential Run tests sequentially (--no-parallel)"
55 echo " -v, --verbose Verbose output"
56 echo ""
57 echo "Test Filters (optional):"
58 echo " SwipeTests Run only swipe tests"
59 echo " TapTests Run only tap tests"
60 echo " KeyTests Run only key tests"
61 echo " TouchTests Run only touch tests"
62 echo " TypeTests Run only type tests"
63 echo " ButtonTests Run only button tests"
64 echo " GestureTests Run only gesture tests"
65 echo " ListSimulatorsTests Run only list simulators tests"
66 echo ""
67 echo "Examples:"
68 echo " $0 # Build everything and run all tests"
69 echo " $0 SwipeTests # Build everything and run only swipe tests"
70 echo " $0 -t SwipeTests # Skip building, run only swipe tests"
71 echo " $0 -b # Only build, skip tests"
72 echo " $0 -c # Clean build and run all tests"
73}
74
75# Parse command line arguments
76BUILD_ONLY=false
77TESTS_ONLY=false
78CLEAN_BUILD=false
79SEQUENTIAL=true
80VERBOSE=false
81TEST_FILTER=""
82
83while [[ $# -gt 0 ]]; do
84 case $1 in
85 -h|--help)
86 show_usage
87 exit 0
88 ;;
89 -b|--build-only)
90 BUILD_ONLY=true
91 shift
92 ;;
93 -t|--tests-only)
94 TESTS_ONLY=true
95 shift
96 ;;
97 -c|--clean)
98 CLEAN_BUILD=true
99 shift
100 ;;
101 -s|--sequential)
102 SEQUENTIAL=true
103 shift
104 ;;
105 -v|--verbose)
106 VERBOSE=true
107 shift
108 ;;
109 SwipeTests|TapTests|KeyTests|TouchTests|TypeTests|ButtonTests|GestureTests|ListSimulatorsTests)
110 TEST_FILTER="$1"
111 shift
112 ;;
113 *)
114 print_error "Unknown option: $1"
115 show_usage
116 exit 1
117 ;;
118 esac
119done
120
121# Function to check prerequisites
122check_prerequisites() {
123 print_header "Checking Prerequisites"
124
125 # Check if we're in the right directory
126 if [[ ! -f "Package.swift" ]]; then
127 print_error "Package.swift not found. Please run this script from the AXe project root."
128 exit 1
129 fi
130
131 # Check if Xcode is available
132 if ! command -v xcodebuild &> /dev/null; then
133 print_error "xcodebuild not found. Please install Xcode."
134 exit 1
135 fi
136
137 # Check if Swift is available
138 if ! command -v swift &> /dev/null; then
139 print_error "swift not found. Please install Swift."
140 exit 1
141 fi
142
143 print_success "All prerequisites satisfied"
144}
145
146# Function to boot simulator
147boot_simulator() {
148 print_header "Setting Up Simulator"
149
150 print_info "Checking simulator status..."
151 SIMULATOR_STATUS=$(xcrun simctl list devices | grep "$SIMULATOR_UDID" | grep -o "Booted\|Shutdown" || echo "NotFound")
152
153 if [[ "$SIMULATOR_STATUS" == "NotFound" ]]; then
154 print_error "Simulator with UDID $SIMULATOR_UDID not found"
155 print_info "Available simulators:"
156 xcrun simctl list devices | grep "iPhone"
157 exit 1
158 fi
159
160 if [[ "$SIMULATOR_STATUS" != "Booted" ]]; then
161 print_info "Booting simulator $SIMULATOR_NAME..."
162 xcrun simctl boot "$SIMULATOR_UDID"
163 sleep 3
164 print_success "Simulator booted"
165 else
166 print_success "Simulator already booted"
167 fi
168}
169
170# Function to clean build
171clean_build() {
172 if [[ "$CLEAN_BUILD" == true ]]; then
173 print_header "Cleaning Build"
174
175 print_info "Cleaning Swift build..."
176 swift package clean
177
178 print_info "Cleaning Xcode build..."
179 xcodebuild clean -project "$PLAYGROUND_PROJECT" -scheme "$PLAYGROUND_SCHEME" -destination "id=$SIMULATOR_UDID"
180
181 print_success "Build cleaned"
182 fi
183}
184
185# Function to build AXe executable
186build_axe() {
187 print_header "Building AXe Executable"
188
189 print_info "Building AXe CLI tool..."
190 if [[ "$VERBOSE" == true ]]; then
191 swift build
192 else
193 swift build > /dev/null 2>&1
194 fi
195
196 # Verify the executable exists
197 if [[ -f ".build/arm64-apple-macosx/debug/axe" ]]; then
198 print_success "AXe executable built successfully"
199 print_info "Location: .build/arm64-apple-macosx/debug/axe"
200 else
201 print_error "Failed to build AXe executable"
202 exit 1
203 fi
204}
205
206# Function to build and install playground app
207build_playground_app() {
208 print_header "Building and Installing Playground App"
209
210 # Terminate existing app instance
211 print_info "Terminating existing app instance..."
212 xcrun simctl terminate "$SIMULATOR_UDID" "$BUNDLE_ID" 2>/dev/null || true
213
214 # Build the app (not build-for-testing since this is a regular app)
215 print_info "Building AxePlayground app..."
216 if [[ "$VERBOSE" == true ]]; then
217 xcodebuild build \
218 -project "$PLAYGROUND_PROJECT" \
219 -scheme "$PLAYGROUND_SCHEME" \
220 -destination "id=$SIMULATOR_UDID"
221 else
222 xcodebuild build \
223 -project "$PLAYGROUND_PROJECT" \
224 -scheme "$PLAYGROUND_SCHEME" \
225 -destination "id=$SIMULATOR_UDID" \
226 -quiet > /dev/null 2>&1
227 fi
228
229 # Find the built app path using TARGET_BUILD_DIR + FULL_PRODUCT_NAME (more semantically correct)
230 print_info "Getting app bundle path..."
231 BUILD_SETTINGS=$(xcodebuild -project "$PLAYGROUND_PROJECT" -scheme "$PLAYGROUND_SCHEME" -destination "id=$SIMULATOR_UDID" -showBuildSettings)
232 TARGET_BUILD_DIR=$(echo "$BUILD_SETTINGS" | grep "TARGET_BUILD_DIR" | head -1 | sed 's/.*= //')
233 FULL_PRODUCT_NAME=$(echo "$BUILD_SETTINGS" | grep "FULL_PRODUCT_NAME" | head -1 | sed 's/.*= //')
234 APP_PATH="$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME"
235
236 if [[ -z "$APP_PATH" || ! -d "$APP_PATH" ]]; then
237 print_error "Built app not found at: $APP_PATH"
238 print_info "TARGET_BUILD_DIR: $TARGET_BUILD_DIR"
239 print_info "FULL_PRODUCT_NAME: $FULL_PRODUCT_NAME"
240 exit 1
241 fi
242
243 # Install the app
244 print_info "Installing AxePlayground app on simulator..."
245 if [[ "$VERBOSE" == true ]]; then
246 xcrun simctl install "$SIMULATOR_UDID" "$APP_PATH"
247 else
248 xcrun simctl install "$SIMULATOR_UDID" "$APP_PATH" > /dev/null 2>&1
249 fi
250
251 print_success "Playground app built and installed successfully"
252 print_info "App path: $APP_PATH"
253}
254
255# Function to run tests
256run_tests() {
257 print_header "Running Tests"
258
259 # Set up environment
260 export SIMULATOR_UDID="$SIMULATOR_UDID"
261
262 # Build test command
263 TEST_CMD="swift test"
264
265 if [[ -n "$TEST_FILTER" ]]; then
266 TEST_CMD="$TEST_CMD --filter $TEST_FILTER"
267 print_info "Running test filter: $TEST_FILTER"
268 else
269 print_info "Running all tests"
270 fi
271
272 if [[ "$SEQUENTIAL" == true ]]; then
273 TEST_CMD="$TEST_CMD --no-parallel"
274 print_info "Running tests sequentially"
275 fi
276
277 if [[ "$VERBOSE" == true ]]; then
278 TEST_CMD="$TEST_CMD --verbose"
279 fi
280
281 print_info "Test command: $TEST_CMD"
282 print_info "Environment: SIMULATOR_UDID=$SIMULATOR_UDID"
283
284 # Run the tests
285 echo ""
286 if eval "$TEST_CMD"; then
287 print_success "All tests passed! 🎉"
288 else
289 print_error "Some tests failed! 😞"
290 exit 1
291 fi
292}
293
294# Function to show summary
295show_summary() {
296 print_header "Summary"
297
298 if [[ "$BUILD_ONLY" == true ]]; then
299 print_success "Build completed successfully"
300 print_info "AXe executable: .build/arm64-apple-macosx/debug/axe"
301 print_info "Playground app installed on: $SIMULATOR_NAME ($SIMULATOR_UDID)"
302 elif [[ "$TESTS_ONLY" == true ]]; then
303 if [[ -n "$TEST_FILTER" ]]; then
304 print_success "Test suite '$TEST_FILTER' completed successfully"
305 else
306 print_success "All test suites completed successfully"
307 fi
308 else
309 print_success "Build and test cycle completed successfully"
310 print_info "AXe executable: .build/arm64-apple-macosx/debug/axe"
311 print_info "Playground app: Installed and tested on $SIMULATOR_NAME"
312 if [[ -n "$TEST_FILTER" ]]; then
313 print_info "Test suite: $TEST_FILTER"
314 else
315 print_info "Test coverage: All test suites"
316 fi
317 fi
318}
319
320# Main execution
321main() {
322 print_header "AXe Test Runner"
323 print_info "Starting automated build and test cycle..."
324
325 # Always check prerequisites
326 check_prerequisites
327
328 # Always boot simulator (needed for both building and testing)
329 boot_simulator
330
331 if [[ "$TESTS_ONLY" != true ]]; then
332 clean_build
333 build_axe
334 build_playground_app
335 fi
336
337 if [[ "$BUILD_ONLY" != true ]]; then
338 run_tests
339 fi
340
341 show_summary
342}
343
344# Run main function
345main "$@"