sync SVN r18237
This commit is contained in:
@@ -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` |
|
||||||
|
|||||||
@@ -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`**
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
Reference in New Issue
Block a user