require "abstract_unit" require "active_support/json/decoding" module ActionDispatch module Journey module GTG class TestGeneralizedTable < ActiveSupport::TestCase def test_to_json table = tt %w{ /articles(.:format) /articles/new(.:format) /articles/:id/edit(.:format) /articles/:id(.:format) } json = ActiveSupport::JSON.decode table.to_json assert json["regexp_states"] assert json["string_states"] assert json["accepting"] end if system("dot -V 2>/dev/null") def test_to_svg table = tt %w{ /articles(.:format) /articles/new(.:format) /articles/:id/edit(.:format) /articles/:id(.:format) } svg = table.to_svg assert svg assert_no_match(/DOCTYPE/, svg) end end def test_simulate_gt sim = simulator_for ["/foo", "/bar"] assert_match sim, "/foo" end def test_simulate_gt_regexp sim = simulator_for [":foo"] assert_match sim, "foo" end def test_simulate_gt_regexp_mix sim = simulator_for ["/get", "/:method/foo"] assert_match sim, "/get" assert_match sim, "/get/foo" end def test_simulate_optional sim = simulator_for ["/foo(/bar)"] assert_match sim, "/foo" assert_match sim, "/foo/bar" assert_no_match sim, "/foo/" end def test_match_data path_asts = asts %w{ /get /:method/foo } paths = path_asts.dup builder = GTG::Builder.new Nodes::Or.new path_asts tt = builder.transition_table sim = GTG::Simulator.new tt match = sim.match "/get" assert_equal [paths.first], match.memos match = sim.match "/get/foo" assert_equal [paths.last], match.memos end def test_match_data_ambiguous path_asts = asts %w{ /articles(.:format) /articles/new(.:format) /articles/:id/edit(.:format) /articles/:id(.:format) } paths = path_asts.dup ast = Nodes::Or.new path_asts builder = GTG::Builder.new ast sim = GTG::Simulator.new builder.transition_table match = sim.match "/articles/new" assert_equal [paths[1], paths[3]], match.memos end private def asts(paths) parser = Journey::Parser.new paths.map { |x| ast = parser.parse x ast.each { |n| n.memo = ast } ast } end def tt(paths) x = asts paths builder = GTG::Builder.new Nodes::Or.new x builder.transition_table end def simulator_for(paths) GTG::Simulator.new tt(paths) end end end end end