class QandA::Question::MultipleChoice

Constants

DEFAULT_IS_INTEGER_ERR
MAXIMUM_NO_ZERO_ERR
MINIMUM_NO_ZERO_ERR
MIN_GREATER_THAN_MAX
NOT_ENOUGH_OPTIONS_ERR

Public Class Methods

new(choices, message = '', default = nil, minimum = 1, maximum = nil) click to toggle source
Calls superclass method
# File lib/question/multiple_choice.rb, line 10
def initialize(choices, message = '', default = nil, minimum = 1, maximum = nil)
  @maximum = maximum.nil? ? minimum : maximum
  @minimum = minimum
  @choices    = choices
  raise InvalidQuestionError.new(NOT_ENOUGH_OPTIONS_ERR) unless choices.is_a?(Array) && choices.size > 1
  raise InvalidQuestionError.new(DEFAULT_IS_INTEGER_ERR) unless default.nil? || answer_string_is_valid?(default)
  raise InvalidQuestionError.new(MAXIMUM_NO_ZERO_ERR) unless @minimum > 0 && @maximum <= choices.size
  raise InvalidQuestionError.new(MINIMUM_NO_ZERO_ERR) unless @maximum > 0 && @minimum <= choices.size - 1
  raise InvalidQuestionError.new(MIN_GREATER_THAN_MAX) unless @maximum >= @minimum
  super(message: message, default: default)
  @validation = Proc.new { |answer| answer_string_is_valid?(answer) }
end

Public Instance Methods

answer() click to toggle source
# File lib/question/multiple_choice.rb, line 60
def answer
  arr = []
  @answer.each do |i|
    arr << @choices[i].to_s
  end
  arr
end
answer_string_is_valid?(answer) click to toggle source
# File lib/question/multiple_choice.rb, line 23
def answer_string_is_valid?(answer)
  answer = answer.to_s.split(',').map { |i| i.strip }
  valid  = true
  valid  = false if answer.length > @maximum
  valid  = false if answer.length < @minimum
  if valid
    answer.each do |answer|
      unless answer.to_i.to_s == answer && @choices.size > answer.to_i - 1
        valid = false
        break
      end
    end
  end
  valid
end
ask() click to toggle source
Calls superclass method
# File lib/question/multiple_choice.rb, line 50
def ask
  super do
    prompt
    @choices.each_with_index do |c, i|
      puts "[#{i+1}] #{c}"
    end
  end
  @answer = [*@answer.to_s.split(',').map { |i| i.strip.to_i - 1 }]
end
prompt() click to toggle source
# File lib/question/multiple_choice.rb, line 39
def prompt
  puts "\n"
  if @maximum == 1
    puts "Select only one answer:"
  elsif @maximum == @minimum
    puts "Select exactly #{@maximum} answers, separated by commas:"
  else
    puts "Select between #{@minimum} and #{@maximum} answers, separated by commas:"
  end
end