jameskilton-rice 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. data/COPYING +23 -0
  2. data/Doxyfile +1253 -0
  3. data/Makefile.am +26 -0
  4. data/Makefile.in +749 -0
  5. data/README +879 -0
  6. data/README.mingw +8 -0
  7. data/Rakefile +72 -0
  8. data/aclocal.m4 +891 -0
  9. data/bootstrap +8 -0
  10. data/config.guess +1526 -0
  11. data/config.sub +1658 -0
  12. data/configure +7668 -0
  13. data/configure.ac +52 -0
  14. data/depcomp +589 -0
  15. data/doxygen.ac +314 -0
  16. data/doxygen.am +186 -0
  17. data/extconf.rb +22 -0
  18. data/install-sh +519 -0
  19. data/missing +367 -0
  20. data/post-autoconf.rb +22 -0
  21. data/post-automake.rb +28 -0
  22. data/rice/Address_Registration_Guard.hpp +7 -0
  23. data/rice/Address_Registration_Guard.ipp +34 -0
  24. data/rice/Address_Registration_Guard_defn.hpp +65 -0
  25. data/rice/Allocation_Strategies.hpp +37 -0
  26. data/rice/Arg.hpp +8 -0
  27. data/rice/Arg_impl.hpp +116 -0
  28. data/rice/Arg_operators.cpp +21 -0
  29. data/rice/Arg_operators.hpp +18 -0
  30. data/rice/Array.hpp +220 -0
  31. data/rice/Array.ipp +263 -0
  32. data/rice/Builtin_Object.hpp +8 -0
  33. data/rice/Builtin_Object.ipp +50 -0
  34. data/rice/Builtin_Object_defn.hpp +51 -0
  35. data/rice/Class.cpp +57 -0
  36. data/rice/Class.hpp +8 -0
  37. data/rice/Class.ipp +6 -0
  38. data/rice/Class_defn.hpp +83 -0
  39. data/rice/Constructor.hpp +339 -0
  40. data/rice/Critical_Guard.hpp +40 -0
  41. data/rice/Critical_Guard.ipp +26 -0
  42. data/rice/Data_Object.hpp +8 -0
  43. data/rice/Data_Object.ipp +133 -0
  44. data/rice/Data_Object_defn.hpp +132 -0
  45. data/rice/Data_Type.cpp +21 -0
  46. data/rice/Data_Type.hpp +8 -0
  47. data/rice/Data_Type.ipp +306 -0
  48. data/rice/Data_Type_defn.hpp +219 -0
  49. data/rice/Data_Type_fwd.hpp +12 -0
  50. data/rice/Director.cpp +19 -0
  51. data/rice/Director.hpp +47 -0
  52. data/rice/Enum.hpp +118 -0
  53. data/rice/Enum.ipp +246 -0
  54. data/rice/Exception.cpp +59 -0
  55. data/rice/Exception.hpp +9 -0
  56. data/rice/Exception_Base.hpp +8 -0
  57. data/rice/Exception_Base.ipp +13 -0
  58. data/rice/Exception_Base_defn.hpp +27 -0
  59. data/rice/Exception_defn.hpp +69 -0
  60. data/rice/Hash.hpp +210 -0
  61. data/rice/Hash.ipp +338 -0
  62. data/rice/Identifier.cpp +8 -0
  63. data/rice/Identifier.hpp +50 -0
  64. data/rice/Identifier.ipp +33 -0
  65. data/rice/Jump_Tag.hpp +24 -0
  66. data/rice/Makefile.am +140 -0
  67. data/rice/Makefile.in +740 -0
  68. data/rice/Module.cpp +84 -0
  69. data/rice/Module.hpp +8 -0
  70. data/rice/Module.ipp +6 -0
  71. data/rice/Module_defn.hpp +88 -0
  72. data/rice/Module_impl.hpp +281 -0
  73. data/rice/Module_impl.ipp +348 -0
  74. data/rice/Object.cpp +153 -0
  75. data/rice/Object.hpp +8 -0
  76. data/rice/Object.ipp +19 -0
  77. data/rice/Object_defn.hpp +183 -0
  78. data/rice/Require_Guard.hpp +21 -0
  79. data/rice/String.cpp +94 -0
  80. data/rice/String.hpp +89 -0
  81. data/rice/Struct.cpp +117 -0
  82. data/rice/Struct.hpp +162 -0
  83. data/rice/Struct.ipp +26 -0
  84. data/rice/Symbol.cpp +25 -0
  85. data/rice/Symbol.hpp +66 -0
  86. data/rice/Symbol.ipp +44 -0
  87. data/rice/VM.cpp +92 -0
  88. data/rice/VM.hpp +32 -0
  89. data/rice/config.hpp +44 -0
  90. data/rice/config.hpp.in +43 -0
  91. data/rice/detail/Arguments.hpp +126 -0
  92. data/rice/detail/Auto_Function_Wrapper.hpp +861 -0
  93. data/rice/detail/Auto_Function_Wrapper.ipp +2929 -0
  94. data/rice/detail/Auto_Member_Function_Wrapper.hpp +828 -0
  95. data/rice/detail/Auto_Member_Function_Wrapper.ipp +2326 -0
  96. data/rice/detail/Caster.hpp +63 -0
  97. data/rice/detail/Exception_Handler.hpp +8 -0
  98. data/rice/detail/Exception_Handler.ipp +68 -0
  99. data/rice/detail/Exception_Handler_defn.hpp +96 -0
  100. data/rice/detail/Iterator.hpp +93 -0
  101. data/rice/detail/Not_Copyable.hpp +25 -0
  102. data/rice/detail/Wrapped_Function.hpp +33 -0
  103. data/rice/detail/check_ruby_type.cpp +27 -0
  104. data/rice/detail/check_ruby_type.hpp +23 -0
  105. data/rice/detail/creation_funcs.hpp +37 -0
  106. data/rice/detail/creation_funcs.ipp +36 -0
  107. data/rice/detail/default_allocation_func.hpp +23 -0
  108. data/rice/detail/default_allocation_func.ipp +11 -0
  109. data/rice/detail/define_method_and_auto_wrap.hpp +31 -0
  110. data/rice/detail/define_method_and_auto_wrap.ipp +30 -0
  111. data/rice/detail/demangle.cpp +56 -0
  112. data/rice/detail/demangle.hpp +19 -0
  113. data/rice/detail/env.hpp +19 -0
  114. data/rice/detail/from_ruby.hpp +43 -0
  115. data/rice/detail/from_ruby.ipp +60 -0
  116. data/rice/detail/method_data.cpp +392 -0
  117. data/rice/detail/method_data.cpp.rpp +301 -0
  118. data/rice/detail/method_data.hpp +21 -0
  119. data/rice/detail/mininode.cpp +1220 -0
  120. data/rice/detail/mininode.cpp.rpp +62 -0
  121. data/rice/detail/mininode.hpp +320 -0
  122. data/rice/detail/mininode.hpp.rpp +119 -0
  123. data/rice/detail/node.hpp +13 -0
  124. data/rice/detail/object_call.hpp +85 -0
  125. data/rice/detail/object_call.ipp +147 -0
  126. data/rice/detail/protect.cpp +29 -0
  127. data/rice/detail/protect.hpp +34 -0
  128. data/rice/detail/remove_const.hpp +21 -0
  129. data/rice/detail/ruby.hpp +89 -0
  130. data/rice/detail/ruby_version_code.hpp +6 -0
  131. data/rice/detail/ruby_version_code.hpp.in +6 -0
  132. data/rice/detail/rubysig.hpp +19 -0
  133. data/rice/detail/st.hpp +60 -0
  134. data/rice/detail/to_ruby.hpp +22 -0
  135. data/rice/detail/to_ruby.ipp +37 -0
  136. data/rice/detail/win32.hpp +16 -0
  137. data/rice/detail/wrap_function.hpp +345 -0
  138. data/rice/detail/wrap_function.ipp +531 -0
  139. data/rice/generate_code.rb +1311 -0
  140. data/rice/global_function.hpp +33 -0
  141. data/rice/global_function.ipp +22 -0
  142. data/rice/protect.hpp +91 -0
  143. data/rice/protect.ipp +803 -0
  144. data/rice/ruby_mark.hpp +13 -0
  145. data/rice/ruby_try_catch.hpp +86 -0
  146. data/rice/rubypp.rb +97 -0
  147. data/rice/to_from_ruby.hpp +8 -0
  148. data/rice/to_from_ruby.ipp +299 -0
  149. data/rice/to_from_ruby_defn.hpp +71 -0
  150. data/ruby.ac +150 -0
  151. data/ruby/Makefile.am +1 -0
  152. data/ruby/Makefile.in +497 -0
  153. data/ruby/lib/Makefile.am +3 -0
  154. data/ruby/lib/Makefile.in +374 -0
  155. data/ruby/lib/mkmf-rice.rb.in +209 -0
  156. data/ruby/lib/version.rb +3 -0
  157. data/sample/Makefile.am +47 -0
  158. data/sample/Makefile.in +380 -0
  159. data/sample/enum/extconf.rb +3 -0
  160. data/sample/enum/sample_enum.cpp +54 -0
  161. data/sample/enum/test.rb +8 -0
  162. data/sample/inheritance/animals.cpp +98 -0
  163. data/sample/inheritance/extconf.rb +3 -0
  164. data/sample/inheritance/test.rb +7 -0
  165. data/sample/map/extconf.rb +3 -0
  166. data/sample/map/map.cpp +81 -0
  167. data/sample/map/test.rb +7 -0
  168. data/test/Makefile.am +49 -0
  169. data/test/Makefile.in +603 -0
  170. data/test/test_Address_Registration_Guard.cpp +43 -0
  171. data/test/test_Allocation_Strategies.cpp +77 -0
  172. data/test/test_Array.cpp +241 -0
  173. data/test/test_Builtin_Object.cpp +72 -0
  174. data/test/test_Class.cpp +398 -0
  175. data/test/test_Constructor.cpp +238 -0
  176. data/test/test_Critical_Guard.cpp +51 -0
  177. data/test/test_Data_Object.cpp +275 -0
  178. data/test/test_Data_Type.cpp +121 -0
  179. data/test/test_Director.cpp +225 -0
  180. data/test/test_Enum.cpp +162 -0
  181. data/test/test_Exception.cpp +46 -0
  182. data/test/test_Hash.cpp +195 -0
  183. data/test/test_Identifier.cpp +70 -0
  184. data/test/test_Jump_Tag.cpp +17 -0
  185. data/test/test_Module.cpp +428 -0
  186. data/test/test_Object.cpp +148 -0
  187. data/test/test_String.cpp +94 -0
  188. data/test/test_Struct.cpp +192 -0
  189. data/test/test_Symbol.cpp +63 -0
  190. data/test/test_To_From_Ruby.cpp +263 -0
  191. data/test/test_VM.cpp +26 -0
  192. data/test/test_global_functions.cpp +97 -0
  193. data/test/test_rice.rb +35 -0
  194. data/test/unittest.cpp +136 -0
  195. data/test/unittest.hpp +292 -0
  196. metadata +247 -0
@@ -0,0 +1,121 @@
1
+ #include "unittest.hpp"
2
+ #include "rice/Data_Type.hpp"
3
+ #include "rice/Exception.hpp"
4
+ #include "rice/Constructor.hpp"
5
+
6
+ using namespace Rice;
7
+
8
+ TESTSUITE(Data_Type);
9
+
10
+ /**
11
+ * The tests here are for the feature of taking an instance
12
+ * of a Ruby-subclass of a Rice wrapped class and passing
13
+ * that instance back into the Rice wrapper. While that
14
+ * might be confusing, the test code is pretty straight foward
15
+ * to see what we're talking about.
16
+ */
17
+
18
+ namespace {
19
+
20
+ /**
21
+ * The class we will subclass in Ruby
22
+ */
23
+ class Listener {
24
+ public:
25
+ Listener() { }
26
+
27
+ virtual ~Listener() { }
28
+
29
+ virtual int getValue() { return 4; }
30
+ };
31
+
32
+ /**
33
+ * This class will recieve a new Listener instance
34
+ * from Ruby
35
+ */
36
+ class ListenerHandler {
37
+
38
+ public:
39
+
40
+ ListenerHandler() { }
41
+
42
+ void addListener(Listener* newList) {
43
+ mListeners.push_back(newList);
44
+ }
45
+
46
+ int process() {
47
+ vector<Listener*>::iterator i = mListeners.begin();
48
+ int accum = 0;
49
+ for(; i != mListeners.end(); i++) {
50
+ accum += (*i)->getValue();
51
+ }
52
+
53
+ return accum;
54
+ }
55
+
56
+ int listenerCount() { return mListeners.size(); }
57
+
58
+ private:
59
+ vector<Listener*> mListeners;
60
+ };
61
+ }
62
+
63
+ SETUP(Data_Type)
64
+ {
65
+ ruby_init();
66
+
67
+ define_class<Listener>("Listener")
68
+ .define_constructor(Constructor<Listener>())
69
+ .define_method("get_value", &Listener::getValue);
70
+
71
+ define_class<ListenerHandler>("ListenerHandler")
72
+ .define_constructor(Constructor<ListenerHandler>())
73
+ .define_method("add_listener", &ListenerHandler::addListener)
74
+ .define_method("process", &ListenerHandler::process)
75
+ .define_method("listener_count", &ListenerHandler::listenerCount);
76
+
77
+ }
78
+
79
+ TESTCASE(can_send_ruby_instance_back_into_rice)
80
+ {
81
+ Module m = define_module("TestingModule");
82
+ Object handler = m.instance_eval("@handler = ListenerHandler.new");
83
+
84
+ ASSERT_EQUAL(INT2NUM(0), handler.call("listener_count").value());
85
+
86
+ m.instance_eval("class MyListener < Listener; end;");
87
+ m.instance_eval("@handler.add_listener(MyListener.new)");
88
+
89
+ ASSERT_EQUAL(INT2NUM(1), handler.call("listener_count").value());
90
+ ASSERT_EQUAL(INT2NUM(4), handler.call("process").value());
91
+
92
+ m.instance_eval("@handler.add_listener(Listener.new)");
93
+
94
+ ASSERT_EQUAL(INT2NUM(2), handler.call("listener_count").value());
95
+ ASSERT_EQUAL(INT2NUM(8), handler.call("process").value());
96
+ }
97
+
98
+ /**
99
+ * The following test SEGFAULTs right now
100
+ */
101
+ /*
102
+ TESTCASE(no_super_in_constructor_still_works)
103
+ {
104
+ Module m = define_module("TestingModule");
105
+ Object handler = m.instance_eval("@handler = ListenerHandler.new");
106
+
107
+ ASSERT_EQUAL(INT2NUM(0), handler.call("listener_count").value());
108
+
109
+ // Because of this, there's a constructor but no super call
110
+ m.instance_eval("class MyListener < Listener; def initialize; @val = 10; end; end;");
111
+ m.instance_eval("@handler.add_listener(MyListener.new)");
112
+
113
+ ASSERT_EQUAL(INT2NUM(1), handler.call("listener_count").value());
114
+ ASSERT_EQUAL(INT2NUM(4), handler.call("process").value());
115
+
116
+ m.instance_eval("@handler.add_listener(MyListener.new)");
117
+
118
+ ASSERT_EQUAL(INT2NUM(2), handler.call("listener_count").value());
119
+ ASSERT_EQUAL(INT2NUM(8), handler.call("process").value());
120
+ }
121
+ */
@@ -0,0 +1,225 @@
1
+ #include "unittest.hpp"
2
+ #include "rice/Director.hpp"
3
+ #include "rice/Constructor.hpp"
4
+ #include "rice/Data_Type.hpp"
5
+
6
+ #include <vector>
7
+ #include <iostream>
8
+
9
+ using namespace std;
10
+ using namespace Rice;
11
+
12
+ TESTSUITE(Director);
13
+
14
+ namespace {
15
+ /**
16
+ * Abstract base class
17
+ */
18
+ class Worker {
19
+ public:
20
+ virtual ~Worker() { }
21
+
22
+ int getNumber() { return 12; }
23
+
24
+ virtual int doSomething(int num) { return num * 4; }
25
+
26
+ virtual int process(int num) = 0;
27
+ };
28
+
29
+ /**
30
+ * Subclass that implements pure virtual
31
+ */
32
+ class MultiplyWorker : public Worker {
33
+ public:
34
+ virtual ~MultiplyWorker() { }
35
+
36
+ virtual int process(int num) { return num * 2; }
37
+ };
38
+
39
+ /**
40
+ * Class to handle workers
41
+ */
42
+ class Handler {
43
+ std::vector<Worker*> mWorkers;
44
+
45
+ public:
46
+
47
+ void addWorker(Worker* worker) { mWorkers.push_back(worker); }
48
+
49
+ int processWorkers(int start) {
50
+ std::vector<Worker*>::iterator i = mWorkers.begin();
51
+ int results = start;
52
+
53
+ for(; i != mWorkers.end(); i++) {
54
+ results = (*i)->process(results);
55
+ }
56
+
57
+ return results;
58
+ }
59
+ };
60
+
61
+ /**
62
+ * Our Director wrapper of Worker
63
+ */
64
+ class WorkerDirector : public Worker, public Rice::Director {
65
+ public:
66
+ WorkerDirector(Object self) : Director(self) { }
67
+
68
+ int process(int num) {
69
+ if(callIsFromRuby("process")) {
70
+ raisePureVirtual();
71
+ } else {
72
+ return from_ruby<int>( getSelf().call("process", num) );
73
+ }
74
+ }
75
+
76
+ int doSomething(int num) {
77
+ if(callIsFromRuby("do_something")) {
78
+ return this->Worker::doSomething(num);
79
+ } else {
80
+ return from_ruby<int>( getSelf().call("do_something", num) );
81
+ }
82
+ }
83
+ };
84
+ };
85
+
86
+ SETUP(Director)
87
+ {
88
+ ruby_init();
89
+
90
+ // Always need to tell Rice about the base class so that
91
+ // casting works correctly
92
+ define_class<Worker>("__Worker__");
93
+ }
94
+
95
+ TESTCASE(exposes_worker_as_instantiatable_class)
96
+ {
97
+ define_class<WorkerDirector, Worker>("Worker")
98
+ .define_constructor(Constructor<WorkerDirector, Object>())
99
+ .define_method("get_number", &Worker::getNumber);
100
+
101
+ Module m = define_module("Testing");
102
+ Object result = m.instance_eval("worker = Worker.new; worker.get_number");
103
+
104
+ ASSERT_EQUAL(12, from_ruby<int>(result.value()));
105
+ }
106
+
107
+ TESTCASE(can_call_virtual_methods_on_base_class)
108
+ {
109
+ define_class<WorkerDirector, Worker>("Worker")
110
+ .define_constructor(Constructor<WorkerDirector, Object>())
111
+ .define_method("get_number", &Worker::getNumber)
112
+ .define_method("do_something", &WorkerDirector::doSomething);
113
+
114
+ Module m = define_module("Testing");
115
+
116
+ Object result = m.instance_eval("worker = Worker.new; worker.do_something(4)");
117
+
118
+ ASSERT_EQUAL(16, from_ruby<int>(result.value()));
119
+ }
120
+
121
+ TESTCASE(super_calls_pass_execution_up_the_inheritance_chain)
122
+ {
123
+ define_class<WorkerDirector, Worker>("Worker")
124
+ .define_constructor(Constructor<WorkerDirector, Object>())
125
+ .define_method("do_something", &WorkerDirector::doSomething);
126
+
127
+ Module m = define_module("Testing");
128
+ m.instance_eval("class RubyWorker < Worker; def do_something(num); super * num; end; end");
129
+
130
+ Object result = m.instance_eval("worker = RubyWorker.new; worker.do_something(10)");
131
+
132
+ ASSERT_EQUAL(400, from_ruby<int>(result.value()));
133
+ }
134
+
135
+ TESTCASE(super_calls_on_pure_virtual_raise_error)
136
+ {
137
+ define_class<WorkerDirector, Worker>("Worker")
138
+ .define_constructor(Constructor<WorkerDirector, Object>())
139
+ .define_method("process", &WorkerDirector::process);
140
+
141
+ Module m = define_module("Testing");
142
+ m.instance_eval("class RubyWorker < Worker; def process(num); super; end; end");
143
+
144
+ ASSERT_EXCEPTION_CHECK(
145
+ Exception,
146
+ m.instance_eval("worker = RubyWorker.new; worker.process(10)"),
147
+ ASSERT_EQUAL(
148
+ Object(rb_eNotImpError),
149
+ Object(CLASS_OF(ex.value()))
150
+ )
151
+ );
152
+ }
153
+
154
+ TESTCASE(polymorphic_calls_head_down_the_call_chain)
155
+ {
156
+ define_class<Handler>("Handler")
157
+ .define_constructor(Constructor<Handler>())
158
+ .define_method("add_worker", &Handler::addWorker)
159
+ .define_method("process_workers", &Handler::processWorkers);
160
+
161
+ define_class<WorkerDirector, Worker>("Worker")
162
+ .define_constructor(Constructor<WorkerDirector, Object>())
163
+ .define_method("process", &WorkerDirector::process);
164
+
165
+ Module m = define_module("Testing");
166
+
167
+ m.instance_eval(
168
+ "class EchoWorker < Worker; def process(num); num + 2; end; end;"
169
+ "class DoubleWorker < Worker; def process(num); num * 2; end; end;"
170
+ "handler = Handler.new;"
171
+ "handler.add_worker(EchoWorker.new);"
172
+ "handler.add_worker(DoubleWorker.new);"
173
+ );
174
+
175
+ Object result = m.instance_eval("handler.process_workers(5)");
176
+
177
+ // Hit's EchoWorker, so 5 + 2, then passes that to DoubleWorker, so 7 * 2 = 14
178
+ ASSERT_EQUAL(14, from_ruby<int>(result.value()));
179
+ }
180
+
181
+ namespace {
182
+
183
+ class CallsSelf {
184
+ public:
185
+ int doIt(int in) {
186
+ return doItImpl(in);
187
+ }
188
+
189
+ virtual int doItImpl(int in) = 0;
190
+ };
191
+
192
+ class CallsSelfDirector : public CallsSelf, public Director {
193
+
194
+ public:
195
+ CallsSelfDirector(Object self) : Director(self) { }
196
+
197
+ virtual int doItImpl(int in) {
198
+ if(!callIsFromRuby("do_it_impl")) {
199
+ return 0;
200
+ } else {
201
+ return from_ruby<int>( getSelf().call("do_it_impl", in) );
202
+ }
203
+ }
204
+ };
205
+
206
+ }
207
+
208
+ TESTCASE(mix_of_polymorphic_calls_and_inheritance_dont_cause_infinite_loops)
209
+ {
210
+ define_class<CallsSelf>("__CallsSelf__");
211
+
212
+ define_class<CallsSelfDirector, CallsSelf>("CallsSelf")
213
+ .define_constructor(Constructor<CallsSelfDirector, Rice::Object>())
214
+ .define_method("do_it_impl", &CallsSelfDirector::doItImpl)
215
+ .define_method("do_it", &CallsSelf::doIt);
216
+
217
+ Module m = define_module("Testing");
218
+
219
+ Object result = m.instance_eval(
220
+ "class MySelf < CallsSelf; def do_it_impl(num); num * 10; end; end;"
221
+ "c = MySelf.new; c.do_it(10)"
222
+ );
223
+
224
+ ASSERT_EQUAL(100, from_ruby<int>(result.value()));
225
+ }
@@ -0,0 +1,162 @@
1
+ #include "unittest.hpp"
2
+ #include "rice/Enum.hpp"
3
+ #include "rice/Array.hpp"
4
+ #include "rice/String.hpp"
5
+ #include <iostream>
6
+
7
+ using namespace Rice;
8
+
9
+ TESTSUITE(Enum);
10
+
11
+ namespace
12
+ {
13
+ enum Color { RED, BLACK, GREEN };
14
+
15
+ Enum<Color> define_color_enum()
16
+ {
17
+ static Enum<Color> colors = define_enum<Color>("Color")
18
+ .define_value("RED", RED)
19
+ .define_value("BLACK", BLACK)
20
+ .define_value("GREEN", GREEN);
21
+ return colors;
22
+ }
23
+ }
24
+
25
+ SETUP(Enum)
26
+ {
27
+ ruby_init();
28
+ }
29
+
30
+ TESTCASE(copy_construct)
31
+ {
32
+ Enum<Color> rb_cColor(define_color_enum());
33
+ ASSERT_EQUAL(define_color_enum().value(), rb_cColor.value());
34
+ }
35
+
36
+ TESTCASE(assignment)
37
+ {
38
+ Enum<Color> rb_cColor;
39
+ rb_cColor = define_color_enum();
40
+ ASSERT_EQUAL(define_color_enum().value(), rb_cColor.value());
41
+ }
42
+
43
+ TESTCASE(each)
44
+ {
45
+ Enum<Color> rb_cColor = define_color_enum();
46
+ Array a = protect(rb_eval_string, "a = []; Color.each { |x| a << x }; a");
47
+ ASSERT_EQUAL(3u, a.size());
48
+ ASSERT_EQUAL(RED, from_ruby<Color>(a[0]));
49
+ ASSERT_EQUAL(BLACK, from_ruby<Color>(a[1]));
50
+ ASSERT_EQUAL(GREEN, from_ruby<Color>(a[2]));
51
+ }
52
+
53
+ TESTCASE(to_s)
54
+ {
55
+ Enum<Color> rb_cColor = define_color_enum();
56
+ ASSERT_EQUAL(String("RED"), String(protect(rb_eval_string, "Color::RED.to_s")));
57
+ ASSERT_EQUAL(String("BLACK"), String(protect(rb_eval_string, "Color::BLACK.to_s")));
58
+ ASSERT_EQUAL(String("GREEN"), String(protect(rb_eval_string, "Color::GREEN.to_s")));
59
+ }
60
+
61
+ TESTCASE(to_i)
62
+ {
63
+ Enum<Color> rb_cColor = define_color_enum();
64
+ ASSERT_EQUAL(to_ruby(int(RED)), Object(protect(rb_eval_string, "Color::RED.to_i")));
65
+ ASSERT_EQUAL(to_ruby(int(BLACK)), Object(protect(rb_eval_string, "Color::BLACK.to_i")));
66
+ ASSERT_EQUAL(to_ruby(int(GREEN)), Object(protect(rb_eval_string, "Color::GREEN.to_i")));
67
+ }
68
+
69
+ TESTCASE(inspect)
70
+ {
71
+ Enum<Color> rb_cColor = define_color_enum();
72
+ ASSERT_EQUAL(String("#<Color::RED>"), String(protect(rb_eval_string, "Color::RED.inspect")));
73
+ ASSERT_EQUAL(String("#<Color::BLACK>"), String(protect(rb_eval_string, "Color::BLACK.inspect")));
74
+ ASSERT_EQUAL(String("#<Color::GREEN>"), String(protect(rb_eval_string, "Color::GREEN.inspect")));
75
+ }
76
+
77
+ TESTCASE(compare)
78
+ {
79
+ Enum<Color> rb_cColor = define_color_enum();
80
+ ASSERT_EQUAL(to_ruby(-1), Object(protect(rb_eval_string, "Color::RED <=> Color::BLACK")));
81
+ ASSERT_EQUAL(to_ruby(1), Object(protect(rb_eval_string, "Color::GREEN <=> Color::RED")));
82
+ ASSERT_EQUAL(to_ruby(0), Object(protect(rb_eval_string, "Color::BLACK <=> Color::BLACK")));
83
+ }
84
+
85
+ TESTCASE(eql)
86
+ {
87
+ Enum<Color> rb_cColor = define_color_enum();
88
+ ASSERT_EQUAL(to_ruby(false), Object(protect(rb_eval_string, "Color::RED == Color::BLACK")));
89
+ ASSERT_EQUAL(to_ruby(true), Object(protect(rb_eval_string, "Color::GREEN == Color::GREEN")));
90
+ }
91
+
92
+ TESTCASE(invalid_to_s)
93
+ {
94
+ Enum<Color> rb_cColor = define_color_enum();
95
+ Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
96
+ ASSERT_EQUAL(String("INVALID(42)"), invalid.to_s());
97
+ }
98
+
99
+ TESTCASE(invalid_to_i)
100
+ {
101
+ Enum<Color> rb_cColor = define_color_enum();
102
+ Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
103
+ ASSERT_EQUAL(to_ruby(42), invalid.call("to_i"));
104
+ }
105
+
106
+ TESTCASE(invalid_inspect)
107
+ {
108
+ Enum<Color> rb_cColor = define_color_enum();
109
+ Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
110
+ ASSERT_EQUAL(String("#<Color::INVALID(42)>"), invalid.inspect());
111
+ }
112
+
113
+ TESTCASE(invalid_compare)
114
+ {
115
+ Enum<Color> rb_cColor = define_color_enum();
116
+ Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
117
+ Data_Object<Color> red(new Color(RED));
118
+ ASSERT_EQUAL(1, invalid.compare(red));
119
+ ASSERT_EQUAL(-1, red.compare(invalid));
120
+ ASSERT_EQUAL(0, invalid.compare(invalid));
121
+ }
122
+
123
+ TESTCASE(invalid_eql)
124
+ {
125
+ Enum<Color> rb_cColor = define_color_enum();
126
+ Data_Object<Color> invalid(new Color(static_cast<Color>(42)));
127
+ Data_Object<Color> red(new Color(RED));
128
+ ASSERT_EQUAL(false, invalid == red);
129
+ ASSERT_EQUAL(false, red == invalid);
130
+ ASSERT_EQUAL(true, invalid == invalid);
131
+ }
132
+
133
+ TESTCASE(different_objects_compare)
134
+ {
135
+ Enum<Color> rb_cColor = define_color_enum();
136
+ Data_Object<Color> red1(new Color(RED));
137
+ Data_Object<Color> red2(new Color(RED));
138
+ ASSERT_EQUAL(0, red1.compare(red2));
139
+ }
140
+
141
+ TESTCASE(different_objects_eql)
142
+ {
143
+ Enum<Color> rb_cColor = define_color_enum();
144
+ Data_Object<Color> red1(new Color(RED));
145
+ Data_Object<Color> red2(new Color(RED));
146
+ ASSERT_EQUAL(true, red1 == red2);
147
+ }
148
+
149
+ TESTCASE(hash)
150
+ {
151
+ Enum<Color> rb_cColor = define_color_enum();
152
+ Data_Object<Color> red(new Color(RED));
153
+ ASSERT_EQUAL(to_ruby(int(RED)), red.call("hash"));
154
+ }
155
+
156
+ TESTCASE(from_int)
157
+ {
158
+ Enum<Color> rb_cColor = define_color_enum();
159
+ Data_Object<Color> color(rb_cColor.call("from_int", int(RED)));
160
+ ASSERT_EQUAL(RED, *color);
161
+ }
162
+