summaryrefslogtreecommitdiff
path: root/chess-test.el
blob: 1e59566e884af8d8c75a1248436cc3647b4f6034 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
;; Soon: Put Emacs Chess through an enormous battery of tests.

(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