From c9bca5d4df1940ba044bdf357b34a7b8a10e18ce Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Wed, 30 Sep 2026 20:06:18 +0300 Subject: [PATCH] sync SVN r18237 --- docs/README.md | 2 +- docs/depanare_testare_vfp.md | 4 ++++ docs/reguli_lucru.md | 2 +- docs/testare-ui-vfp.md | 25 ++++++++++++++++++++++++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8034dcd..5557e30 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,7 +34,7 @@ atingi zona X, citeste fisierul Y"). Restul se deschid doar la declansator. | `conventie_goexecutor_alter_table.md` | `ALTER TABLE` pe cursorul de la `oExecute()` | | **Testare** | | | `depanare_testare_vfp.md` | rulare headless, depanare bug runtime, capcane VFP -> skill `roa-vfp-headless-test` | -| `testare-ui-vfp.md` | test cu formular real + screenshots (harness UI) -> skill `roa-vfp-headless-test` | +| `testare-ui-vfp.md` | test cu formular real + screenshots (harness UI), mouse real (tragere/hover) -> skill `roa-vfp-headless-test` | | **Oracle** | | | `conventie_mediu_oracle.md` | te conectezi la dev/test, alegi schema, rulezi un script de pachet | | `conexiuni-tunel-ssh-odbc.md` | ajungi la un Oracle de PRODUCTIE prin tunel SSH (Bitvise) + alias TNS + DSN ODBC -> skill `roa-oracle-production-access` | diff --git a/docs/depanare_testare_vfp.md b/docs/depanare_testare_vfp.md index 018fef5..b8e0c74 100644 --- a/docs/depanare_testare_vfp.md +++ b/docs/depanare_testare_vfp.md @@ -136,6 +136,10 @@ Cand un bug apare "de azi", compara cu clasa veche fara sa atingi SVN: - **`FOR EACH` pe `loDom.selectNodes(...)`** da la rulare "Expression evaluator failed". Foloseste `loN = loDom.selectNodes(...)` + `FOR i = 0 TO loN.length - 1` / `loN.item(i)`. - **`COUNT ... TO x IN alias` nu e sintaxa VFP9** (eroare "Command contains unrecognized phrase/keyword", vizibila doar in `.ERR`): `COUNT` nu are `IN`; fa `SELECT (cAlias)` inainte, apoi `COUNT FOR ... TO x`. +- **Control fara fereastra (`Control`/`Container`/`Shape`) nu captureaza mouse-ul.** `MouseMove` vine doar cat cursorul e deasupra lui: pe o banda ingusta (splitter 5px) tragerea se opreste dupa 3-4px. Tragerea se face in `MouseDown`, cu bucla `GetAsyncKeyState` + `GetCursorPos`/`ScreenToClient(Thisform.HWnd)` pana la eliberarea butonului (model: `sfsplitter.MouseDown` din `clase\sfsplitter.vcx`). `MDOWN()` intoarce `.F.` in `MouseDown`, nu-l folosi ca test de buton apasat. +- **Copiii unui control prind evenimentele de mouse** (ex. gripper-ul din mijlocul splitterului): `MouseDown`/`MouseLeave` nu ajung la parinte decat daca copilul le deleaga explicit (`this.parent.MouseDown(...)`), pe TOATE nivelurile (container, sub-container, shape-uri). +- **Bug "in exe nu merge" - verifica intai ca exe-ul contine codul**: `grep -a -c '' roacont.exe` (> 0 = codul e compilat). Apoi reproduce in IDE; daca pica si acolo, nu e o diferenta IDE/exe. + ## 7. Capcane la SCRIEREA scriptului de test - **`SET SAFETY OFF` in primele linii, INAINTE de orice `STRTOFILE`/`CREATE CURSOR`/`COMPILE`** diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md index 2c97512..73d4db2 100644 --- a/docs/reguli_lucru.md +++ b/docs/reguli_lucru.md @@ -129,7 +129,7 @@ preferintele salvate per utilizator) -> `capcana_grid_preferinte_utilizator.md`; - `GO` pe un `Recno()` capturat/primit ca parametru -> skill roa-vfp-go-recno (el detine procedura; criteriile lui blocheaza "gata"); - `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`; - - testare UI -> skill roa-vfp-headless-test (acopera si testul headless; criteriile lui blocheaza "gata"); + - testare UI -> skill roa-vfp-headless-test (acopera si testul headless; criteriile lui blocheaza "gata"); tragere/hover/controale fara fereastra -> `testare-ui-vfp.md` sectiunea "Mouse real"; - te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet -> `conventie_mediu_oracle.md`; - garzi pe valori NULL din Oracle -> skill roa-vfp-null-guards (el detine procedura; criteriile lui blocheaza "gata"); diff --git a/docs/testare-ui-vfp.md b/docs/testare-ui-vfp.md index fdec6c4..acb73d5 100644 --- a/docs/testare-ui-vfp.md +++ b/docs/testare-ui-vfp.md @@ -216,7 +216,7 @@ s. **Dialoguri native care nu apar in log si nu sunt prinse de `ON ERROR`/mock-u dupa numele clasei — VFP foloseste clase `vfp9...` si pentru shell-ul principal si pentru dialogurile proprii), captureaza PNG + textul fiecarui control copil (`WM_GETTEXT`) la orice fereastra noua, si omoara procesul la iesire (`finally`, niciodata ramas viu). **Interzis strict: - input real** (`keybd_event`/`SetForegroundWindow`/`SendInput`/`mouse_event`) — masina e + input real** (`keybd_event`/`SetForegroundWindow`/`SendInput`/`mouse_event`; exceptia controlata: sectiunea "Mouse real" de mai jos) — masina e partajata, un input injectat la nivel de sistem ajunge in orice fereastra are focus in acel moment, nu neaparat in dialogul tintit (patit: un ESCAPE injectat a intrerupt sesiunea IDE a utilizatorului, aflat in lucru in paralel). `-AutoDismiss` foloseste STRICT mesaje Windows @@ -226,3 +226,26 @@ s. **Dialoguri native care nu apar in log si nu sunt prinse de `ON ERROR`/mock-u raman oricum de incredere, indiferent de rezultatul dismiss-ului. Watchdog-ul sterge singur `.fxp`-ul vechi la lansare - capcana completa (de ce e obligatoriu) in `depanare_testare_vfp.md` sectiunea 7. + +## Mouse real: tragere, hover, controale fara fereastra + +- **Apelul direct de metode nu dovedeste UI-ul.** `obj.MouseMove(1, ...)` / `obj.MouseDown(...)` din test trec si cand + in aplicatie nu merge nimic: nu verifica cine primeste evenimentul (un copil il poate inghiti) si nici pierderea + `MouseMove` cand cursorul iese din controlul fara fereastra. Pentru tragere/hover: mouse real. +- **Mouse real = exceptie de la interdictia de input real de mai sus**, admisa DOAR cu toate conditiile: + acordul lui Marius pentru rulare (sau masina de test separata, `masini-dezvoltare-testare.md`); driver EXTERN + procesului VFP (PowerShell: `SetCursorPos` + `mouse_event`) - `mouse_event` din acelasi proces VFP (program sau + Timer) agata testul cu butonul apasat; butonul stang eliberat in `finally`; coordonate calculate din formular + (`OBJTOCLIENT` + `ClientToScreen` pe `Thisform.HWnd`), formular maximizat. Sincronizare test <-> driver prin + fisiere-semnal. Model: `efactura_import\drv_splitter_mouse.ps1` + `test_splitter_mouse.prg` + (`-Poz -Desch -Dx `). +- **Dovada = valori, nu proprietati.** Logheaza pozitia (`Top`, dimensiunea obiectelor vecine) inainte/dupa tragere; + pentru culori citeste pixelul de pe ecran (`GetPixel` pe DC-ul ferestrei) - `BackColor` nu spune ce se deseneaza + (hover ramas activ, `BackStyle`). +- **Fluxul real de deschidere, de mai multe ori.** Deschide formularul exact ca programul apelant (ex. + `CREATEOBJECT(...)` + `Show(1)` modal, maximizat), nu `WindowType = 0` + `Show()`: ordinea Resize/Show difera si + rezultatul la fel. Repeta deschidere -> actiune -> inchidere de 2-3 ori in aceeasi sesiune; testeaza si punctele + diferite de apucare (margine vs. mijloc). +- **Ini temporar.** Pozitii/optiuni salvate (`setini` pe `gcGeneralIniFile`) se redirecteaza pe un ini temporar + inainte de instantiere; altfel testul scrie in `D:\ROA\settings.ini` al utilizatorului + (`test_import_efactura_smoke.prg` inca o face).