---
name: run_kotlin_app_tests
kind: pipeline
lang: bash
domain: pipelines
version: "1.0.0"
purity: impure
signature: "run_kotlin_app_tests(project_dir: string, avd_name?: string, --skip-emulator?, --no-stop?) -> int"
description: "Pipeline e2e completo de testing app Kotlin: unit JVM + screenshot Roborazzi + build APK + instrumented Compose en emulador."
tags: [android, kotlin, compose, test, e2e, launcher]
uses_functions:
  - gradle_unit_test_bash_infra
  - gradle_screenshot_test_bash_infra
  - gradle_assemble_debug_bash_infra
  - gradle_instrumented_test_bash_infra
  - android_emulator_list_bash_infra
  - android_emulator_start_bash_infra
  - android_emulator_stop_bash_infra
  - adb_wsl_bash_infra
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "bash/functions/pipelines/run_kotlin_app_tests.sh"
params:
  - name: project_dir
    desc: "Raiz del proyecto Android. Debe contener gradlew. Puede ser relativo al cwd o absoluto."
  - name: avd_name
    desc: "AVD para instrumented tests. Default: Medium_Phone_API_35. Debe existir en la lista de AVDs del sistema. Ignorado si se pasa --skip-emulator."
  - name: --skip-emulator
    desc: "Saltar instrumented tests. El pipeline solo ejecuta unit tests, screenshot tests y build APK, luego sale con exit 0."
  - name: --no-stop
    desc: "No parar el emulador al finalizar los instrumented tests. Util en desarrollo iterativo para no esperar el arranque en la siguiente ejecucion."
output: "Stdout con tabla resumen de cada step (nombre, OK/FAIL/SKIP, tiempo). Exit 0 = todos los tests pasan. Exit codes: 1=unit tests fallaron, 2=screenshot tests fallaron, 3=build APK fallado, 4=emulador no encontrado o no arranca, 5=instrumented tests fallaron."
---

## Ejemplo

```bash
# Suite completa con AVD por defecto
bash bash/functions/pipelines/run_kotlin_app_tests.sh apps/my_kotlin_app

# Suite completa con AVD especifico
bash bash/functions/pipelines/run_kotlin_app_tests.sh apps/my_kotlin_app Pixel_7_API_34

# Solo tests JVM (unit + screenshot + build), sin emulador
bash bash/functions/pipelines/run_kotlin_app_tests.sh apps/my_kotlin_app --skip-emulator

# Suite completa, dejar emulador corriendo al final
bash bash/functions/pipelines/run_kotlin_app_tests.sh apps/my_kotlin_app Medium_Phone_API_35 --no-stop

# Desde el launcher (fn run)
fn run run_kotlin_app_tests apps/my_kotlin_app
```

## Notas

- Fail-fast: si un paso falla, el pipeline imprime el resumen parcial y sale con el exit code del paso fallido. No continua al siguiente.
- El orden de los flags tras `project_dir` es libre: `avd_name` es el primer argumento no-flag; `--skip-emulator` y `--no-stop` pueden aparecer en cualquier posicion.
- El arranque del emulador usa `android_emulator_start` que es idempotente: si ya hay un emulador corriendo con ese AVD, no lanza otro.
- `adb_wsl` se sourcea para resolver `$ADB` apuntando a `adb.exe` en Windows desde WSL2.
- El paso `emulator_stop` se registra como SKIP en la tabla resumen cuando se pasa `--no-stop`.
- Requiere WSL2 + Android SDK instalado en Windows. `ANDROID_HOME` o `~/android-sdk/env.sh` deben estar disponibles.
