# 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/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/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/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/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/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/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 |