2 using li_boost_shared_ptrNamespace;
7 public static bool debug = false;
12 Console.WriteLine("Started");
14 li_boost_shared_ptr.debug_shared=debug;
16 // Change loop count to run for a long time to monitor memory
17 const int loopCount = 1; //50000;
18 for (int i=0; i<loopCount; i++) {
19 new runme().runtest();
21 System.GC.WaitForPendingFinalizers();
23 System.Threading.Thread.Sleep(1); // give some time to the lower priority finalizer thread
28 Console.WriteLine("Nearly finished");
33 System.GC.WaitForPendingFinalizers();
34 System.Threading.Thread.Sleep(10);
37 if (Klass.getTotal_count() == 1) // Expect 1 instance - the one global variable (GlobalValue)
40 if (Klass.getTotal_count() != 1)
41 throw new ApplicationException("Klass.total_count=" + Klass.getTotal_count());
43 int wrapper_count = li_boost_shared_ptr.shared_ptr_wrapper_count();
44 if (wrapper_count != li_boost_shared_ptr.NOT_COUNTING)
45 if (wrapper_count != 1) // Expect 1 instance - the one global variable (GlobalSmartValue)
46 throw new ApplicationException("shared_ptr wrapper count=" + wrapper_count);
49 Console.WriteLine("Finished");
52 private void runtest() {
53 // simple shared_ptr usage - created in C++
55 Klass k = new Klass("me oh my");
56 String val = k.getValue();
57 verifyValue("me oh my", val);
61 // simple shared_ptr usage - not created in C++
63 Klass k = li_boost_shared_ptr.factorycreate();
64 String val = k.getValue();
65 verifyValue("factorycreate", val);
71 Klass k = new Klass("me oh my");
72 Klass kret = li_boost_shared_ptr.smartpointertest(k);
73 String val = kret.getValue();
74 verifyValue("me oh my smartpointertest", val);
79 // pass by shared_ptr pointer
81 Klass k = new Klass("me oh my");
82 Klass kret = li_boost_shared_ptr.smartpointerpointertest(k);
83 String val = kret.getValue();
84 verifyValue("me oh my smartpointerpointertest", val);
89 // pass by shared_ptr reference
91 Klass k = new Klass("me oh my");
92 Klass kret = li_boost_shared_ptr.smartpointerreftest(k);
93 String val = kret.getValue();
94 verifyValue("me oh my smartpointerreftest", val);
99 // pass by shared_ptr pointer reference
101 Klass k = new Klass("me oh my");
102 Klass kret = li_boost_shared_ptr.smartpointerpointerreftest(k);
103 String val = kret.getValue();
104 verifyValue("me oh my smartpointerpointerreftest", val);
106 verifyCount(2, kret);
109 // const pass by shared_ptr
111 Klass k = new Klass("me oh my");
112 Klass kret = li_boost_shared_ptr.constsmartpointertest(k);
113 String val = kret.getValue();
114 verifyValue("me oh my", val);
116 verifyCount(2, kret);
119 // const pass by shared_ptr pointer
121 Klass k = new Klass("me oh my");
122 Klass kret = li_boost_shared_ptr.constsmartpointerpointertest(k);
123 String val = kret.getValue();
124 verifyValue("me oh my", val);
126 verifyCount(2, kret);
129 // const pass by shared_ptr reference
131 Klass k = new Klass("me oh my");
132 Klass kret = li_boost_shared_ptr.constsmartpointerreftest(k);
133 String val = kret.getValue();
134 verifyValue("me oh my", val);
136 verifyCount(2, kret);
141 Klass k = new Klass("me oh my");
142 Klass kret = li_boost_shared_ptr.valuetest(k);
143 String val = kret.getValue();
144 verifyValue("me oh my valuetest", val);
146 verifyCount(1, kret);
151 Klass k = new Klass("me oh my");
152 Klass kret = li_boost_shared_ptr.pointertest(k);
153 String val = kret.getValue();
154 verifyValue("me oh my pointertest", val);
156 verifyCount(1, kret);
161 Klass k = new Klass("me oh my");
162 Klass kret = li_boost_shared_ptr.reftest(k);
163 String val = kret.getValue();
164 verifyValue("me oh my reftest", val);
166 verifyCount(1, kret);
169 // pass by pointer reference
171 Klass k = new Klass("me oh my");
172 Klass kret = li_boost_shared_ptr.pointerreftest(k);
173 String val = kret.getValue();
174 verifyValue("me oh my pointerreftest", val);
176 verifyCount(1, kret);
183 // TODO: add in const versions too
184 if (li_boost_shared_ptr.smartpointertest(k) != null)
185 throw new ApplicationException("return was not null");
187 if (li_boost_shared_ptr.smartpointerpointertest(k) != null)
188 throw new ApplicationException("return was not null");
190 if (li_boost_shared_ptr.smartpointerreftest(k) != null)
191 throw new ApplicationException("return was not null");
193 if (li_boost_shared_ptr.smartpointerpointerreftest(k) != null)
194 throw new ApplicationException("return was not null");
196 if (li_boost_shared_ptr.nullsmartpointerpointertest(null) != "null pointer")
197 throw new ApplicationException("not null smartpointer pointer");
199 try { li_boost_shared_ptr.valuetest(k); throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
201 if (li_boost_shared_ptr.pointertest(k) != null)
202 throw new ApplicationException("return was not null");
204 try { li_boost_shared_ptr.reftest(k); throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
209 Klass k = li_boost_shared_ptr.pointerownertest();
210 String val = k.getValue();
211 verifyValue("pointerownertest", val);
215 Klass k = li_boost_shared_ptr.smartpointerpointerownertest();
216 String val = k.getValue();
217 verifyValue("smartpointerpointerownertest", val);
221 ////////////////////////////////// Derived classes ////////////////////////////////////////
222 // derived pass by shared_ptr
224 KlassDerived k = new KlassDerived("me oh my");
225 KlassDerived kret = li_boost_shared_ptr.derivedsmartptrtest(k);
226 String val = kret.getValue();
227 verifyValue("me oh my derivedsmartptrtest-Derived", val);
228 verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
229 verifyCount(4, kret);
231 // derived pass by shared_ptr pointer
233 KlassDerived k = new KlassDerived("me oh my");
234 KlassDerived kret = li_boost_shared_ptr.derivedsmartptrpointertest(k);
235 String val = kret.getValue();
236 verifyValue("me oh my derivedsmartptrpointertest-Derived", val);
237 verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
238 verifyCount(4, kret);
240 // derived pass by shared_ptr ref
242 KlassDerived k = new KlassDerived("me oh my");
243 KlassDerived kret = li_boost_shared_ptr.derivedsmartptrreftest(k);
244 String val = kret.getValue();
245 verifyValue("me oh my derivedsmartptrreftest-Derived", val);
246 verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
247 verifyCount(4, kret);
249 // derived pass by shared_ptr pointer ref
251 KlassDerived k = new KlassDerived("me oh my");
252 KlassDerived kret = li_boost_shared_ptr.derivedsmartptrpointerreftest(k);
253 String val = kret.getValue();
254 verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val);
255 verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
256 verifyCount(4, kret);
258 // derived pass by pointer
260 KlassDerived k = new KlassDerived("me oh my");
261 KlassDerived kret = li_boost_shared_ptr.derivedpointertest(k);
262 String val = kret.getValue();
263 verifyValue("me oh my derivedpointertest-Derived", val);
264 verifyCount(2, k); // includes an extra reference for the upcast in the proxy class
265 verifyCount(2, kret);
267 // derived pass by ref
269 KlassDerived k = new KlassDerived("me oh my");
270 KlassDerived kret = li_boost_shared_ptr.derivedreftest(k);
271 String val = kret.getValue();
272 verifyValue("me oh my derivedreftest-Derived", val);
273 verifyCount(2, k); // includes an extra reference for the upcast in the proxy class
274 verifyCount(2, kret);
277 ////////////////////////////////// Derived and base class mixed ////////////////////////////////////////
278 // pass by shared_ptr (mixed)
280 Klass k = new KlassDerived("me oh my");
281 Klass kret = li_boost_shared_ptr.smartpointertest(k);
282 String val = kret.getValue();
283 verifyValue("me oh my smartpointertest-Derived", val);
284 verifyCount(3, k); // an extra reference for the upcast in the proxy class
285 verifyCount(3, kret);
288 // pass by shared_ptr pointer (mixed)
290 Klass k = new KlassDerived("me oh my");
291 Klass kret = li_boost_shared_ptr.smartpointerpointertest(k);
292 String val = kret.getValue();
293 verifyValue("me oh my smartpointerpointertest-Derived", val);
294 verifyCount(3, k); // an extra reference for the upcast in the proxy class
295 verifyCount(3, kret);
298 // pass by shared_ptr reference (mixed)
300 Klass k = new KlassDerived("me oh my");
301 Klass kret = li_boost_shared_ptr.smartpointerreftest(k);
302 String val = kret.getValue();
303 verifyValue("me oh my smartpointerreftest-Derived", val);
304 verifyCount(3, k); // an extra reference for the upcast in the proxy class
305 verifyCount(3, kret);
308 // pass by shared_ptr pointer reference (mixed)
310 Klass k = new KlassDerived("me oh my");
311 Klass kret = li_boost_shared_ptr.smartpointerpointerreftest(k);
312 String val = kret.getValue();
313 verifyValue("me oh my smartpointerpointerreftest-Derived", val);
314 verifyCount(3, k); // an extra reference for the upcast in the proxy class
315 verifyCount(3, kret);
318 // pass by value (mixed)
320 Klass k = new KlassDerived("me oh my");
321 Klass kret = li_boost_shared_ptr.valuetest(k);
322 String val = kret.getValue();
323 verifyValue("me oh my valuetest", val); // note slicing
324 verifyCount(2, k); // an extra reference for the upcast in the proxy class
325 verifyCount(1, kret);
328 // pass by pointer (mixed)
330 Klass k = new KlassDerived("me oh my");
331 Klass kret = li_boost_shared_ptr.pointertest(k);
332 String val = kret.getValue();
333 verifyValue("me oh my pointertest-Derived", val);
334 verifyCount(2, k); // an extra reference for the upcast in the proxy class
335 verifyCount(1, kret);
338 // pass by ref (mixed)
340 Klass k = new KlassDerived("me oh my");
341 Klass kret = li_boost_shared_ptr.reftest(k);
342 String val = kret.getValue();
343 verifyValue("me oh my reftest-Derived", val);
344 verifyCount(2, k); // an extra reference for the upcast in the proxy class
345 verifyCount(1, kret);
350 Klass k = new Klass3rdDerived("me oh my");
351 String val = k.getValue();
352 verifyValue("me oh my-3rdDerived", val);
353 verifyCount(3, k); // 3 classes in inheritance chain == 3 swigCPtr values
354 val = li_boost_shared_ptr.test3rdupcast(k);
355 verifyValue("me oh my-3rdDerived", val);
359 ////////////////////////////////// Member variables ////////////////////////////////////////
360 // smart pointer by value
362 MemberVariables m = new MemberVariables();
363 Klass k = new Klass("smart member value");
364 m.SmartMemberValue = k;
365 String val = k.getValue();
366 verifyValue("smart member value", val);
369 Klass kmember = m.SmartMemberValue;
370 val = kmember.getValue();
371 verifyValue("smart member value", val);
372 verifyCount(3, kmember);
376 verifyCount(2, kmember);
379 // smart pointer by pointer
381 MemberVariables m = new MemberVariables();
382 Klass k = new Klass("smart member pointer");
383 m.SmartMemberPointer = k;
384 String val = k.getValue();
385 verifyValue("smart member pointer", val);
388 Klass kmember = m.SmartMemberPointer;
389 val = kmember.getValue();
390 verifyValue("smart member pointer", val);
391 verifyCount(2, kmember);
395 verifyCount(2, kmember);
398 // smart pointer by reference
400 MemberVariables m = new MemberVariables();
401 Klass k = new Klass("smart member reference");
402 m.SmartMemberReference = k;
403 String val = k.getValue();
404 verifyValue("smart member reference", val);
407 Klass kmember = m.SmartMemberReference;
408 val = kmember.getValue();
409 verifyValue("smart member reference", val);
410 verifyCount(3, kmember);
413 // The C++ reference refers to SmartMemberValue...
414 Klass kmemberVal = m.SmartMemberValue;
415 val = kmember.getValue();
416 verifyValue("smart member reference", val);
417 verifyCount(4, kmemberVal);
418 verifyCount(4, kmember);
422 verifyCount(3, kmember);
427 MemberVariables m = new MemberVariables();
428 Klass k = new Klass("plain member value");
430 String val = k.getValue();
431 verifyValue("plain member value", val);
434 Klass kmember = m.MemberValue;
435 val = kmember.getValue();
436 verifyValue("plain member value", val);
437 verifyCount(1, kmember);
441 verifyCount(1, kmember);
446 MemberVariables m = new MemberVariables();
447 Klass k = new Klass("plain member pointer");
449 String val = k.getValue();
450 verifyValue("plain member pointer", val);
453 Klass kmember = m.MemberPointer;
454 val = kmember.getValue();
455 verifyValue("plain member pointer", val);
456 verifyCount(1, kmember);
460 verifyCount(1, kmember);
463 // plain by reference
465 MemberVariables m = new MemberVariables();
466 Klass k = new Klass("plain member reference");
467 m.MemberReference = k;
468 String val = k.getValue();
469 verifyValue("plain member reference", val);
472 Klass kmember = m.MemberReference;
473 val = kmember.getValue();
474 verifyValue("plain member reference", val);
475 verifyCount(1, kmember);
479 verifyCount(1, kmember);
483 // null member variables
485 MemberVariables m = new MemberVariables();
487 // shared_ptr by value
488 Klass k = m.SmartMemberValue;
490 throw new ApplicationException("expected null");
491 m.SmartMemberValue = null;
492 k = m.SmartMemberValue;
494 throw new ApplicationException("expected null");
498 try { m.MemberValue = null; throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
501 ////////////////////////////////// Global variables ////////////////////////////////////////
504 Klass kglobal = li_boost_shared_ptr.GlobalSmartValue;
506 throw new ApplicationException("expected null");
508 Klass k = new Klass("smart global value");
509 li_boost_shared_ptr.GlobalSmartValue = k;
512 kglobal = li_boost_shared_ptr.GlobalSmartValue;
513 String val = kglobal.getValue();
514 verifyValue("smart global value", val);
515 verifyCount(3, kglobal);
517 verifyValue("smart global value", li_boost_shared_ptr.GlobalSmartValue.getValue());
518 li_boost_shared_ptr.GlobalSmartValue = null;
524 Klass k = new Klass("global value");
525 li_boost_shared_ptr.GlobalValue = k;
528 kglobal = li_boost_shared_ptr.GlobalValue;
529 String val = kglobal.getValue();
530 verifyValue("global value", val);
531 verifyCount(1, kglobal);
533 verifyValue("global value", li_boost_shared_ptr.GlobalValue.getValue());
535 try { li_boost_shared_ptr.GlobalValue = null; throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
539 Klass kglobal = li_boost_shared_ptr.GlobalPointer;
541 throw new ApplicationException("expected null");
543 Klass k = new Klass("global pointer");
544 li_boost_shared_ptr.GlobalPointer = k;
547 kglobal = li_boost_shared_ptr.GlobalPointer;
548 String val = kglobal.getValue();
549 verifyValue("global pointer", val);
550 verifyCount(1, kglobal);
552 li_boost_shared_ptr.GlobalPointer = null;
558 Klass k = new Klass("global reference");
559 li_boost_shared_ptr.GlobalReference = k;
562 kglobal = li_boost_shared_ptr.GlobalReference;
563 String val = kglobal.getValue();
564 verifyValue("global reference", val);
565 verifyCount(1, kglobal);
568 try { li_boost_shared_ptr.GlobalReference = null; throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
571 ////////////////////////////////// Templates ////////////////////////////////////////
573 PairIntDouble pid = new PairIntDouble(10, 20.2);
574 if (pid.baseVal1 != 20 || pid.baseVal2 != 40.4)
575 throw new ApplicationException("Base values wrong");
576 if (pid.val1 != 10 || pid.val2 != 20.2)
577 throw new ApplicationException("Derived Values wrong");
580 private void verifyValue(String expected, String got) {
582 throw new Exception("verify value failed. Expected: " + expected + " Got: " + got);
584 private void verifyCount(int expected, Klass k) {
585 int got = li_boost_shared_ptr.use_count(k);
587 throw new Exception("verify use_count failed. Expected: " + expected + " Got: " + got);