2012-12-19 15:54:47 -05:00
|
|
|
require 'abstract_unit'
|
|
|
|
|
|
|
|
module ActionDispatch
|
|
|
|
module Journey
|
|
|
|
module GTG
|
2012-12-31 12:36:30 -05:00
|
|
|
class TestBuilder < ActiveSupport::TestCase
|
2012-12-19 15:54:47 -05:00
|
|
|
def test_following_states_multi
|
|
|
|
table = tt ['a|a']
|
|
|
|
assert_equal 1, table.move([0], 'a').length
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_following_states_multi_regexp
|
|
|
|
table = tt [':a|b']
|
|
|
|
assert_equal 1, table.move([0], 'fooo').length
|
|
|
|
assert_equal 2, table.move([0], 'b').length
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_multi_path
|
|
|
|
table = tt ['/:a/d', '/b/c']
|
|
|
|
|
|
|
|
[
|
|
|
|
[1, '/'],
|
|
|
|
[2, 'b'],
|
|
|
|
[2, '/'],
|
|
|
|
[1, 'c'],
|
|
|
|
].inject([0]) { |state, (exp, sym)|
|
|
|
|
new = table.move(state, sym)
|
|
|
|
assert_equal exp, new.length
|
|
|
|
new
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_match_data_ambiguous
|
|
|
|
table = tt %w{
|
|
|
|
/articles(.:format)
|
|
|
|
/articles/new(.:format)
|
|
|
|
/articles/:id/edit(.:format)
|
|
|
|
/articles/:id(.:format)
|
|
|
|
}
|
|
|
|
|
|
|
|
sim = NFA::Simulator.new table
|
|
|
|
|
|
|
|
match = sim.match '/articles/new'
|
|
|
|
assert_equal 2, match.memos.length
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Identical Routes may have different restrictions.
|
|
|
|
def test_match_same_paths
|
|
|
|
table = tt %w{
|
|
|
|
/articles/new(.:format)
|
|
|
|
/articles/new(.:format)
|
|
|
|
}
|
|
|
|
|
|
|
|
sim = NFA::Simulator.new table
|
|
|
|
|
|
|
|
match = sim.match '/articles/new'
|
|
|
|
assert_equal 2, match.memos.length
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
def ast strings
|
|
|
|
parser = Journey::Parser.new
|
|
|
|
asts = strings.map { |string|
|
|
|
|
memo = Object.new
|
|
|
|
ast = parser.parse string
|
|
|
|
ast.each { |n| n.memo = memo }
|
|
|
|
ast
|
|
|
|
}
|
|
|
|
Nodes::Or.new asts
|
|
|
|
end
|
|
|
|
|
|
|
|
def tt strings
|
|
|
|
Builder.new(ast(strings)).transition_table
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|