#!/usr/bin/perl use strict; $^W = 1; # use warnings core since 5.6 use Test::More tests => 113; BEGIN { $ENV{PERL_TEXT_CSV} = 0; use_ok "Text::CSV"; plan skip_all => "Cannot load Text::CSV" if $@; } my $csv; ok ($csv = Text::CSV->new, "new ()"); is ($csv->quote_char, '"', "quote_char"); is ($csv->escape_char, '"', "escape_char"); is ($csv->sep_char, ',', "sep_char"); is ($csv->eol, '', "eol"); is ($csv->always_quote, 0, "always_quote"); is ($csv->binary, 0, "binary"); is ($csv->keep_meta_info, 0, "keep_meta_info"); is ($csv->allow_loose_quotes, 0, "allow_loose_quotes"); is ($csv->allow_loose_escapes, 0, "allow_loose_escapes"); is ($csv->allow_whitespace, 0, "allow_whitespace"); is ($csv->blank_is_undef, 0, "blank_is_undef"); is ($csv->empty_is_undef, 0, "empty_is_undef"); is ($csv->auto_diag, 0, "auto_diag"); is ($csv->verbatim, 0, "verbatim"); is ($csv->quote_space, 1, "quote_space"); is ($csv->quote_null, 1, "quote_null"); is ($csv->binary (1), 1, "binary (1)"); my @fld = ( 'txt =, "Hi!"', "Yes", "", 2, undef, "1.09", "\r", undef ); ok ($csv->combine (@fld), "combine"); is ($csv->string, qq{"txt =, ""Hi!""",Yes,,2,,1.09,"\r",}, "string"); is ($csv->sep_char (";"), ';', "sep_char (;)"); is ($csv->quote_char ("="), '=', "quote_char (=)"); is ($csv->eol (undef), "", "eol (undef)"); is ($csv->eol (""), "", "eol ('')"); is ($csv->eol ("\r"), "\r", "eol (\\r)"); is ($csv->keep_meta_info (1), 1, "keep_meta_info (1)"); is ($csv->always_quote (undef), 0, "always_quote (undef)"); is ($csv->always_quote (1), 1, "always_quote (1)"); is ($csv->allow_loose_quotes (1), 1, "allow_loose_quotes (1)"); is ($csv->allow_loose_escapes (1), 1, "allow_loose_escapes (1)"); is ($csv->allow_whitespace (1), 1, "allow_whitespace (1)"); is ($csv->blank_is_undef (1), 1, "blank_is_undef (1)"); is ($csv->empty_is_undef (1), 1, "empty_is_undef (1)"); is ($csv->auto_diag (1), 1, "auto_diag (1)"); is ($csv->verbatim (1), 1, "verbatim (1)"); is ($csv->quote_space (1), 1, "quote_space (1)"); is ($csv->quote_null (1), 1, "quote_null (1)"); is ($csv->escape_char ("\\"), "\\", "escape_char (\\)"); ok ($csv->combine (@fld), "combine"); is ($csv->string, qq{=txt \\=, "Hi!"=;=Yes=;==;=2=;;=1.09=;=\r=;\r}, "string"); is ($csv->quote_space (0), 0, "quote_space (1)"); is ($csv->quote_null (0), 0, "quote_null (1)"); # Funny settings, all three translate to \0 internally ok ($csv = Text::CSV->new ({ sep_char => undef, quote_char => undef, escape_char => undef, }), "new (undef ...)"); is ($csv->sep_char, undef, "sep_char undef"); is ($csv->quote_char, undef, "quote_char undef"); is ($csv->escape_char, undef, "escape_char undef"); ok ($csv->parse ("foo"), "parse (foo)"); $csv->sep_char (","); ok ($csv->parse ("foo"), "parse (foo)"); ok (!$csv->parse ("foo,foo\0bar"), "parse (foo)"); $csv->escape_char ("\\"); ok (!$csv->parse ("foo,foo\0bar"), "parse (foo)"); $csv->binary (1); ok ( $csv->parse ("foo,foo\0bar"), "parse (foo)"); # Some forbidden combinations foreach my $ws (" ", "\t") { ok ($csv = Text::CSV->new ({ escape_char => $ws }), "New blank escape"); eval { ok ($csv->allow_whitespace (1), "Allow ws") }; is (($csv->error_diag)[0], 1002, "Wrong combo"); ok ($csv = Text::CSV->new ({ quote_char => $ws }), "New blank quote"); eval { ok ($csv->allow_whitespace (1), "Allow ws") }; is (($csv->error_diag)[0], 1002, "Wrong combo"); ok ($csv = Text::CSV->new ({ allow_whitespace => 1 }), "New ws 1"); eval { ok ($csv->escape_char ($ws), "esc") }; is (($csv->error_diag)[0], 1002, "Wrong combo"); ok ($csv = Text::CSV->new ({ allow_whitespace => 1 }), "New ws 1"); eval { ok ($csv->quote_char ($ws), "esc") }; is (($csv->error_diag)[0], 1002, "Wrong combo"); } eval { $csv = Text::CSV->new ({ escape_char => "\t", quote_char => " ", allow_whitespace => 1, }) }; like ((Text::CSV::error_diag)[1], qr{^INI - allow_whitespace}, "Wrong combo - error message"); is ((Text::CSV::error_diag)[0], 1002, "Wrong combo - numeric error"); # Test 1003 in constructor foreach my $x ("\r", "\n", "\r\n", "x\n", "\rx") { foreach my $attr (qw( sep_char quote_char escape_char )) { eval { $csv = Text::CSV->new ({ $attr => $x }) }; is ((Text::CSV::error_diag)[0], 1003, "eol in $attr"); } } # Test 1003 in methods foreach my $attr (qw( sep_char quote_char escape_char )) { ok ($csv = Text::CSV->new, "New"); eval { ok ($csv->$attr ("\n"), "$attr => \\n") }; is (($csv->error_diag)[0], 1003, "not allowed"); } # And test erroneous calls is (Text::CSV::new (0), undef, "new () as function"); is (Text::CSV::error_diag () . '', "usage: my \$csv = Text::CSV_PP->new ([{ option => value, ... }]);", "Generic usage () message"); is (Text::CSV->new ({ oel => "" }), undef, "typo in attr"); is (Text::CSV::error_diag () . '', "INI - Unknown attribute 'oel'", "Unsupported attr"); is (Text::CSV->new ({ _STATUS => "" }), undef, "private attr"); is (Text::CSV::error_diag () . '', "INI - Unknown attribute '_STATUS'", "Unsupported private attr"); foreach my $arg (undef, 0, "", " ", 1, [], [ 0 ], *STDOUT) { is (Text::CSV->new ($arg), undef, "Illegal type for first arg"); is ((Text::CSV::error_diag)[0], 1000, "Should be a hashref - numeric error"); } 1;