diff --git a/Makefile b/Makefile index 7f12694..0178015 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .SILENT: SCHEME=chibi RNRS=r7rs -LIBRARY=ctrf +LIBRARY=tap DOCKER_TAG=latest AUTHOR=retropikzel @@ -14,13 +14,6 @@ VERSION != cat retropikzel/${LIBRARY}/VERSION DESCRIPTION != head -n1 retropikzel/${LIBRARY}/README.md README=retropikzel/${LIBRARY}/README.html -AKKU_PACKAGES="" -SFX=scm -ifeq "${RNRS}" "r6rs" -SFX=sps -AKKU_PACKAGES="akku-r7rs" -endif - ifeq "${SCHEME}" "capyscheme" DOCKER_TAG=head endif @@ -44,34 +37,32 @@ package: retropikzel/${LIBRARY}/LICENSE retropikzel/${LIBRARY}/VERSION retropikz --always-yes \ --version=${VERSION} \ --authors=${AUTHOR} \ - --doc=${README} \ + --doc-from-scribble=1 \ --description="${DESCRIPTION}" \ + --test=${TESTFILE} \ ${LIBRARY_FILE} ${PKG}: package -install: - snow-chibi install --impls=${SCHEME} --always-yes ${PKG} +install: ${PKG} + snow-chibi install --impls=${SCHEME} --always-yes --install-tests?=1 --show-tests?=1 ${PKG} -testfiles: ${PKG} ${TESTFILE} - rm -rf ${tmpdir} - mkdir -p ${tmpdir} - cp ${PKG} ${tmpdir} - cat test-headers.${SFX} | sed 's/LIBRARY/${LIBRARY}/' > ${tmpdir}/test.${SFX} - cat ${TESTFILE} >> ${tmpdir}/test.${SFX} +test: package + snow-chibi install --impls=${SCHEME} --always-yes --install-tests?=1 --show-tests?=1 ${PKG} + snow-chibi install --impls=${SCHEME} --always-yes --install-tests?=1 --show-tests?=1 ${PKG} -test: testfiles +old-test: cd ${tmpdir} && COMPILE_R7RS=${SCHEME} CSC_OPIONS="-L -lcurl" compile-r7rs -o test-program test.${SFX} cd ${tmpdir} && ./test-program -test-docker: testfiles +test-docker: SNOW_PACKAGES="srfi.19 srfi.64 srfi.180 ${PKG}" \ APT_PACKAGES="libcurl4-openssl-dev" \ AKKU_PACKAGES="${AKKU_PACKAGES}" \ DOCKER_TAG=${DOCKER_TAG} \ COMPILE_R7RS=${SCHEME} \ CSC_OPIONS="-L -lcurl" \ - test-r7rs -o ${tmpdir}/test-program ${tmpdir}/test.${SFX} + test-r7rs -o test-program ${TESTFILE} retropikzel/wasm/plus.wat: retropikzel/wasm/plus.c emcc -o retropikzel/wasm/plus.js retropikzel/wasm/plus.c diff --git a/retropikzel/assert.scm b/retropikzel/assert.scm new file mode 100644 index 0000000..4417b87 --- /dev/null +++ b/retropikzel/assert.scm @@ -0,0 +1,15 @@ +(define-syntax assert + (syntax-rules () + ((_ check body) + (let ((result body)) + (when (not (check result)) + (error "assertion error: " check body result)) + result)))) + +(define-syntax asserts + (syntax-rules () + ((_ (check ...) body) + (let ((result body)) + (when (not (check result)) (error "assertion error: " check body result)) ... + result)))) + diff --git a/retropikzel/assert.sld b/retropikzel/assert.sld new file mode 100644 index 0000000..ccd498f --- /dev/null +++ b/retropikzel/assert.sld @@ -0,0 +1,7 @@ +(define-library + (retropikzel assert) + (import (scheme base) + (scheme write)) + (export assert + asserts) + (include "assert.scm")) diff --git a/retropikzel/assert/LICENSE b/retropikzel/assert/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/retropikzel/assert/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/retropikzel/assert/README.md b/retropikzel/assert/README.md new file mode 100644 index 0000000..00d7bdd --- /dev/null +++ b/retropikzel/assert/README.md @@ -0,0 +1 @@ +WIP diff --git a/retropikzel/assert/VERSION b/retropikzel/assert/VERSION new file mode 100644 index 0000000..6e8bf73 --- /dev/null +++ b/retropikzel/assert/VERSION @@ -0,0 +1 @@ +0.1.0 diff --git a/retropikzel/assert/test.scm b/retropikzel/assert/test.scm new file mode 100644 index 0000000..2b8ee0e --- /dev/null +++ b/retropikzel/assert/test.scm @@ -0,0 +1,21 @@ +(import (scheme base) + (scheme write) + (scheme read) + (retropikzel tap) + (retropikzel debug) + (retropikzel assert) + (srfi 64)) + +(test-runner-current (tap-runner)) + +(test-begin "assert") + +(test-equal 1 (assert number? 1)) + +(test-equal 'error + (guard (condition (else 'error)) + (assert number? "string"))) + +(test-equal 1 (asserts (number? (lambda (i) (= i 1))) 1)) + +(test-end "assert") diff --git a/retropikzel/debug.scm b/retropikzel/debug.scm index 884907f..6aa2c01 100644 --- a/retropikzel/debug.scm +++ b/retropikzel/debug.scm @@ -1,3 +1,7 @@ +(define debug? + (and (get-environment-variable "SCM_DEBUG") + (equal? (get-environment-variable "SCM_DEBUG") "1"))) + (define print (lambda args (map (lambda (item) (display item (current-error-port))) args))) @@ -6,22 +10,21 @@ (syntax-rules () ((_ obj) (begin - (print "[DEBUG] " 'obj ": " obj #\newline) + (when debug? (print "[DEBUG] " 'obj ": " obj #\newline)) obj)))) (define-syntax debug (syntax-rules () ((_ obj) (begin - (print "[DEBUG] " 'obj ": " obj #\newline) + (when debug? (print "[DEBUG] " 'obj ": " obj #\newline)) obj)))) (define-syntax debug-proc (syntax-rules () ((_ proc arg ...) (begin - (print "[DEBUG] Calling: " 'proc ", arguments: " '(arg ...)) + (when debug? (print "[DEBUG] Calling: " 'proc ", arguments: " '(arg ...))) (let ((result (apply proc (list arg ...)))) - (print ", returned: " result #\newline) + (when debug? (print ", returned: " result #\newline)) result))))) - diff --git a/retropikzel/debug.sld b/retropikzel/debug.sld index ebe5efa..982420b 100644 --- a/retropikzel/debug.sld +++ b/retropikzel/debug.sld @@ -1,7 +1,8 @@ (define-library (retropikzel debug) (import (scheme base) - (scheme write)) + (scheme write) + (scheme process-context)) (export debug debug-display debug-proc) diff --git a/retropikzel/debug/test.scm b/retropikzel/debug/test.scm index eb79140..0b656c0 100644 --- a/retropikzel/debug/test.scm +++ b/retropikzel/debug/test.scm @@ -1,3 +1,11 @@ +(import (scheme base) + (scheme write) + (retropikzel tap) + (retropikzel debug) + (srfi 64)) + +(test-runner-current (tap-runner)) + (test-begin "debug") (debug 'lol) diff --git a/retropikzel/match.scm b/retropikzel/match.scm new file mode 100644 index 0000000..ada2e5c --- /dev/null +++ b/retropikzel/match.scm @@ -0,0 +1,4 @@ +(define-syntax match + (syntax-rules (or) + ((_ val compare-with (compare-to body ...) ...) + (cond ((compare-with val compare-to) body ...) ...)))) diff --git a/retropikzel/match.sld b/retropikzel/match.sld new file mode 100644 index 0000000..1eafcaf --- /dev/null +++ b/retropikzel/match.sld @@ -0,0 +1,6 @@ +(define-library + (retropikzel match) + (import (scheme base) + (scheme write)) + (export match) + (include "match.scm")) diff --git a/retropikzel/match/LICENSE b/retropikzel/match/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/retropikzel/match/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/retropikzel/match/README.md b/retropikzel/match/README.md new file mode 100644 index 0000000..00d7bdd --- /dev/null +++ b/retropikzel/match/README.md @@ -0,0 +1 @@ +WIP diff --git a/retropikzel/match/VERSION b/retropikzel/match/VERSION new file mode 100644 index 0000000..6e8bf73 --- /dev/null +++ b/retropikzel/match/VERSION @@ -0,0 +1 @@ +0.1.0 diff --git a/retropikzel/match/test.scm b/retropikzel/match/test.scm new file mode 100644 index 0000000..970e5f7 --- /dev/null +++ b/retropikzel/match/test.scm @@ -0,0 +1,17 @@ +(import (scheme base) + (scheme write) + (retropikzel tap) + (retropikzel match) + (retropikzel debug) + (srfi 64)) + +(test-runner-current (tap-runner)) + +(test-begin "match") + +(define val "Hello") + +(test-equal 1 (debug (match val equal? ("world" 0) ("Hello" 1)))) +(test-equal 1 (debug (match 2 = (1 0) (2 1)))) + +(test-end "match") diff --git a/retropikzel/tap.scm b/retropikzel/tap.scm index 6af7a0c..4c74475 100644 --- a/retropikzel/tap.scm +++ b/retropikzel/tap.scm @@ -1,6 +1,27 @@ -(define tap-output-port (current-output-port)) -(define (set-tap-runner-output-port! port) (set! tap-output-port port)) +;;> \pre{ +;;> TAP output for SRFI-64 +;;> +;;> [Test Anything Protocol](https://testanything.org/) +;;> +;;>} +;;> \section{Usage} +;;> \pre{ +;;> (import (scheme base) +;;> (srfi 64) +;;> (retropikzel tap)) +;;> +;;> (test-runner-current (tap-runner)) +;;> +;;> (test-begin "My Cool Library") +;;> (test-equal 1 1) +;;> (test-end "My Cool Library") +;;>} + +;;> \section{Reference} + + +;;>Get the TAP test runner. (define-syntax tap-runner (syntax-rules () ((_) @@ -20,19 +41,20 @@ (print (lambda args (map (lambda (item) - (display item tap-output-port)) + (display item)) (append indentation args)))) (println (lambda args (map (lambda (item) - (display item tap-output-port)) + (display item)) (append indentation args)) - (display "\n" tap-output-port))) + (display "\n"))) (runner (test-runner-null)) (started? #f) (current-test-groups (vector)) (current-test-group-count 0) - (current-suite-name #f)) + (current-suite-name #f) + (exit-with-fail? #f)) (test-runner-on-group-begin! runner @@ -81,7 +103,9 @@ (let ((value (test-result-ref runner key))) (if value (any->string value) ""))))) (let* ((failed? (or (equal? result 'fail) (equal? result 'xfail)))) - (when failed? (print "not ")) + (when failed? + (set! exit-with-fail? #t) + (print "not ")) (print "ok " current-test-group-count) (if (and (string? name) (not (string=? name ""))) (println " - " name) @@ -96,4 +120,10 @@ (println " at: ") (println " file: " (result-ref runner 'source-file)) (println " line: " (result-ref runner 'source-line))))))) + + (test-runner-on-final! + runner + (lambda (runner) + (when exit-with-fail? (exit 1)))) + runner)))) diff --git a/retropikzel/tap.sld b/retropikzel/tap.sld index e293680..ff75087 100644 --- a/retropikzel/tap.sld +++ b/retropikzel/tap.sld @@ -2,8 +2,8 @@ (retropikzel tap) (import (scheme base) (scheme write) + (scheme process-context) (srfi 64)) - (export tap-runner - set-tap-runner-output-port!) + (export tap-runner) (include "tap.scm")) diff --git a/retropikzel/tap/VERSION b/retropikzel/tap/VERSION index ee1372d..9e11b32 100644 --- a/retropikzel/tap/VERSION +++ b/retropikzel/tap/VERSION @@ -1 +1 @@ -0.2.2 +0.3.1 diff --git a/retropikzel/tap/test.scm b/retropikzel/tap/test.scm index 52dcd99..e41ea9d 100644 --- a/retropikzel/tap/test.scm +++ b/retropikzel/tap/test.scm @@ -1,3 +1,6 @@ +(import (scheme base) + (retropikzel tap) + (srfi 64)) (test-runner-current (tap-runner)) @@ -8,8 +11,8 @@ (test-begin "tap 1") (test-assert #t) (test-assert #t) -(test-assert #f) -(test-equal '(1 2 3) '(4 5 6)) +;(test-assert #f) +;(test-equal '(1 2 3) '(4 5 6)) (test-end "tap 1") (test-begin "tap 2") @@ -19,6 +22,6 @@ (test-end "tap 2") (test-assert #t) -(test-equal '(4 5 6) '(7 8 9)) +;(test-equal '(4 5 6) '(7 8 9)) (test-end "tap")