test/test-state.rkt
#lang racket

(require
  rackunit
  "../drscheme/dracula-state.rkt"
  "data-state.rkt")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Helpers
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; split-all : String -> [Listof String]
;; Produces every character in a string.
(define (split-all str)
  (regexp-split "" str))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Macros
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define-syntax (test/equal? stx)
  (syntax-case stx ()
    [(_ actual expected)
     (syntax/loc stx
       (test-equal? (format "(equal? ~s ~s)" 'actual 'expected)
                    actual expected))]))

(define-syntax (test/true stx)
  (syntax-case stx ()
    [(_ e)
     (syntax/loc stx
       (test-true (format "~s" 'e) e))]))

(define-syntax (test/false stx)
  (syntax-case stx ()
    [(_ e)
     (syntax/loc stx
       (test-false (format "(not ~s)" 'e) e))]))

(define-syntax (test/error stx)
  (syntax-case stx ()
    [(_ e)
     (syntax/loc stx
       (test-exn (format "Error?: ~s" 'e) exn:fail? (lambda () e)))]))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Test Suite
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define state-test-suite
 (test-suite "Proof State"

   #|
   (test-suite "Empty State"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size empty-proof-state) 0))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part empty-proof-state) #f)))

   (test-suite "Merge Proof"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size merged-state) 2))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part merged-state) 0))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size merged-state 0) 3)
       (test/equal? (proof-state-part-size merged-state 1) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position merged-state 1) 0)
       (test/equal? (proof-state-position merged-state 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output merged-state 1 0) "")
       (test/equal? (proof-state-output merged-state 1 1) "")
       (test/equal? (proof-state-output merged-state 1 2) "")
       (test/equal? (proof-state-output merged-state 0 0) "")
       (test/equal? (proof-state-output merged-state 0 1) "")
       (test/equal? (proof-state-output merged-state 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary merged-state 1 0) "")
       (test/equal? (proof-state-summary merged-state 1 1) "")
       (test/equal? (proof-state-summary merged-state 1 2) "")
       (test/equal? (proof-state-summary merged-state 0 0) "")
       (test/equal? (proof-state-summary merged-state 0 2) "")
       (test/equal? (proof-state-summary merged-state 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/false (proof-state-finished? merged-state 1 0))
       (test/false (proof-state-finished? merged-state 1 1))
       (test/false (proof-state-finished? merged-state 1 2))
       (test/false (proof-state-finished? merged-state 0 0))
       (test/false (proof-state-finished? merged-state 0 1))
       (test/false (proof-state-finished? merged-state 0 2)))
     (test-suite "proof-state-successful?"
       (test/error (proof-state-successful? merged-state 1 0))
       (test/error (proof-state-successful? merged-state 1 1))
       (test/error (proof-state-successful? merged-state 1 2))
       (test/error (proof-state-successful? merged-state 0 0))
       (test/error (proof-state-successful? merged-state 0 1))
       (test/error (proof-state-successful? merged-state 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input merged-state 1 0))
       (test/equal? (proof-state-input merged-state 1 1) "(+ 1 2)")
       (test/equal? (proof-state-input merged-state 1 2) "(* 3 4)")
       (test/error (proof-state-input merged-state 0 0))
       (test/equal? (proof-state-input merged-state 0 1) "(list (quote a) (quote b))")
       (test/equal? (proof-state-input merged-state 0 2) "(quote (c d))")))

   (test-suite "Select Second Part"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size select-state) 2))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part select-state) 1))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size select-state 0) 3)
       (test/equal? (proof-state-part-size select-state 1) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position select-state 1) 0)
       (test/equal? (proof-state-position select-state 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output select-state 1 0) "")
       (test/equal? (proof-state-output select-state 1 1) "")
       (test/equal? (proof-state-output select-state 1 2) "")
       (test/equal? (proof-state-output select-state 0 0) "")
       (test/equal? (proof-state-output select-state 0 1) "")
       (test/equal? (proof-state-output select-state 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary select-state 1 0) "")
       (test/equal? (proof-state-summary select-state 1 1) "")
       (test/equal? (proof-state-summary select-state 1 2) "")
       (test/equal? (proof-state-summary select-state 0 0) "")
       (test/equal? (proof-state-summary select-state 0 2) "")
       (test/equal? (proof-state-summary select-state 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/false (proof-state-finished? select-state 1 0))
       (test/false (proof-state-finished? select-state 1 1))
       (test/false (proof-state-finished? select-state 1 2))
       (test/false (proof-state-finished? select-state 0 0))
       (test/false (proof-state-finished? select-state 0 1))
       (test/false (proof-state-finished? select-state 0 2)))
     (test-suite "proof-state-successful?"
       (test/error (proof-state-successful? select-state 1 0))
       (test/error (proof-state-successful? select-state 1 1))
       (test/error (proof-state-successful? select-state 1 2))
       (test/error (proof-state-successful? select-state 0 0))
       (test/error (proof-state-successful? select-state 0 1))
       (test/error (proof-state-successful? select-state 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input select-state 1 0))
       (test/equal? (proof-state-input select-state 1 1) "(+ 1 2)")
       (test/equal? (proof-state-input select-state 1 2) "(* 3 4)")
       (test/error (proof-state-input select-state 0 0))
       (test/equal? (proof-state-input select-state 0 1) "(list (quote a) (quote b))")
       (test/equal? (proof-state-input select-state 0 2) "(quote (c d))")))

   (test-suite "Initial Prompt"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size initial-prompt) 2))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part initial-prompt) 1))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size initial-prompt 0) 3)
       (test/equal? (proof-state-part-size initial-prompt 1) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position initial-prompt 1) 0)
       (test/equal? (proof-state-position initial-prompt 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output initial-prompt 1 0) initial-text)
       (test/equal? (proof-state-output initial-prompt 1 1) "")
       (test/equal? (proof-state-output initial-prompt 1 2) "")
       (test/equal? (proof-state-output initial-prompt 0 0) "")
       (test/equal? (proof-state-output initial-prompt 0 1) "")
       (test/equal? (proof-state-output initial-prompt 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary initial-prompt 1 0) "")
       (test/equal? (proof-state-summary initial-prompt 1 1) "")
       (test/equal? (proof-state-summary initial-prompt 1 2) "")
       (test/equal? (proof-state-summary initial-prompt 0 0) "")
       (test/equal? (proof-state-summary initial-prompt 0 2) "")
       (test/equal? (proof-state-summary initial-prompt 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/true (proof-state-finished? initial-prompt 1 0))
       (test/false (proof-state-finished? initial-prompt 1 1))
       (test/false (proof-state-finished? initial-prompt 1 2))
       (test/false (proof-state-finished? initial-prompt 0 0))
       (test/false (proof-state-finished? initial-prompt 0 1))
       (test/false (proof-state-finished? initial-prompt 0 2)))
     (test-suite "proof-state-successful?"
       (test/true (proof-state-successful? initial-prompt 1 0))
       (test/error (proof-state-successful? initial-prompt 1 1))
       (test/error (proof-state-successful? initial-prompt 1 2))
       (test/error (proof-state-successful? initial-prompt 0 0))
       (test/error (proof-state-successful? initial-prompt 0 1))
       (test/error (proof-state-successful? initial-prompt 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input initial-prompt 1 0))
       (test/equal? (proof-state-input initial-prompt 1 1) "(+ 1 2)")
       (test/equal? (proof-state-input initial-prompt 1 2) "(* 3 4)")
       (test/error (proof-state-input initial-prompt 0 0))
       (test/equal? (proof-state-input initial-prompt 0 1)
                    "(list (quote a) (quote b))")
       (test/equal? (proof-state-input initial-prompt 0 2) "(quote (c d))")))

   (test-suite "Started A Term"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size start-a-term) 2))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part start-a-term) 1))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size start-a-term 0) 3)
       (test/equal? (proof-state-part-size start-a-term 1) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position start-a-term 1) 1)
       (test/equal? (proof-state-position start-a-term 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output start-a-term 1 0) initial-text)
       (test/equal? (proof-state-output start-a-term 1 1) "")
       (test/equal? (proof-state-output start-a-term 1 2) "")
       (test/equal? (proof-state-output start-a-term 0 0) "")
       (test/equal? (proof-state-output start-a-term 0 1) "")
       (test/equal? (proof-state-output start-a-term 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary start-a-term 1 0) "")
       (test/equal? (proof-state-summary start-a-term 1 1) "")
       (test/equal? (proof-state-summary start-a-term 1 2) "")
       (test/equal? (proof-state-summary start-a-term 0 0) "")
       (test/equal? (proof-state-summary start-a-term 0 2) "")
       (test/equal? (proof-state-summary start-a-term 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/true (proof-state-finished? start-a-term 1 0))
       (test/false (proof-state-finished? start-a-term 1 1))
       (test/false (proof-state-finished? start-a-term 1 2))
       (test/false (proof-state-finished? start-a-term 0 0))
       (test/false (proof-state-finished? start-a-term 0 1))
       (test/false (proof-state-finished? start-a-term 0 2)))
     (test-suite "proof-state-successful?"
       (test/true (proof-state-successful? start-a-term 1 0))
       (test/error (proof-state-successful? start-a-term 1 1))
       (test/error (proof-state-successful? start-a-term 1 2))
       (test/error (proof-state-successful? start-a-term 0 0))
       (test/error (proof-state-successful? start-a-term 0 1))
       (test/error (proof-state-successful? start-a-term 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input start-a-term 1 0))
       (test/equal? (proof-state-input start-a-term 1 1) "(+ 1 2)")
       (test/equal? (proof-state-input start-a-term 1 2) "(* 3 4)")
       (test/error (proof-state-input start-a-term 0 0))
       (test/equal? (proof-state-input start-a-term 0 1)
                    "(list (quote a) (quote b))")
       (test/equal? (proof-state-input start-a-term 0 2) "(quote (c d))")))

   (test-suite "One Admitted Term"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size admit-a-term) 2))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part admit-a-term) 1))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size admit-a-term 0) 3)
       (test/equal? (proof-state-part-size admit-a-term 1) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position admit-a-term 1) 1)
       (test/equal? (proof-state-position admit-a-term 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output admit-a-term 1 0) initial-text)
       (test/equal? (proof-state-output admit-a-term 1 1) three-text)
       (test/equal? (proof-state-output admit-a-term 1 2) "")
       (test/equal? (proof-state-output admit-a-term 0 0) "")
       (test/equal? (proof-state-output admit-a-term 0 1) "")
       (test/equal? (proof-state-output admit-a-term 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary admit-a-term 1 0) "")
       (test/equal? (proof-state-summary admit-a-term 1 1) "")
       (test/equal? (proof-state-summary admit-a-term 1 2) "")
       (test/equal? (proof-state-summary admit-a-term 0 0) "")
       (test/equal? (proof-state-summary admit-a-term 0 2) "")
       (test/equal? (proof-state-summary admit-a-term 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/true (proof-state-finished? admit-a-term 1 0))
       (test/true (proof-state-finished? admit-a-term 1 1))
       (test/false (proof-state-finished? admit-a-term 1 2))
       (test/false (proof-state-finished? admit-a-term 0 0))
       (test/false (proof-state-finished? admit-a-term 0 1))
       (test/false (proof-state-finished? admit-a-term 0 2)))
     (test-suite "proof-state-successful?"
       (test/true (proof-state-successful? admit-a-term 1 0))
       (test/true (proof-state-successful? admit-a-term 1 1))
       (test/error (proof-state-successful? admit-a-term 1 2))
       (test/error (proof-state-successful? admit-a-term 0 0))
       (test/error (proof-state-successful? admit-a-term 0 1))
       (test/error (proof-state-successful? admit-a-term 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input admit-a-term 1 0))
       (test/equal? (proof-state-input admit-a-term 1 1) "(+ 1 2)")
       (test/equal? (proof-state-input admit-a-term 1 2) "(* 3 4)")
       (test/error (proof-state-input admit-a-term 0 0))
       (test/equal? (proof-state-input admit-a-term 0 1)
                    "(list (quote a) (quote b))")
       (test/equal? (proof-state-input admit-a-term 0 2) "(quote (c d))")))

   (test-suite "Unchanged Parts"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size unchanged-merge) 1))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part unchanged-merge) 0))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size unchanged-merge 0) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position unchanged-merge 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output unchanged-merge 0 0) "")
       (test/equal? (proof-state-output unchanged-merge 0 1) "")
       (test/equal? (proof-state-output unchanged-merge 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary unchanged-merge 0 0) "")
       (test/equal? (proof-state-summary unchanged-merge 0 2) "")
       (test/equal? (proof-state-summary unchanged-merge 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/false (proof-state-finished? unchanged-merge 0 0))
       (test/false (proof-state-finished? unchanged-merge 0 1))
       (test/false (proof-state-finished? unchanged-merge 0 2)))
     (test-suite "proof-state-successful?"
       (test/error (proof-state-successful? unchanged-merge 0 0))
       (test/error (proof-state-successful? unchanged-merge 0 1))
       (test/error (proof-state-successful? unchanged-merge 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input unchanged-merge 0 0))
       (test/equal? (proof-state-input unchanged-merge 0 1)
                    "(list (quote a) (quote b))")
       (test/equal? (proof-state-input unchanged-merge 0 2)
                    "(quote (c d))")))

   (test-suite "Part Replaced"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size replaced-merge) 1))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part replaced-merge) 0))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size replaced-merge 0) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position replaced-merge 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output replaced-merge 0 0) "")
       (test/equal? (proof-state-output replaced-merge 0 1) "")
       (test/equal? (proof-state-output replaced-merge 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary replaced-merge 0 0) "")
       (test/equal? (proof-state-summary replaced-merge 0 2) "")
       (test/equal? (proof-state-summary replaced-merge 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/false (proof-state-finished? replaced-merge 0 0))
       (test/false (proof-state-finished? replaced-merge 0 1))
       (test/false (proof-state-finished? replaced-merge 0 2)))
     (test-suite "proof-state-successful?"
       (test/error (proof-state-successful? replaced-merge 0 0))
       (test/error (proof-state-successful? replaced-merge 0 1))
       (test/error (proof-state-successful? replaced-merge 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input replaced-merge 0 0))
       (test/equal? (proof-state-input replaced-merge 0 1) "(+ 1 2)")
       (test/equal? (proof-state-input replaced-merge 0 2) "(* 3 4)")))

   (test-suite "Renamed Merge"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size replaced-merge) 1))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part renamed-merge) 0))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size renamed-merge 0) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position renamed-merge 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output renamed-merge 0 0) "")
       (test/equal? (proof-state-output renamed-merge 0 1) "")
       (test/equal? (proof-state-output renamed-merge 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary renamed-merge 0 0) "")
       (test/equal? (proof-state-summary renamed-merge 0 2) "")
       (test/equal? (proof-state-summary renamed-merge 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/false (proof-state-finished? renamed-merge 0 0))
       (test/false (proof-state-finished? renamed-merge 0 1))
       (test/false (proof-state-finished? renamed-merge 0 2)))
     (test-suite "proof-state-successful?"
       (test/error (proof-state-successful? renamed-merge 0 0))
       (test/error (proof-state-successful? renamed-merge 0 1))
       (test/error (proof-state-successful? renamed-merge 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input renamed-merge 0 0))
       (test/equal? (proof-state-input renamed-merge 0 1) "(+ 1 2)")
       (test/equal? (proof-state-input renamed-merge 0 2) "(* 3 4)")))

   (test-suite "Reordered Merge"
     (test-case "proof-state-size"
       (test/equal? (proof-state-size replaced-merge) 2))
     (test-case "proof-state-current-part"
       (test/equal? (proof-state-current-part reordered-merge) 0))
     (test-suite "proof-state-part-size"
       (test/equal? (proof-state-part-size reordered-merge 0) 3)
       (test/equal? (proof-state-part-size reordered-merge 1) 3))
     (test-suite "proof-state-position"
       (test/equal? (proof-state-position reordered-merge 1) 0)
       (test/equal? (proof-state-position reordered-merge 0) 0))
     (test-suite "proof-state-output"
       (test/equal? (proof-state-output reordered-merge 1 0) "")
       (test/equal? (proof-state-output reordered-merge 1 1) "")
       (test/equal? (proof-state-output reordered-merge 1 2) "")
       (test/equal? (proof-state-output reordered-merge 0 0) "")
       (test/equal? (proof-state-output reordered-merge 0 1) "")
       (test/equal? (proof-state-output reordered-merge 0 2) ""))
     (test-suite "proof-state-summary"
       (test/equal? (proof-state-summary reordered-merge 1 0) "")
       (test/equal? (proof-state-summary reordered-merge 1 1) "")
       (test/equal? (proof-state-summary reordered-merge 1 2) "")
       (test/equal? (proof-state-summary reordered-merge 0 0) "")
       (test/equal? (proof-state-summary reordered-merge 0 2) "")
       (test/equal? (proof-state-summary reordered-merge 0 1) ""))
     (test-suite "proof-state-finished?"
       (test/false (proof-state-finished? reordered-merge 1 0))
       (test/false (proof-state-finished? reordered-merge 1 1))
       (test/false (proof-state-finished? reordered-merge 1 2))
       (test/false (proof-state-finished? reordered-merge 0 0))
       (test/false (proof-state-finished? reordered-merge 0 1))
       (test/false (proof-state-finished? reordered-merge 0 2)))
     (test-suite "proof-state-successful?"
       (test/error (proof-state-successful? reordered-merge 1 0))
       (test/error (proof-state-successful? reordered-merge 1 1))
       (test/error (proof-state-successful? reordered-merge 1 2))
       (test/error (proof-state-successful? reordered-merge 0 0))
       (test/error (proof-state-successful? reordered-merge 0 1))
       (test/error (proof-state-successful? reordered-merge 0 2)))
     (test-suite "proof-state-input"
       (test/error (proof-state-input reordered-merge 1 0))
       (test/equal? (proof-state-input reordered-merge 1 1)
                    "(list (quote a) (quote b))")
       (test/equal? (proof-state-input reordered-merge 1 2)
                    "(quote (c d))")
       (test/error (proof-state-input reordered-merge 0 0))
       (test/equal? (proof-state-input reordered-merge 0 1) "(+ 1 2)")
       (test/equal? (proof-state-input reordered-merge 0 2) "(* 3 4)")))
   |#
   ))

(provide state-test-suite)