rbgccxml 0.8 → 0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +5 -5
- data/lib/rbgccxml/node.rb +75 -73
- data/lib/rbgccxml/nodes/argument.rb +13 -2
- data/lib/rbgccxml/nodes/base.rb +14 -0
- data/lib/rbgccxml/nodes/class.rb +46 -8
- data/lib/rbgccxml/nodes/constructor.rb +8 -1
- data/lib/rbgccxml/nodes/destructor.rb +7 -0
- data/lib/rbgccxml/nodes/enum_value.rb +6 -4
- data/lib/rbgccxml/nodes/enumeration.rb +21 -2
- data/lib/rbgccxml/nodes/field.rb +18 -0
- data/lib/rbgccxml/nodes/file.rb +4 -1
- data/lib/rbgccxml/nodes/function.rb +6 -4
- data/lib/rbgccxml/nodes/function_type.rb +7 -0
- data/lib/rbgccxml/nodes/method.rb +6 -4
- data/lib/rbgccxml/nodes/struct.rb +3 -2
- data/lib/rbgccxml/nodes/type.rb +5 -3
- data/lib/rbgccxml/nodes/types/array_type.rb +29 -0
- data/lib/rbgccxml/nodes/types/cv_qualified_type.rb +9 -5
- data/lib/rbgccxml/nodes/types/fundamental_type.rb +3 -2
- data/lib/rbgccxml/nodes/types/pointer_type.rb +6 -3
- data/lib/rbgccxml/nodes/types/reference_type.rb +6 -3
- data/lib/rbgccxml/nodes/types/typedef.rb +2 -2
- data/lib/rbgccxml/nodes/variable.rb +7 -0
- data/lib/rbgccxml/parser.rb +47 -32
- data/lib/rbgccxml/query_result.rb +62 -25
- data/lib/rbgccxml/rbgccxml.rb +13 -16
- data/lib/rbgccxml/xml_parsing.rb +65 -97
- data/lib/rbgccxml.rb +26 -22
- data/test/arguments_test.rb +29 -0
- data/test/classes_test.rb +164 -26
- data/test/enumerations_test.rb +27 -19
- data/test/function_pointers_test.rb +18 -0
- data/test/functions_test.rb +7 -2
- data/test/methods_test.rb +3 -3
- data/test/namespaces_test.rb +1 -1
- data/test/node_test.rb +11 -31
- data/test/parser_test.rb +1 -1
- data/test/query_results_test.rb +15 -14
- data/test/structs_test.rb +10 -12
- data/test/test_helper.rb +10 -2
- data/test/types_test.rb +63 -38
- data/test/variables_test.rb +26 -0
- metadata +46 -31
data/lib/rbgccxml.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'hpricot'
|
2
|
-
gem 'gccxml_gem'
|
3
1
|
require 'gccxml'
|
4
2
|
|
5
3
|
require 'rbgccxml/rbgccxml'
|
@@ -7,29 +5,35 @@ require 'rbgccxml/rbgccxml'
|
|
7
5
|
module RbGCCXML
|
8
6
|
|
9
7
|
# Core classes
|
10
|
-
autoload :
|
11
|
-
autoload :
|
12
|
-
autoload :
|
13
|
-
autoload :
|
8
|
+
autoload :Node, "rbgccxml/node"
|
9
|
+
autoload :Parser, "rbgccxml/parser"
|
10
|
+
autoload :XMLParsing, "rbgccxml/xml_parsing"
|
11
|
+
autoload :QueryResult, "rbgccxml/query_result"
|
14
12
|
|
15
13
|
# Nodes
|
16
|
-
autoload :Argument,
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :
|
22
|
-
autoload :
|
23
|
-
autoload :
|
24
|
-
autoload :
|
25
|
-
autoload :
|
14
|
+
autoload :Argument, "rbgccxml/nodes/argument"
|
15
|
+
autoload :Base, "rbgccxml/nodes/base"
|
16
|
+
autoload :Class, "rbgccxml/nodes/class"
|
17
|
+
autoload :Constructor, "rbgccxml/nodes/constructor"
|
18
|
+
autoload :Destructor, "rbgccxml/nodes/destructor"
|
19
|
+
autoload :Enumeration, "rbgccxml/nodes/enumeration"
|
20
|
+
autoload :EnumValue, "rbgccxml/nodes/enum_value"
|
21
|
+
autoload :Field, "rbgccxml/nodes/field"
|
22
|
+
autoload :File, "rbgccxml/nodes/file"
|
23
|
+
autoload :FunctionType, "rbgccxml/nodes/function_type"
|
24
|
+
autoload :Function, "rbgccxml/nodes/function"
|
25
|
+
autoload :Method, "rbgccxml/nodes/method"
|
26
|
+
autoload :Namespace, "rbgccxml/nodes/namespace"
|
27
|
+
autoload :Struct, "rbgccxml/nodes/struct"
|
28
|
+
autoload :Variable, "rbgccxml/nodes/variable"
|
26
29
|
|
27
30
|
# Type Management
|
28
|
-
autoload :Type,
|
29
|
-
autoload :
|
30
|
-
autoload :
|
31
|
-
autoload :
|
32
|
-
autoload :ReferenceType,
|
33
|
-
autoload :CvQualifiedType,
|
31
|
+
autoload :Type, "rbgccxml/nodes/type"
|
32
|
+
autoload :Typedef, "rbgccxml/nodes/types/typedef"
|
33
|
+
autoload :ArrayType, "rbgccxml/nodes/types/array_type"
|
34
|
+
autoload :PointerType, "rbgccxml/nodes/types/pointer_type"
|
35
|
+
autoload :ReferenceType, "rbgccxml/nodes/types/reference_type"
|
36
|
+
autoload :CvQualifiedType, "rbgccxml/nodes/types/cv_qualified_type"
|
37
|
+
autoload :FundamentalType, "rbgccxml/nodes/types/fundamental_type"
|
34
38
|
|
35
39
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
context "Function and Method Arguments" do
|
4
|
+
|
5
|
+
setup do
|
6
|
+
@@arguments_source ||= RbGCCXML.parse(full_dir("headers/functions.h")).namespaces("functions")
|
7
|
+
end
|
8
|
+
|
9
|
+
specify "have type and to_cpp" do
|
10
|
+
test1 = @@arguments_source.functions("test1")
|
11
|
+
test1.arguments.length.should.equal 2
|
12
|
+
|
13
|
+
test1.arguments[0].to_cpp.should.equal "int x"
|
14
|
+
test1.arguments[0].cpp_type.to_cpp.should.equal "int"
|
15
|
+
|
16
|
+
test1.arguments[1].to_cpp.should.equal "double y"
|
17
|
+
test1.arguments[1].cpp_type.to_cpp.should.equal "double"
|
18
|
+
end
|
19
|
+
|
20
|
+
specify "can have a default value" do
|
21
|
+
test1 = @@arguments_source.functions("test1")
|
22
|
+
test1.arguments[0].value.should.be nil
|
23
|
+
test1.arguments[1].value.should.equal "3.0e+0"
|
24
|
+
|
25
|
+
rockin = @@arguments_source.functions("rockin")
|
26
|
+
rockin.arguments[1].value.should.equal "functions::test()"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/test/classes_test.rb
CHANGED
@@ -1,60 +1,198 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
context "Querying for classes" do
|
4
4
|
setup do
|
5
|
-
|
5
|
+
@source ||= RbGCCXML.parse(full_dir("headers/classes.h")).namespaces("classes")
|
6
6
|
end
|
7
7
|
|
8
8
|
specify "can find all classes in a given namespace" do
|
9
|
-
classes =
|
10
|
-
classes.size.should
|
9
|
+
classes = @source.classes
|
10
|
+
classes.size.should.equal 4
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
12
|
+
classes.find(:name => "Test1").should.not.be.nil
|
13
|
+
classes.find(:name => "Test2").should.not.be.nil
|
14
|
+
classes.find(:name => "Test3").should.not.be.nil
|
16
15
|
end
|
17
16
|
|
18
17
|
specify "can find classes within classes" do
|
19
|
-
test1 =
|
18
|
+
test1 = @source.classes.find(:name => "Test1")
|
20
19
|
test1.should.not.be.nil
|
21
|
-
|
20
|
+
test1.should.be.kind_of RbGCCXML::Class
|
21
|
+
test1.name.should.equal "Test1"
|
22
|
+
|
22
23
|
inner1 = test1.classes("Inner1")
|
23
24
|
inner1.should.not.be.nil
|
24
|
-
|
25
|
+
inner1.should.be.kind_of RbGCCXML::Class
|
26
|
+
inner1.name.should.equal "Inner1"
|
27
|
+
|
25
28
|
inner2 = inner1.classes("Inner1")
|
26
29
|
inner2.should.not.be.nil
|
30
|
+
inner2.should.be.kind_of Array
|
31
|
+
inner2.should.be.empty
|
32
|
+
|
33
|
+
inner2 = inner1.classes("Inner2")
|
34
|
+
inner2.should.not.be.nil
|
35
|
+
inner2.should.be.kind_of RbGCCXML::Class
|
36
|
+
inner2.name.should.equal "Inner2"
|
37
|
+
end
|
38
|
+
|
39
|
+
specify "can find classes within classes by regex" do
|
40
|
+
test1 = @source.classes(/t1/)
|
41
|
+
test1.should.not.be.nil
|
42
|
+
test1.should.be.kind_of RbGCCXML::Class
|
43
|
+
test1.name.should.equal "Test1"
|
44
|
+
|
45
|
+
inner1 = test1.classes(/In.*1/)
|
46
|
+
inner1.should.not.be.nil
|
47
|
+
inner1.should.be.kind_of RbGCCXML::Class
|
48
|
+
inner1.name.should.equal "Inner1"
|
49
|
+
|
50
|
+
inner2 = inner1.classes(/1/)
|
51
|
+
inner2.should.not.be.nil
|
52
|
+
inner2.should.be.kind_of Array
|
53
|
+
inner2.should.be.empty
|
54
|
+
|
55
|
+
inner2 = inner1.classes(/2/)
|
56
|
+
inner2.should.not.be.nil
|
57
|
+
inner2.should.be.kind_of RbGCCXML::Class
|
58
|
+
inner2.name.should.equal "Inner2"
|
27
59
|
end
|
28
60
|
|
29
|
-
specify "can find
|
30
|
-
|
31
|
-
|
61
|
+
specify "can find classes within classes by block" do
|
62
|
+
# We're looking for any class that has virtual methods.
|
63
|
+
test4 = @source.classes { |c| c.methods.any? { |m| m.virtual? } }
|
64
|
+
test4.should.not.be.nil
|
65
|
+
test4.should.be.kind_of RbGCCXML::Class
|
66
|
+
test4.name.should.equal "Test4"
|
67
|
+
|
68
|
+
# Fail case -- there's no methods that return double.
|
69
|
+
test0 = @source.classes { |c| c.methods.any? { |m| m.return_type == "double" }}
|
70
|
+
test0.should.not.be.nil
|
71
|
+
test0.should.be.kind_of Array
|
72
|
+
test0.should.be.empty
|
73
|
+
end
|
74
|
+
|
75
|
+
specify "can tell if a class is pure virtual" do
|
76
|
+
test1 = @source.classes("Test1")
|
77
|
+
test4 = @source.classes("Test4")
|
78
|
+
|
79
|
+
test1.pure_virtual?.should.be false
|
80
|
+
test4.pure_virtual?.should.be true
|
32
81
|
end
|
33
82
|
end
|
34
83
|
|
35
84
|
context "Querying for class constructors" do
|
36
85
|
setup do
|
37
|
-
|
86
|
+
@source ||= RbGCCXML.parse(full_dir("headers/classes.h")).namespaces("classes")
|
38
87
|
end
|
39
88
|
|
40
89
|
specify "should have a list of constructors" do
|
41
|
-
test1 =
|
42
|
-
test1.constructors.size.should
|
90
|
+
test1 = @source.classes.find(:name => "Test1")
|
91
|
+
test1.constructors.size.should.equal 2
|
43
92
|
|
44
|
-
test2 =
|
45
|
-
test2.constructors.size.should
|
93
|
+
test2 = @source.classes.find(:name => "Test2")
|
94
|
+
test2.constructors.size.should.equal 3
|
46
95
|
end
|
47
96
|
|
48
97
|
specify "constructors should have arguments" do
|
49
|
-
test2 =
|
50
|
-
test2.constructors.size.should
|
98
|
+
test2 = @source.classes.find(:name => "Test2")
|
99
|
+
test2.constructors.size.should.equal 3
|
100
|
+
|
101
|
+
# GCC generated copy constructors
|
102
|
+
copy = test2.constructors[0]
|
103
|
+
copy.attributes[:artificial].should.equal "1"
|
51
104
|
|
52
|
-
default = test2.constructors[
|
53
|
-
default.arguments.size.should
|
105
|
+
default = test2.constructors[1]
|
106
|
+
default.arguments.size.should.equal 0
|
54
107
|
|
55
|
-
specific = test2.constructors[
|
56
|
-
specific.arguments.size.should
|
57
|
-
|
108
|
+
specific = test2.constructors[2]
|
109
|
+
specific.arguments.size.should.equal 1
|
110
|
+
specific.arguments[0].cpp_type.name.should.equal "int"
|
58
111
|
end
|
59
112
|
end
|
60
113
|
|
114
|
+
context "Querying for the class's deconstructor" do
|
115
|
+
setup do
|
116
|
+
@source ||= RbGCCXML.parse(full_dir("headers/classes.h")).namespaces("classes")
|
117
|
+
end
|
118
|
+
|
119
|
+
specify "can tell if a class has an explicit destructor" do
|
120
|
+
test1 = @source.classes("Test1")
|
121
|
+
test1.destructor.should.not.be.nil
|
122
|
+
test1.destructor.attributes[:artificial].should.be.nil
|
123
|
+
|
124
|
+
test2 = @source.classes("Test2")
|
125
|
+
test2.destructor.should.not.be.nil
|
126
|
+
test2.destructor.attributes[:artificial].should.not.be.nil
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
context "Query for class variables" do
|
132
|
+
setup do
|
133
|
+
@source ||= RbGCCXML.parse(full_dir("headers/classes.h")).namespaces("classes")
|
134
|
+
end
|
135
|
+
|
136
|
+
specify "find all i-vars" do
|
137
|
+
test1 = @source.classes("Test1")
|
138
|
+
test1.variables.length.should.equal 4
|
139
|
+
end
|
140
|
+
|
141
|
+
specify "can find by access level" do
|
142
|
+
test1 = @source.classes("Test1")
|
143
|
+
test1.variables.find(:access => "public").length.should.equal 2
|
144
|
+
test1.variables.find(:access => "protected").name.should.equal "protVariable"
|
145
|
+
test1.variables.find(:access => "private").name.should.equal "privateVariable"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "Query inheritance heirarchy" do
|
150
|
+
setup do
|
151
|
+
@source ||= RbGCCXML.parse(full_dir("headers/inheritance.h")).namespaces("inheritance")
|
152
|
+
end
|
153
|
+
|
154
|
+
specify "can find a class's superclass" do
|
155
|
+
pc = @source.classes("ParentClass")
|
156
|
+
pc.superclass.should.be.nil
|
157
|
+
|
158
|
+
base1 = @source.classes("Base1")
|
159
|
+
base1.superclass.should.not.be.nil
|
160
|
+
base1.superclass.name.should.equal "ParentClass"
|
161
|
+
end
|
162
|
+
|
163
|
+
specify "can query for multiple inheritance" do
|
164
|
+
multi = @source.classes("MultiBase")
|
165
|
+
multi.superclasses.length.should.equal 2
|
166
|
+
assert multi.superclasses.select {|sp| sp.name == "ParentClass"}
|
167
|
+
assert multi.superclasses.select {|sp| sp.name == "Parent2"}
|
168
|
+
end
|
169
|
+
|
170
|
+
specify "calling #superclasses always returns an array" do
|
171
|
+
pc = @source.classes("ParentClass")
|
172
|
+
pc.superclasses.should.be.empty
|
173
|
+
|
174
|
+
base1 = @source.classes("Base1")
|
175
|
+
base1.superclasses.length.should.equal 1
|
176
|
+
base1.superclasses[0].name.should.equal "ParentClass"
|
177
|
+
end
|
178
|
+
|
179
|
+
specify "can infinitely climb the inheritance heirarchy" do
|
180
|
+
low = @source.classes("VeryLow")
|
181
|
+
low.superclass.superclass.superclass.name.should.equal "ParentClass"
|
182
|
+
end
|
183
|
+
|
184
|
+
specify "can query for types of inheritance" do
|
185
|
+
pvb1 = @source.classes("PrivateBase1")
|
186
|
+
pvb1.superclass(:public).should.be.nil
|
187
|
+
pvb1.superclass(:protected).should.be.nil
|
188
|
+
pvb1.superclass(:private).should.not.be.nil
|
189
|
+
|
190
|
+
pvb1.superclass(:private).name.should.equal "ParentClass"
|
191
|
+
|
192
|
+
pvb1.superclasses(:public).length.should.equal 0
|
193
|
+
pvb1.superclasses(:protected).length.should.equal 0
|
194
|
+
pvb1.superclasses(:private).length.should.equal 1
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
data/test/enumerations_test.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require File.dirname(__FILE__) + '/test_helper'
|
1
|
+
require "test_helper"
|
3
2
|
|
4
3
|
context "Querying for enumerations" do
|
5
4
|
setup do
|
@@ -8,37 +7,46 @@ context "Querying for enumerations" do
|
|
8
7
|
|
9
8
|
specify "can query for enumerations" do
|
10
9
|
enums = @@enum_source.enumerations
|
11
|
-
enums.length.should
|
12
|
-
|
13
|
-
assert @@enum_source.enumerations("TestEnum") == "TestEnum"
|
14
|
-
assert @@enum_source.enumerations.find(:name => "MyEnum") == "MyEnum"
|
10
|
+
enums.length.should.equal 3
|
15
11
|
end
|
16
12
|
|
17
13
|
specify "can find specific enum values" do
|
18
14
|
enum = @@enum_source.enumerations("TestEnum")
|
19
|
-
enum.values.length.should
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
enum.values.length.should.equal 3
|
16
|
+
enum.values[0].name.should.equal "VALUE1"
|
17
|
+
enum.values[1].name.should.equal "VALUE2"
|
18
|
+
enum.values[2].name.should.equal "VALUE3"
|
23
19
|
end
|
24
20
|
|
25
21
|
specify "can find the given value of enum entries" do
|
26
22
|
enum = @@enum_source.enumerations.find(:name => "MyEnum")
|
27
|
-
enum.values[0].value.should
|
28
|
-
enum.values[1].value.should
|
29
|
-
enum.values[2].value.should
|
23
|
+
enum.values[0].value.should.equal 3
|
24
|
+
enum.values[1].value.should.equal 4
|
25
|
+
enum.values[2].value.should.equal 7
|
30
26
|
end
|
31
27
|
|
32
28
|
specify "properly prints out fully qualified C++ identifier for enum values" do
|
33
29
|
enum = @@enum_source.enumerations("TestEnum")
|
34
|
-
enum.values.length.should
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
enum.values.length.should.equal 3
|
31
|
+
enum.values[0].qualified_name.should.equal "enums::VALUE1"
|
32
|
+
enum.values[1].qualified_name.should.equal "enums::VALUE2"
|
33
|
+
enum.values[2].qualified_name.should.equal "enums::VALUE3"
|
38
34
|
|
39
35
|
enum = @@enum_source.classes("Inner").enumerations("InnerEnum")
|
40
|
-
|
41
|
-
|
36
|
+
enum.values[0].qualified_name.should.equal "enums::Inner::INNER_1"
|
37
|
+
enum.values[1].qualified_name.should.equal "enums::Inner::INNER_2"
|
38
|
+
end
|
39
|
+
|
40
|
+
specify "knows if an enumeration is anonymous" do
|
41
|
+
found = @@enum_source.enumerations.select {|e| e.anonymous? }
|
42
|
+
found.length.should.equal 1
|
43
|
+
found = found[0]
|
44
|
+
|
45
|
+
assert found.is_a?(RbGCCXML::Enumeration)
|
46
|
+
found.values[0].value.should.equal 0
|
47
|
+
found.values[1].value.should.equal 1
|
48
|
+
found.values[2].value.should.equal 2
|
42
49
|
end
|
50
|
+
|
43
51
|
end
|
44
52
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
context "Function pointers" do
|
4
|
+
setup do
|
5
|
+
@@fp_source ||= RbGCCXML.parse(full_dir("headers/types.h")).namespaces("types")
|
6
|
+
end
|
7
|
+
|
8
|
+
specify "have arguments" do
|
9
|
+
fp = @@fp_source.functions("takesCallback").arguments[0].cpp_type.base_type
|
10
|
+
fp.arguments.length.should == 1
|
11
|
+
fp.arguments[0].cpp_type.name.should.equal "int"
|
12
|
+
end
|
13
|
+
|
14
|
+
specify "have return value" do
|
15
|
+
fp = @@fp_source.functions("takesCallbackWithReturn").arguments[0].cpp_type.base_type
|
16
|
+
fp.return_type.name.should.equal "int"
|
17
|
+
end
|
18
|
+
end
|
data/test/functions_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
context "Querying for functions" do
|
4
4
|
|
@@ -7,7 +7,7 @@ context "Querying for functions" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
specify "should be able to find all functions" do
|
10
|
-
@@functions_source.functions.length.should ==
|
10
|
+
@@functions_source.functions.length.should == 4
|
11
11
|
end
|
12
12
|
|
13
13
|
specify "can find functions by name" do
|
@@ -41,4 +41,9 @@ context "Querying for functions" do
|
|
41
41
|
test1.functions
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
specify "can get list of arguments" do
|
46
|
+
test1 = @@functions_source.functions("test1")
|
47
|
+
test1.arguments.length.should.equal 2
|
48
|
+
end
|
44
49
|
end
|
data/test/methods_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
context "Querying for class methods" do
|
4
4
|
setup do
|
@@ -32,12 +32,12 @@ context "Querying for class methods" do
|
|
32
32
|
|
33
33
|
specify "can search methods via return type" do
|
34
34
|
adder = @@adder_source.classes("Adder")
|
35
|
-
adder.methods.find(:returns =>
|
35
|
+
adder.methods.find(:returns => :float).name.should == "addFloats"
|
36
36
|
end
|
37
37
|
|
38
38
|
specify "can search via all options (AND)" do
|
39
39
|
adder = @@adder_source.classes("Adder")
|
40
|
-
got = adder.methods.find(:returns =>
|
40
|
+
got = adder.methods.find(:returns => :int, :arguments => [nil, nil])
|
41
41
|
got.name.should == "addIntegers"
|
42
42
|
end
|
43
43
|
|
data/test/namespaces_test.rb
CHANGED
data/test/node_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
context "Qualified name generation" do
|
4
4
|
|
@@ -41,36 +41,6 @@ context "Qualified name generation" do
|
|
41
41
|
|
42
42
|
end
|
43
43
|
|
44
|
-
context "Equality testing" do
|
45
|
-
|
46
|
-
specify "testing against a string will test against the name" do
|
47
|
-
source = RbGCCXML.parse(full_dir("headers/namespaces.h"))
|
48
|
-
assert(source.namespaces("upper") == "upper")
|
49
|
-
end
|
50
|
-
|
51
|
-
specify "c++ nesting should be usable as well" do
|
52
|
-
source = RbGCCXML.parse(full_dir("headers/classes.h")).namespaces("classes")
|
53
|
-
klass = source.classes("Test1").classes("Inner1")
|
54
|
-
assert !(klass == "Inner2")
|
55
|
-
assert(klass == "Inner1")
|
56
|
-
assert(klass == "Test1::Inner1")
|
57
|
-
assert(klass == "classes::Test1::Inner1")
|
58
|
-
end
|
59
|
-
|
60
|
-
specify "but should be able to test against nodes as well" do
|
61
|
-
source = RbGCCXML.parse(full_dir("headers/namespaces.h"))
|
62
|
-
upper = source.namespaces("upper")
|
63
|
-
inner = upper.namespaces("inner1")
|
64
|
-
assert !(upper == inner)
|
65
|
-
end
|
66
|
-
|
67
|
-
specify "should find explicit over matches" do
|
68
|
-
source = RbGCCXML.parse(full_dir("headers/classes.h")).namespaces("classes")
|
69
|
-
f = source.classes("Test2").methods("func")
|
70
|
-
f.name.should == "func"
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
44
|
context "Misc access methods" do
|
75
45
|
|
76
46
|
specify "can tell if something is public, protected, and private" do
|
@@ -82,4 +52,14 @@ context "Misc access methods" do
|
|
82
52
|
assert access.methods("publicMethod").public?
|
83
53
|
end
|
84
54
|
|
55
|
+
specify "can get the full file path of a node" do
|
56
|
+
source = RbGCCXML.parse(full_dir("headers/enums.h")).namespaces("enums")
|
57
|
+
source.enumerations("TestEnum").file.should =~ "enums.h"
|
58
|
+
end
|
59
|
+
|
60
|
+
specify "returns nil if no file node is found" do
|
61
|
+
source = RbGCCXML.parse(full_dir("headers/enums.h")).namespaces("enums")
|
62
|
+
source.file.should.be nil
|
63
|
+
end
|
64
|
+
|
85
65
|
end
|
data/test/parser_test.rb
CHANGED
data/test/query_results_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
context "Managing Query results" do
|
4
4
|
|
@@ -94,7 +94,7 @@ context "QueryResult#find :arguments" do
|
|
94
94
|
func.name.should == "test3"
|
95
95
|
end
|
96
96
|
|
97
|
-
specify "when searching arguments, can
|
97
|
+
specify "when searching arguments, can xspecify catch-all" do
|
98
98
|
funcs = @@query_source.functions.find(:arguments => [:int, nil])
|
99
99
|
funcs.size.should == 2
|
100
100
|
assert funcs.detect {|f| f.name == "test3" }
|
@@ -103,23 +103,23 @@ context "QueryResult#find :arguments" do
|
|
103
103
|
|
104
104
|
specify "works when using custom defined types" do
|
105
105
|
func = @@query_source.functions.find(:arguments => ["MyType"])
|
106
|
-
func.name.should
|
106
|
+
func.name.should.equal "testMyTypeArgs"
|
107
107
|
end
|
108
108
|
|
109
109
|
specify "works with pointers and references" do
|
110
|
-
func = @@query_source.functions.find(:arguments => ["MyType
|
111
|
-
func.
|
110
|
+
func = @@query_source.functions.find(:arguments => ["MyType*"])
|
111
|
+
func.length.should.equal 2
|
112
112
|
|
113
|
-
func = @@query_source.functions.find(:arguments => ["MyType
|
113
|
+
func = @@query_source.functions.find(:arguments => ["MyType&"])
|
114
114
|
func.name.should == "testMyTypeArgsRef"
|
115
115
|
end
|
116
116
|
|
117
117
|
specify "works with qualified names" do
|
118
118
|
func = @@query_source.functions.find(:arguments => ["query::MyType"])
|
119
|
-
func.name.should
|
119
|
+
func.name.should.equal "testMyTypeArgs"
|
120
120
|
|
121
121
|
func = @@query_source.functions.find(:arguments => ["::query::MyType"])
|
122
|
-
func.name.should
|
122
|
+
func.name.should.equal "testMyTypeArgs"
|
123
123
|
end
|
124
124
|
|
125
125
|
specify "works with qualifiers like const" do
|
@@ -143,19 +143,19 @@ context "QueryResult#find :returns" do
|
|
143
143
|
|
144
144
|
specify "works with custom defined types" do
|
145
145
|
func = @@query_source.functions.find(:returns => "MyType")
|
146
|
-
func.
|
146
|
+
func.length.should.equal 2
|
147
147
|
end
|
148
148
|
|
149
149
|
specify "work with qualified names" do
|
150
150
|
func = @@query_source.functions.find(:returns => "query::MyType")
|
151
|
-
func.
|
151
|
+
func.length.should.equal 2
|
152
152
|
|
153
153
|
func = @@query_source.functions.find(:returns => "::query::MyType")
|
154
|
-
func.
|
154
|
+
func.length.should.equal 2
|
155
155
|
end
|
156
156
|
|
157
157
|
specify "works with pointers and references" do
|
158
|
-
func = @@query_source.functions.find(:returns => "MyType
|
158
|
+
func = @@query_source.functions.find(:returns => "MyType*")
|
159
159
|
func.name.should == "testMyTypePtr"
|
160
160
|
|
161
161
|
func = @@query_source.functions.find(:returns => "MyType&")
|
@@ -219,10 +219,11 @@ context "QueryResult#find :all - Flag full source search" do
|
|
219
219
|
end
|
220
220
|
|
221
221
|
specify "can find according to :returns " do
|
222
|
-
funcs = @@query_source.functions.find(:all, :returns =>
|
223
|
-
funcs.size.should ==
|
222
|
+
funcs = @@query_source.functions.find(:all, :returns => "MyType")
|
223
|
+
funcs.size.should == 3
|
224
224
|
assert funcs.detect {|f| f.name == "nestedMyTypeReturns"}
|
225
225
|
assert funcs.detect {|f| f.name == "testMyType"}
|
226
|
+
assert funcs.detect {|f| f.name == "testMyTypeConst"}
|
226
227
|
end
|
227
228
|
|
228
229
|
end
|
data/test/structs_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
3
|
context "Querying for structs" do
|
4
4
|
setup do
|
@@ -25,11 +25,6 @@ context "Querying for structs" do
|
|
25
25
|
inner2 = inner1.structs("Inner1")
|
26
26
|
inner2.should.not.be.nil
|
27
27
|
end
|
28
|
-
|
29
|
-
specify "can find out which file said class is in" do
|
30
|
-
test1 = @@structs_source.structs.find(:name => "Test1")
|
31
|
-
test1.file_name.should == "structs.h"
|
32
|
-
end
|
33
28
|
end
|
34
29
|
|
35
30
|
context "Querying for struct constructors" do
|
@@ -39,22 +34,25 @@ context "Querying for struct constructors" do
|
|
39
34
|
|
40
35
|
specify "should have a list of constructors" do
|
41
36
|
test1 = @@structs_source.structs.find(:name => "Test1")
|
42
|
-
test1.constructors.size.should ==
|
37
|
+
test1.constructors.size.should == 2
|
43
38
|
|
44
39
|
test2 = @@structs_source.structs.find(:name => "Test2")
|
45
|
-
test2.constructors.size.should ==
|
40
|
+
test2.constructors.size.should == 3
|
46
41
|
end
|
47
42
|
|
48
43
|
specify "constructors should have arguments" do
|
49
44
|
test2 = @@structs_source.structs.find(:name => "Test2")
|
50
|
-
test2.constructors.size.should == 2
|
51
45
|
|
52
|
-
|
46
|
+
# GCC generated copy constructors
|
47
|
+
copy = test2.constructors[0]
|
48
|
+
copy.attributes[:artificial].should == "1"
|
49
|
+
|
50
|
+
default = test2.constructors[1]
|
53
51
|
default.arguments.size.should == 0
|
54
52
|
|
55
|
-
specific = test2.constructors[
|
53
|
+
specific = test2.constructors[2]
|
56
54
|
specific.arguments.size.should == 1
|
57
|
-
|
55
|
+
specific.arguments[0].cpp_type.name.should.equal "int"
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|