class TestCase::Lib::StringBuffer {
  use StringBuffer;
  use Fn;

  static method read_write_value : int () {
    
    my $buffer = StringBuffer->new;
    $buffer->push("abc");
    
    my $value = $buffer->value;
    
    my $length = $buffer->length;
    
    $value->[0] = 'f';
    
    my $substr = Fn->substr($value, 0, $length);
    
    unless ($substr eq "fbc") {
      return 0;
    }
    
    return 1;
  }

  static method test_new : int () {
    
    my $buffer = StringBuffer->new;
    
    unless ($buffer isa StringBuffer) {
      return 0;
    }
    
    unless ($buffer->length == 0) {
      return 0;
    }
    
    return 1;
  }

  static method test_length : int () {
    unless (StringBuffer->new->length == 0) {
      return 0;
    }
    my $buffer2 = StringBuffer->new;
    $buffer2->push("a");
    unless ($buffer2->length == 1) {
      return 0;
    }
    return 1;
  }

  static method test_push  : int () {
    my $buffer = StringBuffer->new;
    $buffer->push ("abc");
    unless ($buffer->to_string eq "abc") {
      warn("actual string: " . $buffer->to_string);
      return 0;
    }
    $buffer->push ("de");
    unless ($buffer->to_string eq "abcde") {
      warn("actual string: " . $buffer->to_string);
      return 0;
    }
    $buffer->push ("f");
    unless ($buffer->to_string eq "abcdef") {
      warn("actual string: " . $buffer->to_string);
      return 0;
    }
    return 1;
  }

  static method test_push_char  : int () {
    my $buffer = StringBuffer->new;
    $buffer->push_char('a');
    unless ($buffer->to_string eq "a") {
      warn("actual string: " . $buffer->to_string);
      return 0;
    }
    $buffer->push_char('b');
    unless ($buffer->to_string eq "ab") {
      warn("actual string: " . $buffer->to_string);
      return 0;
    }
    $buffer->push_char('c');
    unless ($buffer->to_string eq "abc") {
      warn("actual string: " . $buffer->to_string);
      return 0;
    }
    return 1;
  }

  static method test_append_copy_on_write : int () {
    warn("TODO: append copy-on-write test is not implemented yet");
    return 0;
  }

  static method test_to_string : int () {
    {
      my $minimal_buf = StringBuffer->new;
      $minimal_buf->push ("a");
      unless ($minimal_buf->to_string eq "a") {
        return 0;
      }
    }
    {
      my $large_buf = StringBuffer->new;
      $large_buf->push ("b");
      unless ($large_buf->to_string eq "b") {
        return 0;
      }
    }
    return 1;
  }
}