require File.dirname(__FILE__) + '/../test_helper'
include HasSetting
class FormattersTest < Test::Unit::TestCase
  def test_for_type
    [:string, :float, :floats, :int, :ints, :strings, :boolean, :booleans].each do |symbol|
      assert(Formatters.for_type(symbol), "No formatter for #{symbol}")
    end
    assert_raises(ArgumentError) do
      Formatters.for_type(:rarararararara_i_do_not_exist)
    end
  end
  
  def test_strings_formatter
    f = Formatters::StringsFormatter.new
    assert_equal(nil, f.to_s(nil))
    assert_equal('bla', f.to_s('bla'))
    assert_equal('bla', f.to_s(['bla']))
    assert_equal('bla,bli', f.to_s(['bla', 'bli']))
    assert_equal('\,schni\,schna\,,bli,\,bla', f.to_s([',schni,schna,', 'bli', ',bla']))
    assert_equal('\,\,\,\,,\,\,\,,\,\,,\,', f.to_s([',,,,', ',,,', ',,', ',']))
    
    assert_equal(nil, f.to_type(nil))
    assert_equal([], f.to_type(''))
    assert_equal(['bli'], f.to_type('bli'))
    assert_equal(['bli','', 'bla'], f.to_type('bli,,bla'))
    assert_equal([',schni,schna,', 'bli', ',bla'], f.to_type('\,schni\,schna\,,bli,\,bla'))
    assert_equal([',,,,', ',,,', ',,', ','], f.to_type('\,\,\,\,,\,\,\,,\,\,,\,'))
  end
  

  def test_string_formatter()
    f = Formatters::StringFormatter.new
    assert_equal('', f.to_s(''))
    assert_equal('a', f.to_s('a'))
    assert_equal('', f.to_type(''))
    assert_equal('a', f.to_type('a'))
  end
  
  def test_boolean_formatter
    f = Formatters::BooleanFormatter.new
    assert_equal('1', f.to_s(''))
    assert_equal('1', f.to_s(true))
    assert_equal('0', f.to_s(false))
    assert_equal(nil, f.to_s(nil))
    
    assert_equal(true, f.to_type('1'))
    assert_equal(false, f.to_type('0'))
    assert_equal(nil, f.to_type(nil))
  end
  
  def test_int_formatter()
    f = Formatters::IntFormatter.new
    assert_raises(ArgumentError) do 
      f.to_s('')
    end
    assert_raises(ArgumentError) do 
      f.to_s('asas')
    end
    assert_nil(f.to_s(nil))
    assert_equal('2', f.to_s(2.6))
    assert_equal('2', f.to_s(2))
    
    assert_raises(ArgumentError) do 
      f.to_type('')
    end
    assert_raises(ArgumentError) do 
      f.to_type('asas')
    end
    assert_nil(f.to_type(nil))
    assert_equal(2, f.to_type('2'))
    assert_equal(2, f.to_type('2.6'))
    assert_equal(2, f.to_type(' 2.6 '))
  end  
  
  def test_float_formatter()
    f = Formatters::FloatFormatter.new
    assert_raises(ArgumentError) do 
      f.to_s('')
    end
    assert_raises(ArgumentError) do 
      f.to_s('asas')
    end
    assert_nil(f.to_s(nil))
    assert_equal('2.6', f.to_s(2.6))
    assert_equal('2.0', f.to_s(2))
    
    assert_raises(ArgumentError) do 
      f.to_type('')
    end
    assert_raises(ArgumentError) do 
      f.to_type('asas')
    end
    assert_nil(f.to_type(nil))
    assert_equal(2.0, f.to_type('2'))
    assert_equal(2.6, f.to_type('2.6'))
  end  
  
  def test_ints_formatter
    f = Formatters::IntsFormatter.new
    assert_equal(nil, f.to_s(nil))
    assert_equal('1', f.to_s(1))
    assert_equal('1', f.to_s([1]))
    assert_equal('1,2', f.to_s([1,2]))
    
    assert_equal(nil, f.to_type(nil))
    assert_equal([], f.to_type(''))
    assert_equal([1], f.to_type('1'))
    assert_equal([1,2], f.to_type('1,2'))
  end
  def test_floats_formatter
    f = Formatters::FloatsFormatter.new
    assert_equal(nil, f.to_s(nil))
    assert_equal('1.2', f.to_s(1.2))
    assert_equal('1.2', f.to_s([1.2]))
    assert_equal('1.2,1.3', f.to_s([1.2,1.3]))
    
    assert_equal(nil, f.to_type(nil))
    assert_equal([], f.to_type(''))
    assert_equal([1.2], f.to_type('1.2'))
    assert_equal([1.2,1.3], f.to_type('1.2,1.3'))
    assert_equal([1.2,1.3], f.to_type('1.2, 1.3'))
  end
  def test_booleans_formatter
    f = Formatters::BooleansFormatter.new
    assert_equal(nil, f.to_s(nil))
    assert_equal('1', f.to_s(true))
    assert_equal('1', f.to_s([true]))
    assert_equal('1,0', f.to_s([true,false]))
    
    assert_equal(nil, f.to_type(nil))
    assert_equal([], f.to_type(''))
    assert_equal([true], f.to_type('1'))
    assert_equal([true, false], f.to_type('1,0'))
  end
end