Skip to content

Commit

Permalink
Handle negative numeric arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
candlerb authored and Tobias Lütke committed Jan 14, 2010
1 parent 96692ff commit 1fb94e7
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
6 changes: 3 additions & 3 deletions lib/liquid/context.rb
Expand Up @@ -139,14 +139,14 @@ def resolve(key)
# Double quoted strings
when /^"(.*)"$/
$1.to_s
# Integer and floats
when /^(\d+)$/
# Integer
when /^([+-]?\d+)$/
$1.to_i
# Ranges
when /^\((\S+)\.\.(\S+)\)$/
(resolve($1).to_i..resolve($2).to_i)
# Floats
when /^(\d[\d\.]+)$/
when /^([+-]?\d[\d\.]+)$/
$1.to_f
else
variable(key)
Expand Down
51 changes: 51 additions & 0 deletions test/filter_test.rb
Expand Up @@ -17,13 +17,33 @@ def money(input)
end
end

module FiltersWithArguments
def adjust(input, offset=10)
sprintf('[%d]', input+offset)
end

def addsub(input, plus, minus=20)
sprintf('[%d]', input+plus-minus)
end
end

class FiltersTest < Test::Unit::TestCase
include Liquid

def setup
@context = Context.new
end

#def test_nonexistent_filter
# @context['var'] = 1000
# assert_match /Error - filter 'money'/, Variable.new("var | money").render(@context)
#end

def test_nonexistent_filter
@context['var'] = 1000
assert_raises(FilterNotFound) { Variable.new("var | xyzzy").render(@context) }
end

def test_local_filter
@context['var'] = 1000
@context.add_filters(MoneyFilter)
Expand All @@ -36,6 +56,37 @@ def test_underscore_in_filter_name
assert_equal ' 1000$ ', Variable.new("var | money_with_underscore").render(@context)
end

def test_filter_with_numeric_argument
@context['var'] = 1000
@context.add_filters(FiltersWithArguments)
assert_equal '[1005]', Variable.new("var | adjust: 5").render(@context)
end

def test_filter_with_negative_argument
@context['var'] = 1000
@context.add_filters(FiltersWithArguments)
assert_equal '[995]', Variable.new("var | adjust: -5").render(@context)
end

def test_filter_with_default_argument
@context['var'] = 1000
@context.add_filters(FiltersWithArguments)
assert_equal '[1010]', Variable.new("var | adjust").render(@context)
end

def test_filter_with_two_arguments
@context['var'] = 1000
@context.add_filters(FiltersWithArguments)
assert_equal '[1150]', Variable.new("var | addsub: 200, 50").render(@context)
end

# ATM the trailing value is silently ignored. Should raise an exception?
#def test_filter_with_two_arguments_no_comma
# @context['var'] = 1000
# @context.add_filters(FiltersWithArguments)
# assert_equal '[1150]', Variable.new("var | addsub: 200 50").render(@context)
#end

def test_second_filter_overwrites_first
@context['var'] = 1000
@context.add_filters(MoneyFilter)
Expand Down

0 comments on commit 1fb94e7

Please sign in to comment.