# Testuje minimaln lub maksymaln dugo atrybutu
def assert_length(boundary, object, attribute, length, options = {})
  valid_char = options[:valid_char] || "a"
  barely_invalid = barely_invalid_string(boundary, length, valid_char)
  # Testuje 1 poza granic
  object[attribute] = barely_invalid
  assert !object.valid?,
        "#{object[attribute]} (length #{object[attribute].length}) " +
        "should raise a length error"
  assert_equal correct_error_message(boundary, length),
               object.errors.on(attribute)
  
  # Testuje granic
  barely_valid = valid_char * length
  object[attribute] = barely_valid
  assert object.valid?,
       "#{object[attribute]} (length #{object[attribute].length}) " +
       "should be on the boundary of validity"
end

# Tworzy atrybut, ktry jest tylko troch nieprawidowy
def barely_invalid_string(boundary, length, valid_char)
  if boundary == :max
    invalid_length = length + 1
  elsif boundary == :min
    invalid_length = length - 1
  else
    raise ArgumentError, "boundary must be :max or :min"
  end
  valid_char * invalid_length
end

# Zwraca poprawny komunikat o bdzie dla testu dugoci
def correct_error_message(boundary, length)
  error_messages = ActiveRecord::Errors.default_error_messages
  if boundary == :max
    sprintf(error_messages[:too_long], length)
  elsif boundary == :min
    sprintf(error_messages[:too_short], length)
  else
    raise ArgumentError, "boundary must be :max or :min"
  end
end

