sync SVN r18237

This commit is contained in:
2026-09-30 20:06:18 +03:00
parent b7dd1ac0a5
commit c9bca5d4df
4 changed files with 30 additions and 3 deletions

View File

@@ -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()` | | `conventie_goexecutor_alter_table.md` | `ALTER TABLE` pe cursorul de la `oExecute()` |
| **Testare** | | | **Testare** | |
| `depanare_testare_vfp.md` | rulare headless, depanare bug runtime, capcane VFP -> skill `roa-vfp-headless-test` | | `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** | | | **Oracle** | |
| `conventie_mediu_oracle.md` | te conectezi la dev/test, alegi schema, rulezi un script de pachet | | `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` | | `conexiuni-tunel-ssh-odbc.md` | ajungi la un Oracle de PRODUCTIE prin tunel SSH (Bitvise) + alias TNS + DSN ODBC -> skill `roa-oracle-production-access` |

View File

@@ -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)`. - **`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`. - **`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 '<literal din metoda noua>' 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 ## 7. Capcane la SCRIEREA scriptului de test
- **`SET SAFETY OFF` in primele linii, INAINTE de orice `STRTOFILE`/`CREATE CURSOR`/`COMPILE`** - **`SET SAFETY OFF` in primele linii, INAINTE de orice `STRTOFILE`/`CREATE CURSOR`/`COMPILE`**

View File

@@ -129,7 +129,7 @@
preferintele salvate per utilizator) -> `capcana_grid_preferinte_utilizator.md`; 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"); - `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`; - `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 -> - te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet ->
`conventie_mediu_oracle.md`; `conventie_mediu_oracle.md`;
- garzi pe valori NULL din Oracle -> skill roa-vfp-null-guards (el detine procedura; criteriile lui blocheaza "gata"); - garzi pe valori NULL din Oracle -> skill roa-vfp-null-guards (el detine procedura; criteriile lui blocheaza "gata");

View File

@@ -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 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 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: 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 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 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 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 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` `.fxp`-ul vechi la lansare - capcana completa (de ce e obligatoriu) in `depanare_testare_vfp.md`
sectiunea 7. 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 <n> -Desch <k> -Dx <px>`).
- **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).