# coding: utf-8

require 'test/unit/helper'

class ThinReports::Core::Shape::Tblock::Formatter::TestPadding < MiniTest::Unit::TestCase
  include ThinReports::TestHelpers
  
  # Alias
  Formatter = ThinReports::Core::Shape::Tblock::Formatter::Padding
  
  def init_formatter(expect_formats)
    format = flexmock({:format_base           => nil,
                       :format_padding_length => 0,
                       :format_padding_char   => nil,
                       :format_padding_rdir?  => false}.merge(expect_formats))
    Formatter.new(format)
  end
  
  def test_apply_padding_formats
    formatter = init_formatter(:format_padding_length => 5,
                               :format_padding_char   => '0')
    
    assert_equal formatter.apply(1), '00001'
    assert_equal formatter.apply('日本語'), '00日本語'
    
    # Text length is longer than the specified length.
    assert_equal formatter.apply('1234567'), '1234567'
    
    # When direction is right
    formatter = init_formatter(:format_padding_length => 5,
                               :format_padding_char   => '0',
                               :format_padding_rdir?  => true)
    
    assert_equal formatter.apply(123), '12300'
  end
  
  def test_apply_padding_format_with_basic_format
    formatter = init_formatter(:format_base           => '[{value}]',
                               :format_padding_length => 10,
                               :format_padding_char   => ' ')

    assert_equal formatter.apply('ABC'), '[       ABC]'
  end
  
  def test_return_raw_value_when_length_is_0
    formatter = init_formatter(:format_padding_length => 0,
                               :format_padding_char   => '0')
    
    assert_same formatter.apply(v = 123), v
    
    # But apply only basic format if have basic-format.
    formatter = init_formatter(:format_base           => '<{value}>',
                               :format_padding_length => 0,
                               :format_padding_char   => '0')
    
    assert_equal formatter.apply(123), '<123>'
  end
  
  def test_return_raw_value_when_char_is_empty
    formatter = init_formatter(:format_padding_length => 10,
                               :format_padding_char   => '')
    
    assert_same formatter.apply(v = '1'), v

    # But apply only basic format if have basic-format.
    formatter = init_formatter(:format_base           => '<{value}>',
                               :format_padding_length => 0,
                               :format_padding_char   => '0')
    
    assert_equal formatter.apply('1'), '<1>'
  end
end