File: test_sample.rb

package info (click to toggle)
racc 1.8.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,016 kB
  • sloc: yacc: 22,764; ruby: 4,515; java: 698; ansic: 680; makefile: 16
file content (80 lines) | stat: -rw-r--r-- 2,375 bytes parent folder | download | duplicates (2)
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
require File.expand_path('lib/helper', __dir__)

module Racc
  class TestSample < TestCase
    # working samples
    [
      {
        grammar_file: "array.y",
        parser_class: :ArrayParser,
        testcases: [
          { input: "[1]", expected: ["1"] },
          { input: "[1, 2]", expected: ["1", "2"] },
        ]
      },
      {
        grammar_file: "array2.y",
        parser_class: :ArrayParser2,
        testcases: [
          { input: "[1]", expected: ["1"] },
          { input: "[1, 2]", expected: ["1", "2"] },
        ]
      },
      {
        grammar_file: "calc.y",
        parser_class: :Calcp,
        testcases: [
          { input: "1", expected: 1 },
          { input: "10", expected: 10 },
          { input: "2 + 1", expected: 3 },
          { input: "2 - 1", expected: 1 },
          { input: "3 * 4", expected: 12 },
          { input: "4 / 2", expected: 2 },
          { input: "3 / 2", expected: 1 },
          { input: "2 + 3 * 4", expected: 14 },
          { input: "(2 + 3) * 4", expected: 20 },
          { input: "2 + (3 * 4)", expected: 14 },
        ]
      },
      {
        grammar_file: "hash.y",
        parser_class: :HashParser,
        testcases: [
          { input: "{}", expected: {} },
          { input: "{ a => b }", expected: { "a" => "b" } },
          { input: "{ a => b, 1 => 2 }", expected: { "a" => "b", "1" => "2" } },
        ]
      },
    ].each do |data|
      define_method "test_#{data[:grammar_file]}" do
        outfile = compile_sample(data[:grammar_file])

        load(outfile)

        parser_class = Object.const_get(data[:parser_class])
        data[:testcases].each do |testcase|
          input = testcase[:input]
          actual = parser_class.new.parse(input)
          expected = testcase[:expected]
          assert_equal(expected, actual, "expected #{expected} but got #{actual} when input is #{input}")
        end
      ensure
        remove_const_f(data[:parser_class])
      end
    end

    private

    # returns the generated file's path
    def compile_sample(yfile)
      file = File.basename(yfile, '.y')
      out = File.join(@OUT_DIR, file)
      ruby "-I#{LIB_DIR}", RACC, File.join(SAMPLE_DIR, yfile), "-o#{out}"
      out
    end

    def remove_const_f(const_name)
      Object.send(:remove_const, const_name) if Object.const_defined?(const_name, false)
    end
  end
end