# Propuesta e2e_checks para apps/tables_qa
# Generado por fn-recopilador modo design-e2e
# app_id: tables_qa
# Issue: 0121a wave 3
# Fecha: 2026-05-19
#
# Diagnostico:
#   lang=cpp, framework=imgui (fn::run_app), domain=tools
#   toolchain: mingw-w64 (cross-compile Windows desde WSL) — mismo toolchain que el resto del ecosistema
#   modulos propios: main.cpp + qa_state + qa_panel + test_suite + perf_tests + 10 tabs (tab_*.cpp)
#   dependencia clave: fn_module_data_table (target CMake opcional — linked si existe)
#     Enlaza via: target_link_libraries(tables_qa PRIVATE fn_module_data_table)
#     Si fn_module_data_table no existe, el build procede sin el modulo (tabs muestran stubs).
#   sin frontend/ — no hay pnpm/vite
#   sin tests/ ni pytest — suite propia en test_suite.cpp (run_test_suite(), 10 checks in-process)
#   sin migrations/ — no usa BD propia
#   sin operations.db — no usa el ciclo reactivo de operations (ops_audit: OMITIDO)
#   sin tag 'service' — no expone HTTP (smoke/health: OMITIDO)
#   appicon.ico: PRESENTE en apps/tables_qa/appicon.ico
#
#   FLAG --self-test:
#     Parseado en main.cpp (L77-84) pero MARCADO como WIP fase 2 TBD.
#     Retorno actual: siempre exit 0 con mensaje "SKIPPED (fase 2 TBD)".
#     El self-test headless real no esta implementado — requiere init parcial del
#     framework (logger) + imgui_test_engine (fase 2 del issue 0108).
#     Dado que exit 0 es garantizado por el stub, el check se incluye como WARNING:
#     verifica que el binario acepta el flag sin crash y confirma el estado WIP.
#     Se podra ascender a critical cuando la fase 2 este implementada.
#
#   test_suite.cpp (in-process):
#     run_test_suite() ejecuta 10 smoke tests sobre la API publica de data_table.
#     Tests: TableInput construction, ColumnSpec enums, BadgeRule/ChipRule fields,
#     State default-constructible, TableEvent enums, ColorScale config, Duration
#     thresholds, Button setup, Multi-table input, ColorStop ordering.
#     NO requiere display ni contexto GL — opera solo sobre estructuras C++ en memoria.
#     Sin embargo, se invoca desde el QA panel en runtime (boton "Run Tests"),
#     NO desde argv. Por tanto NO hay un --run-tests CLI flag que pueda usarse
#     como check headless directo. El check tests_binary_link (ver abajo) verifica
#     que el modulo data_table linka sin error como proxy del test suite.
#
#   BUILD path: cmake --build cpp/build --target tables_qa -j
#   BINARY path: cpp/build/apps/tables_qa/tables_qa (Linux/WSL)
#              o cpp/build/windows/apps/tables_qa/tables_qa.exe (Windows cross)
#   app.md documenta el run command como:
#     ./cpp/build/apps/tables_qa/tables_qa (Linux/WSL nativo)
#   No se detecta referencia a build de Windows en app.md — se usa build nativo WSL.
#
# Patron: C++ ImGui app testbed (QA visual, sin modo capture propio, sin HTTP)

app_id: tables_qa

e2e_checks:
  # Build del target tables_qa en el directorio de build WSL nativo.
  # Enlaza fn_module_data_table (data_table::render, TQL, renderers, etc.) si el
  # target existe. Este check valida: (a) los 10 tabs compilan sin error, (b) la
  # API publica de data_table_cpp es ABI-compatible con las cabeceras usadas en
  # los tabs, (c) ninguna TU del modulo rompe ODR.
  # Es el build gate de data_table v2.0+ para issue 0081 BeginTable migration.
  - id: build
    cmd: "cmake --build /home/lucas/fn_registry/cpp/build --target tables_qa -j"
    timeout_s: 300
    severity: critical
    # Nota: si fn_module_data_table aun no esta buildado, cmake lo buildara como
    # dependencia transitiva antes de tables_qa (order dado por target_link_libraries).

  # Verifica que el binario existe tras el build.
  # cmake --build puede retornar exit 0 en rebuilds parciales sin producir binario
  # si el target ya esta up-to-date pero el archivo fue borrado manualmente.
  - id: binary_exists
    cmd: "test -f /home/lucas/fn_registry/cpp/build/apps/tables_qa/tables_qa"
    timeout_s: 5
    severity: critical

  # Prueba el flag --self-test declarado en main.cpp.
  # Estado actual (v0.1.0): stub WIP que imprime "SKIPPED (fase 2 TBD)" y sale exit 0.
  # El check confirma: (a) el binario acepta el flag sin SIGSEGV ni abort,
  #                    (b) el logger se inicializa correctamente antes del early exit,
  #                    (c) exit 0 consistente con el contrato del stub.
  # Marcado WARNING porque el test suite real no esta corriendo — cuando fase 2
  # implemente --self-test real con imgui_test_engine, ascender a critical y
  # añadir expect_stdout_contains para verificar resultados concretos.
  - id: self_test_stub
    cmd: "/home/lucas/fn_registry/cpp/build/apps/tables_qa/tables_qa --self-test"
    timeout_s: 15
    expect_exit: 0
    expect_stdout_contains: "SKIPPED"
    severity: warning
    # Cuando fase 2 este lista, cambiar expect_stdout_contains a "pass" o similar
    # y ascender severity a critical.

  # Verifica que el .ico esta presente junto al fuente.
  # add_imgui_app genera tables_qa_appicon.rc que windres incluye en el .exe
  # (recurso .rsrc). Si appicon.ico falta, el build WSL pasa pero el .exe
  # Windows queda sin icono embebido. Fallo aqui detecta borrado accidental
  # del .ico antes de cross-compile.
  - id: icon_exists
    cmd: "test -f /home/lucas/fn_registry/apps/tables_qa/appicon.ico"
    timeout_s: 5
    severity: warning

  # Verifica que los 10 tabs estan declarados en tabs.h como funciones render_*.
  # tables_qa crece anadiendo tabs (10 en v0.1.0: basic, renderers, buttons,
  # color_rules, dots, joins, tql, drill, events, compat).
  # Un tab anadido en tab_*.cpp pero no declarado en tabs.h produce linker error
  # solo si main.cpp lo referencia; este check detecta drift entre tabs.h y
  # el conteo esperado sin necesitar build.
  # Cuenta "render_" en tabs.h como proxy del numero de tabs declarados.
  - id: tabs_declared
    cmd: >
      count=$(grep -c 'render_' /home/lucas/fn_registry/apps/tables_qa/tabs.h 2>/dev/null);
      echo "render_ declarations in tabs.h: $count";
      test "$count" -ge 10
    timeout_s: 5
    severity: warning
    # Nota: si se añaden tabs futuros, el umbral -ge 10 es minimo; no necesita
    # actualizarse salvo que se eliminen tabs (lo que requeriria revision manual).

  # Verifica que CMakeLists.txt lista los 10 tab_*.cpp en add_imgui_app.
  # Un tab_foo.cpp creado pero no añadido al CMakeLists no se compila y sus
  # funciones quedan como undefined symbols (detectado en link, no en compile).
  # Este check estático es mas rapido que el build completo y da feedback antes.
  - id: cmakelists_tab_srcs
    cmd: >
      count=$(grep -c '^    tab_' /home/lucas/fn_registry/apps/tables_qa/CMakeLists.txt 2>/dev/null);
      echo "tab_*.cpp in CMakeLists: $count";
      test "$count" -ge 10
    timeout_s: 5
    severity: warning

# Justificacion por check:
# | check               | razon                                                                              |
# |---------------------|------------------------------------------------------------------------------------|
# | build               | enlaza fn_module_data_table — gate de API data_table v2+ para issue 0081           |
# | binary_exists       | confirma que cmake produjo binario (no solo exit 0)                                |
# | self_test_stub      | verifica flag --self-test sin crash; estado WIP documentado; escala a critical     |
# | icon_exists         | .ico requerido para windres cross-compile; faltante no rompe build WSL             |
# | tabs_declared       | detecta drift entre tabs.h y numero esperado de tabs del QA testbed                |
# | cmakelists_tab_srcs | detecta tab_*.cpp creado pero no registrado en add_imgui_app(...)                  |
#
# checks OMITIDOS y razon:
# | check          | razon de omision                                                                   |
# |----------------|------------------------------------------------------------------------------------|
# | ops_audit      | no usa operations.db — no hay bucle reactivo en esta app                           |
# | smoke/health   | no es service, no expone HTTP — es testbed GUI                                     |
# | capture_mode   | no implementado — "Export golden" en app.md es boton UI, no flag CLI               |
# |                | (tab_compat.cpp L: "TBD: requires capture API integration")                        |
# | run_test_suite | run_test_suite() es in-process vía botón UI, no accessible via CLI flag             |
# | pytest         | sin tests/ dir, sin pytest                                                         |
# | perf_test      | perf_tests son in-process (run_perf_test via UI), no CLI invocable headless        |
