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

class TC_truncate < Test::RIO::TestCase
  @@once = false
  def self.once
    @@once = true

  end

  def setup
    super
    self.class.once unless @@once

  end

  def setup_files(tag)
    str = "1234567890"
    fnbase = "out." + tag
    fnruby = fnbase + '.ruby'
    rio(fnruby).print!(str)
    fnrio = fnbase + '.rio'
    rio(fnrio).print!(str)
    [str,fnruby,fnrio]
  end

  def do_changesize(str,fnruby,fnrio,inc)
    n = str.size + inc
    File.truncate(fnruby,n)
    rio(fnrio).truncate(n)
    assert_equal(File.size(fnruby),rio(fnrio).size)
    assert_equal(n,rio(fnrio).size)

    fruby_contents = nil
    f = File.open(fnruby,'r') do |io|
      fruby_contents = io.read
    end
    assert_equal(fruby_contents, rio(fnrio).contents)
  end

  def test_setup
    str,fnruby,fnrio = setup_files('setup')

    assert_equal(File.size(fnruby),rio(fnrio).size)

    fruby_contents = nil
    f = File.open(fnruby,'r') do |io|
      fruby_contents = io.read
    end
    assert_equal(fruby_contents, rio(fnrio).contents)
  end

  def test_nochange
    str,fnruby,fnrio = setup_files('nochange')

    File.truncate(fnruby,str.size)
    rio(fnrio).truncate(str.size)
    assert_equal(File.size(fnruby),rio(fnrio).size)
  end

  def test_clear1
    str,fnrio1,fnrio2 = setup_files('clear1a')

    assert_equal(rio(fnrio1).truncate(0).size,rio(fnrio2).clear.size)
    str,fnrio1,fnrio2 = setup_files('clear1b')
    assert_equal(rio(fnrio1).truncate(0).contents,rio(fnrio2).clear.contents)
  end

  def test_clear2
    str,fnrio1,fnrio2 = setup_files('clear2a')

    assert_equal(rio(fnrio1).truncate.size,rio(fnrio2).clear.size)
    str,fnrio1,fnrio2 = setup_files('cleara')
    assert_equal(rio(fnrio1).truncate.contents,rio(fnrio2).clear.contents)
  end

  def test_clear3
    str,fnrio1,fnrio2 = setup_files('clear3a')

    assert_equal(0,rio(fnrio2).clear.size)

    str,fnrio1,fnrio2 = setup_files('clear3b')
    assert_equal("",rio(fnrio2).clear.contents)
  end

  def test_shorten
    str,fnruby,fnrio = setup_files('shorten')
    do_changesize(str,fnruby,fnrio,-1)
  end

  def test_lengthen
    str,fnruby,fnrio = setup_files('lengthen')
    do_changesize(str,fnruby,fnrio,1)
  end

  def test_shorten_to_zero
    str,fnruby,fnrio = setup_files('shorten_to_zero')
    do_changesize(str,fnruby,fnrio,-str.size)
  end

  def test_shorten_to_less_than_zero
    str,fnruby,fnrio = setup_files('shorten_to_less_than_zero')
    n = -1
    assert_raise Errno::EINVAL do
      File.truncate(fnruby,n)
    end
    assert_equal(str.size,File.size(fnruby))

    rio(fnrio).truncate(n)
    assert_equal(0,rio(fnrio).size)
    assert_equal("",rio(fnrio).contents)
    #do_changesize(str,fnruby,fnrio,-(str.size+1))
  end

  def test_nonexistent
    str,fnruby,fnrio = setup_files('nonexistent')
    ::File.unlink(fnruby)
    assert!(rio(fnruby).exist?)
    assert_raise Errno::ENOENT do
      File.truncate(fnruby,0)
    end
    ::File.unlink(fnrio)
    assert!(rio(fnrio).exist?)
    rio(fnrio).truncate(0)
    assert_equal(0,rio(fnrio).size)
    assert_equal("",rio(fnrio).contents)
  end



end