2009-02-09 19:11:42 -05:00
USING: io.streams.string csv tools.test kernel strings
2016-03-19 12:50:01 -04:00
io.pathnames io.files.temp io.files.unique io.encodings.utf8
io.files io.directories ;
2008-04-30 00:15:50 -04:00
IN: csv.tests
2008-04-17 16:29:04 -04:00
! I like to name my unit tests
2014-09-25 11:06:01 -04:00
: named-unit-test ( name output input -- )
2013-07-24 17:52:09 -04:00
unit-test drop ; inline
2008-04-17 16:29:04 -04:00
"Fields are separated by commas"
2014-09-25 11:06:01 -04:00
[ { { "1997" "Ford" "E350" } } ]
2013-03-15 00:21:20 -04:00
[ "1997,Ford,E350" string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"ignores whitespace before and after elements. n.b.specifically prohibited by RFC 4180, which states, 'Spaces are considered part of a field and should not be ignored.'"
[ { { "1997" "Ford" "E350" } } ]
2013-03-15 00:21:20 -04:00
[ "1997, Ford , E350" string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"keeps spaces in quotes"
[ { { "1997" "Ford" "E350" "Super, luxurious truck" } } ]
2013-03-15 00:21:20 -04:00
[ "1997,Ford,E350,\"Super, luxurious truck\"" string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"double quotes mean escaped in quotes"
[ { { "1997" "Ford" "E350" "Super \"luxurious\" truck" } } ]
2014-09-25 11:06:01 -04:00
[ "1997,Ford,E350,\"Super \"\"luxurious\"\" truck\""
2013-07-24 17:52:09 -04:00
string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"Fields with embedded line breaks must be delimited by double-quote characters."
[ { { "1997" "Ford" "E350" "Go get one now\nthey are going fast" } } ]
[ "1997,Ford,E350,\"Go get one now\nthey are going fast\""
2013-07-24 17:52:09 -04:00
string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"Fields with leading or trailing spaces must be delimited by double-quote characters. (See comment about leading and trailing spaces above)"
[ { { "1997" "Ford" "E350" " Super luxurious truck " } } ]
[ "1997,Ford,E350,\" Super luxurious truck \""
2013-07-24 17:52:09 -04:00
string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"Fields may always be delimited by double-quote characters, whether necessary or not."
[ { { "1997" "Ford" "E350" } } ]
2013-03-15 00:21:20 -04:00
[ "\"1997\",\"Ford\",\"E350\"" string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
"The first record in a csv file may contain column names in each of the fields."
2014-09-25 11:06:01 -04:00
[ { { "Year" "Make" "Model" }
2008-04-17 16:29:04 -04:00
{ "1997" "Ford" "E350" }
{ "2000" "Mercury" "Cougar" } } ]
2014-09-25 11:06:01 -04:00
[ "Year,Make,Model\n1997,Ford,E350\n2000,Mercury,Cougar"
2013-07-24 17:52:09 -04:00
string>csv ] named-unit-test
2008-04-17 16:29:04 -04:00
! !!!!!!!! other tests
2012-07-18 15:24:24 -04:00
2015-07-02 20:28:17 -04:00
{ { { "Phil Dawes" } } }
2013-03-15 00:21:20 -04:00
[ "\"Phil Dawes\"" string>csv ] unit-test
2008-04-17 16:29:04 -04:00
2015-07-02 20:28:17 -04:00
{ { { "1" "2" "3" } { "4" "5" "6" } } }
2013-03-15 00:21:20 -04:00
[ "1,2,3\n4,5,6\n" string>csv ] unit-test
2008-04-17 16:29:04 -04:00
"trims leading and trailing whitespace - n.b. this isn't really conformant, but lots of csv seems to assume this"
2013-03-15 00:21:20 -04:00
[ { { "foo yeah" "bah" "baz" } } ]
[ " foo yeah , bah ,baz\n" string>csv ] named-unit-test
2008-04-30 12:50:40 -04:00
"allows setting of delimiting character"
2013-03-15 00:21:20 -04:00
[ { { "foo" "bah" "baz" } } ]
[ "foo\tbah\tbaz\n" CHAR: \t [ string>csv ] with-delimiter ] named-unit-test
2008-05-01 06:54:09 -04:00
"Quoted field followed immediately by newline"
[ { { "foo" "bar" }
{ "1" "2" } } ]
2013-03-15 00:21:20 -04:00
[ "foo,\"bar\"\n1,2" string>csv ] named-unit-test
2008-07-25 17:02:07 -04:00
"can write csv too!"
[ "foo1,bar1\nfoo2,bar2\n" ]
2013-03-15 00:21:20 -04:00
[ { { "foo1" "bar1" } { "foo2" "bar2" } } csv>string ] named-unit-test
2009-11-05 18:03:24 -05:00
2008-07-25 17:02:07 -04:00
"escapes quotes commas and newlines when writing"
[ "\"fo\"\"o1\",bar1\n\"fo\no2\",\"b,ar2\"\n" ]
2013-03-15 00:21:20 -04:00
[ { { "fo\"o1" "bar1" } { "fo\no2" "b,ar2" } } csv>string ] named-unit-test ! "
2009-01-30 20:23:04 -05:00
2015-07-02 20:28:17 -04:00
{ { { "writing" "some" "csv" "tests" } } }
2009-01-30 20:23:04 -05:00
[
2016-03-18 13:57:54 -04:00
[
"writing,some,csv,tests"
"csv-test1-" ".csv" unique-file utf8
[ set-file-contents ] [ file>csv ] [ drop delete-file ] 2tri
] with-temp-directory
2009-01-30 20:23:04 -05:00
] unit-test
2015-07-02 20:28:17 -04:00
{ t } [
2016-03-18 13:57:54 -04:00
[
{ { "writing,some,csv,tests" } } dup
"csv-test2-" ".csv" unique-file utf8
[ csv>file ] [ file>csv ] 2bi =
] with-temp-directory
2009-01-30 20:23:04 -05:00
] unit-test
2009-02-12 02:32:06 -05:00
2015-07-02 20:28:17 -04:00
{ { { "hello" "" "" "" "goodbye" "" } } }
2013-03-15 00:21:20 -04:00
[ "hello,,\"\",,goodbye," string>csv ] unit-test
2012-07-18 15:24:24 -04:00
{ { { "asd\"f\"" "asdf" } } } [ "asd\"f\",asdf" string>csv ] unit-test
{ { { "a\"sdf" "asdf" } } } [ "a\"sdf,asdf" string>csv ] unit-test
{ { { "as\"df" "asdf" } } } [ " as\"df,asdf" string>csv ] unit-test
{ { { "asd" "f" "asdf" } } } [ "\"as\"d,f,asdf" string>csv ] unit-test
{ { { "as,df" "asdf" } } } [ "\"as,\"df,asdf" string>csv ] unit-test
! FIXME: { { { "as,df" "asdf" } } } [ "\"as,\"df ,asdf" string>csv ] unit-test
! FIXME: { { { "asd\"f\"" "asdf" } } } [ "\"asd\"\"\"f\",asdf" string>csv ] unit-test
{ { { "as,d\"f" "asdf" } } } [ "\"as,\"d\"\"\"\"f,asdf" string>csv ] unit-test
2014-02-19 04:07:28 -05:00
2015-07-02 20:28:17 -04:00
{ { } } [ "" string>csv ] unit-test
2014-09-25 11:06:01 -04:00
2015-07-02 20:28:17 -04:00
{
2014-09-25 11:06:01 -04:00
{ { "Year" "Make" "Model" }
{ "1997" "Ford" "E350" }
}
2015-07-02 20:28:17 -04:00
}
2014-09-25 11:06:01 -04:00
[ "Year,Make,\"Model\"\r\n1997,Ford,E350" string>csv ] unit-test