~ chicken-core (chicken-5) 69eb29536f48bbeee6ba56bcfa7265e0cd7afe51


commit 69eb29536f48bbeee6ba56bcfa7265e0cd7afe51
Author:     Kooda <kooda@upyum.com>
AuthorDate: Sat May 5 12:51:37 2018 +0200
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Sun May 13 15:33:41 2018 +0200

    Add a types.db consistency check test
    
    Signed-off-by: Peter Bex <peter@more-magic.net>

diff --git a/distribution/manifest b/distribution/manifest
index b3ec51a0..a7fccbbd 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -238,6 +238,7 @@ tests/user-pass-tests.scm
 tests/version-tests.scm
 tests/messages-test.scm
 tests/messages.expected
+tests/types-db-consistency.scm
 tweaks.scm
 Makefile
 Makefile.android
diff --git a/tests/runtests.bat b/tests/runtests.bat
index 67fd2e6f..100e2f48 100644
--- a/tests/runtests.bat
+++ b/tests/runtests.bat
@@ -27,6 +27,10 @@ rmdir /q /s %CHICKEN_INSTALL_REPOSITORY%
 mkdir %CHICKEN_INSTALL_REPOSITORY%
 copy %TYPESDB% %CHICKEN_INSTALL_REPOSITORY%
 
+echo "======================================== types.db consistency ..."
+%interpret% -s types-db-consistency.scm %TYPESDB%
+if errorlevel 1 exit /b 1
+
 echo ======================================== version tests ...
 %compile% version-tests.scm
 if errorlevel 1 exit /b 1
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 04a8ade3..35cd9920 100755
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -63,6 +63,9 @@ rm -fr *.exe *.so *.o *.import.* a.out ../foo.import.* test-repository
 mkdir -p test-repository
 cp $TYPESDB test-repository/types.db
 
+echo "======================================== types.db consistency ..."
+$interpret -s types-db-consistency.scm ${TYPESDB}
+
 echo "======================================== version tests ..."
 $compile version-tests.scm
 ./a.out
diff --git a/tests/types-db-consistency.scm b/tests/types-db-consistency.scm
new file mode 100644
index 00000000..5bfb89ba
--- /dev/null
+++ b/tests/types-db-consistency.scm
@@ -0,0 +1,72 @@
+;; This test walks the types.db file and checks that symbols are what they are supposed to be.
+
+(import
+  (chicken base)
+  (chicken bitwise)
+  (chicken continuation)
+  (chicken read-syntax)
+  (chicken irregex)
+  (chicken memory)
+  (chicken process-context posix)
+  (chicken tcp)
+  srfi-4)
+
+(define ignored-symbols
+  '(;; internal procedures
+    chicken.irregex#irregex-dfa
+    chicken.irregex#irregex-dfa/search
+    chicken.irregex#irregex-nfa
+    chicken.irregex#irregex-flags
+    chicken.irregex#irregex-lengths
+    chicken.irregex#irregex-reset-matches!
+    chicken.irregex#irregex-new-matches
+    chicken.irregex#irregex-apply-match
+    chicken.irregex#irregex-search/matches))
+
+(define *error-code* 0)
+
+(define (warn msg . args)
+  (apply fprintf (current-error-port)
+         msg args)
+  (set! *error-code* 1))
+
+(define (deep o)
+  (cond ((pair? o)
+         (deep (car o)))
+        ((vector? o)
+         (deep (vector-ref o 0)))
+        (else o)))
+
+(define ((unknown sym) obj)
+  (warn "Unknown type '~a' for object: ~a~%"
+        sym obj))
+
+(define (symbol->predicate sym)
+  (case sym
+    ((procedure forall) procedure?)
+    ((fixnum) fixnum?)
+    ((float) flonum?)
+    ((list-of) list?)
+    ((symbol) symbol?)
+    ((input-port) input-port?)
+    ((output-port) output-port?)
+    (else (unknown sym))))
+
+(define (run-checks file checker)
+  (with-input-from-file file
+    (lambda ()
+      (port-for-each checker read))))
+
+(define (simple-checker entry)
+  (let* ((symbol (car entry))
+         (value (##sys#slot symbol 0))
+         (type (deep (cadr entry)))
+         (pred (symbol->predicate type)))
+    (unless (or (member symbol ignored-symbols)
+                (pred value))
+      (warn "Mismatch for ~a '~a': ~a~%"
+            type symbol value))))
+
+(run-checks (car (command-line-arguments))
+            simple-checker)
+(exit *error-code*)
Trap