summaryrefslogtreecommitdiff
path: root/test/rdoc/parsers/test_parse_c.rb
blob: c7815a95c09344c2658eb738810a4b44388bc2bd (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
require 'pp'
require 'stringio'
require 'tempfile'
require 'test/unit'
require 'rdoc/parsers/parse_c'

class RDoc::C_Parser
  attr_accessor :classes

  public :do_classes, :do_constants
end

class TestRdocC_Parser < Test::Unit::TestCase

  def setup
    @tempfile = Tempfile.new self.class.name
    filename = @tempfile.path

    @top_level = RDoc::TopLevel.new filename
    @fn = filename
    @options = Options.instance
    @stats = RDoc::Stats.new

    @progress = StringIO.new
  end

  def teardown
    @tempfile.unlink
  end

  def test_do_constants
    content = <<-EOF
#include <ruby.h>

void Init_foo(){
   VALUE cFoo = rb_define_class("Foo", rb_cObject);

   /* 300: The highest possible score in bowling */
   rb_define_const(cFoo, "PERFECT", INT2FIX(300));

   /* Huzzah!: What you cheer when you roll a perfect game */
   rb_define_const(cFoo, "CHEER", rb_str_new2("Huzzah!"));

   /* TEST\:TEST: Checking to see if escaped semicolon works */
   rb_define_const(cFoo, "TEST", rb_str_new2("TEST:TEST"));

   /* \\: The file separator on MS Windows */
   rb_define_const(cFoo, "MSEPARATOR", rb_str_new2("\\"));

   /* /: The file separator on Unix */
   rb_define_const(cFoo, "SEPARATOR", rb_str_new2("/"));

   /* C:\\Program Files\\Stuff: A directory on MS Windows */
   rb_define_const(cFoo, "STUFF", rb_str_new2("C:\\Program Files\\Stuff"));

   /* Default definition */
   rb_define_const(cFoo, "NOSEMI", INT2FIX(99));

   rb_define_const(cFoo, "NOCOMMENT", rb_str_new2("No comment"));

   /*
    * Multiline comment goes here because this comment spans multiple lines.
    * Multiline comment goes here because this comment spans multiple lines.
    */
   rb_define_const(cFoo, "MULTILINE", INT2FIX(1));

   /*
    * 1: Multiline comment goes here because this comment spans multiple lines.
    * Multiline comment goes here because this comment spans multiple lines.
    */
   rb_define_const(cFoo, "MULTILINE_VALUE", INT2FIX(1));

   /* Multiline comment goes here because this comment spans multiple lines.
    * Multiline comment goes here because this comment spans multiple lines.
    */
   rb_define_const(cFoo, "MULTILINE_NOT_EMPTY", INT2FIX(1));

}
    EOF

    parser = util_parser content

    parser.do_classes
    parser.do_constants

    klass = parser.classes['cFoo'] 
    assert klass

    constants = klass.constants
    assert !klass.constants.empty?

    constants = constants.map { |c| [c.name, c.value, c.comment] }

    assert_equal ['PERFECT', '300',
                  "\n      The highest possible score in bowling   \n   "],
                 constants.shift
    assert_equal ['CHEER', 'Huzzah!',
                  "\n      What you cheer when you roll a perfect game   \n   "],
                 constants.shift
    assert_equal ['TEST', 'TEST:TEST',
                  "\n      Checking to see if escaped semicolon works   \n   "],
                 constants.shift
    assert_equal ['MSEPARATOR', '\\',
                  "\n      The file separator on MS Windows   \n   "],
                 constants.shift
    assert_equal ['SEPARATOR', '/',
                  "\n      The file separator on Unix   \n   "],
                 constants.shift
    assert_equal ['STUFF', 'C:\\Program Files\\Stuff',
                  "\n      A directory on MS Windows   \n   "],
                 constants.shift
    assert_equal ['NOSEMI', 'INT2FIX(99)',
                  "\n      Default definition   \n   "],
                 constants.shift
    assert_equal ['NOCOMMENT', 'rb_str_new2("No comment")', nil],
                 constants.shift

    comment = <<-EOF.chomp

     
      Multiline comment goes here because this comment spans multiple lines.
      Multiline comment goes here because this comment spans multiple lines.
      
   
    EOF
    assert_equal ['MULTILINE', 'INT2FIX(1)', comment], constants.shift
    assert_equal ['MULTILINE_VALUE', '1', comment], constants.shift

    comment = <<-EOF.chomp

      Multiline comment goes here because this comment spans multiple lines.
      Multiline comment goes here because this comment spans multiple lines.
      
   
    EOF
    assert_equal ['MULTILINE_NOT_EMPTY', 'INT2FIX(1)', comment], constants.shift

    assert constants.empty?, constants.inspect
  end

  def util_parser(content)
    parser = RDoc::C_Parser.new @top_level, @fn, content, @options, @stats
    parser.progress = @progress
    parser
  end

end