summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2022-08-26 14:53:21 +0900
committernagachika <nagachika@ruby-lang.org>2022-09-03 15:54:07 +0900
commitcd0c2a67c482c441ac7f0a07c0f81573d6b6072f (patch)
treeeef3b14c36dad87ec04eb990a022f67fb1094021 /test
parentc69fffe67d7ad9c1afc4799222e819e0617e11c0 (diff)
Merge csv-3.2.4
Diffstat (limited to 'test')
-rw-r--r--test/csv/parse/test_convert.rb59
-rw-r--r--test/csv/test_data_converters.rb84
-rw-r--r--test/csv/test_encodings.rb31
3 files changed, 174 insertions, 0 deletions
diff --git a/test/csv/parse/test_convert.rb b/test/csv/parse/test_convert.rb
index 21d9f20b28..2ac255695e 100644
--- a/test/csv/parse/test_convert.rb
+++ b/test/csv/parse/test_convert.rb
@@ -107,4 +107,63 @@ class TestCSVParseConvert < Test::Unit::TestCase
assert_equal([nil, "empty", "a"],
CSV.parse_line(',"",a', empty_value: "empty"))
end
+
+ sub_test_case("#quoted?") do
+ def setup
+ @preserving_converter = lambda do |field, info|
+ f = field.encode(CSV::ConverterEncoding)
+ return f if info.quoted?
+ begin
+ Integer(f, 10)
+ rescue
+ f
+ end
+ end
+
+ @quoted_header_converter = lambda do |field, info|
+ f = field.encode(CSV::ConverterEncoding)
+ return f if info.quoted?
+ f.to_sym
+ end
+ end
+
+ def test_parse_line
+ row = CSV.parse_line('1,"2",3', converters: @preserving_converter)
+ assert_equal([1, "2", 3], row)
+ end
+
+ def test_parse
+ expected = [["quoted", "unquoted"], ["109", 1], ["10A", 2]]
+ rows = CSV.parse(<<~CSV, converters: @preserving_converter)
+ "quoted",unquoted
+ "109",1
+ "10A",2
+ CSV
+ assert_equal(expected, rows)
+ end
+
+ def test_alternating_quote
+ row = CSV.parse_line('"1",2,"3"', converters: @preserving_converter)
+ assert_equal(['1', 2, '3'], row)
+ end
+
+ def test_parse_headers
+ expected = [["quoted", :unquoted], ["109", "1"], ["10A", "2"]]
+ table = CSV.parse(<<~CSV, headers: true, header_converters: @quoted_header_converter)
+ "quoted",unquoted
+ "109",1
+ "10A",2
+ CSV
+ assert_equal(expected, table.to_a)
+ end
+
+ def test_parse_with_string_headers
+ expected = [["quoted", :unquoted], %w[109 1], %w[10A 2]]
+ table = CSV.parse(<<~CSV, headers: '"quoted",unquoted', header_converters: @quoted_header_converter)
+ "109",1
+ "10A",2
+ CSV
+ assert_equal(expected, table.to_a)
+ end
+ end
end
diff --git a/test/csv/test_data_converters.rb b/test/csv/test_data_converters.rb
index 1620e077be..c20a5d1f4b 100644
--- a/test/csv/test_data_converters.rb
+++ b/test/csv/test_data_converters.rb
@@ -103,4 +103,88 @@ class TestCSVDataConverters < Test::Unit::TestCase
assert_equal(datetime,
CSV::Converters[:date_time][iso8601_string])
end
+
+ def test_builtin_date_time_converter_rfc3339_minute
+ rfc3339_string = "2018-01-14 22:25"
+ datetime = DateTime.new(2018, 1, 14, 22, 25)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_second
+ rfc3339_string = "2018-01-14 22:25:19"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_under_second
+ rfc3339_string = "2018-01-14 22:25:19.1"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_under_second_offset
+ rfc3339_string = "2018-01-14 22:25:19.1+09:00"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9")
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_offset
+ rfc3339_string = "2018-01-14 22:25:19+09:00"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9")
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_utc
+ rfc3339_string = "2018-01-14 22:25:19Z"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_tab_minute
+ rfc3339_string = "2018-01-14\t22:25"
+ datetime = DateTime.new(2018, 1, 14, 22, 25)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_tab_second
+ rfc3339_string = "2018-01-14\t22:25:19"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_tab_under_second
+ rfc3339_string = "2018-01-14\t22:25:19.1"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_tab_under_second_offset
+ rfc3339_string = "2018-01-14\t22:25:19.1+09:00"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9")
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_tab_offset
+ rfc3339_string = "2018-01-14\t22:25:19+09:00"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9")
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
+
+ def test_builtin_date_time_converter_rfc3339_tab_utc
+ rfc3339_string = "2018-01-14\t22:25:19Z"
+ datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
+ assert_equal(datetime,
+ CSV::Converters[:date_time][rfc3339_string])
+ end
end
diff --git a/test/csv/test_encodings.rb b/test/csv/test_encodings.rb
index 8d228c05f3..f08d551f69 100644
--- a/test/csv/test_encodings.rb
+++ b/test/csv/test_encodings.rb
@@ -288,6 +288,37 @@ class TestCSVEncodings < Test::Unit::TestCase
error.message)
end
+ def test_string_input_transcode
+ # U+3042 HIRAGANA LETTER A
+ # U+3044 HIRAGANA LETTER I
+ # U+3046 HIRAGANA LETTER U
+ value = "\u3042\u3044\u3046"
+ csv = CSV.new(value, encoding: "UTF-8:EUC-JP")
+ assert_equal([[value.encode("EUC-JP")]],
+ csv.read)
+ end
+
+ def test_string_input_set_encoding_string
+ # U+3042 HIRAGANA LETTER A
+ # U+3044 HIRAGANA LETTER I
+ # U+3046 HIRAGANA LETTER U
+ value = "\u3042\u3044\u3046".encode("EUC-JP")
+ csv = CSV.new(value.dup.force_encoding("UTF-8"), encoding: "EUC-JP")
+ assert_equal([[value.encode("EUC-JP")]],
+ csv.read)
+ end
+
+ def test_string_input_set_encoding_encoding
+ # U+3042 HIRAGANA LETTER A
+ # U+3044 HIRAGANA LETTER I
+ # U+3046 HIRAGANA LETTER U
+ value = "\u3042\u3044\u3046".encode("EUC-JP")
+ csv = CSV.new(value.dup.force_encoding("UTF-8"),
+ encoding: Encoding.find("EUC-JP"))
+ assert_equal([[value.encode("EUC-JP")]],
+ csv.read)
+ end
+
private
def assert_parses(fields, encoding, **options)