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
|