(import (scheme base) (only (csc strings) str-quote) (only (csc testing) define-test errorf subtest) (csc format)) (define-test (test-vsprintf t) (define-record-type (test-case name fmt args want) test-case? (name name) (fmt fmt) (args args) (want want)) (let ((tests (list (test-case "single-string" "test-string" '() "test-string") (test-case "list" "{}" '((1 2 3)) "(1 2 3)") (test-case "complex" "this {} is {} a {} test" '((1 2 3) 1 "bbb") "this (1 2 3) is 1 a bbb test") (test-case "escape open" "{{" '() "{") (test-case "escape close" "}}" '() "}")))) (for-each (lambda (tc) (subtest t (name tc) (let ((got (vsprintf (fmt tc) (args tc)))) (unless (equal? got (want tc)) (errorf t "(vsprintf {} {}) = {}, want {}." (str-quote fmt) (args tc) got (want tc)))))) tests)))