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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
require "spec"
require "csv"
private def new_csv(headers = false, strip = false)
CSV.new %(one, two\n1, 2\n3, 4\n5), headers: headers, strip: strip
end
describe CSV do
it "gets headers" do
csv = new_csv headers: true
csv.headers.should eq(%w(one two))
end
it "works without headers" do
csv = CSV.new("", headers: true)
csv.headers.should be_empty
end
it "raises if trying to access before first row" do
csv = new_csv headers: true
expect_raises(CSV::Error, "Before first row") do
csv["one"]
end
end
it "gets row values with string" do
csv = new_csv headers: true
csv.next.should be_true
csv["one"].should eq("1")
csv["two"].should eq(" 2")
expect_raises(KeyError) { csv["three"] }
csv["one"]?.should eq("1")
csv["three"]?.should be_nil
csv.next.should be_true
csv["one"].should eq("3")
csv.next.should be_true
csv["one"].should eq("5")
csv["two"].should eq("")
csv.next.should be_false
expect_raises(CSV::Error, "After last row") do
csv["one"]
end
end
it "gets row values with integer" do
csv = new_csv headers: true
csv.next.should be_true
csv[0].should eq("1")
csv[1].should eq(" 2")
expect_raises(IndexError) do
csv[2]
end
csv[-1].should eq(" 2")
csv[-2].should eq("1")
csv.next
csv.next
csv[0].should eq("5")
csv[1].should eq("")
csv[-2].should eq("5")
csv[-1].should eq("")
end
it "gets row values with regex" do
csv = new_csv headers: true
csv.next.should be_true
csv[/on/].should eq("1")
csv[/tw/].should eq(" 2")
expect_raises(KeyError) do
csv[/foo/]
end
end
it "gets current row" do
csv = new_csv headers: true
csv.next.should be_true
row = csv.row
row["one"].should eq("1")
row[1].should eq(" 2")
row[/on/].should eq("1")
row.size.should eq(2)
row.to_a.should eq(["1", " 2"])
row.to_h.should eq({"one" => "1", "two" => " 2"})
end
it "strips" do
csv = new_csv headers: true, strip: true
csv.next.should be_true
csv["one"].should eq("1")
csv["two"].should eq("2")
csv.row.to_a.should eq(%w(1 2))
csv.row.to_h.should eq({"one" => "1", "two" => "2"})
end
it "works without headers" do
csv = new_csv headers: false
csv.next.should be_true
csv[0].should eq("one")
end
it "can do each" do
csv = new_csv headers: true
csv.each do
csv["one"].should eq("1")
break
end.should be_nil
end
it "can do new with block" do
CSV.new(%(one, two\n1, 2\n3, 4\n5), headers: true, strip: true) do |csv|
csv["one"].should eq("1")
csv["two"].should eq("2")
break
end
end
it "returns a Tuple(String, String) for current row with indices" do
CSV.new("John,20\nPeter,30") do |csv|
csv.values_at(0, -1).should eq({"John", "20"})
break
end
end
it "returns a Tuple(String, String) for current row with headers" do
CSV.new("Name,Age\nJohn,20\nPeter,30", headers: true) do |csv|
csv.values_at("Name", "Age").should eq({"John", "20"})
break
end
end
it "returns a Tuple(String, String) for this row with indices" do
CSV.new("John,20\nPeter,30") do |csv|
csv.row.values_at(0, -1).should eq({"John", "20"})
break
end
end
it "returns a Tuple(String, String) for this row with headers" do
CSV.new("Name,Age\nJohn,20\nPeter,30", headers: true) do |csv|
csv.row.values_at("Name", "Age").should eq({"John", "20"})
break
end
end
describe "rewind" do
describe "string based" do
it "without headers" do
csv = CSV.new("one,two\nthree,four", headers: false)
csv.next
csv.row.to_a.should eq(%w(one two))
csv.next
csv.row.to_a.should eq(%w(three four))
csv.rewind
csv.next
csv.row.to_a.should eq(%w(one two))
end
it "with headers" do
csv = CSV.new("one,two\nthree,four\nfive,six", headers: true)
csv.next
csv.row.to_h.should eq({"one" => "three", "two" => "four"})
csv.next
csv.row.to_h.should eq({"one" => "five", "two" => "six"})
csv.rewind
csv.next
csv.row.to_h.should eq({"one" => "three", "two" => "four"})
end
end
describe "IO based" do
it "without headers" do
csv = CSV.new(IO::Memory.new("one,two\nthree,four"), headers: false)
csv.next
csv.row.to_a.should eq(%w(one two))
csv.next
csv.row.to_a.should eq(%w(three four))
csv.rewind
csv.next
csv.row.to_a.should eq(%w(one two))
end
it "with headers" do
csv = CSV.new(IO::Memory.new("one,two\nthree,four\nfive,six"), headers: true)
csv.next
csv.row.to_h.should eq({"one" => "three", "two" => "four"})
csv.next
csv.row.to_h.should eq({"one" => "five", "two" => "six"})
csv.rewind
csv.next
csv.row.to_h.should eq({"one" => "three", "two" => "four"})
end
end
end
end
|