123456789_123456789_123456789_123456789_123456789_

Class: Test::Unit::Data::ClassMethods::Loader

Relationships & Source Files
Inherits: Object
Defined in: lib/test/unit/data.rb

Class Method Summary

Instance Method Summary

Constructor Details

.new(test_case) ⇒ Loader

This method is for internal use only.
[ GitHub ]

  
# File 'lib/test/unit/data.rb', line 97

def initialize(test_case)
  @test_case = test_case
end

Instance Method Details

#load(file_name)

This method is for internal use only.

Load data from file.

Parameters:

  • file_name (String)

    full path to test data file. File format is automatically detected from filename extension.

Raises:

  • (ArgumentError)

    if file_name is not supported file format.

See Also:

[ GitHub ]

  
# File 'lib/test/unit/data.rb', line 109

def load(file_name)
  case File.extname(file_name).downcase
  when ".csv"
    load_csv(file_name)
  when ".tsv"
    load_tsv(file_name)
  else
    raise ArgumentError, "unsupported file format: <#{file_name}>"
  end
end

#load_csv(file_name)

This method is for internal use only.

Load data from CSV file.

There are 2 types of CSV file as following examples. First, there is a header on first row and it's first column is “label”. Another, there is no header in the file.

Examples:

Load data from CSV file with header

# test-data.csv:
#  label,expected,target
#  empty string,true,""
#  plain string,false,hello
#
load_data("/path/to/test-data.csv")
def test_empty?(data)
  assert_equal(data["expected"], data["target"].empty?)
end

Load data from CSV file without header

# test-data-without-header.csv:
#  empty string,true,""
#  plain string,false,hello
#
load_data("/path/to/test-data-without-header.csv")
def test_empty?(data)
  expected, target = data
  assert_equal(expected, target.empty?)
end
[ GitHub ]

  
# File 'lib/test/unit/data.rb', line 149

def load_csv(file_name)
  require 'csv'
  first_row = true
  header = nil
  CSV.foreach(file_name) do |row|
    if first_row
      first_row = false
      if row.first == "label"
        header = row[1..-1]
        next
      end
    end

    set_test_data(header, row)
  end
end

#load_tsv(file_name)

This method is for internal use only.

Load data from TSV file.

There are 2 types of TSV file as following examples. First, there is a header on first row and it's first column is “label”. Another, there is no header in the file.

Examples:

Load data from TSV file with header

# test-data.tsv:
#  label	expected	target
#  empty string	true	""
#  plain string	false	hello
#
load_data("/path/to/test-data.tsv")
def test_empty?(data)
  assert_equal(data["expected"], data["target"].empty?)
end

Load data from TSV file without header

# test-data-without-header.tsv:
#  empty string	true	""
#  plain string	false	hello
#
load_data("/path/to/test-data-without-header.tsv")
def test_empty?(data)
  expected, target = data
  assert_equal(expected, target.empty?)
end
[ GitHub ]

  
# File 'lib/test/unit/data.rb', line 195

def load_tsv(file_name)
  require "csv"
  if CSV.const_defined?(:VERSION)
    first_row = true
    header = nil
    CSV.foreach(file_name, :col_sep => "\t") do |row|
      if first_row
        first_row = false
        if row.first == "label"
          header = row[1..-1]
          next
        end
      end

      set_test_data(header, row)
    end
  else
    # for old CSV library
    first_row = true
    header = nil
    CSV.open(file_name, "r", "\t") do |row|
      if first_row
        first_row = false
        if row.first == "label"
          header = row[1..-1]
          next
        end
      end

      set_test_data(header, row)
    end
  end
end

#normalize_value(value) (private)

[ GitHub ]

  
# File 'lib/test/unit/data.rb', line 230

def normalize_value(value)
  return true if value == "true"
  return false if value == "false"
  begin
    Integer(value)
  rescue ArgumentError
    begin
      Float(value)
    rescue ArgumentError
      value
    end
  end
end

#set_test_data(header, row) (private)

[ GitHub ]

  
# File 'lib/test/unit/data.rb', line 244

def set_test_data(header, row)
  label = row.shift
  if header
    data = {}
    header.each_with_index do |key, i|
      data[key] = normalize_value(row[i])
    end
  else
    data = row.collect do |cell|
      normalize_value(cell)
    end
  end
  @test_case.data(label, data)
end