#!/usr/local/bin/ruby
if $0 == __FILE__
  Dir.chdir File.dirname(__FILE__)+'/../'
  $:.unshift File.expand_path('../lib/')
end
require 'rio'
require 'test/unit'
#require 'test/unit/testsuite'
require 'qpdir'

class TC_RIO_closeoneof < Test::Unit::TestCase
  def test_basic
    rio($QPDIR,'test_closeoneof').rmtree.mkpath.chdir {
      sf = rio(:strio)
      1.upto(3) do |n| 
        s = "Line #{n}"
        sf.puts(s)
      end
      sf.close

      exp = sf.lines[]
      rio('lines.txt') < sf
      
      exp_s = exp.join('')
      
      rio('dir').mkdir
      rio('dir/a1.txt') < rio('lines.txt')
      rio('dir/a2.txt') < rio('lines.txt')
      
      file = rio('lines.txt')
      lines = file.to_a
      assert_equal(exp,lines)
      assert_equal(true,file.closed?)
      
      file = rio('lines.txt')
      lines = file.readlines
      assert_equal(exp,lines)
      assert_equal(true,file.closed?)
      
      file = rio('lines.txt')
      str = ""
      file.each_line { |el| str += el }
      assert_equal(exp_s,str)
      assert_equal(true,file.closed?)

      file = rio('lines.txt')
      str = ""
      file.each_byte { |el| str += el.chr }
      assert_equal(true,file.closed?)

      file = rio('lines.txt')
      str = ""
      file.bytes.each { |el| str += el }
      assert_equal(true,file.closed?)

      file = rio('lines.txt')
      str = ""
      file.bytes(3).each { |el| str += el }
      assert_equal(true,file.closed?)




      file = rio('lines.txt').nocloseoneof
      lines = file.to_a
      assert_equal(exp,lines)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt').nocloseoneof
      lines = file.readlines
      assert_equal(exp,lines)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt').nocloseoneof
      str = ""
      file.each_line { |el| str += el }
      assert_equal(exp_s,str)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt').nocloseoneof
      str = ""
      file.each_byte { |el| str += el.chr }
      #assert_equal(exp_s,str)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt').nocloseoneof
      str = ""
      file.bytes.each { |el| str += el }
      #assert_equal(exp_s,str)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt').nocloseoneof
      str = ""
      file.bytes(3).each { |el| str += el }
      #assert_equal(exp_s,str)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt')
      str = ""
      file.each { |el| str += el }
      assert_equal(exp_s,str)
      assert_equal(true,file.closed?)

      file = rio('lines.txt')
      str = ""
      file.nocloseoneof.each { |el| str += el }
      assert_equal(exp_s,str)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt')
      str = ""
      file.nocloseoneof { |el| str += el }
      assert_equal(exp_s,str)
      assert_equal(false,file.closed?)
      file.close

      file = rio('lines.txt')
      str = ""
      file.closeoneof { |el| str += el }
      assert_equal(exp_s,str)
      assert_equal(true,file.closed?)


      file = rio('lines.txt')
      lines = file.nocloseoneof.readlines
      assert_equal(exp,lines)
      assert_equal(false,file.closed?)
      file.close
      
      file = rio('lines.txt').nocloseoneof
      lines = file.to_a
      assert_equal(false,file.closed?)
      file.close

      rio('dir').each { |en|
        lines = en.to_a
        assert_equal(exp,lines)
        assert_equal(true,en.closed?)
      }

      rio('dir').nocloseoneof.each { |en|
        lines = en.to_a
        assert_equal(exp,lines)
        assert_equal(false,en.closed?)
        en.close
      }

      rio('dir').nocloseoneof.each { |en|
        lines = en.closeoneof.to_a
        assert_equal(exp,lines)
        assert_equal(true,en.closed?)
      }

      rio('dir').closeoneof.each { |en|
        lines = en.nocloseoneof.to_a
        assert_equal(exp,lines)
        assert_equal(false,en.closed?)
        en.close
      }


      rio('dir').nocloseoneof { |en|
        lines = en.to_a
        assert_equal(exp,lines)
        assert_equal(false,en.closed?)
        en.close
      }

      rio('dir').nocloseoneof { |en|
        lines = en.closeoneof.to_a
        assert_equal(exp,lines)
        assert_equal(true,en.closed?)
      }

      rio('dir').closeoneof { |en|
        lines = en.nocloseoneof.to_a
        assert_equal(exp,lines)
        assert_equal(false,en.closed?)
        en.close
      }


    }
  end
    
end