/collects/tests/gracket/wxme-random.rkt

http://github.com/gmarceau/PLT · Racket · 198 lines · 171 code · 26 blank · 1 comment · 16 complexity · 14548e574ac10f045d7724194c39dacc MD5 · raw file

  1. #lang scheme/gui
  2. (define seed (abs (current-milliseconds)))
  3. (random-seed seed)
  4. (define use-nested? #t)
  5. (error-print-context-length 100)
  6. ;; Don't paste before copying, because that interferes with replay
  7. (define copied? #f)
  8. (define copy-len 0)
  9. (define (go pause x-pos)
  10. (define orig-t (new text%))
  11. (define frame
  12. (new (class frame%
  13. (define/augment (on-close) (exit))
  14. (super-new))
  15. [label "Test"]
  16. [width 300]
  17. [height 400]
  18. [x x-pos]))
  19. (define canvas
  20. (new editor-canvas% [parent frame] [editor orig-t]))
  21. (define _1 (send frame show #t))
  22. (define (init t)
  23. (send t set-max-undo-history 100))
  24. (define _2 (init orig-t))
  25. (define (random-elem v)
  26. (vector-ref v (random (vector-length v))))
  27. (define (random-string)
  28. (random-elem '#("a" "x\ny\nz\n" "(define (f x)\n (+ x x))\n" "hello there" "" "\n")))
  29. (define seqs (make-hasheq))
  30. (define ts-length 64)
  31. (define ts-pos 0)
  32. (define ts (make-vector ts-length orig-t))
  33. (define (add-t! t2)
  34. (if (= ts-pos ts-length)
  35. (let ([v ts])
  36. (set! ts (make-vector ts-length orig-t))
  37. (set! ts-pos 0)
  38. (for ([t3 (in-vector v)])
  39. (when (zero? (random 2))
  40. (add-t! t3)))
  41. (add-t! t2))
  42. (begin
  43. (vector-set! ts ts-pos t2)
  44. (set! ts-pos (add1 ts-pos)))))
  45. (define (set-copied?! t)
  46. (let ([len (- (send t get-end-position)
  47. (send t get-start-position))])
  48. (if (zero? len)
  49. #f
  50. (begin
  51. (set! copy-len len)
  52. (set! copied? #t)
  53. #t))))
  54. (define (maybe-convert)
  55. (when (zero? (random 4))
  56. (let ([data (send the-clipboard get-clipboard-data "WXME" 0)])
  57. (send the-clipboard set-clipboard-client
  58. (new (class clipboard-client%
  59. (inherit add-type)
  60. (super-new)
  61. (add-type "WXME")
  62. (define/override (get-data format) data)))
  63. 0))))
  64. (define actions
  65. (vector
  66. (lambda (t) (send t undo))
  67. (lambda (t) (send t redo))
  68. (lambda (t) (send t insert (random-string) (random (add1 (send t last-position)))))
  69. (lambda (t) (send t insert "\t" (random (add1 (send t last-position)))))
  70. (lambda (t)
  71. (let ([pos (random (add1 (send t last-position)))])
  72. (send t delete pos (random (max 1 (- (send t last-position) pos))))))
  73. (lambda (t)
  74. (send t begin-edit-sequence)
  75. (hash-update! seqs t add1 0))
  76. (lambda (t)
  77. (let loop ()
  78. (when (positive? (hash-ref seqs t 0))
  79. (send t end-edit-sequence)
  80. (hash-update! seqs t sub1)
  81. (when (zero? (random 2))
  82. (loop)))))
  83. (lambda (t)
  84. (let ([pos (random (add1 (send t last-position)))])
  85. (send t set-position pos (random (max 1 (- (send t last-position) pos))))))
  86. (lambda (t) (when (set-copied?! t) (send t copy) (maybe-convert)))
  87. (lambda (t) (when (set-copied?! t) (send t cut) (maybe-convert)))
  88. (lambda (t) (when copied?
  89. (let ([s (send t get-start-position)]
  90. [e (send t get-end-position)]
  91. [l (send t last-position)])
  92. (send t paste)
  93. (when copy-len
  94. (unless (= (send t last-position)
  95. (+ (- l (- e s)) copy-len))
  96. (error 'paste "length mismatch: [~s, ~s) in ~s + ~s ~s -> ~s"
  97. s e l copy-len
  98. (send the-clipboard get-clipboard-data "TEXT" 0)
  99. (send t last-position)))))
  100. (when (zero? (random 4))
  101. (set! copy-len #f)
  102. (send t paste-next))))
  103. (lambda (t) (send t change-style (make-object style-delta% 'change-size (add1 (random 42)))))
  104. (lambda (t) (send t change-style
  105. (send (make-object style-delta%) set-delta-foreground (make-object color%
  106. (random 256)
  107. (random 256)
  108. (random 256)))))
  109. (lambda (t)
  110. (when use-nested?
  111. (let ([t2 (new text%)])
  112. (add-t! t2)
  113. (init t2)
  114. (send t insert (make-object editor-snip% t2)))))
  115. (lambda (t)
  116. (send t set-max-width (if (zero? (random 2))
  117. (+ 50.0 (/ (random 500) 10.0))
  118. 'none)))
  119. (lambda (t) (yield (system-idle-evt)))
  120. (lambda (t) (pause))
  121. ))
  122. (send canvas focus)
  123. (let loop ()
  124. (let ([act (random-elem actions)]
  125. [t (if (zero? (random 2))
  126. orig-t
  127. (random-elem ts))])
  128. (printf "~s: ~s ~s\n" seed (eq-hash-code t) act)
  129. (act t)
  130. (loop))))
  131. (define (run-one)
  132. (go void 50))
  133. (define (run-two-concurrent)
  134. (define sema-one (make-semaphore))
  135. (define sema-two (make-semaphore))
  136. (define (make sema-this sema-other x-pos)
  137. (parameterize ([current-eventspace (make-eventspace)])
  138. (queue-callback
  139. (lambda ()
  140. (semaphore-wait sema-this)
  141. (go (lambda ()
  142. (semaphore-post sema-other)
  143. (semaphore-wait sema-this))
  144. x-pos)))
  145. (current-eventspace)))
  146. (define e1 (make sema-one sema-two 50))
  147. (define e2 (make sema-two sema-one 350))
  148. (semaphore-post sema-one)
  149. (application-quit-handler (lambda args (exit)))
  150. (yield never-evt))
  151. (define (run-two)
  152. (define one-box (box #f))
  153. (define two-box (box #f))
  154. (define (make box-this box-other x-pos)
  155. (let/ec esc
  156. (call-with-continuation-prompt
  157. (lambda ()
  158. (begin
  159. (let/cc k
  160. (set-box! box-this k)
  161. (esc))
  162. (go (lambda ()
  163. (let/cc k
  164. (set-box! box-this k)
  165. ((unbox box-other))))
  166. x-pos))))))
  167. (make one-box two-box 50)
  168. (make two-box one-box 350)
  169. (call-with-continuation-prompt
  170. (lambda ()
  171. ((unbox one-box)))))
  172. (run-two)