Class: Ull::Etsii::Alu4321::Quiz::Quiz

Inherits:
Object
  • Object
show all
Defined in:
lib/ull-etsii-alu4321-quiz.rb

Overview

Clase que permite la construcciC3n de cuestionarios tipo test mediante un DSL

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) {|_self| ... } ⇒ Quiz

Recibe el nombre del test y un bloque con las preguntas y sus respuestas

Ejemplo de uso: quiz = Quiz.new(“Test 1”){ |e| e.question “Pregunta 1”, e.wrong => “Respuesta incorrecta 1”, e.wrong => “Respuesta incorrecta 2”, e.wrong => “Respuesta incorrecta 3”, e.rigth => “Respuesta correcta” }

Yields:

  • (_self)

Yield Parameters:



26
27
28
29
30
31
32
33
# File 'lib/ull-etsii-alu4321-quiz.rb', line 26

def initialize(name)
    @counter = 0
    @aciertos = 0
    @name = name
    @questions = []

    yield self
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



14
15
16
# File 'lib/ull-etsii-alu4321-quiz.rb', line 14

def name
  @name
end

#questionsObject

Returns the value of attribute questions.



14
15
16
# File 'lib/ull-etsii-alu4321-quiz.rb', line 14

def questions
  @questions
end

Instance Method Details

#question(title, anss) ⇒ Object

MC)todo que recibe el tC-tulo title de la pregunta y una serie de parC!metros como respuestas



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ull-etsii-alu4321-quiz.rb', line 50

def question(title, anss)
    answers = []

    anss.each do |ans|
        a = Answer.new(ans)
        answers << a
    end

    q = Question.new(title, answers)
    questions << q
end

#rightObject

Pregunta correcta



44
45
46
# File 'lib/ull-etsii-alu4321-quiz.rb', line 44

def right
    :right
end

#runObject

Ejecuta el test por consola. Presenta cada pregunta y las posibles respuestas. Al final muestra los resultados.



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/ull-etsii-alu4321-quiz.rb', line 64

def run
    puts name
    questions.each do |q|
        puts q
        print "Su respuesta: "
        resp = gets.chomp.to_i
        raise IndexError, "Answer must be between 1 and #{q.answers.size}." unless resp <= q.answers.size and resp > 0
        if q.answers[resp-1].state
            puts "Correcto!".colorize(:light_green)
            @aciertos += 1
        else
            correcta = q.answers.select { |ans| ans.state }.first
            puts "Fallo, la respuesta correcta era #{correcta}".colorize(:red)
        end
        puts
    end
    puts "Has acertado el #{(@aciertos/questions.size.to_f)*100}% de las preguntas [#{@aciertos} de #{questions.size}]."
end

#to_htmlObject

Genera el test en formato html. Dicho test es totalmente funcional, permitiendo la selecciC3n de respuestas y la correcciC3n de las mismas

Raises:

  • (IOError)


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/ull-etsii-alu4321-quiz.rb', line 95

def to_html
    # SetUp del fichero de salida
    if not Dir.exist? "html"
        # Copiamos el directorio html con los ficheros bC!sicos
        require 'fileutils'
        FileUtils.cp_r File.expand_path(File.dirname(__FILE__)) + '/html', 'html'
    end
    # Generamos HTML
    htmlFile = File.new("html/#{name.gsub(/[\ \\\/:]/, '_')}.html", "w")
    raise IOError, 'Can\'t access to html output file' unless htmlFile
    # Generamos JavaScript
    jsFile = File.new("html/js/quiz.js", "w")
    raise IOError, 'Can\'t access to javascript output file' unless jsFile
    
    # Construimos los ERB y los escribimos en los ficheros
    require 'templates'
    rhtml = ERB.new(HTML_TEMPLATE)
    htmlFile.syswrite(rhtml.result(binding))
    htmlFile.close
    
    rjs = ERB.new(JAVASCRIPT_TEMPLATE)
    jsFile.syswrite(rjs.result(binding))
    jsFile.close
    
    
end

#to_sObject

RepresentaciC3n visual de un Test en forma de String.



84
85
86
87
88
89
90
# File 'lib/ull-etsii-alu4321-quiz.rb', line 84

def to_s
    out = name + "\n"
    questions.each do |q|
        out << "#{q}\n"
    end
    out
end

#wrongObject

Pregunta incorrecta

Avoid collisions



38
39
40
41
# File 'lib/ull-etsii-alu4321-quiz.rb', line 38

def wrong
    @counter += 1
    [@counter, WRONG]
end