File: data.rb

package info (click to toggle)
ruby-test-unit 2.5.0-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 772 kB
  • sloc: ruby: 11,397; makefile: 6
file content (80 lines) | stat: -rw-r--r-- 2,021 bytes parent folder | download
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
module Test
  module Unit
    module Data
      class << self
        def included(base)
          base.extend(ClassMethods)
        end
      end

      module ClassMethods
        # TODO: WRITE ME.
        def data(*arguments, &block)
          n_arguments = arguments.size
          case n_arguments
          when 0
            data_set = block
          when 1
            data_set = arguments[0]
          when 2
            data_set = {arguments[0] => arguments[1]}
          else
            message = "wrong number arguments(#{n_arguments} for 1..2)"
            raise ArgumentError, message
          end
          current_data = current_attribute(:data)[:value] || []
          attribute(:data, current_data + [data_set])
        end

        # TODO: WRITE ME.
        def load_data(file_name)
          case file_name
          when /\.csv/i
            loader = CSVDataLoader.new(self)
            loader.load(file_name)
          else
            raise ArgumentError, "unsupported file format: <#{file_name}>"
          end
        end

        class CSVDataLoader
          def initialize(test_case)
            @test_case = test_case
          end

          def load(file_name)
            require 'csv'
            header = nil
            CSV.foreach(file_name) do |row|
              if header.nil?
                header = row
                next
              end
              label = nil
              data = {}
              header.each_with_index do |key, i|
                if key == "label"
                  label = row[i]
                else
                  data[key] = normalize_value(row[i])
                end
              end
              @test_case.data(label, data)
            end
          end

          private
          def normalize_value(value)
            Integer(value)
          rescue ArgumentError
            begin
              Float(value)
            rescue ArgumentError
              value
            end
          end
        end
      end
    end
  end
end