/collects/test-engine/test-tool.scm

http://github.com/97jaz/racket · Racket · 219 lines · 185 code · 33 blank · 1 comment · 23 complexity · 4d7c0beeab09506d76a859b06b2b5275 MD5 · raw file

  1. #lang scheme/base
  2. (require scheme/file scheme/class scheme/unit scheme/contract drscheme/tool framework mred
  3. string-constants)
  4. (require "test-display.scm")
  5. (provide tool@)
  6. (preferences:set-default 'test-engine:test-dock-size
  7. '(2/3 1/3)
  8. (Îť (x) (and (list? x) (= (length x) 2) (andmap number? x) (= 1 (apply + x)))))
  9. (preferences:set-default 'test-engine:test-window:docked? #f boolean?)
  10. (preferences:set-default 'test-engine:enable? #t boolean?)
  11. (define tool@
  12. (unit (import drscheme:tool^) (export drscheme:tool-exports^)
  13. (define (phase1) (void))
  14. (define (phase2) (void))
  15. ;; Overriding interactions as the current-rep implementation
  16. (define (test-interactions-text%-mixin %)
  17. (class* % ()
  18. (inherit get-top-level-window get-definitions-text)
  19. (define/public (display-test-results test-display)
  20. (let* ([dr-frame (get-top-level-window)]
  21. [ed-def (get-definitions-text)]
  22. [tab (and ed-def (send ed-def get-tab))])
  23. (when (and dr-frame ed-def tab)
  24. (send test-display display-settings dr-frame tab ed-def)
  25. (send test-display display-results))))
  26. (super-instantiate ())))
  27. (define (test-definitions-text%-mixin %)
  28. (class* % ()
  29. (inherit begin-edit-sequence end-edit-sequence)
  30. (define colorer-frozen-by-test? #f)
  31. (define/public (test-froze-colorer?) colorer-frozen-by-test?)
  32. (define/public (toggle-test-status)
  33. (set! colorer-frozen-by-test?
  34. (not colorer-frozen-by-test?)))
  35. (define/public (begin-test-color)
  36. (begin-edit-sequence #f))
  37. (define/public (end-test-color)
  38. (end-edit-sequence))
  39. (define/augment (on-delete start len)
  40. (begin-edit-sequence)
  41. (inner (void) on-delete start len))
  42. (define/augment (after-delete start len)
  43. (inner (void) after-delete start len)
  44. (when colorer-frozen-by-test?
  45. (send this thaw-colorer)
  46. (send this toggle-test-status))
  47. (end-edit-sequence))
  48. (define/augment (on-insert start len)
  49. (begin-edit-sequence)
  50. (inner (void) on-insert start len))
  51. (define/augment (after-insert start len)
  52. (inner (void) after-insert start len)
  53. (when colorer-frozen-by-test?
  54. (send this thaw-colorer)
  55. (send this toggle-test-status))
  56. (end-edit-sequence))
  57. (super-instantiate ())))
  58. (define (test-frame-mixin %)
  59. (class* % ()
  60. (inherit get-current-tab)
  61. (define/public (display-test-panel editor)
  62. (send test-panel update-editor editor)
  63. (unless (send test-panel is-shown?)
  64. (send test-frame add-child test-panel)
  65. (send test-frame set-percentages
  66. (preferences:get 'test-engine:test-dock-size))))
  67. (define test-panel null)
  68. (define test-frame null)
  69. (define test-windows null)
  70. (define/public (register-test-window t)
  71. (set! test-windows (cons t test-windows)))
  72. (define/public (deregister-test-window t)
  73. (set! test-windows (remq t test-windows)))
  74. (define/public (dock-tests)
  75. (for ([t test-windows]) (send t show #f))
  76. (let ([ed (send (get-current-tab) get-test-editor)])
  77. (when ed (display-test-panel ed))))
  78. (define/public (undock-tests)
  79. (when (send test-panel is-shown?) (send test-panel remove))
  80. (for ([t test-windows]) (send t show #t)))
  81. (define/override (make-root-area-container cls parent)
  82. (let* ([outer-p (super make-root-area-container
  83. panel:vertical-dragable% parent)]
  84. [louter-panel (make-object vertical-panel% outer-p)]
  85. [test-p (make-object test-panel% outer-p '(deleted))]
  86. [root (make-object cls louter-panel)])
  87. (set! test-panel test-p)
  88. (send test-panel update-frame this)
  89. (set! test-frame outer-p)
  90. root))
  91. (define/augment (on-tab-change from-tab to-tab)
  92. (let ([test-editor (send to-tab get-test-editor)]
  93. [panel-shown? (send test-panel is-shown?)]
  94. [dock? (preferences:get 'test-engine:test-window:docked?)])
  95. (cond [(and test-editor panel-shown? dock?)
  96. (send test-panel update-editor test-editor)]
  97. [(and test-editor dock?)
  98. (display-test-panel test-editor)]
  99. [(and panel-shown? (not dock?))
  100. (undock-tests)]
  101. [panel-shown? (send test-panel remove)])
  102. (inner (void) on-tab-change from-tab to-tab)))
  103. (inherit get-menu-bar get-menu% register-capability-menu-item get-definitions-text
  104. get-insert-menu)
  105. (define dock-label (string-constant test-engine-dock-report))
  106. (define undock-label (string-constant test-engine-undock-report))
  107. (define/private (test-menu-init)
  108. (let ([language-menu (send this get-language-menu)]
  109. [enable-label (string-constant test-engine-enable-tests)]
  110. [disable-label (string-constant test-engine-disable-tests)])
  111. (make-object separator-menu-item% language-menu)
  112. (register-capability-menu-item 'tests:test-menu language-menu)
  113. (letrec ([enable-menu-item%
  114. (class menu:can-restore-menu-item%
  115. (define enabled? #t)
  116. (define/public (is-test-enabled?) enabled?)
  117. (define/public (set-test-enabled?! e) (set! enabled? e))
  118. (define/public (enable-tests)
  119. (unless enabled?
  120. (set! enabled? #t)
  121. (send this set-label disable-label)
  122. (preferences:set 'test-engine:enable? #t)))
  123. (define/public (disable-tests)
  124. (when enabled?
  125. (set! enabled? #f)
  126. (send this set-label enable-label)
  127. (preferences:set 'test-engine:enable? #f)))
  128. (super-instantiate ()))]
  129. [enable? (preferences:get 'test-engine:enable?)]
  130. [enable-menu-item (make-object enable-menu-item%
  131. (if enable? disable-label enable-label)
  132. language-menu
  133. (lambda (_1 _2)
  134. (if (send _1 is-test-enabled?)
  135. (send _1 disable-tests)
  136. (send _1 enable-tests))) #f)])
  137. (send enable-menu-item set-test-enabled?! enable?)
  138. (register-capability-menu-item 'tests:test-menu language-menu))))
  139. (unless (drscheme:language:capability-registered? 'tests:dock-menu)
  140. (drscheme:language:register-capability 'tests:dock-menu (flat-contract boolean?) #f))
  141. (unless (drscheme:language:capability-registered? 'tests:test-menu)
  142. (drscheme:language:register-capability 'tests:test-menu (flat-contract boolean?) #f))
  143. (super-instantiate ())
  144. (test-menu-init)
  145. ))
  146. (define (test-tab%-mixin %)
  147. (class* % ()
  148. (inherit get-frame get-defs)
  149. (define test-editor #f)
  150. (define/public (get-test-editor) test-editor)
  151. (define/public (current-test-editor ed)
  152. (set! test-editor ed))
  153. (define test-window #f)
  154. (define/public (get-test-window) test-window)
  155. (define/public (current-test-window w) (set! test-window w))
  156. (define/public (update-test-preference test?)
  157. (let* ([language-settings
  158. (preferences:get
  159. (drscheme:language-configuration:get-settings-preferences-symbol))]
  160. [language
  161. (drscheme:language-configuration:language-settings-language
  162. language-settings)]
  163. [settings
  164. (drscheme:language-configuration:language-settings-settings
  165. language-settings)])
  166. (when (object-method-arity-includes? language 'update-test-setting 2)
  167. (let ([next-setting
  168. (drscheme:language-configuration:make-language-settings
  169. language
  170. (send language update-test-setting settings test?))])
  171. (preferences:set
  172. (drscheme:language-configuration:get-settings-preferences-symbol)
  173. next-setting)
  174. (send (get-defs) set-next-settings next-setting)))))
  175. (define/augment (on-close)
  176. (when test-window
  177. (when (send test-window is-shown?)
  178. (send test-window show #f))
  179. (send (get-frame) deregister-test-window test-window))
  180. (inner (void) on-close))
  181. (super-instantiate ())))
  182. (drscheme:get/extend:extend-definitions-text test-definitions-text%-mixin)
  183. (drscheme:get/extend:extend-interactions-text test-interactions-text%-mixin)
  184. (drscheme:get/extend:extend-unit-frame test-frame-mixin)
  185. (drscheme:get/extend:extend-tab test-tab%-mixin)
  186. ))