summaryrefslogtreecommitdiff
path: root/test/csv/parse/test_convert.rb
blob: bfe6ddd527c2bac23edee5c1dce09c7f9486440a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# -*- coding: utf-8 -*-
# frozen_string_literal: false

require_relative "../helper"

class TestCSVParseConvert < Test::Unit::TestCase
  extend DifferentOFS

  def setup
    super
    @data   = "Numbers,:integer,1,:float,3.015"
    @parser = CSV.new(@data)

    @custom = lambda {|field| /\A:(\S.*?)\s*\Z/ =~ field ? $1.to_sym : field}

    @time = Time.utc(2018, 12, 30, 6, 41, 29)
    @windows_safe_time_data = @time.strftime("%a %b %d %H:%M:%S %Y")
  end

  def test_integer
    @parser.convert(:integer)
    assert_equal(["Numbers", ":integer", 1, ":float", "3.015"],
                 @parser.shift)
  end

  def test_float
    @parser.convert(:float)
    assert_equal(["Numbers", ":integer", 1.0, ":float", 3.015],
                 @parser.shift)
  end

  def test_float_integer
    @parser.convert(:float)
    @parser.convert(:integer)
    assert_equal(["Numbers", ":integer", 1.0, ":float", 3.015],
                 @parser.shift)
  end

  def test_integer_float
    @parser.convert(:integer)
    @parser.convert(:float)
    assert_equal(["Numbers", ":integer", 1, ":float", 3.015],
                 @parser.shift)
  end

  def test_numberic
    @parser.convert(:numeric)
    assert_equal(["Numbers", ":integer", 1, ":float", 3.015],
                 @parser.shift)
  end

  def test_all
    @data   << ",#{@windows_safe_time_data}"
    @parser =  CSV.new(@data)
    @parser.convert(:all)
    assert_equal(["Numbers", ":integer", 1, ":float", 3.015, @time.to_datetime],
                 @parser.shift)
  end

  def test_custom
    @parser.convert do |field|
      /\A:(\S.*?)\s*\Z/ =~ field ? $1.to_sym : field
    end
    assert_equal(["Numbers", :integer, "1", :float, "3.015"],
                 @parser.shift)
  end

  def test_builtin_custom
    @parser.convert(:numeric)
    @parser.convert(&@custom)
    assert_equal(["Numbers", :integer, 1, :float, 3.015],
                 @parser.shift)
  end

  def test_custom_field_info_line
    @parser.convert do |field, info|
      assert_equal(1, info.line)
      info.index == 4 ? Float(field).floor : field
    end
    assert_equal(["Numbers", ":integer", "1", ":float", 3],
                 @parser.shift)
  end

  def test_custom_field_info_header
    headers = ["one", "two", "three", "four", "five"]
    @parser = CSV.new(@data, headers: headers)
    @parser.convert do |field, info|
      info.header == "three" ? Integer(field) * 100 : field
    end
    assert_equal(CSV::Row.new(headers,
                              ["Numbers", ":integer", 100, ":float", "3.015"]),
                 @parser.shift)
  end

  def test_custom_blank_field
    converter = lambda {|field| field.nil?}
    row = CSV.parse_line('nil,', converters: converter)
    assert_equal([false, true], row)
  end

  def test_nil_value
    assert_equal(["nil", "", "a"],
                 CSV.parse_line(',"",a', nil_value: "nil"))
  end

  def test_empty_value
    assert_equal([nil, "empty", "a"],
                 CSV.parse_line(',"",a', empty_value: "empty"))
  end
end