(import scheme (chicken port) test tabular) (define (generator->list gen) (let recur ((ax '())) (let ((value (gen))) (if (eof-object? value) (reverse ax) (recur (cons value ax)) )) )) (define (stream->list proc strm) (let recur ((ax '()) (strm strm)) (let ((value.strm (proc strm))) (if (eof-object? value.strm) (reverse ax) (recur (cons (car value.strm) ax) (cadr value.strm)) )) )) #; (test-group "csv read from invalid string" (test `(("Test \n1" "Test 2" "Test 3") ("Test 4" "Test 5" )) (let-values (((proc strm) (call-with-input-string "\"Test \n1\n" (lambda (port) (reader port delimiter: #\|))))) (stream->list proc strm)) )) (test-group "csv read from string without newline" (test `(("Test 1")) (let-values (((proc strm) (call-with-input-string "Test 1" (lambda (port) (reader port delimiter: #\|))))) (stream->list proc strm)) )) (test-group "csv read from string" (test `(("Test \n1" "Test 2" "Test 3") ("Test 4" "Test 5" )) (let-values (((proc strm) (call-with-input-string "\"Test \n1\"|Test 2|Test 3\nTest 4|Test 5\n" (lambda (port) (reader port delimiter: #\|))))) (stream->list proc strm)) )) (test-group "csv read from file" (test `("Bank Name" "City" "ST" "CERT" "Acquiring Institution" "Closing Date" "Updated Date") (let ((input (open-input-file "tests/data/banklist.csv"))) (let-values (((proc strm) (reader input delimiter: #\,))) (let ((lst (stream->list proc strm))) (close-input-port input) (car lst))) )) ) (test-group "csv read from string generator" (test `(("Test \n1" "Test 2" "Test 3") ("Test 4" "Test 5" )) (let ((gen (call-with-input-string "\"Test \n1\"|Test 2|Test 3\nTest 4|Test 5\n" (lambda (port) (reader* port delimiter: #\|))))) (generator->list gen)) )) (test-group "csv read from string generator with missing values" (test `(("Test \n1" "MISSING" "Test 3") ("Test 4" "Test 5" )) (let ((gen (call-with-input-string "\"Test \n1\"||Test 3\nTest 4|Test 5\n" (lambda (port) (reader* port delimiter: #\| na: "MISSING"))))) (generator->list gen)) )) (test-group "csv read from string generator with missing values" (test `(("Test \n1" "Test 2" "Test 3") ("Test 4" "MISSING" )) (let ((gen (call-with-input-string "\"Test \n1\"|Test 2|Test 3\nTest 4|\n" (lambda (port) (reader* port delimiter: #\| na: "MISSING"))))) (generator->list gen)) )) (test-group "csv read from file generator" (test `("Bank Name" "City" "ST" "CERT" "Acquiring Institution" "Closing Date" "Updated Date") (car (let* ((input (open-input-file "tests/data/banklist.csv")) (gen (reader* input delimiter: #\,)) (lst (generator->list gen))) (close-input-port input) lst)) )) (test-group "fixed-width read from string generator" (test `(("Test 1" "Test 2" "Test 3") ("Test 4" "Test 5" "Test 6")) (let ((gen (call-with-input-string "Test 1Test 2Test 3\nTest 4Test 5Test 6\n" (lambda (port) (reader* port delimiter: #f column-widths: '(6 6 6)))))) (generator->list gen)) )) (test-group "writer" (test "Test 1,Test 2,Test 3\nTest 4,Test 5\n" (call-with-output-string (lambda (port) (let ((out (writer port))) (out (list "Test 1" "Test 2" "Test 3") (list "Test 4" "Test 5" ))) )) )) (test-group "writer" (test "Test 1,Test 2,Test 3\nTest 4,Test 5\n" (call-with-output-string (lambda (port) (let ((out (writer port))) (out (list "Test 1" "Test 2" "Test 3") (list "Test 4" "Test 5" ))) )) )) (test-group "fixed-width writer" (test "Test 1Test 2Test 3\nTest 4Test 5\n" (call-with-output-string (lambda (port) (let ((out (writer port delimiter: #f column-widths: `(6 6 6)))) (out (list "Test 1" "Test 2" "Test 3") (list "Test 4" "Test 5" ))) )) )) (test-exit)