(require "circuit-simulator.ss") (require "test-stuff.ss") (define-syntax capturing-output (syntax-rules () ((with-display-output e1 e2 ...) (let ((port (open-output-string))) (parameterize ((current-output-port port)) (begin e1 e2 ...)) (get-output-string port))))) ;; An assertion that checks to see if the output matches what we ;; expected. (define-simple-assertion (assert-display-output e x) (let ((output (capturing-output x))) (equal? e output))) (define circuit-simulator-tests (make-test-suite "circuit simulator tests" (make-test-case "simple construction from the book" (let ((a (make-wire)) (b (make-wire)) (c (make-wire)) (d (make-wire)) (e (make-wire)) (s (make-wire))) (assert-equal? 'ok (or-gate a b d)) (assert-equal? 'ok (and-gate a b c)) (assert-equal? 'ok (inverter c e)) (assert-equal? 'ok (and-gate d e s))) ) (make-test-case "probing" (let ((input-1 (make-wire)) (input-2 (make-wire)) (sum (make-wire)) (carry (make-wire))) (assert-display-output "\nsum 0 New-value = 0" (probe 'sum sum)) (assert-display-output "\ncarry 0 New-value = 0" (probe 'carry carry)) (assert-equal? 'ok (half-adder input-1 input-2 sum carry)) (assert-equal? 'done (set-signal! input-1 1)) (assert-display-output "\nsum 8 New-value = 1" (propagate)))) )) (test/text-ui circuit-simulator-tests)