;============================================================================
;----------------------------------------------------------------------------
;
; fichier ***test2.ll***
; 13.01.88 Ilog/ing bounthara
; test du fenetrage virtuel, chapitre 18
;
;============================================================================
;
; Test du bitmap virtuel
; Le-Lisp v15.2 du 1er Aout 1987
; Test du chapitre 18
;
; les sous-fenetres et l'environnement graphique minimum
; fonctions testees:
; . create-window 
; . create-subwindow
; . make-window
; . #:window:left, #:window:top,....
; . current-window
; . modify-window
; . kill-window 
; . windowp
; . pop-window
; . move-window-behind
; . find-window
; . map-window
; 
; . clear-graph-env
; . draw-cursor
; . draw-cn
; . draw-string
; . draw-substring 
; . width-substring 
; . height-substring
; . x-base-space
; . y-base-space
;============================================================================
; dernier numero test : #225#
;----------------------------------------------------------------------------
(bitprologue)
;----------------------------------------------------------------------------
; ---- loader les fichiers communs
 (unless (featurep 'testcomm)
         (libload testcomm))

 (unless (featurep 'testbvcomm)
         (libload testbvcomm))

;============================================================================
;----------------------------------------------------------------------------
; ---- on teste les fonctions decrites dans le chapitre suivant
(tycls)
(tyflush)
(titre "Creation des fenetres")
(print "Tests des fontions du chapitre 18:")
(print """Le Fenetrage Virtuel""")
(print "Les tests portent sur l'utilisation de ces fonctions dans un")
(print "contexte de ""sous-fenetrage"".")
(print "Les tests utilisent les 3/4 haut-gauche de l'ecran.")
(print 
"----------------------------------------------------------------------------")
(terpri)
;============================================================================
(sous-titre "#201# Creation d'UNE fenetre avec create-window")
(verif "Fene↑tre w1 en 1/4,1/4 de 1/3x1/3, hilited, visible"
        '(setq w1 (create-window 'window quartx quarty tierx tiery "w1" 1 1)))

(print "Je teste les fonctions d'acces aux champs des fenetres")
(print "#:window:left, #:window:top,...")
(testsuite)
(#:window:left w1) #.quartx
(#:window:top w1) #.quarty
(#:window:title w1) "w1"
(#:window:width w1) #.tierx
(#:window:height w1) #.tiery
(#:window:hilited w1) 1
(#:window:visible w1) 1
(exit eof) ()

; ATTENTION: nous faisons appel souvent a ces fonctions d'acces aux champs

;------------------------
; ---- Test avec SEULEMENT UNE fenetre
(titre "#202# Une sous-fenetre")
; d'abord:
; . inlusion totale
; . inclusion partielle
; . fenetre est "inclus" dans la sou-fenetre
(sous-titre "#203# Creation d'une sous-fenetre")
(verif "Sous-fenetre sw1 avec un cadre de 3/4x2/3 en 1/6,1/4 visible"
       '(setq sw1 (create-subwindow 'window    
                          (div (#:window:width w1) 6)
                          (div (#:window:height w1) 4)
                          (mul (div (#:window:width w1) 4) 3)
                          (mul (div (#:window:height w1) 3) 2)
                          "sw1" 0 1 w1)))
(print "Je memorise les coordonnees de sw1")
(let ()
  (disp-props sw1)
  (setq sw1-top (#:window:top sw1)
        sw1-left (#:window:left sw1)
        sw1-width (#:window:width sw1)
        sw1-height (#:window:height sw1)
        sw1-title (#:window:title sw1)
        sw1-visible (#:window:visible sw1)))

; ---- pour tester si les props de sw1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour sw1")
(testsuite)
(#:window:top sw1) #.sw1-top
(#:window:left sw1) #.sw1-left
(#:window:width sw1) #.sw1-width 
(#:window:height sw1) #.sw1-height 
(#:window:title sw1) #.sw1-title 
(#:window:visible sw1) #.sw1-visible 
(exit eof) ()

;------------------------
(sous-titre "#204# Test des fonctions sur la fenetre w1")
(verif "la hauteur est reduite de moitie"
       '(modify-window w1 () () () (div (#:window:height w1) 2) () () ()))
; ---- pour tester si les props de sw1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour sw1")
(testsuite)
(#:window:top sw1) #.sw1-top
(#:window:left sw1) #.sw1-left
(#:window:width sw1) #.sw1-width 
(#:window:height sw1) #.sw1-height 
(#:window:title sw1) #.sw1-title 
(#:window:visible sw1) #.sw1-visible 
(exit eof) ()

(verif "la largeur est reduite de moitie"
       '(modify-window w1 () () (div (#:window:width w1) 2) () () () ()))
; ---- pour tester si les props de sw1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour sw1")
(testsuite)
(#:window:top sw1) #.sw1-top
(#:window:left sw1) #.sw1-left
(#:window:width sw1) #.sw1-width 
(#:window:height sw1) #.sw1-height 
(#:window:title sw1) #.sw1-title 
(#:window:visible sw1) #.sw1-visible 
(exit eof) ()

(verif "w1 reprend ses dimensions initiales (haut x 2 et larg x 2)"
       '(modify-window w1 () () 
                       (mul (#:window:width w1) 2) 
                       (mul (#:window:height w1) 2) () () ()))
; ---- pour tester si les props de sw1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour sw1")
(testsuite)
(#:window:top sw1) #.sw1-top
(#:window:left sw1) #.sw1-left
(#:window:width sw1) #.sw1-width 
(#:window:height sw1) #.sw1-height 
(#:window:title sw1) #.sw1-title 
(#:window:visible sw1) #.sw1-visible 
(exit eof) ()

; ---- les deplacements de la fenetre principale 
(verif "w1 se deplace vers la droite de 1/3"
       '(modify-window w1 (add (#:window:left w1) tierx) ()
                       () () () () ()))
; ---- pour tester si les props de sw1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour sw1")
(testsuite)
(#:window:top sw1) #.sw1-top
(#:window:left sw1) #.sw1-left
(#:window:width sw1) #.sw1-width 
(#:window:height sw1) #.sw1-height 
(#:window:title sw1) #.sw1-title 
(#:window:visible sw1) #.sw1-visible 
(exit eof) ()

(verif "w1 revient a sa position initiale"
       '(modify-window w1 quartx quarty
                       () () () () ()))
; ---- pour tester si les props de sw1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour sw1")
(testsuite)
(#:window:top sw1) #.sw1-top
(#:window:left sw1) #.sw1-left
(#:window:width sw1) #.sw1-width 
(#:window:height sw1) #.sw1-height 
(#:window:title sw1) #.sw1-title 
(#:window:visible sw1) #.sw1-visible 
(exit eof) ()

;------------------------
(sous-titre "#205# L'environnement graphique minimum dans la sous-fenetre")
;  ---- les dimensions d'un caractere
(test-env-graph-min sw1)

(verif "Je remplis w1 de 0 et sw1 avec 1"
       '(progn 
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
(verif "clear sw1"
       '(progn (current-window sw1)
               (clear-graph-env)))


;------------------------
(sous-titre "#206# Fonctions sur la sous-fenetre sw1")
; ---- memoriser les proprietes de w1 pour tester les eventuelles 
; ---- modifications
(print "Je memorise les coordonnees de w1")
(let ()
  (disp-props w1)
  (setq w1-top (#:window:top w1)
        w1-left (#:window:left w1)
        w1-width (#:window:width w1)
        w1-height (#:window:height w1)
        w1-title (#:window:title w1)
        w1-visible (#:window:visible w1)))

; --- deplacement de la sous-fenetre
(verif "Le coin sup gauche de sw1 en 1/3,1/2 de w1"
       '(progn 
          (modify-window sw1 
                       (div (#:window:width w1) 3)
                       (div (#:window:height w1) 2)
                       () () () () ())
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
; ----
(verif "Le coin sup gauche de sw1 en -10 -10"
       '(progn 
          (modify-window sw1 
                       -10 -10
                       () () () () ())
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
; ----
(verif "sw1 double de hauteur"
       '(progn
          (modify-window sw1 
                       () () () (mul (#:window:height sw1) 2) () () ())
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
; ----
(verif "sw1 double de largeur"
       '(progn
          (modify-window sw1 
                       () () (mul (#:window:width sw1) 2) () () () ())
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
; ----
(verif "sw1 devient invisible"
       '(progn
          (modify-window sw1 
                       () () () () () () 0)
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
; ----
(verif "sw1 redevient visible; reprend la position initiale (a sa creation)"
       '(progn
          (modify-window sw1 
                       sw1-left sw1-top sw1-width sw1-height () () 1)
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))
; ----
(verif "sw1 est tuee"
       '(kill-window sw1))
(testsuite)
(windowp sw1) ()
(exit eof) ()

; ----
(verif "sw1 reapparait; coin sup gauche est en 1/3,1/2 dans w1 (make-window)"
       '(let ()
          (#:window:left sw1 (div (#:window:width w1) 3))
          (#:window:top sw1 (div (#:window:height w1) 2))
          (make-window sw1)))
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)))

; ---- pour tester si les props de w1 ont subit des modifs par rapport
; ---- aux valeurs initiales
(print "Je teste les eventuelles modifications de proprietes pour w1")
(testsuite)
(#:window:top w1) #.w1-top
(#:window:left w1) #.w1-left
(#:window:width w1) #.w1-width 
(#:window:height w1) #.w1-height 
(#:window:title w1) #.w1-title 
(#:window:visible w1) #.w1-visible 
(exit eof) ()

;------------------------
(sous-titre "#207# Test sur le clip")
(test-clip-subwindow sw1)


;------------------------
(sous-titre "#208# Les fonctions find-window et map-window")
; ---- find-window
(print "Coin sup gauche de sw1 (absolu sur l'ecran) (sw1-gx sw1-gy) = "
       (list (setq sw1-gx (add (#:window:left w1) (#:window:left sw1)))
               (setq sw1-gy (add (#:window:top w1) (#:window:top sw1)))))
; ---- dans la fenetre principale
(affich "Je teste l'appartenance du point sw1+(-10,-10) (devrait etre w1)"
        '(and (setq w (find-window (sub sw1-gx 10) (sub sw1-gy 10)))
              (win-title w)))
(print "Je teste map-window pour le point precedent")
(testsuite)
(progn (map-window w (sub sw1-gx 10) (sub sw1-gy 10) 'lx 'ly)
       (list lx ly)) #.(list (sub (#:window:left sw1)  10)
                             (sub (#:window:top sw1) 10))
(exit eof) ()

; ---- dans la sous-fenetre
(affich "Je teste l'appartenance du point sw1+(10,10) (devrait etre sw1)"
        '(and (setq w (find-window (add sw1-gx 10) (add sw1-gy 10)))
              (win-title w)))
(print "Je teste map-window pour le point precedent")
(testsuite)
(progn (map-window w (add sw1-gx 10) (add sw1-gy 10) 'lx 'ly)
       (list lx ly)) (10 10)
(exit eof) ()

; ---- dans la sous-fenetre
(verif "sw1 devient invisible"
       '(modify-window sw1 () () () () () () 0))
(affich "Je teste l'appartenance du point sw1+(10,10) (devrait etre w1)"
        '(and (setq w (find-window (add sw1-gx 10) (add sw1-gy 10)))
              (win-title w)))
(print "Je teste map-window pour le point precedent")
(testsuite)
(progn (map-window w (add sw1-gx 10) (add sw1-gy 10) 'lx 'ly)
       (list lx ly)) #.(list (add (#:window:left sw1)  10)
                             (add (#:window:top sw1) 10))
(exit eof) ()

;----------------------------------------------------------------------------
; --- maintenant, DEUX sous-fenetres de meme parent
(titre "#209# Maintenant, avec DEUX sous-fenetres SOEURS")
(sous-titre "#210# Creation d'une seconde sous-fenetre sw2 avec make-window")
(verif "sw2 en 0,0 de 1/2x1/2, visible "
       '(let ()
          (setq sw2 (#:window:make))
          (#:window:left sw2 0)
          (#:window:top sw2 0)
          (#:window:width sw2 (div (#:window:width w1) 2))
          (#:window:height sw2 (div (#:window:height w1) 2))
          (#:window:hilited sw2 0)
          (#:window:visible sw2 1)
          (#:window:father sw2 w1)
          (#:window:title sw2 "sw2")
          (make-window sw2)))

;------------------------
(sous-titre "#211# Les fonctions d'ecriture dans la sous-fenetre sw2")
(small-test-env-graph-min sw2)

(verif "Je remplis w1 de 1, sw1 de @ et sw2 de % (sw1 est invisible)"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw2 #/2)))

;------------------------
; ---- les sous-fenetres sw1 et sw2 sont disjointes
(sous-titre "#212# Les 2 sous-fenetres sont disjointes")
(verif "sw1 redevient visible; coin sup gauche au milieu de w1"
       '(modify-window sw1 
                       (div (#:window:width w1) 2) 
                       (div (#:window:height w1) 2) () () () () 1))
(verif "Je remplis w1 de 0, sw1 de 1 et sw2 de 2"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw2 #/2)))
(verif "clear sw1"
       '(and (current-window sw1)
            (clear-graph-env)))
(verif "clear sw2"
       '(and (current-window sw2)
            (clear-graph-env)))
(verif "clear w1"
       '(and (current-window w1)
            (clear-graph-env)))

;------------------------
; ---- intersection
(sous-titre "#213# Les 2 sous-fenetres se chevauchent partiellement")
(verif "sw2 en 1/4,1/4"
       '(modify-window sw2 (div (#:window:width w1) 4)
                       (div (#:window:height w1) 4)
                       () () () () ()))
(verif "sw1 en 1/3,1/3"
       '(modify-window sw1 (div (#:window:width w1) 3)
                       (div (#:window:height w1) 3)
                       () () () () ()))
(verif "Je remplis w1 de 0, sw1 de 1 et sw2 de 2"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw2 #/2)))
(verif "clear sw2"
       '(and (current-window sw2)
            (clear-graph-env)))
(verif "clear sw1"
       '(and (current-window sw1)
            (clear-graph-env)))
(verif "clear w1"
       '(and (current-window w1)
            (clear-graph-env)))

;------------------------
; ---- superposition
(sous-titre "#214# Les 2 sous-fenetres sont superposees")
(verif "sw2 en 1/3,1/3"
       '(modify-window sw2 (div (#:window:width w1) 3)
                       (div (#:window:height w1) 3)
                       () () () () ()))
(verif "sw1 en 1/4,1/4"
       '(modify-window sw1 (div (#:window:width w1) 4)
                       (div (#:window:height w1) 4)
                       () () () () ()))
(verif "Je remplis w1 de 0, sw1 de 1 et sw2 de 2"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw2 #/2)))
(verif "clear sw2"
       '(and (current-window sw2)
            (clear-graph-env)))
(verif "clear sw1"
       '(and (current-window sw1)
            (clear-graph-env)))
(verif "clear w1"
       '(and (current-window w1)
            (clear-graph-env)))
(verif "Je remplis w1 de 0,  sw1 de 1 et sw2 de 2"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw2 #/2)))
(verif "clear sw1"
       '(and (current-window sw1)
            (clear-graph-env)))
(verif "clear sw2"
       '(and (current-window sw2)
            (clear-graph-env)))
(verif "clear w1"
       '(and (current-window w1)
            (clear-graph-env)))

;------------------------
(sous-titre "#215# Les fonctions pop-window et move-behind-window")
(verif "Je remplis w1 de 0,  sw1 de 1 et sw2 de 2"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw2 #/2)))
(print "Les coordonnees globales du centre de w1 = "
        (list (setq w1-midx 
                     (add (div (#:window:width w1) 2) (#:window:left w1)))
               (setq w1-midy
                     (add (div (#:window:height w1) 2) (#:window:top w1)))))
(affich "centre(w1) appartient a la fenetre "
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je pop sw1"
       '(pop-window sw1))
(affich "centre(w1) doit appartenir a sw1"
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je move sw1 derriere sw2"
       '(move-behind-window sw1 sw2))
(affich "centre(w1) doit appartenir a sw2"
        '(win-title (find-window w1-midx w1-midy)))
(verif "sw2 devient invisible"
       '(modify-window sw2 () () () () () () 0))
(affich "centre(w1) doit appartenir a sw1"
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je pop la fenetre w1"
       '(pop-window w1))
(affich "centre(w1) doit toujours appartenir a sw1"
        '(win-title (find-window w1-midx w1-midy)))
(verif "sw2 redevient visible"
       '(modify-window sw2 () () () () () () 1))

;----------------------------------------------------------------------------
; --- maintenant, UNE sous-fenetre de sous-fenetre
(titre "#216# Maintenant, une SOUS-SOUS-fenetre")
(sous-titre "#217# Creation d'une sous-fenetre de sw1")
(verif "Sous-fenetre sw3 de sw1 de 3/4x2/3 (de sw1)  en 1/8,1/8 visible"
       '(setq sw3 (create-subwindow 'window    
                          (div (#:window:width sw1) 8)
                          (div (#:window:height sw1) 8)
                          (mul (div (#:window:width sw1) 4) 3)
                          (mul (div (#:window:height sw1) 3) 2)
                          "sw3" 0 1 sw1)))

(verif "Je remplis w1 de 0, sw1 de 1, sw2 de 2 et sw3 de 3"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw3 #/3)
               (fill-window-with-char sw2 #/2)))

;------------------------
(sous-titre "#218# Les fonctions appliquees a sw3")
(verif "clear sw1"
       '(progn (current-window sw1)
               (clear-graph-env)))
(test-subwindow sw3)

(test-move-subwindow sw3)

;------------------------
(sous-titre "#219# Les fonctions de l'env.graphique minimal dans sw3")
(small-test-env-graph-min sw3)

;------------------------
(sous-titre "#220# Test du clip sur sw3")
(test-clip-subwindow sw3)

;------------------------
(sous-titre "#221# Les fonctions pop-window et move-behind-window")
(verif "Je remplis w1 de 0, sw1 de 1, sw2 de 2 et sw3 de 3"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw3 #/3)
               (fill-window-with-char sw2 #/2)))
(print "Les coordonnees globales du centre de w1 = "
       (list (setq w1-midx 
                     (add (div (#:window:width w1) 2) (#:window:left w1)))
               (setq w1-midy
                     (add (div (#:window:height w1) 2) (#:window:top w1)))))
(affich "centre(w1) appartient a la fenetre"
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je pop sw1"
       '(pop-window sw1))
(affich "centre(w1) doit appartenir a la fenetre sw3"
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je move sw1 derriere sw2"
       '(move-behind-window sw1 sw2))
(affich "centre(w1) doit appartenir a la fenetre sw2"
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je move sw3 devant sw2"
       '(move-behind-window sw2 sw3))
(affich "centre(w1) doit appartenir a la fenetre ??? (pas w1)"
        '(win-title (find-window w1-midx w1-midy)))
(verif "sw1 devient invisible"
       '(modify-window sw1 () () () () () () 0))
(affich "centre(w1) doit appartenir a la fenetre sw2"
        '(win-title (find-window w1-midx w1-midy)))
(verif "Je pop la fenetre w1"
       '(pop-window w1))
(affich "centre(w1) doit appartenir a la fenetre sw2"
        '(win-title (find-window w1-midx w1-midy)))

;----------------------------------------------------------------------------
; --- maintenant, UNE sous-fenetre de sous-fenetre de sous-fenetre
(titre "#222# Maintenant, une SOUS-SOUS-SOUS-fenetre")
(verif "Sous-fenetre sw4 de sw3 de 2x2 (de sw3)  en 1/3,1/3 visible"
       '(setq sw4 (create-subwindow 'window    
                          (div (#:window:width sw3) 3)
                          (div (#:window:height sw3) 3)
                          (mul (#:window:width sw3)  2)
                          (mul (#:window:height sw3)  2)
                          "sw4" 0 1 sw3)))

(verif "sw1 redevient visible"
       '(modify-window sw1 () () () () () () 1))
(verif "Je remplis w1 de 0, sw1 de 1, sw3 de 3 et sw4 de 4"
       '(progn (fill-window-with-char w1 #/0)
               (fill-window-with-char sw1 #/1)
               (fill-window-with-char sw3 #/3)
               (fill-window-with-char sw4 #/4)))

;------------------------
(sous-titre "#223# Test du clip sur sw4")
(test-clip-subwindow sw4)

;------------------------
(sous-titre "#224# 2eme test du clip sur sw4")
(verif 
"hauteur(sw1) diminue; le 1/3 sup de sw3 est visible (sw4 doit etre invisible)"
       '(progn 
          (modify-window sw1 () () () 
                         (add (div (#:window:height sw3) 3) 
                              (#:window:top sw3)) () () ())
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)
          (fill-window-with-char sw3 #/3)
          (fill-window-with-char sw4 #/4)))
(verif 
"hauteur(sw1) double"
       '(progn 
          (modify-window sw1 () () () 
                         (mul (#:window:height sw1) 2) () () ())
          (fill-window-with-char w1 #/0)
          (fill-window-with-char sw1 #/1)
          (fill-window-with-char sw3 #/3)
          (fill-window-with-char sw4 #/4)))

;----------------------------------------------------------------------------
; ---- destruction des fenetres
(titre "#225# Destruction des fenetres") 
(verif "La fenetre w1 est tuee"
       '(kill-window w1))

;----------------------------------------------------------------------------
; ---- fin du test(ouffff...)
(titre "Fin du test du chapitre 18 / sous-fenetres") 

;----------------------------------------------------------------------------
 (terpri)
 (terpri)
 (terpri)
 (bitepilogue)
 (setq automatic ())
;----------------------------------------------------------------------------
;============================================================================