diff --git a/lib/fbe/award.rb b/lib/fbe/award.rb index ad3d8cd..1cd00dd 100644 --- a/lib/fbe/award.rb +++ b/lib/fbe/award.rb @@ -358,7 +358,12 @@ def set(var, value) # bill.line(50, "for code review") def line(value, text) return if value.zero? - text = text.gsub(/\$\{([a-z_0-9]+)\}/) { |_x| @vars[Regexp.last_match[1].to_sym] } + text = + text.gsub(/\$\{([a-z_0-9]+)\}/) do |_x| + k = Regexp.last_match[1].to_sym + raise(Fbe::Error, "Undefined variable '#{k}' used in award text: #{text}") unless @vars.key?(k) + @vars[k] + end @lines << { v: value, t: text } end @@ -445,7 +450,12 @@ def intro(text) # bylaw.let(:points, 50) # bylaw.line("award ${points} points") def line(line) - line = line.gsub(/\$\{([a-z_0-9]+)\}/) { |_x| "**#{@lets[Regexp.last_match[1].to_sym]}**" } + line = + line.gsub(/\$\{([a-z_0-9]+)\}/) do |_x| + k = Regexp.last_match[1].to_sym + raise(Fbe::Error, "Undefined variable '#{k}' used in bylaw text: #{line}") unless @lets.key?(k) + "**#{@lets[k]}**" + end @lines << line end diff --git a/test/fbe/test_award.rb b/test/fbe/test_award.rb index 0ce4c15..44a0a30 100644 --- a/test/fbe/test_award.rb +++ b/test/fbe/test_award.rb @@ -130,6 +130,16 @@ def test_shorten_when_nothing assert_equal('You\'ve earned nothing. ', g, g) end + def test_bill_raises_on_undefined_var + a = Fbe::Award.new('(award (give 10 "test ${missing}"))') + assert_raises(Fbe::Error) { a.bill } + end + + def test_bylaw_raises_on_undefined_var + a = Fbe::Award.new('(award (aka (give 10 "points") "${undefined} points"))') + assert_raises(Fbe::Error) { a.bylaw } + end + def test_division_by_zero_raises_error a = Fbe::Award.new('(award (set x (div 10 0)) (give x "test"))') assert_raises(Fbe::Error) { a.bill }