;; Soon: Put Emacs Chess through an enormous battery of tests.
-(defun chess-test () t)
+(eval-when-compile
+ (require 'cl))
+
+(require 'chess-database)
+(require 'chess-game)
+
+(defun chess-test (&optional file)
+ (unless file
+ (setq file (car command-line-args-left)))
+ (message "Opening chess database '%s'" file)
+ (let ((database (chess-database-open file)))
+ (if database
+ (progn
+ (message "Running chess unit tests...")
+ (condition-case err
+ (let ((count (chess-database-count database))
+ (ply-count 0)
+ (index 1)
+ (begin (current-time)))
+ (while (< index count)
+ ;; Reading in the game will cause it to be converted from PGN
+ ;; (this is true currently) to a chess-game, during which time
+ ;; every move will be tested for legality.
+ ;;
+ ;; jww (2008-08-31): We should add some extra checks here, if we
+ ;; want to verify the final position and such.
+ (let ((game (chess-database-read database index)))
+ (when game
+ (setq ply-count
+ (+ ply-count (length (chess-game-plies game))))
+ (if (= 0 (mod index 1000))
+ (message "Read %d games: %d total plies (%.2f ply/sec)"
+ index ply-count
+ (/ (float ply-count)
+ (float
+ (time-to-seconds
+ (subtract-time (current-time)
+ begin))))))))
+ (setq index (1+ index)))
+ (message "Running chess unit tests...done"))
+ (t
+ (error "Failed to open chess database '%s'" file)))
+ (chess-database-close database)))))
+
+;;; chess-test.el ends here