PageRenderTime 41ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/Examples/test-suite/csharp/li_boost_shared_ptr_runme.cs

#
C# | 589 lines | 469 code | 69 blank | 51 comment | 49 complexity | 27ea2b42f8c09af1767a78972195af35 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. using System;
  2. using li_boost_shared_ptrNamespace;
  3. public class runme
  4. {
  5. // Debugging flag
  6. public static bool debug = false;
  7. static void Main()
  8. {
  9. if (debug)
  10. Console.WriteLine("Started");
  11. li_boost_shared_ptr.debug_shared=debug;
  12. // Change loop count to run for a long time to monitor memory
  13. const int loopCount = 1; //50000;
  14. for (int i=0; i<loopCount; i++) {
  15. new runme().runtest();
  16. System.GC.Collect();
  17. System.GC.WaitForPendingFinalizers();
  18. if (i%100 == 0) {
  19. System.Threading.Thread.Sleep(1); // give some time to the lower priority finalizer thread
  20. }
  21. }
  22. if (debug)
  23. Console.WriteLine("Nearly finished");
  24. int countdown = 100;
  25. while (true) {
  26. System.GC.Collect();
  27. System.GC.WaitForPendingFinalizers();
  28. System.Threading.Thread.Sleep(10);
  29. if (--countdown == 0)
  30. break;
  31. if (Klass.getTotal_count() == 1) // Expect 1 instance - the one global variable (GlobalValue)
  32. break;
  33. };
  34. if (Klass.getTotal_count() != 1)
  35. throw new ApplicationException("Klass.total_count=" + Klass.getTotal_count());
  36. int wrapper_count = li_boost_shared_ptr.shared_ptr_wrapper_count();
  37. if (wrapper_count != li_boost_shared_ptr.NOT_COUNTING)
  38. if (wrapper_count != 1) // Expect 1 instance - the one global variable (GlobalSmartValue)
  39. throw new ApplicationException("shared_ptr wrapper count=" + wrapper_count);
  40. if (debug)
  41. Console.WriteLine("Finished");
  42. }
  43. private void runtest() {
  44. // simple shared_ptr usage - created in C++
  45. {
  46. Klass k = new Klass("me oh my");
  47. String val = k.getValue();
  48. verifyValue("me oh my", val);
  49. verifyCount(1, k);
  50. }
  51. // simple shared_ptr usage - not created in C++
  52. {
  53. Klass k = li_boost_shared_ptr.factorycreate();
  54. String val = k.getValue();
  55. verifyValue("factorycreate", val);
  56. verifyCount(1, k);
  57. }
  58. // pass by shared_ptr
  59. {
  60. Klass k = new Klass("me oh my");
  61. Klass kret = li_boost_shared_ptr.smartpointertest(k);
  62. String val = kret.getValue();
  63. verifyValue("me oh my smartpointertest", val);
  64. verifyCount(2, k);
  65. verifyCount(2, kret);
  66. }
  67. // pass by shared_ptr pointer
  68. {
  69. Klass k = new Klass("me oh my");
  70. Klass kret = li_boost_shared_ptr.smartpointerpointertest(k);
  71. String val = kret.getValue();
  72. verifyValue("me oh my smartpointerpointertest", val);
  73. verifyCount(2, k);
  74. verifyCount(2, kret);
  75. }
  76. // pass by shared_ptr reference
  77. {
  78. Klass k = new Klass("me oh my");
  79. Klass kret = li_boost_shared_ptr.smartpointerreftest(k);
  80. String val = kret.getValue();
  81. verifyValue("me oh my smartpointerreftest", val);
  82. verifyCount(2, k);
  83. verifyCount(2, kret);
  84. }
  85. // pass by shared_ptr pointer reference
  86. {
  87. Klass k = new Klass("me oh my");
  88. Klass kret = li_boost_shared_ptr.smartpointerpointerreftest(k);
  89. String val = kret.getValue();
  90. verifyValue("me oh my smartpointerpointerreftest", val);
  91. verifyCount(2, k);
  92. verifyCount(2, kret);
  93. }
  94. // const pass by shared_ptr
  95. {
  96. Klass k = new Klass("me oh my");
  97. Klass kret = li_boost_shared_ptr.constsmartpointertest(k);
  98. String val = kret.getValue();
  99. verifyValue("me oh my", val);
  100. verifyCount(2, k);
  101. verifyCount(2, kret);
  102. }
  103. // const pass by shared_ptr pointer
  104. {
  105. Klass k = new Klass("me oh my");
  106. Klass kret = li_boost_shared_ptr.constsmartpointerpointertest(k);
  107. String val = kret.getValue();
  108. verifyValue("me oh my", val);
  109. verifyCount(2, k);
  110. verifyCount(2, kret);
  111. }
  112. // const pass by shared_ptr reference
  113. {
  114. Klass k = new Klass("me oh my");
  115. Klass kret = li_boost_shared_ptr.constsmartpointerreftest(k);
  116. String val = kret.getValue();
  117. verifyValue("me oh my", val);
  118. verifyCount(2, k);
  119. verifyCount(2, kret);
  120. }
  121. // pass by value
  122. {
  123. Klass k = new Klass("me oh my");
  124. Klass kret = li_boost_shared_ptr.valuetest(k);
  125. String val = kret.getValue();
  126. verifyValue("me oh my valuetest", val);
  127. verifyCount(1, k);
  128. verifyCount(1, kret);
  129. }
  130. // pass by pointer
  131. {
  132. Klass k = new Klass("me oh my");
  133. Klass kret = li_boost_shared_ptr.pointertest(k);
  134. String val = kret.getValue();
  135. verifyValue("me oh my pointertest", val);
  136. verifyCount(1, k);
  137. verifyCount(1, kret);
  138. }
  139. // pass by reference
  140. {
  141. Klass k = new Klass("me oh my");
  142. Klass kret = li_boost_shared_ptr.reftest(k);
  143. String val = kret.getValue();
  144. verifyValue("me oh my reftest", val);
  145. verifyCount(1, k);
  146. verifyCount(1, kret);
  147. }
  148. // pass by pointer reference
  149. {
  150. Klass k = new Klass("me oh my");
  151. Klass kret = li_boost_shared_ptr.pointerreftest(k);
  152. String val = kret.getValue();
  153. verifyValue("me oh my pointerreftest", val);
  154. verifyCount(1, k);
  155. verifyCount(1, kret);
  156. }
  157. // null tests
  158. {
  159. Klass k = null;
  160. // TODO: add in const versions too
  161. if (li_boost_shared_ptr.smartpointertest(k) != null)
  162. throw new ApplicationException("return was not null");
  163. if (li_boost_shared_ptr.smartpointerpointertest(k) != null)
  164. throw new ApplicationException("return was not null");
  165. if (li_boost_shared_ptr.smartpointerreftest(k) != null)
  166. throw new ApplicationException("return was not null");
  167. if (li_boost_shared_ptr.smartpointerpointerreftest(k) != null)
  168. throw new ApplicationException("return was not null");
  169. if (li_boost_shared_ptr.nullsmartpointerpointertest(null) != "null pointer")
  170. throw new ApplicationException("not null smartpointer pointer");
  171. try { li_boost_shared_ptr.valuetest(k); throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
  172. if (li_boost_shared_ptr.pointertest(k) != null)
  173. throw new ApplicationException("return was not null");
  174. try { li_boost_shared_ptr.reftest(k); throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
  175. }
  176. // $owner
  177. {
  178. Klass k = li_boost_shared_ptr.pointerownertest();
  179. String val = k.getValue();
  180. verifyValue("pointerownertest", val);
  181. verifyCount(1, k);
  182. }
  183. {
  184. Klass k = li_boost_shared_ptr.smartpointerpointerownertest();
  185. String val = k.getValue();
  186. verifyValue("smartpointerpointerownertest", val);
  187. verifyCount(1, k);
  188. }
  189. ////////////////////////////////// Derived classes ////////////////////////////////////////
  190. // derived pass by shared_ptr
  191. {
  192. KlassDerived k = new KlassDerived("me oh my");
  193. KlassDerived kret = li_boost_shared_ptr.derivedsmartptrtest(k);
  194. String val = kret.getValue();
  195. verifyValue("me oh my derivedsmartptrtest-Derived", val);
  196. verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
  197. verifyCount(4, kret);
  198. }
  199. // derived pass by shared_ptr pointer
  200. {
  201. KlassDerived k = new KlassDerived("me oh my");
  202. KlassDerived kret = li_boost_shared_ptr.derivedsmartptrpointertest(k);
  203. String val = kret.getValue();
  204. verifyValue("me oh my derivedsmartptrpointertest-Derived", val);
  205. verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
  206. verifyCount(4, kret);
  207. }
  208. // derived pass by shared_ptr ref
  209. {
  210. KlassDerived k = new KlassDerived("me oh my");
  211. KlassDerived kret = li_boost_shared_ptr.derivedsmartptrreftest(k);
  212. String val = kret.getValue();
  213. verifyValue("me oh my derivedsmartptrreftest-Derived", val);
  214. verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
  215. verifyCount(4, kret);
  216. }
  217. // derived pass by shared_ptr pointer ref
  218. {
  219. KlassDerived k = new KlassDerived("me oh my");
  220. KlassDerived kret = li_boost_shared_ptr.derivedsmartptrpointerreftest(k);
  221. String val = kret.getValue();
  222. verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val);
  223. verifyCount(4, k); // includes two extra references for upcasts in the proxy classes
  224. verifyCount(4, kret);
  225. }
  226. // derived pass by pointer
  227. {
  228. KlassDerived k = new KlassDerived("me oh my");
  229. KlassDerived kret = li_boost_shared_ptr.derivedpointertest(k);
  230. String val = kret.getValue();
  231. verifyValue("me oh my derivedpointertest-Derived", val);
  232. verifyCount(2, k); // includes an extra reference for the upcast in the proxy class
  233. verifyCount(2, kret);
  234. }
  235. // derived pass by ref
  236. {
  237. KlassDerived k = new KlassDerived("me oh my");
  238. KlassDerived kret = li_boost_shared_ptr.derivedreftest(k);
  239. String val = kret.getValue();
  240. verifyValue("me oh my derivedreftest-Derived", val);
  241. verifyCount(2, k); // includes an extra reference for the upcast in the proxy class
  242. verifyCount(2, kret);
  243. }
  244. ////////////////////////////////// Derived and base class mixed ////////////////////////////////////////
  245. // pass by shared_ptr (mixed)
  246. {
  247. Klass k = new KlassDerived("me oh my");
  248. Klass kret = li_boost_shared_ptr.smartpointertest(k);
  249. String val = kret.getValue();
  250. verifyValue("me oh my smartpointertest-Derived", val);
  251. verifyCount(3, k); // an extra reference for the upcast in the proxy class
  252. verifyCount(3, kret);
  253. }
  254. // pass by shared_ptr pointer (mixed)
  255. {
  256. Klass k = new KlassDerived("me oh my");
  257. Klass kret = li_boost_shared_ptr.smartpointerpointertest(k);
  258. String val = kret.getValue();
  259. verifyValue("me oh my smartpointerpointertest-Derived", val);
  260. verifyCount(3, k); // an extra reference for the upcast in the proxy class
  261. verifyCount(3, kret);
  262. }
  263. // pass by shared_ptr reference (mixed)
  264. {
  265. Klass k = new KlassDerived("me oh my");
  266. Klass kret = li_boost_shared_ptr.smartpointerreftest(k);
  267. String val = kret.getValue();
  268. verifyValue("me oh my smartpointerreftest-Derived", val);
  269. verifyCount(3, k); // an extra reference for the upcast in the proxy class
  270. verifyCount(3, kret);
  271. }
  272. // pass by shared_ptr pointer reference (mixed)
  273. {
  274. Klass k = new KlassDerived("me oh my");
  275. Klass kret = li_boost_shared_ptr.smartpointerpointerreftest(k);
  276. String val = kret.getValue();
  277. verifyValue("me oh my smartpointerpointerreftest-Derived", val);
  278. verifyCount(3, k); // an extra reference for the upcast in the proxy class
  279. verifyCount(3, kret);
  280. }
  281. // pass by value (mixed)
  282. {
  283. Klass k = new KlassDerived("me oh my");
  284. Klass kret = li_boost_shared_ptr.valuetest(k);
  285. String val = kret.getValue();
  286. verifyValue("me oh my valuetest", val); // note slicing
  287. verifyCount(2, k); // an extra reference for the upcast in the proxy class
  288. verifyCount(1, kret);
  289. }
  290. // pass by pointer (mixed)
  291. {
  292. Klass k = new KlassDerived("me oh my");
  293. Klass kret = li_boost_shared_ptr.pointertest(k);
  294. String val = kret.getValue();
  295. verifyValue("me oh my pointertest-Derived", val);
  296. verifyCount(2, k); // an extra reference for the upcast in the proxy class
  297. verifyCount(1, kret);
  298. }
  299. // pass by ref (mixed)
  300. {
  301. Klass k = new KlassDerived("me oh my");
  302. Klass kret = li_boost_shared_ptr.reftest(k);
  303. String val = kret.getValue();
  304. verifyValue("me oh my reftest-Derived", val);
  305. verifyCount(2, k); // an extra reference for the upcast in the proxy class
  306. verifyCount(1, kret);
  307. }
  308. // 3rd derived class
  309. {
  310. Klass k = new Klass3rdDerived("me oh my");
  311. String val = k.getValue();
  312. verifyValue("me oh my-3rdDerived", val);
  313. verifyCount(3, k); // 3 classes in inheritance chain == 3 swigCPtr values
  314. val = li_boost_shared_ptr.test3rdupcast(k);
  315. verifyValue("me oh my-3rdDerived", val);
  316. verifyCount(3, k);
  317. }
  318. ////////////////////////////////// Member variables ////////////////////////////////////////
  319. // smart pointer by value
  320. {
  321. MemberVariables m = new MemberVariables();
  322. Klass k = new Klass("smart member value");
  323. m.SmartMemberValue = k;
  324. String val = k.getValue();
  325. verifyValue("smart member value", val);
  326. verifyCount(2, k);
  327. Klass kmember = m.SmartMemberValue;
  328. val = kmember.getValue();
  329. verifyValue("smart member value", val);
  330. verifyCount(3, kmember);
  331. verifyCount(3, k);
  332. m.Dispose();
  333. verifyCount(2, kmember);
  334. verifyCount(2, k);
  335. }
  336. // smart pointer by pointer
  337. {
  338. MemberVariables m = new MemberVariables();
  339. Klass k = new Klass("smart member pointer");
  340. m.SmartMemberPointer = k;
  341. String val = k.getValue();
  342. verifyValue("smart member pointer", val);
  343. verifyCount(1, k);
  344. Klass kmember = m.SmartMemberPointer;
  345. val = kmember.getValue();
  346. verifyValue("smart member pointer", val);
  347. verifyCount(2, kmember);
  348. verifyCount(2, k);
  349. m.Dispose();
  350. verifyCount(2, kmember);
  351. verifyCount(2, k);
  352. }
  353. // smart pointer by reference
  354. {
  355. MemberVariables m = new MemberVariables();
  356. Klass k = new Klass("smart member reference");
  357. m.SmartMemberReference = k;
  358. String val = k.getValue();
  359. verifyValue("smart member reference", val);
  360. verifyCount(2, k);
  361. Klass kmember = m.SmartMemberReference;
  362. val = kmember.getValue();
  363. verifyValue("smart member reference", val);
  364. verifyCount(3, kmember);
  365. verifyCount(3, k);
  366. // The C++ reference refers to SmartMemberValue...
  367. Klass kmemberVal = m.SmartMemberValue;
  368. val = kmember.getValue();
  369. verifyValue("smart member reference", val);
  370. verifyCount(4, kmemberVal);
  371. verifyCount(4, kmember);
  372. verifyCount(4, k);
  373. m.Dispose();
  374. verifyCount(3, kmember);
  375. verifyCount(3, k);
  376. }
  377. // plain by value
  378. {
  379. MemberVariables m = new MemberVariables();
  380. Klass k = new Klass("plain member value");
  381. m.MemberValue = k;
  382. String val = k.getValue();
  383. verifyValue("plain member value", val);
  384. verifyCount(1, k);
  385. Klass kmember = m.MemberValue;
  386. val = kmember.getValue();
  387. verifyValue("plain member value", val);
  388. verifyCount(1, kmember);
  389. verifyCount(1, k);
  390. m.Dispose();
  391. verifyCount(1, kmember);
  392. verifyCount(1, k);
  393. }
  394. // plain by pointer
  395. {
  396. MemberVariables m = new MemberVariables();
  397. Klass k = new Klass("plain member pointer");
  398. m.MemberPointer = k;
  399. String val = k.getValue();
  400. verifyValue("plain member pointer", val);
  401. verifyCount(1, k);
  402. Klass kmember = m.MemberPointer;
  403. val = kmember.getValue();
  404. verifyValue("plain member pointer", val);
  405. verifyCount(1, kmember);
  406. verifyCount(1, k);
  407. m.Dispose();
  408. verifyCount(1, kmember);
  409. verifyCount(1, k);
  410. }
  411. // plain by reference
  412. {
  413. MemberVariables m = new MemberVariables();
  414. Klass k = new Klass("plain member reference");
  415. m.MemberReference = k;
  416. String val = k.getValue();
  417. verifyValue("plain member reference", val);
  418. verifyCount(1, k);
  419. Klass kmember = m.MemberReference;
  420. val = kmember.getValue();
  421. verifyValue("plain member reference", val);
  422. verifyCount(1, kmember);
  423. verifyCount(1, k);
  424. m.Dispose();
  425. verifyCount(1, kmember);
  426. verifyCount(1, k);
  427. }
  428. // null member variables
  429. {
  430. MemberVariables m = new MemberVariables();
  431. // shared_ptr by value
  432. Klass k = m.SmartMemberValue;
  433. if (k != null)
  434. throw new ApplicationException("expected null");
  435. m.SmartMemberValue = null;
  436. k = m.SmartMemberValue;
  437. if (k != null)
  438. throw new ApplicationException("expected null");
  439. verifyCount(0, k);
  440. // plain by value
  441. try { m.MemberValue = null; throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
  442. }
  443. ////////////////////////////////// Global variables ////////////////////////////////////////
  444. // smart pointer
  445. {
  446. Klass kglobal = li_boost_shared_ptr.GlobalSmartValue;
  447. if (kglobal != null)
  448. throw new ApplicationException("expected null");
  449. Klass k = new Klass("smart global value");
  450. li_boost_shared_ptr.GlobalSmartValue = k;
  451. verifyCount(2, k);
  452. kglobal = li_boost_shared_ptr.GlobalSmartValue;
  453. String val = kglobal.getValue();
  454. verifyValue("smart global value", val);
  455. verifyCount(3, kglobal);
  456. verifyCount(3, k);
  457. verifyValue("smart global value", li_boost_shared_ptr.GlobalSmartValue.getValue());
  458. li_boost_shared_ptr.GlobalSmartValue = null;
  459. }
  460. // plain value
  461. {
  462. Klass kglobal;
  463. Klass k = new Klass("global value");
  464. li_boost_shared_ptr.GlobalValue = k;
  465. verifyCount(1, k);
  466. kglobal = li_boost_shared_ptr.GlobalValue;
  467. String val = kglobal.getValue();
  468. verifyValue("global value", val);
  469. verifyCount(1, kglobal);
  470. verifyCount(1, k);
  471. verifyValue("global value", li_boost_shared_ptr.GlobalValue.getValue());
  472. try { li_boost_shared_ptr.GlobalValue = null; throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
  473. }
  474. // plain pointer
  475. {
  476. Klass kglobal = li_boost_shared_ptr.GlobalPointer;
  477. if (kglobal != null)
  478. throw new ApplicationException("expected null");
  479. Klass k = new Klass("global pointer");
  480. li_boost_shared_ptr.GlobalPointer = k;
  481. verifyCount(1, k);
  482. kglobal = li_boost_shared_ptr.GlobalPointer;
  483. String val = kglobal.getValue();
  484. verifyValue("global pointer", val);
  485. verifyCount(1, kglobal);
  486. verifyCount(1, k);
  487. li_boost_shared_ptr.GlobalPointer = null;
  488. }
  489. // plain reference
  490. {
  491. Klass kglobal;
  492. Klass k = new Klass("global reference");
  493. li_boost_shared_ptr.GlobalReference = k;
  494. verifyCount(1, k);
  495. kglobal = li_boost_shared_ptr.GlobalReference;
  496. String val = kglobal.getValue();
  497. verifyValue("global reference", val);
  498. verifyCount(1, kglobal);
  499. verifyCount(1, k);
  500. try { li_boost_shared_ptr.GlobalReference = null; throw new ApplicationException("Failed to catch null pointer"); } catch (ArgumentNullException) {}
  501. }
  502. ////////////////////////////////// Templates ////////////////////////////////////////
  503. {
  504. PairIntDouble pid = new PairIntDouble(10, 20.2);
  505. if (pid.baseVal1 != 20 || pid.baseVal2 != 40.4)
  506. throw new ApplicationException("Base values wrong");
  507. if (pid.val1 != 10 || pid.val2 != 20.2)
  508. throw new ApplicationException("Derived Values wrong");
  509. }
  510. }
  511. private void verifyValue(String expected, String got) {
  512. if (expected != got)
  513. throw new Exception("verify value failed. Expected: " + expected + " Got: " + got);
  514. }
  515. private void verifyCount(int expected, Klass k) {
  516. int got = li_boost_shared_ptr.use_count(k);
  517. if (expected != got)
  518. throw new Exception("verify use_count failed. Expected: " + expected + " Got: " + got);
  519. }
  520. }