require 'abstract_unit' module ActionDispatch module Journey module GTG class TestBuilder < ActiveSupport::TestCase 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