require 'bundler'
Bundler.require(:default, :test)

gem 'minitest'
#require 'minitest/benchmark'
require 'minitest/autorun'
#require 'minitest/spec'
require 'ccsv'
#require 'csv'

TEST_CSV="/tmp/test.csv"

module CSVScan
  def self.foreach(file, &block)
    open(file) do |f|
      scan(f, &block)
    end
  end
end

def create_csv(delimiter=',')
	open(TEST_CSV,"w") do |f|
        	1.upto(100000) do |n|
			f.puts [n,2*n,3+n].join(delimiter)
		end
	end
end


describe Ccsv do
	before do
		@csv=[]
	end

	it 'reads csv with default delimiter' do
		create_csv
		Ccsv.foreach(TEST_CSV) do |v|
			@csv << v
		end
		@csv[15000].must_equal(['15001','30002','15004'])
		@csv.size.must_equal(100000)
	end

	it 'reads csv with tab delimiter' do
		create_csv("\t")
		Ccsv.foreach(TEST_CSV,"\t") do |v|
			@csv << v
		end
		@csv[15000].must_equal(['15001','30002','15004'])
	end

	it 'reads csv with comma delimiter' do
		create_csv(',')
		Ccsv.foreach(TEST_CSV,',') do |v|
			@csv << v
		end
		@csv[15000].must_equal(['15001','30002','15004'])
	end

	it 'raises error' do
		proc {
			Ccsv.foreach('/non-existent-file') do |x| end
		}.must_raise(RuntimeError)
	end

#	bench_performance_linear 'just read', 0.9 do |n|
#		create_csv(',',n)
#		Ccsv.foreach(TEST_CSV)
#	end
end

#describe 'my benchmarks' do
#end

__END__
require 'test/unit'
require 'ccsv'
require 'benchmark'

# Yeah, I know.
begin
  require 'csv'
  require 'rubygems'
  require 'lightcsv'
  require 'csvscan'

  module CSVScan
    def self.foreach(file, &block)
      open(file) do |f|
        scan(f, &block)
      end
    end
  end

rescue LoadError
end

class TestCcsv < Test::Unit::TestCase

  def setup
    @dir = "#{File.dirname(__FILE__)}/../"
  end

  def test_should_raise
    assert_raises(RuntimeError) do
      Ccsv.foreach('fdssfd') do
      end
    end
  end

  def test_accuracy
    ccsv = []
    file = @dir + "data_small.csv"
    Ccsv.foreach(file) do |values|
      ccsv << values.dup
    end
    csv = []
    CSV.foreach(file) do |values|
      csv << values
    end
    assert_equal csv, ccsv
  end

  def test_speed
    Benchmark.bm(5) do |x|
      [Ccsv, CSV].each do |klass| # CSVScan, LightCsv,
        x.report(klass.name) do
          klass.foreach(@dir + "data.csv") do |values| end
        end
      end
    end
  end

end