class Test::Unit::Data::ClassMethods::Loader

Public Class Methods

new(test_case) click to toggle source

@api private

# File lib/test/unit/data.rb, line 206
def initialize(test_case)
  @test_case = test_case
end

Public Instance Methods

load(file_name) click to toggle source

Load data from file.

@param [String] file_name full path to test data file.

File format is automatically detected from filename extension.

@raise [ArgumentError] if file_name is not supported file format. @see load_csv @see load_tsv @api private

# File lib/test/unit/data.rb, line 218
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) click to toggle source

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.

@example 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

@example 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

@api private

# File lib/test/unit/data.rb, line 258
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) click to toggle source

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.

@example 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

@example 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

@api private

# File lib/test/unit/data.rb, line 304
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

Private Instance Methods

normalize_value(value) click to toggle source
# File lib/test/unit/data.rb, line 339
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) click to toggle source
# File lib/test/unit/data.rb, line 353
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