File: test_transition_table.rb

package info (click to toggle)
ruby-journey 1.0.4-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 292 kB
  • sloc: ruby: 2,830; javascript: 113; yacc: 42; makefile: 2
file content (113 lines) | stat: -rw-r--r-- 2,769 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
require 'helper'
require 'json'

module Journey
  module GTG
    class TestGeneralizedTable < MiniTest::Unit::TestCase
      def test_to_json
        table = tt %w{
          /articles(.:format)
          /articles/new(.:format)
          /articles/:id/edit(.:format)
          /articles/:id(.:format)
        }

        json = JSON.load 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
          refute_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'
        refute_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