(load "../common") (defmacro mtest-csv (. pairs) (tree-bind (data expected) (flow pairs (tuples 2) transpose) ^(mtest ,*(mappend (ret ^((get-csv ,(regsub "#" "\"" @1)) ,(mapcar (op regsub "#" "\"") @2))) data expected)))) (defmacro mtest-pcsv (. pairs) (tree-bind (data expected) (flow pairs (tuples 2) transpose) ^(mtest ,*(mappend (ret ^((tocsv ,(mapcar [iffi stringp (op regsub "#" "\"")] @1)) ,(regsub "#" "\"" @2))) data expected)))) (mtest-csv "" nil "," #("" "") ",," #("" "" "")) (mtest-csv "\r" #("\r") "\r\n" #("") "\r\r" #("\r\r") "\r\r\n" #("\r") "\r\r" #("\r\r") "\r\r\r" #("\r\r\r") "\r\r\r\n" #("\r\r") "\r,\r" #("\r" "\r") "\r\n,\r" #("") "\r\r\n,\r" #("\r") ",\r\r" #("" "\r\r") ",\r\n" #("" "")) (mtest-csv "a\r" #("a\r") "a\r\n" #("a") "a\r\r" #("a\r\r") "a\r\r\n" #("a\r") "a\r\r" #("a\r\r") "a\r\r\r" #("a\r\r\r") "a\r\r\r\n" #("a\r\r") "a\r,a\r" #("a\r" "a\r") "a\r\n,a\r" #("a") "a\r\r\n,a\r" #("a\r") "a,a\r\r" #("a" "a\r\r") "a,\r\r" #("a" "\r\r") ",a\r\n" #("" "a")) (mtest-csv "##" #("") "#" #("") "#,#" #(",") "##,##" #("" "") "####" #("#") "##a#" #("a#") "#\r#" #("\r") "#\n#" #("\n") "#\r\n#" #("\n") "#\r\r\n#" #("\r\n") "#\r\r\r\n#" #("\r\r\n") "##\r\n#" #("") "##\r\r\n#" #("\r") "##\r\r\r\n#" #("\r\r")) (mtest-csv "##\n" #("") "#\n" #("\n") "#,#\n" #(",") "##,##\n" #("" "") "####\n" #("#") "##a#\n" #("a#") "#\r#\n" #("\r") "#\n#\n" #("\n") "#\r\n#\n" #("\n") "#\r\r\n#\n" #("\r\n") "#\r\r\r\n#\n" #("\r\r\n") "##\r\n#\n" #("") "##\r\r\n#\n" #("\r") "##\r\r\r\n#\n" #("\r\r")) (mtest-csv "#\r##\r#" #("\r#\r") "#\n##\n#" #("\n#\n") "#\r\n##\r\n#" #("\n#\n")) (mtest-csv "a#b" #("a#b") "a##b" #("a##b") "a###b" #("a###b")) (mtest-csv "#a#b" #("ab") "ab#cd#ef" #("ab#cd#ef")) (mtest-csv "a," #("a" "") ",a" #("" "a") "a,b,c" #("a" "b" "c") "#a#,b,c" #("a" "b" "c") "a,#b#,c" #("a" "b" "c") "a,b,#c#" #("a" "b" "c") "#a#,b,#c#" #("a" "b" "c") "#a#,#b#,#c#" #("a" "b" "c")) (mtest-csv "a,\r\n" #("a" "") ",a\r\n" #("" "a") "a,b,c\r\n" #("a" "b" "c") "#a#,b,c\r\n" #("a" "b" "c") "a,#b#,c\r\n" #("a" "b" "c") "a,b,#c#\r\n" #("a" "b" "c") "#a#,b,#c#\r\n" #("a" "b" "c") "#a#,#b#,#c#\r\n" #("a" "b" "c")) (mtest-csv "a,\n" #("a" "") ",a\n" #("" "a") "a,b,c\n" #("a" "b" "c") "#a#,b,c\n" #("a" "b" "c") "a,#b#,c\n" #("a" "b" "c") "a,b,#c#\n" #("a" "b" "c") "#a#,b,#c#\n" #("a" "b" "c") "#a#,#b#,#c#\n" #("a" "b" "c")) (mtest-csv "a,\r" #("a" "\r") ",a\r" #("" "a\r") "a,b,c\r" #("a" "b" "c\r") "#a#,b,c\r" #("a" "b" "c\r") "a,#b#,c\r" #("a" "b" "c\r") "a,b,#c#\r" #("a" "b" "c\r") "#a#,b,#c#\r" #("a" "b" "c\r") "#a#,#b#,#c#\r" #("a" "b" "c\r")) (mtest-csv "a,\n" #("a" "") ",a\n" #("" "a") "a,b,c\n" #("a" "b" "c") "#a#,b,c\n" #("a" "b" "c") "a,#b#,c\n" #("a" "b" "c") "a,b,#c#\n" #("a" "b" "c") "#a#,b,#c#\n" #("a" "b" "c") "#a#,#b#,#c#\n" #("a" "b" "c")) (mtest-csv "a,\r" #("a" "\r") ",a\r" #("" "a\r") "a,b,c\r" #("a" "b" "c\r") "#a#,b,c\r" #("a" "b" "c\r") "a,#b#,c\r" #("a" "b" "c\r") "a,b,#c#\r" #("a" "b" "c\r") "#a#,b,#c#\r" #("a" "b" "c\r") "#a#,#b#,#c#\r" #("a" "b" "c\r")) (mtest-csv "aa,\r\n" #("aa" "") ",aa\r\n" #("" "aa") "aa,bb,cc\r\n" #("aa" "bb" "cc") "#aa#,bb,cc\r\n" #("aa" "bb" "cc") "aa,#bb#,cc\r\n" #("aa" "bb" "cc") "aa,bb,#cc#\r\n" #("aa" "bb" "cc") "#aa#,bb,#cc#\r\n" #("aa" "bb" "cc") "#aa#,#bb#,#cc#\r\n" #("aa" "bb" "cc")) (mtest-csv "#Hello, ##Bob##!" #("Hello, #Bob#!") "#Hello, ##Bob##!\r" #("Hello, #Bob#!\r") "#Hello, ##Bob##!\n" #("Hello, #Bob#!\n") "#Hello, ##Bob##!\r\n" #("Hello, #Bob#!\n") "#Hello, ##Bob##!#\r\n" #("Hello, #Bob#!") "#Hello, ##Bob##!#\n" #("Hello, #Bob#!") "#Hello, ##Bob##!#\r" #("Hello, #Bob#!\r")) (mtest-pcsv #() "\n" #("") "\n" #(hello) "hello\n" #(3.14) "3.14\n" #(1.0 2 #\c) "1,2,c\n" #(hello world) "hello,world\n" #("foo" "bar") "foo,bar\n" #(",") "#,#\n" #("a\nb" "c#d" "e,f") "#a\nb#,#c##d#,#e,f#\n" #("a\n#,b") "#a\n##,b#\n" #("a#\n,b\n") "#a##\n,b\n#\n") (mtest (with-in-string-stream (s "a,b,c\nd,e,f\r\n") (list (get-csv s) (get-csv s) (get-csv s))) (#("a" "b" "c") #("d" "e" "f") nil) (with-in-string-stream (s "a,b,c\nd,e,f\n") (list (get-csv s) (get-csv s) (get-csv s))) (#("a" "b" "c") #("d" "e" "f") nil) (with-in-string-stream (s "a,b,c\nd,e,f") (list (get-csv s) (get-csv s) (get-csv s))) (#("a" "b" "c") #("d" "e" "f") nil) (with-in-string-stream (s "a,b,c\r\n") (list (get-csv s) (get-csv s) (get-csv s))) (#("a" "b" "c") nil nil) (with-in-string-stream (s "a,b,c\n") (list (get-csv s) (get-csv s) (get-csv s))) (#("a" "b" "c") nil nil) (with-in-string-stream (s "a,b,c") (list (get-csv s) (get-csv s) (get-csv s))) (#("a" "b" "c") nil nil) (with-in-string-stream (s "") (list (get-csv s) (get-csv s) (get-csv s))) (nil nil nil) (with-in-string-stream (s "\r") (list (get-csv s) (get-csv s) (get-csv s))) (#("\r") nil nil) (with-in-string-stream (s "\r\n") (list (get-csv s) (get-csv s) (get-csv s))) (#("") nil nil) (with-in-string-stream (s "\n") (list (get-csv s) (get-csv s) (get-csv s))) (#("") nil nil))