123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- #!/usr/local/bin/ruby -w
- # tc_headers.rb
- #
- # Created by James Edward Gray II on 2006-02-25.
- # Copyright 2012 Gray Productions. All rights reserved.
- require "test/unit"
- require "faster_csv"
- class TestFasterCSVHeaders < Test::Unit::TestCase
- def setup
- @data = <<-END_CSV.gsub(/^\s+/, "")
- first,second,third
- A,B,C
- 1,2,3
- END_CSV
- end
-
- def test_first_row
- [:first_row, true].each do |setting| # two names for the same setting
- # activate headers
- csv = nil
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => setting)
- end
- # first data row - skipping headers
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{first A}, %w{second B}, %w{third C}], row.to_a)
- # second data row
- row = csv[1]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{first 1}, %w{second 2}, %w{third 3}], row.to_a)
- # empty
- assert_nil(csv[2])
- end
- end
-
- def test_array_of_headers
- # activate headers
- csv = nil
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => [:my, :new, :headers])
- end
- # first data row - skipping headers
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal( [[:my, "first"], [:new, "second"], [:headers, "third"]],
- row.to_a )
- # second data row
- row = csv[1]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([[:my, "A"], [:new, "B"], [:headers, "C"]], row.to_a)
- # third data row
- row = csv[2]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([[:my, "1"], [:new, "2"], [:headers, "3"]], row.to_a)
- # empty
- assert_nil(csv[3])
-
- # with return and convert
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => [:my, :new, :headers],
- :return_headers => true,
- :header_converters => lambda { |h| h.to_s } )
- end
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal( [["my", :my], ["new", :new], ["headers", :headers]],
- row.to_a )
- assert(row.header_row?)
- assert(!row.field_row?)
- end
-
- def test_csv_header_string
- # activate headers
- csv = nil
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => "my,new,headers")
- end
- # first data row - skipping headers
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{my first}, %w{new second}, %w{headers third}], row.to_a)
- # second data row
- row = csv[1]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{my A}, %w{new B}, %w{headers C}], row.to_a)
- # third data row
- row = csv[2]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{my 1}, %w{new 2}, %w{headers 3}], row.to_a)
- # empty
- assert_nil(csv[3])
-
- # with return and convert
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => "my,new,headers",
- :return_headers => true,
- :header_converters => :symbol )
- end
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal( [[:my, "my"], [:new, "new"], [:headers, "headers"]],
- row.to_a )
- assert(row.header_row?)
- assert(!row.field_row?)
- end
-
- def test_csv_header_string_inherits_separators
- # parse with custom col_sep
- csv = nil
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse( @data.tr(",", "|"), :col_sep => "|",
- :headers => "my|new|headers" )
- end
- # verify headers were recognized
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{my first}, %w{new second}, %w{headers third}], row.to_a)
- end
-
- def test_return_headers
- # activate headers and request they are returned
- csv = nil
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => true, :return_headers => true)
- end
- # header row
- row = csv[0]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal( [%w{first first}, %w{second second}, %w{third third}],
- row.to_a )
- assert(row.header_row?)
- assert(!row.field_row?)
- # first data row - skipping headers
- row = csv[1]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{first A}, %w{second B}, %w{third C}], row.to_a)
- assert(!row.header_row?)
- assert(row.field_row?)
- # second data row
- row = csv[2]
- assert_not_nil(row)
- assert_instance_of(FasterCSV::Row, row)
- assert_equal([%w{first 1}, %w{second 2}, %w{third 3}], row.to_a)
- assert(!row.header_row?)
- assert(row.field_row?)
- # empty
- assert_nil(csv[3])
- end
-
- def test_converters
- # create test data where headers and fields look alike
- data = <<-END_MATCHING_CSV.gsub(/^\s+/, "")
- 1,2,3
- 1,2,3
- END_MATCHING_CSV
-
- # normal converters do not affect headers
- csv = FasterCSV.parse( data, :headers => true,
- :return_headers => true,
- :converters => :numeric )
- assert_equal([%w{1 1}, %w{2 2}, %w{3 3}], csv[0].to_a)
- assert_equal([["1", 1], ["2", 2], ["3", 3]], csv[1].to_a)
- assert_nil(csv[2])
-
- # header converters do affect headers (only)
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse( data, :headers => true,
- :return_headers => true,
- :converters => :numeric,
- :header_converters => :symbol )
- end
- assert_equal([[:"1", "1"], [:"2", "2"], [:"3", "3"]], csv[0].to_a)
- assert_equal([[:"1", 1], [:"2", 2], [:"3", 3]], csv[1].to_a)
- assert_nil(csv[2])
- end
-
- def test_builtin_downcase_converter
- csv = FasterCSV.parse( "One,TWO Three", :headers => true,
- :return_headers => true,
- :header_converters => :downcase )
- assert_equal(%w{one two\ three}, csv.headers)
- end
-
- def test_builtin_symbol_converter
- csv = FasterCSV.parse( "One,TWO Three", :headers => true,
- :return_headers => true,
- :header_converters => :symbol )
- assert_equal([:one, :two_three], csv.headers)
- end
-
- def test_custom_converter
- converter = lambda { |header| header.tr(" ", "_") }
- csv = FasterCSV.parse( "One,TWO Three",
- :headers => true,
- :return_headers => true,
- :header_converters => converter )
- assert_equal(%w{One TWO_Three}, csv.headers)
- end
-
- def test_table_support
- csv = nil
- assert_nothing_raised(Exception) do
- csv = FasterCSV.parse(@data, :headers => true)
- end
-
- assert_instance_of(FasterCSV::Table, csv)
- end
-
- def test_skip_blanks
- @data = <<-END_CSV.gsub(/^ +/, "")
-
- A,B,C
-
- 1,2,3
-
-
-
- END_CSV
-
- expected = [%w[1 2 3]]
- FasterCSV.parse(@data, :headers => true, :skip_blanks => true) do |row|
- assert_equal(expected.shift, row.fields)
- end
-
- expected = [%w[A B C], %w[1 2 3]]
- FasterCSV.parse( @data,
- :headers => true,
- :return_headers => true,
- :skip_blanks => true ) do |row|
- assert_equal(expected.shift, row.fields)
- end
- end
-
- def test_blank_row_bug_fix
- @data += "\n#{@data}" # add a blank row
-
- # ensure that everything returned is a Row object
- FasterCSV.parse(@data, :headers => true) do |row|
- assert_instance_of(FasterCSV::Row, row)
- end
- end
- end
|