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