X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/239fa5bd3dff0b38b0cebdd3438311f21c24ba4f..7e94c5fe2eff01fe81fde1f54c53d3eefb254ba0:/src/c-types-test.lisp diff --git a/src/c-types-test.lisp b/src/c-types-test.lisp index 16e41ce..a1095db 100644 --- a/src/c-types-test.lisp +++ b/src/c-types-test.lisp @@ -249,40 +249,51 @@ int ftw(const char */*dirpath*/, ;;;-------------------------------------------------------------------------- ;;; Parsing. -(def-test-method parse-c-type ((test c-types-test) :run nil) - (flet ((check (string c-type name) - (let* ((char-scanner (make-string-scanner string)) - (scanner (make-instance 'sod-token-scanner - :char-scanner char-scanner - :filename ""))) - (with-parser-context (token-scanner-context :scanner scanner) - (define-module ("" :truename nil :location scanner) - (multiple-value-bind (result winp consumedp) - (parse (seq ((ds (parse-c-type scanner)) - (dc (parse-declarator scanner ds)) - :eof) - dc)) - (declare (ignore consumedp)) - (cond ((null c-type) - (assert-false winp)) - (t - (assert-true winp) - (unless (eq c-type t) - (assert-cteqp (car result) c-type)) - (unless (eq name t) - (assert-equal (cdr result) name)))))))))) - - (check "int x" (c-type int) "x") - (check "int long unsigned long y" (c-type unsigned-long-long) "y") - (check "int long int x" nil nil) - (check "float v[69][42]" (c-type ([] float "69" "42")) "v") - (check "const char *const tab[]" - (c-type ([] (* (char :const) :const) "")) - "tab") - (check "void (*signal(int, void (*)(int)))(int)" - (c-type (func (* (func void (nil int))) - (nil int) - (nil (* (func void (nil int)))))) - "signal"))) +(defun check-c-type-parse (string c-type name) + (let* ((char-scanner (make-string-scanner string)) + (scanner (make-instance 'sod-token-scanner + :char-scanner char-scanner + :filename ""))) + (with-parser-context (token-scanner-context :scanner scanner) + (define-module ("" :truename nil :location scanner) + (multiple-value-bind (result winp consumedp) + (parse (seq ((ds (parse-c-type scanner)) + (dc (parse-declarator scanner ds)) + :eof) + dc)) + (declare (ignore consumedp)) + (cond ((null c-type) + (assert-false winp)) + (t + (assert-true winp) + (unless (eq c-type t) + (assert-cteqp (car result) c-type)) + (unless (eq name t) + (assert-equal (cdr result) name))))))))) + +(def-test-method parse-simple ((test c-types-test) :run nil) + (check-c-type-parse "int x" (c-type int) "x")) + +(def-test-method parse-hairy-declspec ((test c-types-test) :run nil) + (check-c-type-parse "int long unsigned long y" + (c-type unsigned-long-long) "y")) + +(def-test-method parse-bogus-declspec ((test c-types-test) :run nil) + (check-c-type-parse "int long int x" nil nil)) + +(def-test-method parse-array ((test c-types-test) :run nil) + (check-c-type-parse "float v[69][42]" (c-type ([] float "69" "42")) "v")) + +(def-test-method parse-array-of-pointers ((test c-types-test) :run nil) + (check-c-type-parse "const char *const tab[]" + (c-type ([] (* (char :const) :const) "")) + "tab")) + +(def-test-method parse-hairy-function-pointer ((test c-types-test) :run nil) + (check-c-type-parse "void (*signal(int, void (*)(int)))(int)" + (c-type (func (* (func void (nil int))) + (nil int) + (nil (* (func void (nil int)))))) + "signal")) ;;;----- That's all, folks --------------------------------------------------