#!/usr/bin/newlisp

; qa-dictionary
; check dictionary creation

;(macro (double X) (+ x x))
;(macro (triple X) (+ x x x))
;(macro (bar X) (+ x x x))


(println)
(println "Testing and benchmarking namespaces")

(set 'N 10000)

(if (main-args 2)
	(set 'N (int (main-args 2))))

; define name-space, force creation, stay in MAIN
(context 'Lex) (context MAIN)

(define (qa-dictionary)
    (set 'data (randomize (sequence 1 N)))
    (set 'ass (map list (map string data) data))
	(println "N of associations: " N)
	(println "number of cells before creating Lex: " (sys-info 0))
    (println "time to aquire from association list: " (set 'ta (time (Lex ass))) " ms")
	(println "time to aquire one entry: " 
		(format "%5.3f" (mul 1000 (div ta N))) (append " " (char  956) "s"))

	(print "time reading and verifying entries ... : ")
	(set 'start (time-of-day))
	(set 'sum 0)
	(dolist (a ass)
		(if (!= (Lex (a 0)) (a 1)) 
			(begin
				(println "Error: " (Lex (a 0)) " != " (a 1))
				(set 'read-error true))))
	(set 'ta (- (time-of-day) start))
	(println ta " ms")
	(println "time to read and verify one entry: "
			(format "%5.3f" (mul 1000 (div ta N))) (append " " (char  956) "s"))

	(set 'start (time-of-day))
	(set 'sum 0)
	(dolist (a ass)
		(Lex (a 0)) )
	(set 'ta (- (time-of-day) start))
	(println "time to only read one entry: "
			(format "%5.3f" (mul 1000 (div ta N))) (append " " (char  956) "s"))

	(println "number of cells after creating Lex: " (sys-info 0))
	(println "N of symbols in Lex: " (set 'ns (length (Lex))))
	(println "time to save to file: " (time (save "Lex.lsp" 'Lex)) " ms")
	(println "time to delete namespace: " (set 'td (time (delete 'Lex))) " ms")
	(println "time to delete one symbol: "
		(format "%5.3f" (mul 1000 (div td ns))) (append " " (char  956) "s"))
	(println "number of cells after deleting Lex: " (sys-info 0))
	(println "time to load namespace: " (time (load "Lex.lsp")) " ms")
	(println "number of cells after loading Lex: " (sys-info 0))
	(println "time to save Lex2: " (time (save "Lex2.lsp" 'Lex)) " ms")
	(println)
	(if (and (not read-error) (= (read-file "Lex.lsp") (read-file "Lex2.lsp")))
		(println ">>>>> Dictionary API tested SUCCESSFUL")
		(println ">>>>> PROBLEM in dictionary API"))
)

(qa-dictionary)
(delete-file "Lex.lsp")
(delete-file "Lex2.lsp")
(delete 'Lex)
(set 'data nil)
(set 'ass nil)
(if (main-args 2) 
    (println (sys-info))
    (exit))