smartdown 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/smartdown/engine/transition.rb +3 -12
- data/lib/smartdown/engine.rb +13 -13
- data/lib/smartdown/model/answer/base.rb +42 -0
- data/lib/smartdown/model/answer/date.rb +22 -0
- data/lib/smartdown/model/answer/multiple_choice.rb +13 -0
- data/lib/smartdown/model/answer/salary.rb +37 -0
- data/lib/smartdown/model/element/question/date.rb +7 -1
- data/lib/smartdown/model/element/question/multiple_choice.rb +7 -1
- data/lib/smartdown/model/element/question/salary.rb +7 -1
- data/lib/smartdown/model/node.rb +17 -5
- data/lib/smartdown/model/predicate/comparison/greater.rb +1 -5
- data/lib/smartdown/model/predicate/comparison/greater_or_equal.rb +1 -5
- data/lib/smartdown/model/predicate/comparison/less.rb +1 -5
- data/lib/smartdown/model/predicate/comparison/less_or_equal.rb +1 -5
- data/lib/smartdown/model/predicate/otherwise.rb +4 -0
- data/lib/smartdown/model/predicate/set_membership.rb +1 -1
- data/lib/smartdown/version.rb +1 -1
- data/spec/model/answer/base_spec.rb +23 -0
- data/spec/model/answer/date_spec.rb +77 -0
- data/spec/model/answer/salary_spec.rb +98 -0
- data/spec/model/node_spec.rb +45 -1
- metadata +21 -11
@@ -26,24 +26,15 @@ module Smartdown
|
|
26
26
|
|
27
27
|
private
|
28
28
|
def next_node_from_next_node_rules
|
29
|
-
next_node_rules && first_matching_rule(next_node_rules.rules).outcome
|
29
|
+
node.next_node_rules && first_matching_rule(node.next_node_rules.rules).outcome
|
30
30
|
end
|
31
31
|
|
32
32
|
def next_node_from_start_button
|
33
|
-
start_button && start_button.start_node
|
33
|
+
node.start_button && node.start_button.start_node
|
34
34
|
end
|
35
35
|
|
36
36
|
def input_variable_names_from_question
|
37
|
-
|
38
|
-
questions.map(&:name)
|
39
|
-
end
|
40
|
-
|
41
|
-
def next_node_rules
|
42
|
-
node.elements.find { |e| e.is_a?(Smartdown::Model::NextNodeRules) }
|
43
|
-
end
|
44
|
-
|
45
|
-
def start_button
|
46
|
-
node.elements.find { |e| e.is_a?(Smartdown::Model::Element::StartButton) }
|
37
|
+
node.questions.map(&:name)
|
47
38
|
end
|
48
39
|
|
49
40
|
def first_matching_rule(rules)
|
data/lib/smartdown/engine.rb
CHANGED
@@ -24,22 +24,22 @@ module Smartdown
|
|
24
24
|
{}.merge(@initial_state)
|
25
25
|
end
|
26
26
|
|
27
|
-
def process(
|
27
|
+
def process(raw_responses, test_start_state = nil)
|
28
28
|
state = test_start_state || build_start_state
|
29
|
-
unprocessed_responses =
|
29
|
+
unprocessed_responses = raw_responses
|
30
30
|
while !unprocessed_responses.empty? do
|
31
|
-
nb_questions = 0
|
32
31
|
current_node = flow.node(state.get(:current_node))
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
32
|
+
|
33
|
+
if current_node.is_start_page_node?
|
34
|
+
# If it's a start page node, we've got to do something different because of the preceeding 'y' answer
|
35
|
+
transition = Transition.new(state, current_node, unprocessed_responses.shift(1))
|
36
|
+
else
|
37
|
+
answers = current_node.questions.map do |question|
|
38
|
+
question.answer_type.new(question, unprocessed_responses.shift)
|
39
|
+
end
|
40
|
+
|
41
|
+
transition = Transition.new(state, current_node, answers)
|
42
|
+
end
|
43
43
|
state = transition.next_state
|
44
44
|
end
|
45
45
|
state
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Smartdown
|
2
|
+
module Model
|
3
|
+
module Answer
|
4
|
+
class Base
|
5
|
+
extend Forwardable
|
6
|
+
include Comparable
|
7
|
+
|
8
|
+
def_delegators :value, :to_s, :to_i, :to_f, :+, :-, :*, :/
|
9
|
+
|
10
|
+
def value_type
|
11
|
+
::String
|
12
|
+
end
|
13
|
+
|
14
|
+
def <=>(other)
|
15
|
+
value <=> parse_comparison_object(other)
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :question, :value
|
19
|
+
|
20
|
+
def initialize(question, value)
|
21
|
+
@question = question
|
22
|
+
@value = parse_value(value)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def parse_comparison_object(comparison_object)
|
27
|
+
if comparison_object.is_a? Base
|
28
|
+
comparison_object.value
|
29
|
+
elsif comparison_object.is_a? value_type
|
30
|
+
comparison_object
|
31
|
+
else
|
32
|
+
parse_value(comparison_object)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_value(value)
|
37
|
+
value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Smartdown
|
4
|
+
module Model
|
5
|
+
module Answer
|
6
|
+
class Date < Base
|
7
|
+
def value_type
|
8
|
+
::Date
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
value.strftime("%Y-%-m-%-d")
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def parse_value(value)
|
17
|
+
::Date.parse(value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Smartdown
|
4
|
+
module Model
|
5
|
+
module Answer
|
6
|
+
class Salary < Base
|
7
|
+
attr_reader :period, :amount_per_period
|
8
|
+
|
9
|
+
def value_type
|
10
|
+
::Float
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
"#{'%.2f' % amount_per_period} per #{period}"
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def parse_value(value)
|
19
|
+
@amount_per_period, @period = value.split(/-|\W*per\W*/)
|
20
|
+
@amount_per_period = @amount_per_period.to_f
|
21
|
+
yearly_total
|
22
|
+
end
|
23
|
+
|
24
|
+
def yearly_total
|
25
|
+
case period
|
26
|
+
when "week"
|
27
|
+
amount_per_period * 52
|
28
|
+
when "month"
|
29
|
+
amount_per_period * 12
|
30
|
+
when "year"
|
31
|
+
amount_per_period
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,8 +1,14 @@
|
|
1
|
+
require 'smartdown/model/answer/date'
|
2
|
+
|
1
3
|
module Smartdown
|
2
4
|
module Model
|
3
5
|
module Element
|
4
6
|
module Question
|
5
|
-
Date
|
7
|
+
class Date < Struct.new(:name)
|
8
|
+
def answer_type
|
9
|
+
Smartdown::Model::Answer::Date
|
10
|
+
end
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
8
14
|
end
|
@@ -1,8 +1,14 @@
|
|
1
|
+
require 'smartdown/model/answer/multiple_choice'
|
2
|
+
|
1
3
|
module Smartdown
|
2
4
|
module Model
|
3
5
|
module Element
|
4
6
|
module Question
|
5
|
-
MultipleChoice
|
7
|
+
class MultipleChoice < Struct.new(:name, :choices)
|
8
|
+
def answer_type
|
9
|
+
Smartdown::Model::Answer::MultipleChoice
|
10
|
+
end
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
8
14
|
end
|
@@ -1,8 +1,14 @@
|
|
1
|
+
require 'smartdown/model/answer/salary'
|
2
|
+
|
1
3
|
module Smartdown
|
2
4
|
module Model
|
3
5
|
module Element
|
4
6
|
module Question
|
5
|
-
Salary
|
7
|
+
class Salary < Struct.new(:name)
|
8
|
+
def answer_type
|
9
|
+
Smartdown::Model::Answer::Salary
|
10
|
+
end
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
8
14
|
end
|
data/lib/smartdown/model/node.rb
CHANGED
@@ -7,18 +7,30 @@ module Smartdown
|
|
7
7
|
super(name, elements, front_matter || Smartdown::Model::FrontMatter.new)
|
8
8
|
end
|
9
9
|
|
10
|
+
def title
|
11
|
+
h1s.first ? h1s.first.content : ""
|
12
|
+
end
|
13
|
+
|
14
|
+
def body
|
15
|
+
markdown_blocks[1..-1].map { |block| as_markdown(block) }.compact.join("\n")
|
16
|
+
end
|
17
|
+
|
10
18
|
def questions
|
11
|
-
elements.select do |element|
|
19
|
+
@questions ||= elements.select do |element|
|
12
20
|
element.class.to_s.include?("Smartdown::Model::Element::Question")
|
13
21
|
end
|
14
22
|
end
|
15
23
|
|
16
|
-
def
|
17
|
-
|
24
|
+
def next_node_rules
|
25
|
+
@next_node_rules ||= elements.find { |e| e.is_a?(Smartdown::Model::NextNodeRules) }
|
18
26
|
end
|
19
27
|
|
20
|
-
def
|
21
|
-
|
28
|
+
def start_button
|
29
|
+
@start_button ||= elements.find { |e| e.is_a?(Smartdown::Model::Element::StartButton) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_start_page_node?
|
33
|
+
@is_start_page_node ||= !!start_button
|
22
34
|
end
|
23
35
|
|
24
36
|
private
|
@@ -8,11 +8,7 @@ module Smartdown
|
|
8
8
|
class Greater < Base
|
9
9
|
def evaluate(state)
|
10
10
|
variable = state.get(varname)
|
11
|
-
|
12
|
-
Date.parse(variable) > Date.parse(value)
|
13
|
-
else
|
14
|
-
variable > value
|
15
|
-
end
|
11
|
+
variable > value
|
16
12
|
end
|
17
13
|
|
18
14
|
def humanize
|
@@ -8,11 +8,7 @@ module Smartdown
|
|
8
8
|
class GreaterOrEqual < Base
|
9
9
|
def evaluate(state)
|
10
10
|
variable = state.get(varname)
|
11
|
-
|
12
|
-
Date.parse(variable) >= Date.parse(value)
|
13
|
-
else
|
14
|
-
variable >= value
|
15
|
-
end
|
11
|
+
variable >= value
|
16
12
|
end
|
17
13
|
|
18
14
|
def humanize
|
@@ -8,11 +8,7 @@ module Smartdown
|
|
8
8
|
class Less < Base
|
9
9
|
def evaluate(state)
|
10
10
|
variable = state.get(varname)
|
11
|
-
|
12
|
-
Date.parse(variable) < Date.parse(value)
|
13
|
-
else
|
14
|
-
variable < value
|
15
|
-
end
|
11
|
+
variable < value
|
16
12
|
end
|
17
13
|
|
18
14
|
def humanize
|
@@ -8,11 +8,7 @@ module Smartdown
|
|
8
8
|
class LessOrEqual < Base
|
9
9
|
def evaluate(state)
|
10
10
|
variable = state.get(varname)
|
11
|
-
|
12
|
-
Date.parse(variable) <= Date.parse(value)
|
13
|
-
else
|
14
|
-
variable <= value
|
15
|
-
end
|
11
|
+
variable <= value
|
16
12
|
end
|
17
13
|
|
18
14
|
def humanize
|
data/lib/smartdown/version.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'smartdown/model/answer/base'
|
2
|
+
|
3
|
+
describe Smartdown::Model::Answer::Base do
|
4
|
+
let(:question) { :a_question }
|
5
|
+
let(:value) { 'a value' }
|
6
|
+
|
7
|
+
subject(:instance) {Smartdown::Model::Answer::Base.new(question, value)}
|
8
|
+
|
9
|
+
specify { expect(instance.question).to eql question }
|
10
|
+
|
11
|
+
describe "value parsing" do
|
12
|
+
it "should assign the return value of parse_value (to be implemented by sub-classes) to value" do
|
13
|
+
expect_any_instance_of(Smartdown::Model::Answer::Base).to receive(:parse_value).with(value).and_return("parsed value")
|
14
|
+
expect(instance.value).to eql "parsed value"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "simple type behaviour" do
|
19
|
+
[:==, :<, :>, :<=, :>=, :to_s, :to_i, :to_f, :+, :-, :*, :/].each do |method|
|
20
|
+
it { should respond_to(method) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'smartdown/model/answer/date'
|
2
|
+
require 'smartdown/model/element/question/date'
|
3
|
+
|
4
|
+
describe Smartdown::Model::Answer::Date do
|
5
|
+
let(:date_string) { "2014-9-4" }
|
6
|
+
let(:question) { Smartdown::Model::Element::Question::Date.new("a_date") }
|
7
|
+
subject(:instance) { described_class.new(question, date_string) }
|
8
|
+
|
9
|
+
specify { expect(instance.value).to eql Date.new(2014, 9, 4) }
|
10
|
+
specify { expect(instance.to_s).to eql "2014-9-4" }
|
11
|
+
|
12
|
+
|
13
|
+
describe "comparisons" do
|
14
|
+
let(:date_string) { "2000-1-10" }
|
15
|
+
|
16
|
+
context "comparing against ::Dates" do
|
17
|
+
|
18
|
+
specify { expect(instance == Date.new(2000, 1, 10)).to eql true }
|
19
|
+
|
20
|
+
specify { expect(instance < Date.new(2000, 1, 11)).to eql true }
|
21
|
+
specify { expect(instance < Date.new(2000, 1, 10)).to eql false }
|
22
|
+
specify { expect(instance < Date.new(2000, 1, 9)).to eql false }
|
23
|
+
|
24
|
+
specify { expect(instance > Date.new(2000, 1, 11)).to eql false }
|
25
|
+
specify { expect(instance > Date.new(2000, 1, 10)).to eql false }
|
26
|
+
specify { expect(instance > Date.new(2000, 1, 9)).to eql true }
|
27
|
+
|
28
|
+
specify { expect(instance <= Date.new(2000, 1, 11)).to eql true }
|
29
|
+
specify { expect(instance <= Date.new(2000, 1, 10)).to eql true }
|
30
|
+
specify { expect(instance <= Date.new(2000, 1, 9)).to eql false }
|
31
|
+
|
32
|
+
specify { expect(instance >= Date.new(2000, 1, 11)).to eql false }
|
33
|
+
specify { expect(instance >= Date.new(2000, 1, 10)).to eql true }
|
34
|
+
specify { expect(instance >= Date.new(2000, 1, 9)).to eql true }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "comparing against strings" do
|
38
|
+
specify { expect(instance == "2000-1-10").to eql true }
|
39
|
+
|
40
|
+
specify { expect(instance < "2000-1-11").to eql true }
|
41
|
+
specify { expect(instance < "2000-1-10").to eql false }
|
42
|
+
specify { expect(instance < "2000-1-9").to eql false }
|
43
|
+
|
44
|
+
specify { expect(instance > "2000-1-11").to eql false }
|
45
|
+
specify { expect(instance > "2000-1-10").to eql false }
|
46
|
+
specify { expect(instance > "2000-1-9").to eql true }
|
47
|
+
|
48
|
+
specify { expect(instance <= "2000-1-11").to eql true }
|
49
|
+
specify { expect(instance <= "2000-1-10").to eql true }
|
50
|
+
specify { expect(instance <= "2000-1-9").to eql false }
|
51
|
+
|
52
|
+
specify { expect(instance >= "2000-1-11").to eql false }
|
53
|
+
specify { expect(instance >= "2000-1-10").to eql true }
|
54
|
+
specify { expect(instance >= "2000-1-9").to eql true }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "comparing against Answer::Dates" do
|
58
|
+
specify { expect(instance == described_class.new(nil, "2000-1-10")).to eql true }
|
59
|
+
|
60
|
+
specify { expect(instance < described_class.new(nil, "2000-1-11")).to eql true }
|
61
|
+
specify { expect(instance < described_class.new(nil, "2000-1-10")).to eql false }
|
62
|
+
specify { expect(instance < described_class.new(nil, "2000-1-9")).to eql false }
|
63
|
+
|
64
|
+
specify { expect(instance > described_class.new(nil, "2000-1-11")).to eql false }
|
65
|
+
specify { expect(instance > described_class.new(nil, "2000-1-10")).to eql false }
|
66
|
+
specify { expect(instance > described_class.new(nil, "2000-1-9")).to eql true }
|
67
|
+
|
68
|
+
specify { expect(instance <= described_class.new(nil, "2000-1-11")).to eql true }
|
69
|
+
specify { expect(instance <= described_class.new(nil, "2000-1-10")).to eql true }
|
70
|
+
specify { expect(instance <= described_class.new(nil, "2000-1-9")).to eql false }
|
71
|
+
|
72
|
+
specify { expect(instance >= described_class.new(nil, "2000-1-11")).to eql false }
|
73
|
+
specify { expect(instance >= described_class.new(nil, "2000-1-10")).to eql true }
|
74
|
+
specify { expect(instance >= described_class.new(nil, "2000-1-9")).to eql true }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'smartdown/model/answer/date'
|
2
|
+
require 'smartdown/model/element/question/date'
|
3
|
+
|
4
|
+
describe Smartdown::Model::Answer::Salary do
|
5
|
+
let(:salary_string) { "500-week" }
|
6
|
+
let(:question) { Smartdown::Model::Element::Question::Date.new("a_date") }
|
7
|
+
subject(:instance) { described_class.new(question, salary_string) }
|
8
|
+
|
9
|
+
specify { expect(instance.period).to eql('week') }
|
10
|
+
specify { expect(instance.amount_per_period).to eql(500.00) }
|
11
|
+
|
12
|
+
it "as a string, it should declare itself in the initial format provided" do
|
13
|
+
expect(instance.to_s).to eql("500.00 per week")
|
14
|
+
end
|
15
|
+
|
16
|
+
context "declared by week" do
|
17
|
+
let(:salary_string) { "500-week" }
|
18
|
+
specify { expect(instance.value).to eql 500.0 * 52 }
|
19
|
+
end
|
20
|
+
|
21
|
+
context "declared by month" do
|
22
|
+
let(:salary_string) { "2000-month" }
|
23
|
+
specify { expect(instance.value).to eql 2000.0 * 12 }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "declared by year" do
|
27
|
+
let(:salary_string) { "20000-year" }
|
28
|
+
specify { expect(instance.value).to eql 20000.0 }
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
describe "comparisons" do
|
33
|
+
let(:salary_string) { "1200-week" } # equivalent to 62,400 yearly or 5200 monthly
|
34
|
+
|
35
|
+
context "comparing against ::Floats" do
|
36
|
+
specify { expect(instance == 62400.0).to eql true }
|
37
|
+
|
38
|
+
specify { expect(instance < 62400.1).to eql true }
|
39
|
+
specify { expect(instance < 62400.0).to eql false }
|
40
|
+
specify { expect(instance < 62399.9).to eql false }
|
41
|
+
|
42
|
+
specify { expect(instance > 62400.1).to eql false }
|
43
|
+
specify { expect(instance > 62400.0).to eql false }
|
44
|
+
specify { expect(instance > 62399.9).to eql true }
|
45
|
+
|
46
|
+
specify { expect(instance <= 62400.1).to eql true }
|
47
|
+
specify { expect(instance <= 62400.0).to eql true }
|
48
|
+
specify { expect(instance <= 62399.9).to eql false }
|
49
|
+
|
50
|
+
specify { expect(instance >= 62400.1).to eql false }
|
51
|
+
specify { expect(instance >= 62400.0).to eql true }
|
52
|
+
specify { expect(instance >= 62399.9).to eql true }
|
53
|
+
end
|
54
|
+
|
55
|
+
context "comparing against strings" do
|
56
|
+
specify { expect(instance == "1200-week").to eql true }
|
57
|
+
specify { expect(instance == "5200-month").to eql true }
|
58
|
+
specify { expect(instance == "62400-year").to eql true }
|
59
|
+
specify { expect(instance == "10-month").to eql false }
|
60
|
+
|
61
|
+
specify { expect(instance < "62400.1-year").to eql true }
|
62
|
+
specify { expect(instance < "5200.0-month").to eql false }
|
63
|
+
specify { expect(instance < "1199.9-week").to eql false }
|
64
|
+
|
65
|
+
specify { expect(instance > "1200.1-week").to eql false }
|
66
|
+
specify { expect(instance > "62400-year").to eql false }
|
67
|
+
specify { expect(instance > "5199.9-month").to eql true }
|
68
|
+
|
69
|
+
specify { expect(instance <= "62400.1-year").to eql true }
|
70
|
+
specify { expect(instance <= "5200.0-month").to eql true }
|
71
|
+
specify { expect(instance <= "1199.9-week").to eql false }
|
72
|
+
|
73
|
+
specify { expect(instance >= "1200.1-week").to eql false }
|
74
|
+
specify { expect(instance >= "62400-year").to eql true }
|
75
|
+
specify { expect(instance >= "5199.9-month").to eql true }
|
76
|
+
end
|
77
|
+
|
78
|
+
context "comparing against Answer::Salaries" do
|
79
|
+
specify { expect(instance == described_class.new(nil, "1200-week")).to eql true }
|
80
|
+
|
81
|
+
specify { expect(instance < described_class.new(nil, "1200.1-week")).to eql true }
|
82
|
+
specify { expect(instance < described_class.new(nil, "1200.0-week")).to eql false }
|
83
|
+
specify { expect(instance < described_class.new(nil, "1199.9-week")).to eql false }
|
84
|
+
|
85
|
+
specify { expect(instance > described_class.new(nil, "1200.1-week")).to eql false }
|
86
|
+
specify { expect(instance > described_class.new(nil, "1200.0-week")).to eql false }
|
87
|
+
specify { expect(instance > described_class.new(nil, "1199.9-week")).to eql true }
|
88
|
+
|
89
|
+
specify { expect(instance <= described_class.new(nil, "1200.1-week")).to eql true }
|
90
|
+
specify { expect(instance <= described_class.new(nil, "1200.0-week")).to eql true }
|
91
|
+
specify { expect(instance <= described_class.new(nil, "1199.9-week")).to eql false }
|
92
|
+
|
93
|
+
specify { expect(instance >= described_class.new(nil, "1200.1-week")).to eql false }
|
94
|
+
specify { expect(instance >= described_class.new(nil, "1200.0-week")).to eql true }
|
95
|
+
specify { expect(instance >= described_class.new(nil, "1199.9-week")).to eql true }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/spec/model/node_spec.rb
CHANGED
@@ -3,9 +3,9 @@ require 'smartdown/model/node'
|
|
3
3
|
describe Smartdown::Model::Node do
|
4
4
|
let(:name) { "my node" }
|
5
5
|
let(:elements) { [] }
|
6
|
+
subject(:node) { described_class.new(name, elements) }
|
6
7
|
|
7
8
|
describe "#new" do
|
8
|
-
subject(:node) { described_class.new(name, elements) }
|
9
9
|
|
10
10
|
it "accepts name and list of body blocks" do
|
11
11
|
expect(node.name).to eq(name)
|
@@ -29,4 +29,48 @@ describe Smartdown::Model::Node do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
describe "#questions" do
|
34
|
+
context "with seval elements, some of which are questions" do
|
35
|
+
let(:elements) { [
|
36
|
+
Smartdown::Model::Element::MarkdownHeading.new("A Heading"),
|
37
|
+
Smartdown::Model::Element::Question::Date.new("a_date_question"),
|
38
|
+
Smartdown::Model::Element::Question::MultipleChoice.new("a_multiple_choice_question"),
|
39
|
+
Smartdown::Model::Element::MarkdownParagraph.new("Some text"),
|
40
|
+
] }
|
41
|
+
specify { expect(node.questions).to eq elements[1..2] }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#next_node_rules" do
|
46
|
+
context "with elements, one of which is a NextNodeRules questions" do
|
47
|
+
let(:elements) { [
|
48
|
+
Smartdown::Model::Element::MarkdownHeading.new("A Heading"),
|
49
|
+
Smartdown::Model::NextNodeRules.new(:rules)
|
50
|
+
] }
|
51
|
+
specify { expect(node.next_node_rules).to eq elements[1] }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#start_button" do
|
56
|
+
context "with elements, one of which is a StartButton questions" do
|
57
|
+
let(:elements) { [
|
58
|
+
Smartdown::Model::Element::StartButton.new(:a_start_node),
|
59
|
+
Smartdown::Model::NextNodeRules.new(:rules)
|
60
|
+
] }
|
61
|
+
specify { expect(node.start_button).to eq elements[0] }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#is_start_page_node?" do
|
66
|
+
context "with a StartButton element" do
|
67
|
+
let (:elements) { [Smartdown::Model::Element::StartButton.new(:some_start_node)] }
|
68
|
+
specify { expect(node.is_start_page_node?).to eql true }
|
69
|
+
end
|
70
|
+
|
71
|
+
context "without a StartButton element" do
|
72
|
+
let (:elements) { [] }
|
73
|
+
specify { expect(node.is_start_page_node?).to eql false }
|
74
|
+
end
|
75
|
+
end
|
32
76
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2014-07-09 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parslet
|
16
|
-
requirement: &
|
16
|
+
requirement: &6529700 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.6.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *6529700
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &6526340 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *6526340
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &6541220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *6541220
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: gem_publisher
|
49
|
-
requirement: &
|
49
|
+
requirement: &6539420 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *6539420
|
58
58
|
description:
|
59
59
|
email: david.heath@digital.cabinet-office.gov.uk
|
60
60
|
executables:
|
@@ -117,6 +117,10 @@ files:
|
|
117
117
|
- lib/smartdown/model/predicate/otherwise.rb
|
118
118
|
- lib/smartdown/model/node.rb
|
119
119
|
- lib/smartdown/model/front_matter.rb
|
120
|
+
- lib/smartdown/model/answer/date.rb
|
121
|
+
- lib/smartdown/model/answer/base.rb
|
122
|
+
- lib/smartdown/model/answer/salary.rb
|
123
|
+
- lib/smartdown/model/answer/multiple_choice.rb
|
120
124
|
- lib/smartdown/model/element/conditional.rb
|
121
125
|
- lib/smartdown/model/element/markdown_paragraph.rb
|
122
126
|
- lib/smartdown/model/element/start_button.rb
|
@@ -182,6 +186,9 @@ files:
|
|
182
186
|
- spec/engine_spec.rb
|
183
187
|
- spec/model/node_spec.rb
|
184
188
|
- spec/model/flow_spec.rb
|
189
|
+
- spec/model/answer/base_spec.rb
|
190
|
+
- spec/model/answer/salary_spec.rb
|
191
|
+
- spec/model/answer/date_spec.rb
|
185
192
|
- spec/model/predicates/set_membership_spec.rb
|
186
193
|
- spec/model/predicates/combined_spec.rb
|
187
194
|
- spec/model/predicates/comparison_spec.rb
|
@@ -203,7 +210,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
203
210
|
version: '0'
|
204
211
|
segments:
|
205
212
|
- 0
|
206
|
-
hash:
|
213
|
+
hash: -2794088758218871255
|
207
214
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
215
|
none: false
|
209
216
|
requirements:
|
@@ -212,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
219
|
version: '0'
|
213
220
|
segments:
|
214
221
|
- 0
|
215
|
-
hash:
|
222
|
+
hash: -2794088758218871255
|
216
223
|
requirements: []
|
217
224
|
rubyforge_project:
|
218
225
|
rubygems_version: 1.8.11
|
@@ -271,6 +278,9 @@ test_files:
|
|
271
278
|
- spec/engine_spec.rb
|
272
279
|
- spec/model/node_spec.rb
|
273
280
|
- spec/model/flow_spec.rb
|
281
|
+
- spec/model/answer/base_spec.rb
|
282
|
+
- spec/model/answer/salary_spec.rb
|
283
|
+
- spec/model/answer/date_spec.rb
|
274
284
|
- spec/model/predicates/set_membership_spec.rb
|
275
285
|
- spec/model/predicates/combined_spec.rb
|
276
286
|
- spec/model/predicates/comparison_spec.rb
|