PageRenderTime 52ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.8/csv/test_csv.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 1753 lines | 1674 code | 72 blank | 7 comment | 1 complexity | b3c61b3961a24aba469059086232af93 MD5 | raw file
  1. require 'test/unit'
  2. require 'tempfile'
  3. require 'fileutils'
  4. require 'csv'
  5. class CSV
  6. class StreamBuf
  7. # Let buffer work hard.
  8. remove_const("BufSize")
  9. BufSize = 2
  10. end
  11. end
  12. module CSVTestSupport
  13. def d(data)
  14. data
  15. end
  16. end
  17. class TestCSV < Test::Unit::TestCase
  18. file = Tempfile.new("crlf")
  19. file << "\n"
  20. file.open
  21. file.binmode
  22. RSEP = file.read
  23. file.close
  24. include CSVTestSupport
  25. class << self
  26. include CSVTestSupport
  27. end
  28. @@simpleCSVData = {
  29. [nil] => '',
  30. [''] => '""',
  31. [nil, nil] => ',',
  32. [nil, nil, nil] => ',,',
  33. ['foo'] => 'foo',
  34. [','] => '","',
  35. [',', ','] => '",",","',
  36. [';'] => ';',
  37. [';', ';'] => ';,;',
  38. ["\"\r", "\"\r"] => "\"\"\"\r\",\"\"\"\r\"",
  39. ["\"\n", "\"\n"] => "\"\"\"\n\",\"\"\"\n\"",
  40. ["\t"] => "\t",
  41. ["\t", "\t"] => "\t,\t",
  42. ['foo', 'bar'] => 'foo,bar',
  43. ['foo', '"bar"', 'baz'] => 'foo,"""bar""",baz',
  44. ['foo', 'foo,bar', 'baz'] => 'foo,"foo,bar",baz',
  45. ['foo', '""', 'baz'] => 'foo,"""""",baz',
  46. ['foo', '', 'baz'] => 'foo,"",baz',
  47. ['foo', nil, 'baz'] => 'foo,,baz',
  48. [nil, 'foo', 'bar'] => ',foo,bar',
  49. ['foo', 'bar', nil] => 'foo,bar,',
  50. ['foo', "\r", 'baz'] => "foo,\"\r\",baz",
  51. ['foo', "\n", 'baz'] => "foo,\"\n\",baz",
  52. ['foo', "\r\n\r", 'baz'] => "foo,\"\r\n\r\",baz",
  53. ['foo', "\r\n", 'baz'] => "foo,\"\r\n\",baz",
  54. ['foo', "\r.\n", 'baz'] => "foo,\"\r.\n\",baz",
  55. ['foo', "\r\n\n", 'baz'] => "foo,\"\r\n\n\",baz",
  56. ['foo', '"', 'baz'] => 'foo,"""",baz',
  57. }
  58. @@fullCSVData = {
  59. [d(nil)] => '',
  60. [d('')] => '""',
  61. [d(nil), d(nil)] => ',',
  62. [d(nil), d(nil), d(nil)] => ',,',
  63. [d('foo')] => 'foo',
  64. [d('foo'), d('bar')] => 'foo,bar',
  65. [d('foo'), d('"bar"'), d('baz')] => 'foo,"""bar""",baz',
  66. [d('foo'), d('foo,bar'), d('baz')] => 'foo,"foo,bar",baz',
  67. [d('foo'), d('""'), d('baz')] => 'foo,"""""",baz',
  68. [d('foo'), d(''), d('baz')] => 'foo,"",baz',
  69. [d('foo'), d(nil), d('baz')] => 'foo,,baz',
  70. [d('foo'), d("\r"), d('baz')] => "foo,\"\r\",baz",
  71. [d('foo'), d("\n"), d('baz')] => "foo,\"\n\",baz",
  72. [d('foo'), d("\r\n"), d('baz')] => "foo,\"\r\n\",baz",
  73. [d('foo'), d("\r.\n"), d('baz')] => "foo,\"\r.\n\",baz",
  74. [d('foo'), d("\r\n\n"), d('baz')] => "foo,\"\r\n\n\",baz",
  75. [d('foo'), d('"'), d('baz')] => 'foo,"""",baz',
  76. }
  77. @@fullCSVDataArray = @@fullCSVData.collect { |key, value| key }
  78. def ssv2csv(ssvStr, row_sep = nil)
  79. sepConv(ssvStr, ?;, ?,, row_sep)
  80. end
  81. def csv2ssv(csvStr, row_sep = nil)
  82. sepConv(csvStr, ?,, ?;, row_sep)
  83. end
  84. def tsv2csv(tsvStr, row_sep = nil)
  85. sepConv(tsvStr, ?\t, ?,, row_sep)
  86. end
  87. def csv2tsv(csvStr, row_sep = nil)
  88. sepConv(csvStr, ?,, ?\t, row_sep)
  89. end
  90. def sepConv(srcStr, srcSep, destSep, row_sep = nil)
  91. rows = []
  92. cols, idx = CSV.parse_row(srcStr, 0, rows, srcSep, row_sep)
  93. destStr = ''
  94. cols = CSV.generate_row(rows, rows.size, destStr, destSep, row_sep)
  95. destStr
  96. end
  97. public
  98. def setup
  99. @tmpdir = File.join(Dir.tmpdir, "ruby_test_csv_tmp_#{$$}")
  100. Dir.mkdir(@tmpdir)
  101. @infile = File.join(@tmpdir, 'in.csv')
  102. @infiletsv = File.join(@tmpdir, 'in.tsv')
  103. @emptyfile = File.join(@tmpdir, 'empty.csv')
  104. @outfile = File.join(@tmpdir, 'out.csv')
  105. @bomfile = File.join(@tmpdir, "bom.csv")
  106. @macfile = File.join(@tmpdir, "mac.csv")
  107. CSV.open(@infile, "wb") do |writer|
  108. @@fullCSVDataArray.each do |row|
  109. writer.add_row(row)
  110. end
  111. end
  112. CSV.open(@infiletsv, "wb", ?\t) do |writer|
  113. @@fullCSVDataArray.each do |row|
  114. writer.add_row(row)
  115. end
  116. end
  117. CSV.generate(@emptyfile) do |writer|
  118. # Create empty file.
  119. end
  120. File.open(@bomfile, "wb") do |f|
  121. f.write("\357\273\277\"foo\"\r\n\"bar\"\r\n")
  122. end
  123. File.open(@macfile, "wb") do |f|
  124. f.write("\"Avenches\",\"aus Umgebung\"\r\"Bad Hersfeld\",\"Ausgrabung\"")
  125. end
  126. end
  127. def teardown
  128. FileUtils.rm_rf(@tmpdir)
  129. end
  130. #### CSV::Reader unit test
  131. def test_Reader_each
  132. file = File.open(@infile, "rb")
  133. begin
  134. reader = CSV::Reader.create(file)
  135. expectedArray = @@fullCSVDataArray.dup
  136. first = true
  137. ret = reader.each { |row|
  138. if first
  139. assert_instance_of(Array, row)
  140. first = false
  141. end
  142. expected = expectedArray.shift
  143. assert_equal(expected, row)
  144. }
  145. assert_nil(ret, "Return is nil")
  146. assert(expectedArray.empty?)
  147. ensure
  148. file.close
  149. end
  150. # Illegal format.
  151. reader = CSV::Reader.create("a,b\r\na,b,\"c\"\ra")
  152. assert_raises(CSV::IllegalFormatError) do
  153. reader.each do |row|
  154. end
  155. end
  156. reader = CSV::Reader.create("a,b\r\n\"")
  157. assert_raises(CSV::IllegalFormatError) do
  158. reader.each do |row|
  159. end
  160. end
  161. end
  162. def test_Reader_shift
  163. file = File.open(@infile, "rb")
  164. begin
  165. reader = CSV::Reader.create(file)
  166. first = true
  167. checked = 0
  168. @@fullCSVDataArray.each do |expected|
  169. actual = reader.shift
  170. if first
  171. assert_instance_of(Array, actual)
  172. first = false
  173. end
  174. assert_equal(expected, actual)
  175. checked += 1
  176. end
  177. assert(checked == @@fullCSVDataArray.size)
  178. ensure
  179. file.close
  180. end
  181. # Illegal format.
  182. reader = CSV::Reader.create("a,b\r\na,b,\"c\"\ra")
  183. assert_raises(CSV::IllegalFormatError) do
  184. reader.shift
  185. reader.shift
  186. end
  187. reader = CSV::Reader.create("a,b\r\na,b,\"c\"\ra")
  188. assert_raises(CSV::IllegalFormatError) do
  189. reader.shift
  190. reader.shift
  191. end
  192. end
  193. def test_Reader_getRow
  194. if CSV::Reader.respond_to?(:allocate)
  195. obj = CSV::Reader.allocate
  196. assert_raises(NotImplementedError) do
  197. row = []
  198. obj.shift
  199. end
  200. end
  201. end
  202. def test_IOReader_close_on_terminate
  203. f = File.open(@infile, "r")
  204. reader = CSV::IOReader.create(f)
  205. reader.close
  206. assert(!f.closed?)
  207. f.close
  208. f = File.open(@infile, "r")
  209. writer = CSV::IOReader.create(f)
  210. writer.close_on_terminate
  211. writer.close
  212. assert(f.closed?)
  213. end
  214. def test_Reader_close
  215. f = File.open(@infile, "r")
  216. reader = CSV::IOReader.create(f)
  217. reader.close_on_terminate
  218. reader.close
  219. assert(f.closed?)
  220. end
  221. def test_Reader_s_new
  222. assert_raises(RuntimeError) do
  223. CSV::Reader.new(nil)
  224. end
  225. end
  226. def test_Reader_s_create
  227. reader = CSV::Reader.create("abc")
  228. assert_instance_of(CSV::StringReader, reader, "With a String")
  229. file = File.open(@infile, "rb")
  230. reader = CSV::Reader.create(file)
  231. assert_instance_of(CSV::IOReader, reader, 'With an IO')
  232. obj = Object.new
  233. def obj.sysread(size)
  234. "abc"
  235. end
  236. def obj.read(size)
  237. "abc"
  238. end
  239. reader = CSV::Reader.create(obj)
  240. assert_instance_of(CSV::IOReader, reader, "With not an IO or String")
  241. # No need to test Tempfile because it's a pseudo IO. I test this here
  242. # fors other tests.
  243. reader = CSV::Reader.create(Tempfile.new("in.csv"))
  244. assert_instance_of(CSV::IOReader, reader, "With an pseudo IO.")
  245. file.close
  246. end
  247. def test_IOReader_s_create_binmode
  248. file = File.open(@outfile, "wb")
  249. file << "\"\r\n\",\"\r\",\"\n\"\r1,2,3"
  250. file.close
  251. file = File.open(@outfile, "rb")
  252. begin
  253. reader = CSV::IOReader.new(file, ?,, ?\r)
  254. assert_equal(["\r\n", "\r", "\n"], reader.shift.to_a)
  255. assert_equal(["1", "2", "3"], reader.shift.to_a)
  256. reader.close
  257. ensure
  258. file.close
  259. end
  260. file = File.open(@outfile, "r") # not "rb"
  261. begin
  262. lfincell = (RSEP == "\n" ? "\r\n" : "\n")
  263. reader = CSV::IOReader.new(file, ?,, ?\r)
  264. assert_equal([lfincell, "\r", "\n"], reader.shift.to_a)
  265. assert_equal(["1", "2", "3"], reader.shift.to_a)
  266. reader.close
  267. ensure
  268. file.close
  269. end
  270. end
  271. def test_Reader_s_parse
  272. ret = CSV::Reader.parse("a,b,c") { |row|
  273. assert_instance_of(Array, row, "Block parameter")
  274. }
  275. assert_nil(ret, "Return is nil")
  276. ret = CSV::Reader.parse("a;b;c", ?;) { |row|
  277. assert_instance_of(Array, row, "Block parameter")
  278. }
  279. file = Tempfile.new("in.csv")
  280. file << "a,b,c"
  281. file.open
  282. ret = CSV::Reader.parse(file) { |row|
  283. assert_instance_of(Array, row, "Block parameter")
  284. }
  285. assert_nil(ret, "Return is nil")
  286. file = Tempfile.new("in.csv")
  287. file << "a,b,c"
  288. file.open
  289. ret = CSV::Reader.parse(file, ?,) { |row|
  290. assert_instance_of(Array, row, "Block parameter")
  291. }
  292. # Illegal format.
  293. assert_raises(CSV::IllegalFormatError) do
  294. CSV::Reader.parse("a,b\r\na,b,\"c\"\ra") do |row|
  295. end
  296. end
  297. assert_raises(CSV::IllegalFormatError) do
  298. CSV::Reader.parse("a,b\r\na,b\"") do |row|
  299. end
  300. end
  301. end
  302. #### CSV::Writer unit test
  303. def test_Writer_s_new
  304. assert_raises(RuntimeError) do
  305. CSV::Writer.new(nil)
  306. end
  307. end
  308. def test_Writer_s_generate
  309. ret = CSV::Writer.generate(STDOUT) { |writer|
  310. assert_instance_of(CSV::BasicWriter, writer, "Block parameter")
  311. }
  312. ret = CSV::Writer.generate(STDOUT, ?;) { |writer|
  313. assert_instance_of(CSV::BasicWriter, writer, "Block parameter")
  314. }
  315. assert_nil(ret, "Return is nil")
  316. end
  317. def test_Writer_s_create
  318. writer = CSV::Writer.create(STDERR)
  319. assert_instance_of(CSV::BasicWriter, writer, "String")
  320. writer = CSV::Writer.create(STDERR, ?;)
  321. assert_instance_of(CSV::BasicWriter, writer, "String")
  322. writer = CSV::Writer.create(Tempfile.new("out.csv"))
  323. assert_instance_of(CSV::BasicWriter, writer, "IO")
  324. end
  325. def test_Writer_LSHIFT # '<<'
  326. file = Tempfile.new("out.csv")
  327. CSV::Writer.generate(file) do |writer|
  328. ret = writer << ['a', 'b', 'c']
  329. assert_instance_of(CSV::BasicWriter, ret, 'Return is self')
  330. writer << [nil, 'e', 'f'] << [nil, nil, '']
  331. end
  332. file.open
  333. file.binmode
  334. str = file.read
  335. assert_equal("a,b,c#{RSEP},e,f#{RSEP},,\"\"#{RSEP}", str, 'Normal')
  336. file = Tempfile.new("out2.csv")
  337. CSV::Writer.generate(file) do |writer|
  338. ret = writer << [d('a'), d('b'), d('c')]
  339. assert_instance_of(CSV::BasicWriter, ret, 'Return is self')
  340. writer << [d(nil), d('e'), d('f')] << [d(nil), d(nil), d('')]
  341. end
  342. file.open
  343. file.binmode
  344. str = file.read
  345. assert_equal("a,b,c#{RSEP},e,f#{RSEP},,\"\"#{RSEP}", str, 'Normal')
  346. end
  347. def test_Writer_add_row
  348. file = Tempfile.new("out.csv")
  349. CSV::Writer.generate(file) do |writer|
  350. ret = writer.add_row(
  351. [d('a'), d('b'), d('c')])
  352. assert_instance_of(CSV::BasicWriter, ret, 'Return is self')
  353. writer.add_row(
  354. [d(nil), d('e'), d('f')]
  355. ).add_row(
  356. [d(nil), d(nil), d('')]
  357. )
  358. end
  359. file.open
  360. file.binmode
  361. str = file.read
  362. assert_equal("a,b,c#{RSEP},e,f#{RSEP},,\"\"#{RSEP}", str, 'Normal')
  363. end
  364. def test_Writer_close
  365. f = File.open(@outfile, "w")
  366. writer = CSV::BasicWriter.create(f)
  367. writer.close_on_terminate
  368. writer.close
  369. assert(f.closed?)
  370. end
  371. def test_BasicWriter_close_on_terminate
  372. f = File.open(@outfile, "w")
  373. writer = CSV::BasicWriter.create(f)
  374. writer.close
  375. assert(!f.closed?)
  376. f.close
  377. f = File.open(@outfile, "w")
  378. writer = CSV::BasicWriter.new(f)
  379. writer.close_on_terminate
  380. writer.close
  381. assert(f.closed?)
  382. end
  383. def test_BasicWriter_s_create_binmode
  384. file = File.open(@outfile, "w") # not "wb"
  385. begin
  386. writer = CSV::BasicWriter.new(file, ?,, ?\r)
  387. writer << ["\r\n", "\r", "\n"]
  388. writer << ["1", "2", "3"]
  389. writer.close
  390. ensure
  391. file.close
  392. end
  393. file = File.open(@outfile, "rb")
  394. str = file.read
  395. file.close
  396. assert_equal("\"\r#{RSEP}\",\"\r\",\"#{RSEP}\"\r1,2,3\r", str)
  397. end
  398. #### CSV unit test
  399. def test_s_open_reader
  400. assert_raises(ArgumentError, 'Illegal mode') do
  401. CSV.open("temp", "a")
  402. end
  403. assert_raises(ArgumentError, 'Illegal mode') do
  404. CSV.open("temp", "a", ?;)
  405. end
  406. reader = CSV.open(@infile, "r")
  407. assert_instance_of(CSV::IOReader, reader)
  408. reader.close
  409. reader = CSV.open(@infile, "rb")
  410. assert_instance_of(CSV::IOReader, reader)
  411. reader.close
  412. reader = CSV.open(@infile, "r", ?;)
  413. assert_instance_of(CSV::IOReader, reader)
  414. reader.close
  415. CSV.open(@infile, "r") do |row|
  416. assert_instance_of(Array, row)
  417. break
  418. end
  419. CSV.open(@infiletsv, "r", ?\t) do |row|
  420. assert_instance_of(Array, row)
  421. break
  422. end
  423. assert_raises(Errno::ENOENT) do
  424. CSV.open("NoSuchFileOrDirectory", "r")
  425. end
  426. assert_raises(Errno::ENOENT) do
  427. CSV.open("NoSuchFileOrDirectory", "r", ?;)
  428. end
  429. # Illegal format.
  430. File.open(@outfile, "wb") do |f|
  431. f << "a,b\r\na,b,\"c\"\ra"
  432. end
  433. assert_raises(CSV::IllegalFormatError) do
  434. CSV.open(@outfile, "r") do |row|
  435. end
  436. end
  437. File.open(@outfile, "wb") do |f|
  438. f << "a,b\r\na,b\""
  439. end
  440. assert_raises(CSV::IllegalFormatError) do
  441. CSV.open(@outfile, "r") do |row|
  442. end
  443. end
  444. CSV.open(@emptyfile, "r") do |row|
  445. assert_fail("Must not reach here")
  446. end
  447. end
  448. def test_s_parse
  449. result = CSV.parse(File.read(@infile))
  450. assert_instance_of(Array, result)
  451. assert_instance_of(Array, result[0])
  452. result = CSV.parse(File.read(@infile))
  453. assert_instance_of(Array, result)
  454. assert_instance_of(Array, result[0])
  455. assert_equal([], CSV.parse(""))
  456. assert_equal([[nil]], CSV.parse("\n"))
  457. CSV.parse(File.read(@infile)) do |row|
  458. assert_instance_of(Array, row)
  459. break
  460. end
  461. CSV.parse(File.read(@infiletsv), ?\t) do |row|
  462. assert_instance_of(Array, row)
  463. break
  464. end
  465. CSV.parse("") do |row|
  466. assert(false)
  467. end
  468. count = 0
  469. CSV.parse("\n") do |row|
  470. assert_equal([nil], row)
  471. count += 1
  472. end
  473. assert_equal(1, count)
  474. assert_equal([["a|b-c|d"]], CSV.parse("a|b-c|d"))
  475. assert_equal([["a", "b"], ["c", "d"]], CSV.parse("a|b-c|d", "|", "-"))
  476. end
  477. def test_s_open_writer
  478. writer = CSV.open(@outfile, "w")
  479. assert_instance_of(CSV::BasicWriter, writer)
  480. writer.close
  481. writer = CSV.open(@outfile, "wb")
  482. assert_instance_of(CSV::BasicWriter, writer)
  483. writer.close
  484. writer = CSV.open(@outfile, "wb", ?;)
  485. assert_instance_of(CSV::BasicWriter, writer)
  486. writer.close
  487. CSV.open(@outfile, "w") do |writer|
  488. assert_instance_of(CSV::BasicWriter, writer)
  489. end
  490. CSV.open(@outfile, "w", ?;) do |writer|
  491. assert_instance_of(CSV::BasicWriter, writer)
  492. end
  493. begin
  494. CSV.open(@tmpdir, "w")
  495. assert(false)
  496. rescue Exception => ex
  497. assert(ex.is_a?(Errno::EEXIST) || ex.is_a?(Errno::EISDIR) || ex.is_a?(Errno::EACCES))
  498. end
  499. end
  500. def test_s_generate
  501. writer = CSV.generate(@outfile)
  502. assert_instance_of(CSV::BasicWriter, writer)
  503. writer.close
  504. writer = CSV.generate(@outfile, ?;)
  505. assert_instance_of(CSV::BasicWriter, writer)
  506. writer.close
  507. CSV.generate(@outfile) do |writer|
  508. assert_instance_of(CSV::BasicWriter, writer)
  509. end
  510. CSV.generate(@outfile, ?;) do |writer|
  511. assert_instance_of(CSV::BasicWriter, writer)
  512. end
  513. begin
  514. CSV.generate(@tmpdir)
  515. assert(false)
  516. rescue Exception => ex
  517. assert(ex.is_a?(Errno::EEXIST) || ex.is_a?(Errno::EISDIR) || ex.is_a?(Errno::EACCES))
  518. end
  519. end
  520. def test_s_generate_line
  521. str = CSV.generate_line([])
  522. assert_equal('', str, "Extra boundary check.")
  523. str = CSV.generate_line([], ?;)
  524. assert_equal('', str, "Extra boundary check.")
  525. @@simpleCSVData.each do |col, str|
  526. buf = CSV.generate_line(col)
  527. assert_equal(str, buf)
  528. end
  529. @@simpleCSVData.each do |col, str|
  530. buf = CSV.generate_line(col, ?;)
  531. assert_equal(str + "\n", ssv2csv(buf))
  532. end
  533. @@simpleCSVData.each do |col, str|
  534. buf = CSV.generate_line(col, ?\t)
  535. assert_equal(str + "\n", tsv2csv(buf))
  536. end
  537. str = CSV.generate_line(['a', 'b'], nil, ?|)
  538. assert_equal('a,b', str)
  539. str = CSV.generate_line(['a', 'b'], nil, "a")
  540. assert_equal('"a",b', str)
  541. end
  542. def test_s_generate_row
  543. buf = ''
  544. cols = CSV.generate_row([], 0, buf)
  545. assert_equal(0, cols)
  546. assert_equal("\n", buf, "Extra boundary check.")
  547. buf = ''
  548. cols = CSV.generate_row([], 0, buf, ?;)
  549. assert_equal(0, cols)
  550. assert_equal("\n", buf, "Extra boundary check.")
  551. buf = ''
  552. cols = CSV.generate_row([], 0, buf, ?\t)
  553. assert_equal(0, cols)
  554. assert_equal("\n", buf, "Extra boundary check.")
  555. buf = ''
  556. cols = CSV.generate_row([], 0, buf, ?\t, ?|)
  557. assert_equal(0, cols)
  558. assert_equal("|", buf, "Extra boundary check.")
  559. buf = ''
  560. cols = CSV.generate_row([d('1')], 2, buf)
  561. assert_equal('1,', buf)
  562. buf = ''
  563. cols = CSV.generate_row([d('1')], 2, buf, ?;)
  564. assert_equal('1;', buf)
  565. buf = ''
  566. cols = CSV.generate_row([d('1')], 2, buf, ?\t)
  567. assert_equal("1\t", buf)
  568. buf = ''
  569. cols = CSV.generate_row([d('1')], 2, buf, ?\t, ?|)
  570. assert_equal("1\t", buf)
  571. buf = ''
  572. cols = CSV.generate_row([d('1'), d('2')], 1, buf)
  573. assert_equal("1\n", buf)
  574. buf = ''
  575. cols = CSV.generate_row([d('1'), d('2')], 1, buf, ?;)
  576. assert_equal("1\n", buf)
  577. buf = ''
  578. cols = CSV.generate_row([d('1'), d('2')], 1, buf, ?\t)
  579. assert_equal("1\n", buf)
  580. buf = ''
  581. cols = CSV.generate_row([d('1'), d('2')], 1, buf, ?\t, ?\n)
  582. assert_equal("1\n", buf)
  583. buf = ''
  584. cols = CSV.generate_row([d('1'), d('2')], 1, buf, ?\t, ?\r)
  585. assert_equal("1\r", buf)
  586. buf = ''
  587. cols = CSV.generate_row([d('1'), d('2')], 1, buf, ?\t, ?|)
  588. assert_equal("1|", buf)
  589. @@fullCSVData.each do |col, str|
  590. buf = ''
  591. cols = CSV.generate_row(col, col.size, buf)
  592. assert_equal(col.size, cols)
  593. assert_equal(str + "\n", buf)
  594. end
  595. @@fullCSVData.each do |col, str|
  596. buf = ''
  597. cols = CSV.generate_row(col, col.size, buf, ?;)
  598. assert_equal(col.size, cols)
  599. assert_equal(str + "\n", ssv2csv(buf))
  600. end
  601. @@fullCSVData.each do |col, str|
  602. buf = ''
  603. cols = CSV.generate_row(col, col.size, buf, ?\t)
  604. assert_equal(col.size, cols)
  605. assert_equal(str + "\n", tsv2csv(buf))
  606. end
  607. # row separator
  608. @@fullCSVData.each do |col, str|
  609. buf = ''
  610. cols = CSV.generate_row(col, col.size, buf, ?,, ?|)
  611. assert_equal(col.size, cols)
  612. assert_equal(str + "|", buf)
  613. end
  614. # col and row separator
  615. @@fullCSVData.each do |col, str|
  616. buf = ''
  617. cols = CSV.generate_row(col, col.size, buf, ?\t, ?|)
  618. assert_equal(col.size, cols)
  619. assert_equal(str + "|", tsv2csv(buf, ?|))
  620. end
  621. buf = ''
  622. toBe = ''
  623. cols = 0
  624. colsToBe = 0
  625. @@fullCSVData.each do |col, str|
  626. cols += CSV.generate_row(col, col.size, buf)
  627. toBe << str << "\n"
  628. colsToBe += col.size
  629. end
  630. assert_equal(colsToBe, cols)
  631. assert_equal(toBe, buf)
  632. buf = ''
  633. toBe = ''
  634. cols = 0
  635. colsToBe = 0
  636. @@fullCSVData.each do |col, str|
  637. lineBuf = ''
  638. cols += CSV.generate_row(col, col.size, lineBuf, ?;)
  639. buf << ssv2csv(lineBuf) << "\n"
  640. toBe << ssv2csv(lineBuf) << "\n"
  641. colsToBe += col.size
  642. end
  643. assert_equal(colsToBe, cols)
  644. assert_equal(toBe, buf)
  645. buf = ''
  646. toBe = ''
  647. cols = 0
  648. colsToBe = 0
  649. @@fullCSVData.each do |col, str|
  650. lineBuf = ''
  651. cols += CSV.generate_row(col, col.size, lineBuf, ?\t)
  652. buf << tsv2csv(lineBuf) << "\n"
  653. toBe << tsv2csv(lineBuf) << "\n"
  654. colsToBe += col.size
  655. end
  656. assert_equal(colsToBe, cols)
  657. assert_equal(toBe, buf)
  658. buf = ''
  659. toBe = ''
  660. cols = 0
  661. colsToBe = 0
  662. @@fullCSVData.each do |col, str|
  663. lineBuf = ''
  664. cols += CSV.generate_row(col, col.size, lineBuf, ?|)
  665. buf << tsv2csv(lineBuf, ?|)
  666. toBe << tsv2csv(lineBuf, ?|)
  667. colsToBe += col.size
  668. end
  669. assert_equal(colsToBe, cols)
  670. assert_equal(toBe, buf)
  671. end
  672. def test_s_parse_line
  673. @@simpleCSVData.each do |col, str|
  674. row = CSV.parse_line(str)
  675. assert_instance_of(Array, row)
  676. assert_equal(col.size, row.size)
  677. assert_equal(col, row)
  678. end
  679. @@simpleCSVData.each do |col, str|
  680. str = csv2ssv(str)
  681. row = CSV.parse_line(str, ?;)
  682. assert_instance_of(Array, row)
  683. assert_equal(col.size, row.size, str.inspect)
  684. assert_equal(col, row, str.inspect)
  685. end
  686. @@simpleCSVData.each do |col, str|
  687. str = csv2tsv(str)
  688. row = CSV.parse_line(str, ?\t)
  689. assert_instance_of(Array, row)
  690. assert_equal(col.size, row.size)
  691. assert_equal(col, row)
  692. end
  693. assert_equal(['a', 'b', 'c'], CSV.parse_line("a,b,c", nil, nil))
  694. assert_equal(['a', nil], CSV.parse_line("a,b,c", nil, ?b))
  695. assert_equal(['a', 'b', nil], CSV.parse_line("a,b,c", nil, "c"))
  696. assert_equal([nil], CSV.parse_line(""))
  697. assert_equal([nil], CSV.parse_line("\n"))
  698. assert_equal([""], CSV.parse_line("\"\"\n"))
  699. # Illegal format.
  700. buf = []
  701. row = CSV.parse_line("a,b,\"c\"\ra")
  702. assert_instance_of(Array, row)
  703. assert_equal(0, row.size)
  704. buf = Array.new
  705. row = CSV.parse_line("a;b;\"c\"\ra", ?;)
  706. assert_instance_of(Array, row)
  707. assert_equal(0, row.size)
  708. buf = Array.new
  709. row = CSV.parse_line("a\tb\t\"c\"\ra", ?\t)
  710. assert_instance_of(Array, row)
  711. assert_equal(0, row.size)
  712. row = CSV.parse_line("a,b\"")
  713. assert_instance_of(Array, row)
  714. assert_equal(0, row.size)
  715. row = CSV.parse_line("a;b\"", ?;)
  716. assert_instance_of(Array, row)
  717. assert_equal(0, row.size)
  718. row = CSV.parse_line("a\tb\"", ?\t)
  719. assert_instance_of(Array, row)
  720. assert_equal(0, row.size)
  721. row = CSV.parse_line("\"a,b\"\r,")
  722. assert_instance_of(Array, row)
  723. assert_equal(0, row.size)
  724. row = CSV.parse_line("\"a;b\"\r;", ?;)
  725. assert_instance_of(Array, row)
  726. assert_equal(0, row.size)
  727. row = CSV.parse_line("\"a\tb\"\r\t", ?\t)
  728. assert_instance_of(Array, row)
  729. assert_equal(0, row.size)
  730. row = CSV.parse_line("\"a,b\"\r\"")
  731. assert_instance_of(Array, row)
  732. assert_equal(0, row.size)
  733. row = CSV.parse_line("\"a;b\"\r\"", ?;)
  734. assert_instance_of(Array, row)
  735. assert_equal(0, row.size)
  736. row = CSV.parse_line("\"a\tb\"\r\"", ?\t)
  737. assert_instance_of(Array, row)
  738. assert_equal(0, row.size)
  739. end
  740. def test_s_parse_row
  741. @@fullCSVData.each do |col, str|
  742. buf = Array.new
  743. cols, idx = CSV.parse_row(str + "\r\n", 0, buf)
  744. assert_equal(cols, buf.size, "Reported size.")
  745. assert_equal(col.size, buf.size, "Size.")
  746. assert_equal(col, buf, str.inspect)
  747. buf = Array.new
  748. cols, idx = CSV.parse_row(str + "\n", 0, buf, ?,, ?\n)
  749. assert_equal(cols, buf.size, "Reported size.")
  750. assert_equal(col.size, buf.size, "Size.")
  751. assert_equal(col, buf, str.inspect)
  752. # separator: |
  753. buf = Array.new
  754. cols, idx = CSV.parse_row(str + "|", 0, buf, ?,)
  755. assert_not_equal(col, buf)
  756. buf = Array.new
  757. cols, idx = CSV.parse_row(str + "|", 0, buf, ?,, ?|)
  758. assert_equal(cols, buf.size, "Reported size.")
  759. assert_equal(col.size, buf.size, "Size.")
  760. assert_equal(col, buf, str.inspect)
  761. end
  762. @@fullCSVData.each do |col, str|
  763. str = csv2ssv(str)
  764. buf = Array.new
  765. cols, idx = CSV.parse_row(str + "\r\n", 0, buf, ?;)
  766. assert_equal(cols, buf.size, "Reported size.")
  767. assert_equal(col.size, buf.size, "Size.")
  768. assert_equal(col, buf, str)
  769. end
  770. @@fullCSVData.each do |col, str|
  771. str = csv2tsv(str)
  772. buf = Array.new
  773. cols, idx = CSV.parse_row(str + "\r\n", 0, buf, ?\t)
  774. assert_equal(cols, buf.size, "Reported size.")
  775. assert_equal(col.size, buf.size, "Size.")
  776. assert_equal(col, buf, str)
  777. end
  778. @@fullCSVData.each do |col, str|
  779. str = csv2tsv(str, ?|)
  780. buf = Array.new
  781. cols, idx = CSV.parse_row(str + "|", 0, buf, ?\t, ?|)
  782. assert_equal(cols, buf.size, "Reported size.")
  783. assert_equal(col.size, buf.size, "Size.")
  784. assert_equal(col, buf, str)
  785. end
  786. buf = []
  787. CSV.parse_row("a,b,c", 0, buf, nil, nil)
  788. assert_equal(['a', 'b', 'c'], buf)
  789. buf = []
  790. CSV.parse_row("a,b,c", 0, buf, nil, ?b)
  791. assert_equal(['a', nil], buf)
  792. buf = []
  793. CSV.parse_row("a,b,c", 0, buf, nil, "c")
  794. assert_equal(['a', 'b', nil], buf)
  795. buf = Array.new
  796. cols, idx = CSV.parse_row("a,b,\"c\r\"", 0, buf)
  797. assert_equal(["a", "b", "c\r"], buf.to_a)
  798. buf = Array.new
  799. cols, idx = CSV.parse_row("a;b;\"c\r\"", 0, buf, ?;)
  800. assert_equal(["a", "b", "c\r"], buf.to_a)
  801. buf = Array.new
  802. cols, idx = CSV.parse_row("a\tb\t\"c\r\"", 0, buf, ?\t)
  803. assert_equal(["a", "b", "c\r"], buf.to_a)
  804. buf = Array.new
  805. cols, idx = CSV.parse_row("a,b,c\n", 0, buf, ?,, ?\n)
  806. assert_equal(["a", "b", "c"], buf.to_a)
  807. buf = Array.new
  808. cols, idx = CSV.parse_row("a\tb\tc\n", 0, buf, ?\t, ?\n)
  809. assert_equal(["a", "b", "c"], buf.to_a)
  810. # Illegal format.
  811. buf = Array.new
  812. cols, idx = CSV.parse_row("a,b,c\"", 0, buf)
  813. assert_equal(0, cols, "Illegal format; unbalanced double-quote.")
  814. buf = Array.new
  815. cols, idx = CSV.parse_row("a;b;c\"", 0, buf, ?;)
  816. assert_equal(0, cols, "Illegal format; unbalanced double-quote.")
  817. buf = Array.new
  818. cols, idx = CSV.parse_row("a,b,\"c\"\ra", 0, buf)
  819. assert_equal(0, cols)
  820. assert_equal(0, idx)
  821. buf = Array.new
  822. cols, idx = CSV.parse_row("a,b,\"c\"\ra", 0, buf, ?;)
  823. assert_equal(0, cols)
  824. assert_equal(0, idx)
  825. buf = Array.new
  826. cols, idx = CSV.parse_row("a,b\"", 0, buf)
  827. assert_equal(0, cols)
  828. assert_equal(0, idx)
  829. buf = Array.new
  830. cols, idx = CSV.parse_row("a;b\"", 0, buf, ?;)
  831. assert_equal(0, cols)
  832. assert_equal(0, idx)
  833. buf = Array.new
  834. cols, idx = CSV.parse_row("\"a,b\"\r,", 0, buf)
  835. assert_equal(0, cols)
  836. assert_equal(0, idx)
  837. buf = Array.new
  838. cols, idx = CSV.parse_row("a\r,", 0, buf)
  839. assert_equal(0, cols)
  840. assert_equal(0, idx)
  841. buf = Array.new
  842. cols, idx = CSV.parse_row("a\r", 0, buf)
  843. assert_equal(0, cols)
  844. assert_equal(0, idx)
  845. buf = Array.new
  846. cols, idx = CSV.parse_row("a\rbc", 0, buf)
  847. assert_equal(0, cols)
  848. assert_equal(0, idx)
  849. buf = Array.new
  850. cols, idx = CSV.parse_row("a\r\"\"", 0, buf)
  851. assert_equal(0, cols)
  852. assert_equal(0, idx)
  853. buf = Array.new
  854. cols, idx = CSV.parse_row("a\r\rabc,", 0, buf)
  855. assert_equal(0, cols)
  856. assert_equal(0, idx)
  857. buf = Array.new
  858. cols, idx = CSV.parse_row("\"a;b\"\r;", 0, buf, ?;)
  859. assert_equal(0, cols)
  860. assert_equal(0, idx)
  861. buf = Array.new
  862. cols, idx = CSV.parse_row("\"a,b\"\r\"", 0, buf)
  863. assert_equal(0, cols)
  864. assert_equal(0, idx)
  865. buf = Array.new
  866. cols, idx = CSV.parse_row("\"a;b\"\r\"", 0, buf, ?;)
  867. assert_equal(0, cols)
  868. assert_equal(0, idx)
  869. end
  870. def test_s_parse_rowEOF
  871. @@fullCSVData.each do |col, str|
  872. if str == ''
  873. # String "" is not allowed.
  874. next
  875. end
  876. buf = Array.new
  877. cols, idx = CSV.parse_row(str, 0, buf)
  878. assert_equal(col.size, cols, "Reported size.")
  879. assert_equal(col.size, buf.size, "Size.")
  880. assert_equal(col, buf)
  881. end
  882. end
  883. def test_s_parse_rowConcat
  884. buf = ''
  885. toBe = []
  886. @@fullCSVData.each do |col, str|
  887. buf << str << "\r\n"
  888. toBe.concat(col)
  889. end
  890. idx = 0
  891. cols = 0
  892. parsed = Array.new
  893. parsedCols = 0
  894. begin
  895. cols, idx = CSV.parse_row(buf, idx, parsed)
  896. parsedCols += cols
  897. end while cols > 0
  898. assert_equal(toBe.size, parsedCols)
  899. assert_equal(toBe.size, parsed.size)
  900. assert_equal(toBe, parsed)
  901. buf = ''
  902. toBe = []
  903. @@fullCSVData.each do |col, str|
  904. buf << str << "\n"
  905. toBe.concat(col)
  906. end
  907. idx = 0
  908. cols = 0
  909. parsed = Array.new
  910. parsedCols = 0
  911. begin
  912. cols, idx = CSV.parse_row(buf, idx, parsed, ?,, ?\n)
  913. parsedCols += cols
  914. end while cols > 0
  915. assert_equal(toBe.size, parsedCols)
  916. assert_equal(toBe.size, parsed.size)
  917. assert_equal(toBe, parsed)
  918. buf = ''
  919. toBe = []
  920. @@fullCSVData.sort { |a, b|
  921. a[0].length <=> b[0].length
  922. }.each do |col, str|
  923. buf << str << "\n"
  924. toBe.concat(col)
  925. end
  926. idx = 0
  927. cols = 0
  928. parsed = Array.new
  929. parsedCols = 0
  930. begin
  931. cols, idx = CSV.parse_row(buf, idx, parsed, ?,, ?\n)
  932. parsedCols += cols
  933. end while cols > 0
  934. assert_equal(toBe.size, parsedCols)
  935. assert_equal(toBe.size, parsed.size)
  936. assert_equal(toBe, parsed)
  937. buf = ''
  938. toBe = []
  939. @@fullCSVData.each do |col, str|
  940. buf << str << "|"
  941. toBe.concat(col)
  942. end
  943. idx = 0
  944. cols = 0
  945. parsed = []
  946. parsedCols = 0
  947. begin
  948. cols, idx = CSV.parse_row(buf, idx, parsed, ?,, ?|)
  949. parsedCols += cols
  950. end while cols > 0
  951. assert_equal(toBe.size, parsedCols)
  952. assert_equal(toBe.size, parsed.size)
  953. assert_equal(toBe, parsed)
  954. end
  955. def test_utf8
  956. rows = []
  957. CSV.open(@bomfile, "r") do |row|
  958. rows << row.to_a
  959. end
  960. assert_equal([["foo"], ["bar"]], rows)
  961. rows = []
  962. file = File.open(@bomfile)
  963. CSV::Reader.parse(file) do |row|
  964. rows << row.to_a
  965. end
  966. assert_equal([["foo"], ["bar"]], rows)
  967. file.close
  968. end
  969. def test_macCR
  970. rows = []
  971. CSV.open(@macfile, "r", ?,, ?\r) do |row|
  972. rows << row.to_a
  973. end
  974. assert_equal([["Avenches", "aus Umgebung"], ["Bad Hersfeld", "Ausgrabung"]], rows)
  975. rows = []
  976. assert_raises(CSV::IllegalFormatError) do
  977. CSV.open(@macfile, "r") do |row|
  978. rows << row.to_a
  979. end
  980. assert_equal([["Avenches", "aus Umgebung\r\"Bad Hersfeld", "Ausgrabung"]], rows)
  981. end
  982. rows = []
  983. file = File.open(@macfile)
  984. begin
  985. CSV::Reader.parse(file, ?,, ?\r) do |row|
  986. rows << row.to_a
  987. end
  988. assert_equal([["Avenches", "aus Umgebung"], ["Bad Hersfeld", "Ausgrabung"]], rows)
  989. ensure
  990. file.close
  991. end
  992. rows = []
  993. file = File.open(@macfile)
  994. begin
  995. assert_raises(CSV::IllegalFormatError) do
  996. CSV::Reader.parse(file, ?,) do |row|
  997. rows << row.to_a
  998. end
  999. assert_equal([["Avenches", "aus Umgebung\r\"Bad Hersfeld", "Ausgrabung"]], rows)
  1000. end
  1001. ensure
  1002. file.close
  1003. end
  1004. end
  1005. #### CSV unit test
  1006. InputStreamPattern = '0123456789'
  1007. InputStreamPatternSize = InputStreamPattern.size
  1008. def expChar(idx)
  1009. InputStreamPattern[idx % InputStreamPatternSize]
  1010. end
  1011. def expStr(idx, n)
  1012. if n > InputStreamPatternSize
  1013. InputStreamPattern + expStr(0, n - InputStreamPatternSize)
  1014. else
  1015. InputStreamPattern[idx % InputStreamPatternSize, n]
  1016. end
  1017. end
  1018. def setupInputStream(size, bufSize = nil)
  1019. setBufSize(bufSize) if bufSize
  1020. m = ((size / InputStreamPatternSize) + 1).to_i
  1021. File.open(@outfile, "wb") do |f|
  1022. f << (InputStreamPattern * m)[0, size]
  1023. end
  1024. file = File.open(@outfile, "rb")
  1025. buf = CSV::IOBuf.new(file)
  1026. if block_given?
  1027. yield(buf)
  1028. file.close
  1029. nil
  1030. else
  1031. buf
  1032. end
  1033. end
  1034. def setBufSize(size)
  1035. CSV::StreamBuf.module_eval('remove_const("BufSize")')
  1036. CSV::StreamBuf.module_eval("BufSize = #{ size }")
  1037. end
  1038. class StrBuf < CSV::StreamBuf
  1039. private
  1040. def initialize(string)
  1041. @str = string
  1042. @idx = 0
  1043. super()
  1044. end
  1045. def read(size)
  1046. str = @str[@idx, size]
  1047. if str.empty?
  1048. nil
  1049. else
  1050. @idx += str.size
  1051. str
  1052. end
  1053. end
  1054. end
  1055. class ErrBuf < CSV::StreamBuf
  1056. class Error < RuntimeError; end
  1057. private
  1058. def initialize
  1059. @first = true
  1060. super()
  1061. end
  1062. def read(size)
  1063. if @first
  1064. @first = false
  1065. "a" * size
  1066. else
  1067. raise ErrBuf::Error.new
  1068. end
  1069. end
  1070. end
  1071. def test_StreamBuf_MyBuf
  1072. # At first, check ruby's behaviour.
  1073. s = "abc"
  1074. assert_equal(?a, s[0])
  1075. assert_equal(?b, s[1])
  1076. assert_equal(?c, s[2])
  1077. assert_equal(nil, s[3])
  1078. assert_equal("a", s[0, 1])
  1079. assert_equal("b", s[1, 1])
  1080. assert_equal("c", s[2, 1])
  1081. assert_equal("", s[3, 1])
  1082. assert_equal(nil, s[4, 1])
  1083. s = StrBuf.new("abc")
  1084. assert_equal(?a, s[0])
  1085. assert_equal(?b, s.get(1))
  1086. assert_equal(?c, s[2])
  1087. assert_equal(nil, s.get(3))
  1088. assert_equal("a", s[0, 1])
  1089. assert_equal("b", s.get(1, 1))
  1090. assert_equal("c", s[2, 1])
  1091. assert_equal("", s.get(3, 1))
  1092. assert_equal(nil, s[4, 1])
  1093. dropped = s.drop(1)
  1094. assert_equal(1, dropped)
  1095. assert_equal(?b, s[0])
  1096. assert(!s.is_eos?)
  1097. dropped = s.drop(1)
  1098. assert_equal(1, dropped)
  1099. assert_equal(?c, s[0])
  1100. assert(!s.is_eos?)
  1101. dropped = s.drop(1)
  1102. assert_equal(1, dropped)
  1103. assert_equal(nil, s[0])
  1104. assert(s.is_eos?)
  1105. dropped = s.drop(1)
  1106. assert_equal(0, dropped)
  1107. assert_equal(nil, s[0])
  1108. assert(s.is_eos?)
  1109. s = StrBuf.new("")
  1110. assert_equal(nil, s[0])
  1111. s = StrBuf.new("")
  1112. dropped = s.drop(1)
  1113. assert_equal(0, dropped)
  1114. assert_raises(TestCSV::ErrBuf::Error) do
  1115. s = ErrBuf.new
  1116. s[1024]
  1117. end
  1118. assert_raises(TestCSV::ErrBuf::Error) do
  1119. s = ErrBuf.new
  1120. s.drop(1024)
  1121. end
  1122. end
  1123. def test_StreamBuf_AREF # '[idx]'
  1124. setupInputStream(22, 1024) do |s|
  1125. [0, 1, 9, 10, 19, 20, 21].each do |idx|
  1126. assert_equal(expChar(idx), s[idx], idx.to_s)
  1127. end
  1128. [22, 23].each do |idx|
  1129. assert_equal(nil, s[idx], idx.to_s)
  1130. end
  1131. assert_equal(nil, s[-1])
  1132. end
  1133. setupInputStream(22, 1) do |s|
  1134. [0, 1, 9, 10, 19, 20, 21].each do |idx|
  1135. assert_equal(expChar(idx), s[idx], idx.to_s)
  1136. end
  1137. [22, 23].each do |idx|
  1138. assert_equal(nil, s[idx], idx.to_s)
  1139. end
  1140. end
  1141. setupInputStream(1024, 1) do |s|
  1142. [1023, 0].each do |idx|
  1143. assert_equal(expChar(idx), s[idx], idx.to_s)
  1144. end
  1145. [1024, 1025].each do |idx|
  1146. assert_equal(nil, s[idx], idx.to_s)
  1147. end
  1148. end
  1149. setupInputStream(1, 1) do |s|
  1150. [0].each do |idx|
  1151. assert_equal(expChar(idx), s[idx], idx.to_s)
  1152. end
  1153. [1, 2].each do |idx|
  1154. assert_equal(nil, s[idx], idx.to_s)
  1155. end
  1156. end
  1157. end
  1158. def test_StreamBuf_AREF_n # '[idx, n]'
  1159. # At first, check ruby's behaviour.
  1160. assert_equal("", "abc"[3, 1])
  1161. assert_equal(nil, "abc"[4, 1])
  1162. setupInputStream(22, 1024) do |s|
  1163. [0, 1, 9, 10, 19, 20, 21].each do |idx|
  1164. assert_equal(expStr(idx, 1), s[idx, 1], idx.to_s)
  1165. end
  1166. assert_equal("", s[22, 1])
  1167. assert_equal(nil, s[23, 1])
  1168. end
  1169. setupInputStream(22, 1) do |s|
  1170. [0, 1, 9, 10, 19, 20, 21].each do |idx|
  1171. assert_equal(expStr(idx, 1), s[idx, 1], idx.to_s)
  1172. end
  1173. assert_equal("", s[22, 1])
  1174. assert_equal(nil, s[23, 1])
  1175. end
  1176. setupInputStream(1024, 1) do |s|
  1177. [1023, 0].each do |idx|
  1178. assert_equal(expStr(idx, 1), s[idx, 1], idx.to_s)
  1179. end
  1180. assert_equal("", s[1024, 1])
  1181. assert_equal(nil, s[1025, 1])
  1182. end
  1183. setupInputStream(1, 1) do |s|
  1184. [0].each do |idx|
  1185. assert_equal(expStr(idx, 1), s[idx, 1], idx.to_s)
  1186. end
  1187. assert_equal("", s[1, 1])
  1188. assert_equal(nil, s[2, 1])
  1189. end
  1190. setupInputStream(22, 11) do |s|
  1191. [0, 1, 10, 11, 20].each do |idx|
  1192. assert_equal(expStr(idx, 2), s[idx, 2], idx.to_s)
  1193. end
  1194. assert_equal(expStr(21, 1), s[21, 2])
  1195. assert_equal(expStr(0, 12), s[0, 12])
  1196. assert_equal(expStr(10, 12), s[10, 12])
  1197. assert_equal(expStr(10, 12), s[10, 13])
  1198. assert_equal(expStr(10, 12), s[10, 14])
  1199. assert_equal(expStr(10, 12), s[10, 1024])
  1200. assert_equal(nil, s[0, -1])
  1201. assert_equal(nil, s[21, -1])
  1202. assert_equal(nil, s[-1, 10])
  1203. assert_equal(nil, s[-1, -1])
  1204. end
  1205. end
  1206. def test_StreamBuf_get
  1207. setupInputStream(22, 1024) do |s|
  1208. [0, 1, 9, 10, 19, 20, 21].each do |idx|
  1209. assert_equal(expChar(idx), s.get(idx), idx.to_s)
  1210. end
  1211. [22, 23].each do |idx|
  1212. assert_equal(nil, s.get(idx), idx.to_s)
  1213. end
  1214. assert_equal(nil, s.get(-1))
  1215. end
  1216. end
  1217. def test_StreamBuf_get_n
  1218. setupInputStream(22, 1024) do |s|
  1219. [0, 1, 9, 10, 19, 20, 21].each do |idx|
  1220. assert_equal(expStr(idx, 1), s.get(idx, 1), idx.to_s)
  1221. end
  1222. assert_equal("", s.get(22, 1))
  1223. assert_equal(nil, s.get(23, 1))
  1224. assert_equal(nil, s.get(-1, 1))
  1225. assert_equal(nil, s.get(-1, -1))
  1226. end
  1227. end
  1228. def test_StreamBuf_drop
  1229. setupInputStream(22, 1024) do |s|
  1230. assert_equal(expChar(0), s[0])
  1231. assert_equal(expChar(21), s[21])
  1232. assert_equal(nil, s[22])
  1233. dropped = s.drop(-1)
  1234. assert_equal(0, dropped)
  1235. assert_equal(expChar(0), s[0])
  1236. dropped = s.drop(0)
  1237. assert_equal(0, dropped)
  1238. assert_equal(expChar(0), s[0])
  1239. dropped = s.drop(1)
  1240. assert_equal(1, dropped)
  1241. assert_equal(expChar(1), s[0])
  1242. assert_equal(expChar(2), s[1])
  1243. dropped = s.drop(1)
  1244. assert_equal(1, dropped)
  1245. assert_equal(expChar(2), s[0])
  1246. assert_equal(expChar(3), s[1])
  1247. end
  1248. setupInputStream(4, 2) do |s|
  1249. dropped = s.drop(2)
  1250. assert_equal(2, dropped)
  1251. assert_equal(expChar(2), s[0])
  1252. assert_equal(expChar(3), s[1])
  1253. dropped = s.drop(1)
  1254. assert_equal(1, dropped)
  1255. assert_equal(expChar(3), s[0])
  1256. assert_equal(nil, s[1])
  1257. dropped = s.drop(1)
  1258. assert_equal(1, dropped)
  1259. assert_equal(nil, s[0])
  1260. assert_equal(nil, s[1])
  1261. dropped = s.drop(0)
  1262. assert_equal(0, dropped)
  1263. assert_equal(nil, s[0])
  1264. assert_equal(nil, s[1])
  1265. end
  1266. setupInputStream(6, 3) do |s|
  1267. dropped = s.drop(2)
  1268. assert_equal(2, dropped)
  1269. dropped = s.drop(2)
  1270. assert_equal(2, dropped)
  1271. assert_equal(expChar(4), s[0])
  1272. assert_equal(expChar(5), s[1])
  1273. dropped = s.drop(3)
  1274. assert_equal(2, dropped)
  1275. assert_equal(nil, s[0])
  1276. assert_equal(nil, s[1])
  1277. end
  1278. end
  1279. def test_StreamBuf_is_eos?
  1280. setupInputStream(3, 1024) do |s|
  1281. assert(!s.is_eos?)
  1282. s.drop(1)
  1283. assert(!s.is_eos?)
  1284. s.drop(1)
  1285. assert(!s.is_eos?)
  1286. s.drop(1)
  1287. assert(s.is_eos?)
  1288. s.drop(1)
  1289. assert(s.is_eos?)
  1290. end
  1291. setupInputStream(3, 2) do |s|
  1292. assert(!s.is_eos?)
  1293. s.drop(1)
  1294. assert(!s.is_eos?)
  1295. s.drop(1)
  1296. assert(!s.is_eos?)
  1297. s.drop(1)
  1298. assert(s.is_eos?)
  1299. s.drop(1)
  1300. assert(s.is_eos?)
  1301. end
  1302. end
  1303. def test_StreamBuf_s_new
  1304. # NotImplementedError should be raised from StreamBuf#read.
  1305. assert_raises(NotImplementedError) do
  1306. CSV::StreamBuf.new
  1307. end
  1308. end
  1309. def test_IOBuf_close
  1310. f = File.open(@outfile, "wb")
  1311. f << "tst"
  1312. f.close
  1313. f = File.open(@outfile, "rb")
  1314. iobuf = CSV::IOBuf.new(f)
  1315. iobuf.close
  1316. assert(true) # iobuf.close does not raise any exception.
  1317. f.close
  1318. end
  1319. def test_IOBuf_s_new
  1320. iobuf = CSV::IOBuf.new(Tempfile.new("in.csv"))
  1321. assert_instance_of(CSV::IOBuf, iobuf)
  1322. end
  1323. #### CSV functional test
  1324. # sample data
  1325. #
  1326. # 1 2 3 4 5 6 7 8
  1327. # +------+-------+---------+-------+--------+------+----+------+
  1328. # | foo | "foo" | foo,bar | "" |(empty) |(null)| \r | \r\n |
  1329. # +------+-------+---------+-------+--------+------+----+------+
  1330. # | NaHi | "Na" | Na,Hi | \r.\n | \r\n\n | " | \n | \r\n |
  1331. # +------+-------+---------+-------+--------+------+----+------+
  1332. #
  1333. def test_s_parseAndCreate
  1334. colSize = 8
  1335. csvStr = "foo,!!!foo!!!,!foo,bar!,!!!!!!,!!,,!\r!,!\r\n!\nNaHi,!!!Na!!!,!Na,Hi!,!\r.\n!,!\r\n\n!,!!!!,!\n!,!\r\n!".gsub!('!', '"')
  1336. csvStrTerminated = csvStr + "\n"
  1337. myStr = csvStr.dup
  1338. res1 = []; res2 = []
  1339. idx = 0
  1340. col, idx = CSV::parse_row(myStr, 0, res1)
  1341. col, idx = CSV::parse_row(myStr, idx, res2)
  1342. buf = ''
  1343. col = CSV::generate_row(res1, colSize, buf)
  1344. col = CSV::generate_row(res2, colSize, buf)
  1345. assert_equal(csvStrTerminated, buf)
  1346. parsed = []
  1347. CSV::Reader.parse(csvStrTerminated) do |row|
  1348. parsed << row
  1349. end
  1350. buf = ''
  1351. CSV::Writer.generate(buf) do |writer|
  1352. parsed.each do |row|
  1353. writer.add_row(row)
  1354. end
  1355. end
  1356. assert_equal(csvStrTerminated, buf)
  1357. buf = ''
  1358. CSV::Writer.generate(buf) do |writer|
  1359. parsed.each do |row|
  1360. writer << row
  1361. end
  1362. end
  1363. assert_equal(csvStrTerminated, buf)
  1364. end
  1365. def test_writer_fs_rs_generate
  1366. buf = ''
  1367. CSV::Writer.generate(buf, ",,") do |writer|
  1368. writer << []
  1369. end
  1370. assert_equal("\n", buf)
  1371. buf = ''
  1372. CSV::Writer.generate(buf, ",,") do |writer|
  1373. writer << [] << []
  1374. end
  1375. assert_equal("\n\n", buf)
  1376. buf = ''
  1377. CSV::Writer.generate(buf, ",,") do |writer|
  1378. writer << [1]
  1379. end
  1380. assert_equal("1\n", buf)
  1381. buf = ''
  1382. CSV::Writer.generate(buf, ",,") do |writer|
  1383. writer << [1, 2, 3]
  1384. writer << [4, ",,", 5]
  1385. end
  1386. assert_equal("1,,2,,3\n4,,\",,\",,5\n", buf)
  1387. buf = ''
  1388. CSV::Writer.generate(buf, ",,:", ",,;") do |writer|
  1389. writer << [nil, nil, nil]
  1390. writer << [nil, ",,", nil]
  1391. end
  1392. assert_equal(",,:,,:,,;,,:,,,,:,,;", buf)
  1393. buf = ''
  1394. CSV::Writer.generate(buf, "---") do |writer|
  1395. writer << [1, 2, 3]
  1396. writer << [4, "---\"---", 5]
  1397. end
  1398. assert_equal("1---2---3\n4---\"---\"\"---\"---5\n", buf)
  1399. buf = ''
  1400. CSV::Writer.generate(buf, nil) do |writer|
  1401. writer << [1, 2, 3]
  1402. writer << [4, ",\",", 5]
  1403. end
  1404. assert_equal("1,2,3\n4,\",\"\",\",5\n", buf)
  1405. end
  1406. def test_writer_fs_rs_parse
  1407. reader = CSV::Reader.create('a||b--c||d', '||', '--')
  1408. assert_equal(['a', 'b'], reader.shift)
  1409. assert_equal(['c', 'd'], reader.shift)
  1410. reader = CSV::Reader.create("a@|b@-c@|d", "@|", "@-")
  1411. assert_equal(['a', 'b'], reader.shift)
  1412. assert_equal(['c', 'd'], reader.shift)
  1413. reader = CSV::Reader.create("ababfsababrs", "abfs", "abrs")
  1414. assert_equal(['ab', 'ab'], reader.shift)
  1415. reader = CSV::Reader.create('"ab"abfsababrs', "abfs", "abrs")
  1416. assert_equal(['ab', 'ab'], reader.shift)
  1417. reader = CSV::Reader.create('"ab"aabfsababrs', "abfs", "abrs")
  1418. assert_raises(CSV::IllegalFormatError) do
  1419. reader.shift
  1420. end
  1421. # fs match while matching rs progress
  1422. reader = CSV::Reader.create("ab,ababrs", nil, "abrs")
  1423. assert_equal(['ab', 'ab'], reader.shift)
  1424. reader = CSV::Reader.create(',ababrs', nil, "abrs")
  1425. assert_equal([nil, 'ab'], reader.shift)
  1426. reader = CSV::Reader.create('"",ababrs', nil, "abrs")
  1427. assert_equal(['', 'ab'], reader.shift)
  1428. reader = CSV::Reader.create('ab,"ab"abrs', nil, "abrs")
  1429. assert_equal(['ab', 'ab'], reader.shift)
  1430. reader = CSV::Reader.create('ab,"ab"aabrs', nil, "abrs")
  1431. assert_raises(CSV::IllegalFormatError) do
  1432. reader.shift
  1433. end
  1434. # rs match while matching fs progress
  1435. reader = CSV::Reader.create("ab|abc", 'ab-', "ab|")
  1436. assert_equal([nil], reader.shift)
  1437. assert_equal(['abc'], reader.shift)
  1438. reader = CSV::Reader.create("ab\ncdabcef", "abc", "\n")
  1439. assert_equal(['ab'], reader.shift)
  1440. assert_equal(['cd', "ef"], reader.shift)
  1441. # EOF while fs/rs matching
  1442. reader = CSV::Reader.create("ab", 'ab-', "xyz")
  1443. assert_equal(['ab'], reader.shift)
  1444. reader = CSV::Reader.create("ab", 'xyz', "ab|")
  1445. assert_equal(['ab'], reader.shift)
  1446. reader = CSV::Reader.create("ab", 'ab-', "ab|")
  1447. assert_equal(['ab'], reader.shift)
  1448. reader = CSV::Reader.create(",,:,,:,,;,,:,,,,:,,;", ",,:", ",,;")
  1449. assert_equal([nil, nil, nil], reader.shift)
  1450. assert_equal([nil, ",,", nil], reader.shift)
  1451. end
  1452. def test_s_foreach
  1453. File.open(@outfile, "w") do |f|
  1454. f << "1,2,3\n4,5,6"
  1455. end
  1456. row = []
  1457. CSV.foreach(@outfile) { |line|
  1458. row << line
  1459. }
  1460. assert_equal([['1', '2', '3'], ['4', '5', '6']], row)
  1461. File.open(@outfile, "w") do |f|
  1462. f << "1,2,3\r4,5,6"
  1463. end
  1464. row = []
  1465. CSV.foreach(@outfile, "\r") { |line|
  1466. row << line
  1467. }
  1468. assert_equal([['1', '2', '3'], ['4', '5', '6']], row)
  1469. end
  1470. def test_s_readlines
  1471. File.open(@outfile, "w") do |f|
  1472. f << "1,2,3\n4,5,6"
  1473. end
  1474. assert_equal([["1", "2", "3"], ["4", "5", "6"]], CSV.readlines(@outfile))
  1475. assert_equal([["1", "2", nil], [nil, "5", "6"]], CSV.readlines(@outfile, "3\n4"))
  1476. end
  1477. def test_s_read
  1478. File.open(@outfile, "w") do |f|
  1479. f << "1,2,3\n4,5,6"
  1480. end
  1481. assert_equal([["1", "2", "3"], ["4", "5", "6"]], CSV.read(@outfile))
  1482. assert_equal([["1", "2"]], CSV.read(@outfile, 3))
  1483. assert_equal([[nil], ["4", nil]], CSV.read(@outfile, 3, 5))
  1484. end
  1485. end