PageRenderTime 59ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/mcs/tests/gtest-etree-01.cs

https://bitbucket.org/danipen/mono
C# | 2831 lines | 2383 code | 409 blank | 39 comment | 66 complexity | b3a0a825ebe77b42f111b09df998d3aa MD5 | raw file
Possible License(s): Unlicense, Apache-2.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. // Compiler options: -unsafe
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. public struct InverseLogicalOperator
  8. {
  9. bool value;
  10. public InverseLogicalOperator (bool value)
  11. {
  12. this.value = value;
  13. }
  14. public static bool operator true (InverseLogicalOperator u)
  15. {
  16. return u.value;
  17. }
  18. public static bool operator false (InverseLogicalOperator u)
  19. {
  20. return u.value;
  21. }
  22. }
  23. /* TODO: Add tests for every numeric expression where a type has only 1 implicit
  24. numeric conversion
  25. public struct MyType<T>
  26. {
  27. T value;
  28. public MyType (T value)
  29. {
  30. this.value = value;
  31. }
  32. public static implicit operator T (MyType<T> o)
  33. {
  34. return o.value;
  35. }
  36. }
  37. */
  38. // TODO: Create a clone which uses +(MyType, int) pattern and an implicit conversion
  39. // is required to do the user-conversion
  40. public struct MyType
  41. {
  42. int value;
  43. public MyType (int value) : this ()
  44. {
  45. this.value = value;
  46. }
  47. public short ShortProp { get; set; }
  48. public override int GetHashCode ()
  49. {
  50. throw new NotImplementedException ();
  51. }
  52. public static implicit operator int (MyType o)
  53. {
  54. return o.value;
  55. }
  56. public static bool operator true (MyType a)
  57. {
  58. return a.value == a;
  59. }
  60. public static bool operator false (MyType a)
  61. {
  62. return a.value != a;
  63. }
  64. public static MyType operator + (MyType a, MyType b)
  65. {
  66. return new MyType (a.value + b.value);
  67. }
  68. public static MyType operator - (MyType a, MyType b)
  69. {
  70. return new MyType (a.value - b.value);
  71. }
  72. public static MyType operator / (MyType a, MyType b)
  73. {
  74. return new MyType (a.value / b.value);
  75. }
  76. public static MyType operator * (MyType a, MyType b)
  77. {
  78. return new MyType (a.value * b.value);
  79. }
  80. public static MyType operator % (MyType a, MyType b)
  81. {
  82. return new MyType (a.value % b.value);
  83. }
  84. public static MyType operator &(MyType a, MyType b)
  85. {
  86. return new MyType (a.value & b.value);
  87. }
  88. public static MyType operator | (MyType a, MyType b)
  89. {
  90. return new MyType (a.value | b.value);
  91. }
  92. public static MyType operator ^ (MyType a, MyType b)
  93. {
  94. return new MyType (a.value ^ b.value);
  95. }
  96. public static bool operator == (MyType a, MyType b)
  97. {
  98. return a.value == b.value;
  99. }
  100. public static bool operator != (MyType a, MyType b)
  101. {
  102. return a.value != b.value;
  103. }
  104. public static bool operator > (MyType a, MyType b)
  105. {
  106. return a.value > b.value;
  107. }
  108. public static bool operator < (MyType a, MyType b)
  109. {
  110. return a.value < b.value;
  111. }
  112. public static bool operator >= (MyType a, MyType b)
  113. {
  114. return a.value >= b.value;
  115. }
  116. public static bool operator <= (MyType a, MyType b)
  117. {
  118. return a.value <= b.value;
  119. }
  120. public static bool operator ! (MyType a)
  121. {
  122. return a.value > 0;
  123. }
  124. public static int operator >> (MyType a, int b)
  125. {
  126. return a.value >> b;
  127. }
  128. public static int operator << (MyType a, int b)
  129. {
  130. return a.value << b;
  131. }
  132. public static MyType operator - (MyType a)
  133. {
  134. return new MyType (-a.value);
  135. }
  136. public static MyType operator + (MyType a)
  137. {
  138. return new MyType (+a.value);
  139. }
  140. public override string ToString ()
  141. {
  142. return value.ToString ();
  143. }
  144. }
  145. class MyTypeExplicit
  146. {
  147. int value;
  148. public MyTypeExplicit (int value)
  149. {
  150. this.value = value;
  151. }
  152. public static explicit operator int (MyTypeExplicit m)
  153. {
  154. return m.value;
  155. }
  156. }
  157. struct MyTypeImplicitOnly
  158. {
  159. short b;
  160. public MyTypeImplicitOnly (short b)
  161. {
  162. this.b = b;
  163. }
  164. public static implicit operator short (MyTypeImplicitOnly m)
  165. {
  166. return m.b;
  167. }
  168. }
  169. class MemberAccessData
  170. {
  171. public bool BoolValue;
  172. public static decimal DecimalValue = decimal.MinValue;
  173. public volatile uint VolatileValue;
  174. public string [] StringValues;
  175. public List<string> ListValues;
  176. event Func<bool> EventField;
  177. public Expression<Func<Func<bool>>> GetEvent ()
  178. {
  179. return () => EventField;
  180. }
  181. MyType mt;
  182. public MyType MyTypeProperty {
  183. set {
  184. mt = value;
  185. }
  186. get {
  187. return mt;
  188. }
  189. }
  190. public static string StaticProperty {
  191. get {
  192. return "alo";
  193. }
  194. }
  195. public object SetOnly { set { } }
  196. }
  197. enum MyEnum : byte
  198. {
  199. Value_1 = 1,
  200. Value_2 = 2
  201. }
  202. enum MyEnumUlong : ulong
  203. {
  204. Value_1 = 1
  205. }
  206. class NewTest<T>
  207. {
  208. T [] t;
  209. public NewTest (T i)
  210. {
  211. t = new T [] { i };
  212. }
  213. public NewTest (params T [] t)
  214. {
  215. this.t = t;
  216. }
  217. public override int GetHashCode ()
  218. {
  219. return base.GetHashCode ();
  220. }
  221. public override bool Equals (object obj)
  222. {
  223. NewTest<T> obj_t = obj as NewTest<T>;
  224. if (obj_t == null)
  225. return false;
  226. for (int i = 0; i < t.Length; ++i) {
  227. if (!t [i].Equals (obj_t.t [i]))
  228. return false;
  229. }
  230. return true;
  231. }
  232. }
  233. class Indexer
  234. {
  235. public int this [int i] { get { return i; } set { } }
  236. public string this [params string[] i] { get { return string.Concat (i); } }
  237. }
  238. class A { }
  239. class B : A { }
  240. // TODO: Add more nullable tests, follow AddTest pattern.
  241. class Tester
  242. {
  243. delegate void EmptyDelegate ();
  244. delegate int IntDelegate ();
  245. static int ReturnNumber ()
  246. {
  247. return 8;
  248. }
  249. static void AssertNodeType (LambdaExpression e, ExpressionType et)
  250. {
  251. if (e.Body.NodeType != et)
  252. throw new ApplicationException (e.Body.NodeType + " != " + et);
  253. }
  254. static void Assert<T> (T expected, T value)
  255. {
  256. Assert (expected, value, null);
  257. }
  258. static void Assert<T> (T expected, T value, string name)
  259. {
  260. if (!EqualityComparer<T>.Default.Equals (expected, value)) {
  261. if (!string.IsNullOrEmpty (name))
  262. name += ": ";
  263. throw new ApplicationException (name + expected + " != " + value);
  264. }
  265. }
  266. static void Assert<T> (T [] expected, T [] value)
  267. {
  268. if (expected == null) {
  269. if (value != null)
  270. throw new ApplicationException ("Both arrays expected to be null");
  271. return;
  272. }
  273. if (expected.Length != value.Length)
  274. throw new ApplicationException ("Array length does not match " + expected.Length + " != " + value.Length);
  275. for (int i = 0; i < expected.Length; ++i) {
  276. if (!EqualityComparer<T>.Default.Equals (expected [i], value [i]))
  277. throw new ApplicationException ("Index " + i + ": " + expected [i] + " != " + value [i]);
  278. }
  279. }
  280. #pragma warning disable 169
  281. void AddTest ()
  282. {
  283. Expression<Func<int, int, int>> e = (int a, int b) => a + b;
  284. AssertNodeType (e, ExpressionType.Add);
  285. Assert (50, e.Compile ().Invoke (20, 30));
  286. }
  287. void AddTest_2 ()
  288. {
  289. Expression<Func<int?, int?, int?>> e2 = (a, b) => a + b;
  290. AssertNodeType (e2, ExpressionType.Add);
  291. Assert (null, e2.Compile ().Invoke (null, 3));
  292. }
  293. void AddTest_3 ()
  294. {
  295. Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a + b;
  296. AssertNodeType (e3, ExpressionType.Add);
  297. Assert (10, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
  298. }
  299. void AddTest_4 ()
  300. {
  301. Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a + b;
  302. AssertNodeType (e4, ExpressionType.Add);
  303. Assert (new MyType (10), e4.Compile ().Invoke (new MyType (-20), new MyType (30)));
  304. Assert (null, e4.Compile ().Invoke (null, new MyType (30)));
  305. }
  306. void AddTest_5 ()
  307. {
  308. Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a + b;
  309. AssertNodeType (e5, ExpressionType.Add);
  310. Assert (31, e5.Compile ().Invoke (1, new MyType (30)));
  311. }
  312. void AddTest_6 ()
  313. {
  314. Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a + b;
  315. AssertNodeType (e6, ExpressionType.Add);
  316. Assert (-1, e6.Compile ().Invoke (-31, new MyType (30)));
  317. }
  318. void AddTest_7 ()
  319. {
  320. Expression<Func<MyEnum, byte, MyEnum>> e7 = (a, b) => a + b;
  321. AssertNodeType (e7, ExpressionType.Convert);
  322. Assert (MyEnum.Value_2, e7.Compile ().Invoke (MyEnum.Value_1, 1));
  323. }
  324. void AddTest_8 ()
  325. {
  326. // CSC BUG: probably due to missing numeric promotion
  327. Expression<Func<MyEnum?, byte?, MyEnum?>> e8 = (a, b) => a + b;
  328. AssertNodeType (e8, ExpressionType.Convert);
  329. Assert<MyEnum?> (0, e8.Compile ().Invoke (MyEnum.Value_1, 255));
  330. Assert (null, e8.Compile ().Invoke (MyEnum.Value_1, null));
  331. Assert (null, e8.Compile ().Invoke (null, null));
  332. }
  333. void AddTest_9 ()
  334. {
  335. Expression<Func<byte, MyEnum, MyEnum>> e9 = (a, b) => a + b;
  336. AssertNodeType (e9, ExpressionType.Convert);
  337. Assert (MyEnum.Value_2, e9.Compile ().Invoke (1, MyEnum.Value_1));
  338. }
  339. void AddCheckedTest ()
  340. {
  341. checked {
  342. Expression<Func<int, int, int>> e = (int a, int b) => a + b;
  343. AssertNodeType (e, ExpressionType.AddChecked);
  344. Assert (50, e.Compile ().Invoke (20, 30));
  345. }
  346. }
  347. void AddCheckedTest_2 ()
  348. {
  349. checked {
  350. Expression<Func<int?, int?, int?>> e2 = (a, b) => a + b;
  351. AssertNodeType (e2, ExpressionType.AddChecked);
  352. Assert (null, e2.Compile ().Invoke (null, 3));
  353. }
  354. }
  355. void AddCheckedTest_3 ()
  356. {
  357. checked {
  358. Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a + b;
  359. AssertNodeType (e3, ExpressionType.Add);
  360. Assert (10, e3.Compile ().Invoke (new MyType (-20), new MyType (30)));
  361. }
  362. }
  363. void AddStringTest ()
  364. {
  365. Expression<Func<string, string>> e6 = (a) => 1 + a;
  366. AssertNodeType (e6, ExpressionType.Add);
  367. Assert ("1to", e6.Compile ().Invoke ("to"));
  368. }
  369. void AddStringTest_2 ()
  370. {
  371. Expression<Func<object, string, string>> e7 = (object a, string b) => a + b;
  372. AssertNodeType (e7, ExpressionType.Add);
  373. Assert ("testme", e7.Compile ().Invoke ("test", "me"));
  374. Assert ("test", e7.Compile ().Invoke ("test", null));
  375. Assert ("", e7.Compile ().Invoke (null, null));
  376. }
  377. void AddStringTest_3 ()
  378. {
  379. Expression<Func<string, int, string>> e8 = (a, b) => a + " " + "-" + "> " + b;
  380. AssertNodeType (e8, ExpressionType.Add);
  381. Assert ("test -> 2", e8.Compile ().Invoke ("test", 2));
  382. }
  383. void AddStringTest_4 ()
  384. {
  385. Expression<Func<string, ushort?, string>> e9 = (a, b) => a + b;
  386. AssertNodeType (e9, ExpressionType.Add);
  387. Assert ("test2", e9.Compile ().Invoke ("test", 2));
  388. Assert ("test", e9.Compile ().Invoke ("test", null));
  389. }
  390. void AndTest ()
  391. {
  392. Expression<Func<bool, bool, bool>> e = (bool a, bool b) => a & b;
  393. AssertNodeType (e, ExpressionType.And);
  394. Func<bool, bool, bool> c = e.Compile ();
  395. Assert (true, c (true, true));
  396. Assert (false, c (true, false));
  397. Assert (false, c (false, true));
  398. Assert (false, c (false, false));
  399. }
  400. void AndTest_2 ()
  401. {
  402. Expression<Func<MyType, MyType, MyType>> e2 = (MyType a, MyType b) => a & b;
  403. AssertNodeType (e2, ExpressionType.And);
  404. var c2 = e2.Compile ();
  405. Assert (new MyType (0), c2 (new MyType (0), new MyType (1)));
  406. Assert (new MyType (1), c2 (new MyType (0xFF), new MyType (0x01)));
  407. }
  408. void AndTest_3 ()
  409. {
  410. Expression<Func<MyEnum, MyEnum, MyEnum>> e3 = (a, b) => a & b;
  411. AssertNodeType (e3, ExpressionType.Convert);
  412. Assert<MyEnum> (0, e3.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
  413. Assert (MyEnum.Value_2, e3.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  414. }
  415. void AndTest_4 ()
  416. {
  417. Expression<Func<int, int>> e = (a) => a & 0;
  418. AssertNodeType (e, ExpressionType.And);
  419. var c = e.Compile ();
  420. Assert (0, c (1));
  421. }
  422. void AndNullableTest ()
  423. {
  424. Expression<Func<bool?, bool?, bool?>> e = (bool? a, bool? b) => a & b;
  425. AssertNodeType (e, ExpressionType.And);
  426. Func<bool?, bool?, bool?> c = e.Compile ();
  427. Assert (true, c (true, true));
  428. Assert (false, c (true, false));
  429. Assert (false, c (false, true));
  430. Assert (false, c (false, false));
  431. Assert (null, c (true, null));
  432. Assert (false, c (false, null));
  433. Assert (false, c (null, false));
  434. Assert (null, c (true, null));
  435. Assert (null, c (null, null));
  436. }
  437. void AndNullableTest_2 ()
  438. {
  439. Expression<Func<MyType?, MyType?, MyType?>> e2 = (MyType? a, MyType? b) => a & b;
  440. AssertNodeType (e2, ExpressionType.And);
  441. var c2 = e2.Compile ();
  442. Assert (new MyType (0), c2 (new MyType (0), new MyType (1)));
  443. Assert (new MyType (1), c2 (new MyType (0xFF), new MyType (0x01)));
  444. Assert (null, c2 (new MyType (0xFF), null));
  445. }
  446. void AndNullableTest_3 ()
  447. {
  448. Expression<Func<MyEnum?, MyEnum?, MyEnum?>> e3 = (a, b) => a & b;
  449. AssertNodeType (e3, ExpressionType.Convert);
  450. Assert (null, e3.Compile ().Invoke (null, MyEnum.Value_2));
  451. Assert (MyEnum.Value_2, e3.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  452. }
  453. void AndAlsoTest ()
  454. {
  455. Expression<Func<bool, bool, bool>> e = (bool a, bool b) => a && b;
  456. AssertNodeType (e, ExpressionType.AndAlso);
  457. Assert (false, e.Compile ().Invoke (true, false));
  458. }
  459. void AndAlsoTest_2 ()
  460. {
  461. Expression<Func<MyType, MyType, MyType>> e2 = (MyType a, MyType b) => a && b;
  462. AssertNodeType (e2, ExpressionType.AndAlso);
  463. Assert (new MyType (64), e2.Compile ().Invoke (new MyType (64), new MyType (64)));
  464. Assert (new MyType (0), e2.Compile ().Invoke (new MyType (32), new MyType (64)));
  465. }
  466. void AndAlsoTest_3 ()
  467. {
  468. Expression<Func<bool, bool>> e3 = (bool a) => a && true;
  469. AssertNodeType (e3, ExpressionType.AndAlso);
  470. Assert (false, e3.Compile ().Invoke (false));
  471. Assert (true, e3.Compile ().Invoke (true));
  472. }
  473. void ArrayIndexTest ()
  474. {
  475. Expression<Func<string [], long, string>> e = (string [] a, long i) => a [i];
  476. AssertNodeType (e, ExpressionType.ArrayIndex);
  477. Assert ("b", e.Compile ().Invoke (new string [] { "a", "b", "c" }, 1));
  478. }
  479. void ArrayIndexTest_2 ()
  480. {
  481. Expression<Func<string [], string>> e2 = (string [] a) => a [0];
  482. AssertNodeType (e2, ExpressionType.ArrayIndex);
  483. Assert ("a", e2.Compile ().Invoke (new string [] { "a", "b" }));
  484. }
  485. void ArrayIndexTest_3 ()
  486. {
  487. Expression<Func<object [,], int, int, object>> e3 = (object [,] a, int i, int j) => a [i, j];
  488. AssertNodeType (e3, ExpressionType.Call);
  489. Assert ("z", e3.Compile ().Invoke (
  490. new object [,] { { 1, 2 }, { "x", "z" } }, 1, 1));
  491. }
  492. void ArrayIndexTest_4 ()
  493. {
  494. Expression<Func<decimal [] [], byte, decimal>> e4 = (decimal [] [] a, byte b) => a [b] [1];
  495. AssertNodeType (e4, ExpressionType.ArrayIndex);
  496. decimal [] [] array = { new decimal [] { 1, 9 }, new decimal [] { 10, 90 } };
  497. Assert (90, e4.Compile ().Invoke (array, 1));
  498. }
  499. void ArrayIndexTest_5 ()
  500. {
  501. Expression<Func<int>> e5 = () => (new int [1]) [0];
  502. AssertNodeType (e5, ExpressionType.ArrayIndex);
  503. Assert (0, e5.Compile ().Invoke ());
  504. }
  505. void ArrayIndexTest_6 ()
  506. {
  507. const ulong max = 3;
  508. Expression<Func<int[], int>> e = a => a [max];
  509. AssertNodeType (e, ExpressionType.ArrayIndex);
  510. Assert (4, e.Compile ().Invoke (new int [] { 1, 2, 3, 4, 5 }));
  511. }
  512. void ArrayIndexTest_7 ()
  513. {
  514. const ulong max = uint.MaxValue;
  515. Expression<Func<int[], int>> e = a => a [max];
  516. AssertNodeType (e, ExpressionType.ArrayIndex);
  517. try {
  518. e.Compile ().Invoke (new int [0]);
  519. throw new ApplicationException ("ArrayIndexTest_7");
  520. } catch (System.OverflowException) {
  521. // Check whether CheckedConversion was generated
  522. }
  523. }
  524. void ArrayLengthTest ()
  525. {
  526. Expression<Func<double [], int>> e = (double [] a) => a.Length;
  527. AssertNodeType (e, ExpressionType.ArrayLength);
  528. Assert (0, e.Compile ().Invoke (new double [0]));
  529. Assert (9, e.Compile ().Invoke (new double [9]));
  530. }
  531. void ArrayLengthTest_2 ()
  532. {
  533. Expression<Func<string [,], int>> e2 = (string [,] a) => a.Length;
  534. AssertNodeType (e2, ExpressionType.MemberAccess);
  535. Assert (0, e2.Compile ().Invoke (new string [0, 0]));
  536. }
  537. void CallTest ()
  538. {
  539. Expression<Func<int, int>> e = (int a) => Math.Max (a, 5);
  540. AssertNodeType (e, ExpressionType.Call);
  541. Assert (5, e.Compile ().Invoke (2));
  542. Assert (9, e.Compile ().Invoke (9));
  543. }
  544. void CallTest_2 ()
  545. {
  546. Expression<Func<string, string>> e2 = (string a) => InstanceMethod (a);
  547. AssertNodeType (e2, ExpressionType.Call);
  548. Assert ("abc", e2.Compile ().Invoke ("abc"));
  549. }
  550. void CallTest_3 ()
  551. {
  552. Expression<Func<int, string, int, object>> e3 = (int index, string a, int b) => InstanceParamsMethod (index, a, b);
  553. AssertNodeType (e3, ExpressionType.Call);
  554. Assert<object> (4, e3.Compile ().Invoke (1, "a", 4));
  555. }
  556. void CallTest_4 ()
  557. {
  558. Expression<Func<object>> e4 = () => InstanceParamsMethod (0);
  559. AssertNodeType (e4, ExpressionType.Call);
  560. Assert<object> ("<empty>", e4.Compile ().Invoke ());
  561. }
  562. void CallTest_5 ()
  563. {
  564. Expression<Func<int, int>> e5 = (int a) => GenericMethod (a);
  565. AssertNodeType (e5, ExpressionType.Call);
  566. Assert (5, e5.Compile ().Invoke (5));
  567. }
  568. void CallTest_6 ()
  569. {
  570. Expression<Action> e6 = () => Console.WriteLine ("call test");
  571. AssertNodeType (e6, ExpressionType.Call);
  572. }
  573. void CallTest_7 ()
  574. {
  575. Expression<Func<Indexer, int, int>> e7 = (a, b) => a [b];
  576. AssertNodeType (e7, ExpressionType.Call);
  577. Assert (3, e7.Compile ().Invoke (new Indexer (), 3));
  578. }
  579. void CallTest_8 ()
  580. {
  581. Expression<Func<Indexer, string, string, string, string>> e8 = (a, b, c , d) => a [b, c, d];
  582. AssertNodeType (e8, ExpressionType.Call);
  583. Assert ("zyb", e8.Compile ().Invoke (new Indexer (), "z", "y", "b"));
  584. }
  585. void CallTest_9 ()
  586. {
  587. Expression<Action<int>> e9 = (a) => RefMethod (ref a);
  588. AssertNodeType (e9, ExpressionType.Call);
  589. e9.Compile ().Invoke (1);
  590. }
  591. void CoalesceTest ()
  592. {
  593. Expression<Func<uint?, uint>> e = (uint? a) => a ?? 99;
  594. AssertNodeType (e, ExpressionType.Coalesce);
  595. var r = e.Compile ();
  596. Assert ((uint) 5, r.Invoke (5));
  597. Assert ((uint) 99, r.Invoke (null));
  598. }
  599. void CoalesceTest_2 ()
  600. {
  601. Expression<Func<MyType?, int>> e2 = (MyType? a) => a ?? -3;
  602. AssertNodeType (e2, ExpressionType.Coalesce);
  603. var r2 = e2.Compile ();
  604. Assert (2, r2.Invoke (new MyType (2)));
  605. Assert (-3, r2.Invoke (null));
  606. }
  607. void ConditionTest ()
  608. {
  609. Expression<Func<bool, byte, int, int>> e = (bool a, byte b, int c) => (a ? b : c);
  610. AssertNodeType (e, ExpressionType.Conditional);
  611. var r = e.Compile ();
  612. Assert (3, r.Invoke (true, 3, 999999));
  613. Assert (999999, r.Invoke (false, 3, 999999));
  614. }
  615. void ConditionTest_2 ()
  616. {
  617. Expression<Func<int, decimal, decimal?>> e2 = (int a, decimal d) => (a > 0 ? d : a < 0 ? -d : (decimal?) null);
  618. AssertNodeType (e2, ExpressionType.Conditional);
  619. var r2 = e2.Compile ();
  620. Assert (null, r2.Invoke (0, 10));
  621. Assert (50, r2.Invoke (1, 50));
  622. Assert (30, r2.Invoke (-7, -30));
  623. }
  624. void ConditionTest_3 ()
  625. {
  626. Expression<Func<bool?, int?>> e3 = (bool? a) => ((bool) a ? 3 : -2);
  627. AssertNodeType (e3, ExpressionType.Convert);
  628. var r3 = e3.Compile ();
  629. Assert (3, r3.Invoke (true));
  630. Assert (-2, r3.Invoke (false));
  631. }
  632. void ConditionTest_4 ()
  633. {
  634. Expression<Func<InverseLogicalOperator, byte, byte, byte>> e4 = (InverseLogicalOperator a, byte b, byte c) => (a ? b : c);
  635. AssertNodeType (e4, ExpressionType.Conditional);
  636. var r4 = e4.Compile ();
  637. Assert (3, r4.Invoke (new InverseLogicalOperator (true), 3, 4));
  638. Assert (4, r4.Invoke (new InverseLogicalOperator (false), 3, 4));
  639. }
  640. void ConditionTest_5 ()
  641. {
  642. // CSC bug ?
  643. Expression<Func<int>> e = () => false ? 1 : 4;
  644. AssertNodeType (e, ExpressionType.Conditional);
  645. var r = e.Compile ();
  646. Assert (4, r.Invoke ());
  647. }
  648. void ConstantTest ()
  649. {
  650. Expression<Func<int>> e1 = () => default (int);
  651. AssertNodeType (e1, ExpressionType.Constant);
  652. Assert (0, e1.Compile ().Invoke ());
  653. }
  654. void ConstantTest_2 ()
  655. {
  656. Expression<Func<int?>> e2 = () => default (int?);
  657. AssertNodeType (e2, ExpressionType.Constant);
  658. Assert (null, e2.Compile ().Invoke ());
  659. }
  660. void ConstantTest_3 ()
  661. {
  662. Expression<Func<Tester>> e3 = () => default (Tester);
  663. AssertNodeType (e3, ExpressionType.Constant);
  664. Assert (null, e3.Compile ().Invoke ());
  665. }
  666. void ConstantTest_4 ()
  667. {
  668. Expression<Func<object>> e4 = () => null;
  669. AssertNodeType (e4, ExpressionType.Constant);
  670. Assert (null, e4.Compile ().Invoke ());
  671. }
  672. void ConstantTest_5 ()
  673. {
  674. Expression<Func<int>> e5 = () => 8 / 4;
  675. AssertNodeType (e5, ExpressionType.Constant);
  676. Assert (2, e5.Compile ().Invoke ());
  677. }
  678. void ConstantTest_6 ()
  679. {
  680. Expression<Func<int>> e6 = () => 0xFFFFFF >> 0x40;
  681. AssertNodeType (e6, ExpressionType.Constant);
  682. Assert (0xFFFFFF, e6.Compile ().Invoke ());
  683. }
  684. void ConstantTest_7 ()
  685. {
  686. Expression<Func<object>> e7 = () => "Alleluia";
  687. AssertNodeType (e7, ExpressionType.Constant);
  688. Assert ("Alleluia", e7.Compile ().Invoke ());
  689. }
  690. void ConstantTest_8 ()
  691. {
  692. Expression<Func<Type>> e8 = () => typeof (int);
  693. AssertNodeType (e8, ExpressionType.Constant);
  694. Assert (typeof (int), e8.Compile ().Invoke ());
  695. }
  696. void ConstantTest_9 ()
  697. {
  698. Expression<Func<Type>> e9 = () => typeof (void);
  699. AssertNodeType (e9, ExpressionType.Constant);
  700. Assert (typeof (void), e9.Compile ().Invoke ());
  701. }
  702. void ConstantTest_10 ()
  703. {
  704. Expression<Func<Type>> e10 = () => typeof (Func<,>);
  705. AssertNodeType (e10, ExpressionType.Constant);
  706. Assert (typeof (Func<,>), e10.Compile ().Invoke ());
  707. }
  708. void ConstantTest_11 ()
  709. {
  710. Expression<Func<MyEnum>> e11 = () => MyEnum.Value_2;
  711. AssertNodeType (e11, ExpressionType.Constant);
  712. Assert (MyEnum.Value_2, e11.Compile ().Invoke ());
  713. }
  714. void ConstantTest_13 ()
  715. {
  716. Expression<Func<int>> e13 = () => sizeof (byte);
  717. AssertNodeType (e13, ExpressionType.Constant);
  718. Assert (1, e13.Compile ().Invoke ());
  719. }
  720. void ConstantTest_14 ()
  721. {
  722. Expression<Func<Type>> e14 = () => typeof (bool*);
  723. AssertNodeType (e14, ExpressionType.Constant);
  724. Assert (typeof (bool*), e14.Compile ().Invoke ());
  725. }
  726. void ConstantTest_15 ()
  727. {
  728. Expression<Func<int?>> e15 = () => null;
  729. AssertNodeType (e15, ExpressionType.Constant);
  730. Assert (null, e15.Compile ().Invoke ());
  731. }
  732. void ConvertTest ()
  733. {
  734. Expression<Func<int, byte>> e = (int a) => ((byte) a);
  735. AssertNodeType (e, ExpressionType.Convert);
  736. Assert (100, e.Compile ().Invoke (100));
  737. }
  738. void ConvertTest_2 ()
  739. {
  740. Expression<Func<long, ushort>> e2 = (long a) => ((ushort) a);
  741. AssertNodeType (e2, ExpressionType.Convert);
  742. Assert (100, e2.Compile ().Invoke (100));
  743. }
  744. void ConvertTest_3 ()
  745. {
  746. Expression<Func<float?, float>> e3 = (float? a) => ((float) a);
  747. AssertNodeType (e3, ExpressionType.Convert);
  748. Assert (-0.456f, e3.Compile ().Invoke (-0.456f));
  749. }
  750. void ConvertTest_4 ()
  751. {
  752. Expression<Func<MyType, int>> e4 = (MyType a) => (a);
  753. AssertNodeType (e4, ExpressionType.Convert);
  754. Assert (-9, e4.Compile ().Invoke (new MyType (-9)));
  755. }
  756. void ConvertTest_5 ()
  757. {
  758. Expression<Func<MyType, MyType, bool?>> e5 = (MyType a, MyType b) => a == b;
  759. AssertNodeType (e5, ExpressionType.Convert);
  760. }
  761. void ConvertTest_6 ()
  762. {
  763. Expression<Func<MyType?, MyType?, bool?>> e6 = (MyType? a, MyType? b) => a == b;
  764. AssertNodeType (e6, ExpressionType.Convert);
  765. Assert (false, e6.Compile ().Invoke (null, new MyType (-20)));
  766. Assert (true, e6.Compile ().Invoke (null, null));
  767. Assert (true, e6.Compile ().Invoke (new MyType (120), new MyType (120)));
  768. }
  769. void ConvertTest_7 ()
  770. {
  771. Expression<Func<MyTypeExplicit, int?>> e7 = x => (int?)x;
  772. AssertNodeType (e7, ExpressionType.Convert);
  773. Assert (33, e7.Compile ().Invoke (new MyTypeExplicit (33)));
  774. }
  775. void ConvertTest_8 ()
  776. {
  777. Expression<Func<int?, object>> e8 = x => (object)x;
  778. AssertNodeType (e8, ExpressionType.Convert);
  779. Assert (null, e8.Compile ().Invoke (null));
  780. Assert (-100, e8.Compile ().Invoke (-100));
  781. }
  782. unsafe void ConvertTest_9 ()
  783. {
  784. int*[] p = new int* [1];
  785. Expression<Func<object>> e9 = () => (object)p;
  786. AssertNodeType (e9, ExpressionType.Convert);
  787. Assert (p, e9.Compile ().Invoke ());
  788. }
  789. void ConvertTest_10 ()
  790. {
  791. Expression<Func<Func<int>, Delegate>> e10 = (a) => a + a;
  792. AssertNodeType (e10, ExpressionType.Convert);
  793. Assert (null, e10.Compile ().Invoke (null));
  794. Assert (new Func<int> (TestInt) + new Func<int> (TestInt), e10.Compile ().Invoke (TestInt));
  795. }
  796. void ConvertTest_11 ()
  797. {
  798. Expression<Func<Func<int>, Delegate>> e11 = (a) => a - a;
  799. AssertNodeType (e11, ExpressionType.Convert);
  800. Assert (null, e11.Compile ().Invoke (null));
  801. }
  802. void ConvertTest_12 ()
  803. {
  804. Expression<Func<Func<int>>> e12 = () => TestInt;
  805. AssertNodeType (e12, ExpressionType.Convert);
  806. Assert (29, e12.Compile ().Invoke () ());
  807. }
  808. void ConvertTest_13 ()
  809. {
  810. Expression<Func<decimal, sbyte>> e13 = a => (sbyte)a;
  811. AssertNodeType (e13, ExpressionType.Convert);
  812. Assert (6, e13.Compile ().Invoke (6));
  813. }
  814. void ConvertTest_14 ()
  815. {
  816. Expression<Func<long, decimal>> e14 = a => a;
  817. AssertNodeType (e14, ExpressionType.Convert);
  818. Assert (-66, e14.Compile ().Invoke (-66));
  819. }
  820. void ConvertTest_15 ()
  821. {
  822. Expression<Func<ulong?, decimal?>> e15 = a => a;
  823. AssertNodeType (e15, ExpressionType.Convert);
  824. Assert (null, e15.Compile ().Invoke (null));
  825. Assert (9, e15.Compile ().Invoke (9));
  826. }
  827. void ConvertTest_16 ()
  828. {
  829. Expression<Func<sbyte, sbyte>> e16 = a => (sbyte)a;
  830. AssertNodeType (e16, ExpressionType.Convert);
  831. Assert (6, e16.Compile ().Invoke (6));
  832. }
  833. void ConvertCheckedTest ()
  834. {
  835. Expression<Func<int, byte>> e = (int a) => checked((byte) a);
  836. AssertNodeType (e, ExpressionType.ConvertChecked);
  837. Assert (100, e.Compile ().Invoke (100));
  838. }
  839. void ConvertCheckedTest_2 ()
  840. {
  841. checked {
  842. Expression<Func<long, ushort>> e2 = (long a) => unchecked((ushort) a);
  843. AssertNodeType (e2, ExpressionType.Convert);
  844. Assert (100, e2.Compile ().Invoke (100));
  845. }
  846. }
  847. void ConvertCheckedTest_3 ()
  848. {
  849. checked {
  850. Expression<Func<float?, float>> e3 = (float? a) => ((float) a);
  851. AssertNodeType (e3, ExpressionType.ConvertChecked);
  852. Assert (-0.456f, e3.Compile ().Invoke (-0.456f));
  853. }
  854. }
  855. void ConvertCheckedTest_4 ()
  856. {
  857. checked {
  858. Expression<Func<MyType, int>> e4 = (MyType a) => (a);
  859. AssertNodeType (e4, ExpressionType.Convert);
  860. Assert (-9, e4.Compile ().Invoke (new MyType (-9)));
  861. }
  862. }
  863. void DivideTest ()
  864. {
  865. Expression<Func<int, int, int>> e = (int a, int b) => a / b;
  866. AssertNodeType (e, ExpressionType.Divide);
  867. Assert (2, e.Compile ().Invoke (60, 30));
  868. }
  869. void DivideTest_2 ()
  870. {
  871. Expression<Func<double?, double?, double?>> e2 = (a, b) => a / b;
  872. AssertNodeType (e2, ExpressionType.Divide);
  873. Assert (null, e2.Compile ().Invoke (null, 3));
  874. Assert (1.5, e2.Compile ().Invoke (3, 2));
  875. }
  876. void DivideTest_3 ()
  877. {
  878. Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a / b;
  879. AssertNodeType (e3, ExpressionType.Divide);
  880. Assert (1, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  881. }
  882. void DivideTest_4 ()
  883. {
  884. Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a / b;
  885. AssertNodeType (e4, ExpressionType.Divide);
  886. Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
  887. Assert (new MyType (-6), e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
  888. }
  889. void DivideTest_5 ()
  890. {
  891. Expression<Func<int, MyType, int>> e5 = (int a, MyType b) => a / b;
  892. AssertNodeType (e5, ExpressionType.Divide);
  893. Assert (50, e5.Compile ().Invoke (100, new MyType (2)));
  894. }
  895. void DivideTest_6 ()
  896. {
  897. Expression<Func<int, MyType?, int?>> e6 = (int a, MyType? b) => a / b;
  898. AssertNodeType (e6, ExpressionType.Divide);
  899. Assert (50, e6.Compile ().Invoke (100, new MyType (2)));
  900. Assert (null, e6.Compile ().Invoke (20, null));
  901. }
  902. void DivideTest_7 ()
  903. {
  904. Expression<Func<float, uint?, float?>> e = (a, b) => a / b;
  905. AssertNodeType (e, ExpressionType.Divide);
  906. Assert (50, e.Compile () (100, 2));
  907. Assert (null, e.Compile () (20, null));
  908. }
  909. void EqualTest ()
  910. {
  911. Expression<Func<int, int, bool>> e = (int a, int b) => a == b;
  912. AssertNodeType (e, ExpressionType.Equal);
  913. Assert (false, e.Compile ().Invoke (60, 30));
  914. Assert (true, e.Compile ().Invoke (-1, -1));
  915. }
  916. void EqualTest_2 ()
  917. {
  918. Expression<Func<double?, double?, bool>> e2 = (a, b) => a == b;
  919. AssertNodeType (e2, ExpressionType.Equal);
  920. Assert (true, e2.Compile ().Invoke (3, 3));
  921. Assert (false, e2.Compile ().Invoke (3, 2));
  922. }
  923. void EqualTest_3 ()
  924. {
  925. Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a == b;
  926. AssertNodeType (e3, ExpressionType.Equal);
  927. Assert (true, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  928. }
  929. void EqualTest_4 ()
  930. {
  931. Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a == b;
  932. AssertNodeType (e4, ExpressionType.Equal);
  933. Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
  934. Assert (true, e4.Compile ().Invoke (null, null));
  935. Assert (true, e4.Compile ().Invoke (new MyType (120), new MyType (120)));
  936. }
  937. void EqualTest_5 ()
  938. {
  939. Expression<Func<bool?, bool?, bool>> e5 = (bool? a, bool? b) => a == b;
  940. AssertNodeType (e5, ExpressionType.Equal);
  941. Assert (false, e5.Compile ().Invoke (true, null));
  942. Assert (true, e5.Compile ().Invoke (null, null));
  943. Assert (true, e5.Compile ().Invoke (false, false));
  944. }
  945. void EqualTest_6 ()
  946. {
  947. Expression<Func<bool, bool>> e6 = (bool a) => a == null;
  948. AssertNodeType (e6, ExpressionType.Equal);
  949. Assert (false, e6.Compile ().Invoke (true));
  950. Assert (false, e6.Compile ().Invoke (false));
  951. }
  952. void EqualTest_7 ()
  953. {
  954. Expression<Func<string, string, bool>> e7 = (string a, string b) => a == b;
  955. AssertNodeType (e7, ExpressionType.Equal);
  956. Assert (true, e7.Compile ().Invoke (null, null));
  957. Assert (false, e7.Compile ().Invoke ("a", "A"));
  958. Assert (true, e7.Compile ().Invoke ("a", "a"));
  959. }
  960. void EqualTest_8 ()
  961. {
  962. Expression<Func<object, bool>> e8 = (object a) => null == a;
  963. AssertNodeType (e8, ExpressionType.Equal);
  964. Assert (true, e8.Compile ().Invoke (null));
  965. Assert (false, e8.Compile ().Invoke ("a"));
  966. Assert (false, e8.Compile ().Invoke (this));
  967. }
  968. void EqualTest_9 ()
  969. {
  970. Expression<Func<MyEnum, MyEnum, bool>> e9 = (a, b) => a == b;
  971. AssertNodeType (e9, ExpressionType.Equal);
  972. Assert (false, e9.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
  973. Assert (true, e9.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  974. }
  975. void EqualTest_10 ()
  976. {
  977. Expression<Func<MyEnum?, MyEnum?, bool>> e10 = (a, b) => a == b;
  978. AssertNodeType (e10, ExpressionType.Equal);
  979. Assert (false, e10.Compile ().Invoke (MyEnum.Value_1, null));
  980. Assert (true, e10.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  981. }
  982. void EqualTest_11 ()
  983. {
  984. Expression<Func<MyEnum?, bool>> e11 = (a) => a == null;
  985. AssertNodeType (e11, ExpressionType.Equal);
  986. Assert (false, e11.Compile ().Invoke (MyEnum.Value_1));
  987. Assert (true, e11.Compile ().Invoke (null));
  988. }
  989. void EqualTest_12 ()
  990. {
  991. Expression<Func<MyEnumUlong, bool>> e12 = (a) => a == 0;
  992. AssertNodeType (e12, ExpressionType.Equal);
  993. Assert (false, e12.Compile ().Invoke (MyEnumUlong.Value_1));
  994. Assert (true, e12.Compile ().Invoke (0));
  995. }
  996. void EqualTest_13 ()
  997. {
  998. Expression<Func<MyEnum, bool>> e13 = (a) => a == MyEnum.Value_2;
  999. AssertNodeType (e13, ExpressionType.Equal);
  1000. Assert (true, e13.Compile ().Invoke (MyEnum.Value_2));
  1001. Assert (false, e13.Compile ().Invoke (0));
  1002. }
  1003. void EqualTest_14 ()
  1004. {
  1005. Expression<Func<MyEnum, bool>> e = (a) => a == null;
  1006. AssertNodeType (e, ExpressionType.Equal);
  1007. Assert (false, e.Compile ().Invoke (MyEnum.Value_1));
  1008. }
  1009. void EqualTest_15 ()
  1010. {
  1011. Expression<Func<int?, uint, bool>> e = (a, b) => a == b;
  1012. AssertNodeType (e, ExpressionType.Equal);
  1013. Assert (false, e.Compile ().Invoke (null, 0));
  1014. Assert (true, e.Compile ().Invoke (4, 4));
  1015. }
  1016. void EqualTestDelegate ()
  1017. {
  1018. Expression<Func<Delegate, Delegate, bool>> e1 = (a, b) => a == b;
  1019. AssertNodeType (e1, ExpressionType.Equal);
  1020. Assert (true, e1.Compile ().Invoke (null, null));
  1021. }
  1022. void EqualTestDelegate_2 ()
  1023. {
  1024. EmptyDelegate ed = delegate () {};
  1025. Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
  1026. AssertNodeType (e2, ExpressionType.Equal);
  1027. Assert (false, e2.Compile ().Invoke (delegate () {}, null));
  1028. Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
  1029. Assert (false, e2.Compile ().Invoke (ed, delegate {}));
  1030. Assert (true, e2.Compile ().Invoke (ed, ed));
  1031. }
  1032. void EqualTestDelegate_3 ()
  1033. {
  1034. Expression<Func<Func<int>, bool>> e1 = (a) => a == ReturnNumber;
  1035. AssertNodeType (e1, ExpressionType.Equal);
  1036. Assert (false, e1.Compile ().Invoke (null));
  1037. Assert (true, e1.Compile ().Invoke (ReturnNumber));
  1038. }
  1039. void ExclusiveOrTest ()
  1040. {
  1041. Expression<Func<int, short, int>> e = (int a, short b) => a ^ b;
  1042. AssertNodeType (e, ExpressionType.ExclusiveOr);
  1043. Assert (34, e.Compile ().Invoke (60, 30));
  1044. }
  1045. void ExclusiveOrTest_2 ()
  1046. {
  1047. Expression<Func<byte?, byte?, int?>> e2 = (a, b) => a ^ b;
  1048. AssertNodeType (e2, ExpressionType.ExclusiveOr);
  1049. Assert (null, e2.Compile ().Invoke (null, 3));
  1050. Assert (1, e2.Compile ().Invoke (3, 2));
  1051. }
  1052. void ExclusiveOrTest_3 ()
  1053. {
  1054. Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a ^ b;
  1055. AssertNodeType (e3, ExpressionType.ExclusiveOr);
  1056. Assert (0, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  1057. }
  1058. void ExclusiveOrTest_4 ()
  1059. {
  1060. Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a ^ b;
  1061. AssertNodeType (e4, ExpressionType.ExclusiveOr);
  1062. Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
  1063. Assert (new MyType (-108), e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
  1064. }
  1065. void ExclusiveOrTest_5 ()
  1066. {
  1067. Expression<Func<MyType?, byte, int?>> e5 = (MyType? a, byte b) => a ^ b;
  1068. AssertNodeType (e5, ExpressionType.ExclusiveOr);
  1069. Assert (null, e5.Compile ().Invoke (null, 64));
  1070. Assert (96, e5.Compile ().Invoke (new MyType (64), 32));
  1071. }
  1072. void ExclusiveOrTest_6 ()
  1073. {
  1074. Expression<Func<MyEnum, MyEnum, MyEnum>> e6 = (a, b) => a ^ b;
  1075. AssertNodeType (e6, ExpressionType.Convert);
  1076. Assert ((MyEnum)3, e6.Compile ().Invoke (MyEnum.Value_1, MyEnum.Value_2));
  1077. Assert<MyEnum> (0, e6.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1078. }
  1079. void ExclusiveOrTest_7 ()
  1080. {
  1081. Expression<Func<MyEnum?, MyEnum?, MyEnum?>> e7 = (a, b) => a ^ b;
  1082. AssertNodeType (e7, ExpressionType.Convert);
  1083. Assert (null, e7.Compile ().Invoke (MyEnum.Value_1, null));
  1084. Assert<MyEnum?> (0, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1085. }
  1086. void ExclusiveOrTest_8 ()
  1087. {
  1088. Expression<Func<MyEnum?, MyEnum?>> e8 = (a) => a ^ null;
  1089. AssertNodeType (e8, ExpressionType.Convert);
  1090. Assert (null, e8.Compile ().Invoke (MyEnum.Value_1));
  1091. Assert (null, e8.Compile ().Invoke (null));
  1092. }
  1093. void GreaterThanTest ()
  1094. {
  1095. Expression<Func<int, int, bool>> e = (int a, int b) => a > b;
  1096. AssertNodeType (e, ExpressionType.GreaterThan);
  1097. Assert (true, e.Compile ().Invoke (60, 30));
  1098. }
  1099. void GreaterThanTest_2 ()
  1100. {
  1101. Expression<Func<uint?, byte?, bool>> e2 = (a, b) => a > b;
  1102. AssertNodeType (e2, ExpressionType.GreaterThan);
  1103. Assert (false, e2.Compile ().Invoke (null, 3));
  1104. Assert (false, e2.Compile ().Invoke (2, 2));
  1105. }
  1106. void GreaterThanTest_3 ()
  1107. {
  1108. Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a > b;
  1109. AssertNodeType (e3, ExpressionType.GreaterThan);
  1110. Assert (false, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  1111. }
  1112. void GreaterThanTest_4 ()
  1113. {
  1114. Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a > b;
  1115. AssertNodeType (e4, ExpressionType.GreaterThan);
  1116. Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
  1117. Assert (false, e4.Compile ().Invoke (null, null));
  1118. Assert (true, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
  1119. }
  1120. void GreaterThanTest_5 ()
  1121. {
  1122. Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a > b;
  1123. AssertNodeType (e5, ExpressionType.GreaterThan);
  1124. Assert (false, e5.Compile ().Invoke (null, 33));
  1125. Assert (false, e5.Compile ().Invoke (null, 0));
  1126. Assert (true, e5.Compile ().Invoke (new MyType (120), 3));
  1127. }
  1128. void GreaterThanTest_6 ()
  1129. {
  1130. Expression<Func<ushort, bool>> e6 = (ushort a) => a > null;
  1131. AssertNodeType (e6, ExpressionType.GreaterThan);
  1132. Assert (false, e6.Compile ().Invoke (60));
  1133. }
  1134. void GreaterThanTest_7 ()
  1135. {
  1136. Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a > b;
  1137. AssertNodeType (e7, ExpressionType.GreaterThan);
  1138. Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
  1139. Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1140. }
  1141. void GreaterThanTest_8 ()
  1142. {
  1143. Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a > b;
  1144. AssertNodeType (e8, ExpressionType.GreaterThan);
  1145. Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
  1146. Assert (false, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1147. }
  1148. void GreaterThanOrEqualTest ()
  1149. {
  1150. Expression<Func<int, int, bool>> e = (int a, int b) => a >= b;
  1151. AssertNodeType (e, ExpressionType.GreaterThanOrEqual);
  1152. Assert (true, e.Compile ().Invoke (60, 30));
  1153. }
  1154. void GreaterThanOrEqualTest_2 ()
  1155. {
  1156. Expression<Func<byte?, byte?, bool>> e2 = (a, b) => a >= b;
  1157. AssertNodeType (e2, ExpressionType.GreaterThanOrEqual);
  1158. Assert (false, e2.Compile ().Invoke (null, 3));
  1159. Assert (true, e2.Compile ().Invoke (2, 2));
  1160. }
  1161. void GreaterThanOrEqualTest_3 ()
  1162. {
  1163. Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a >= b;
  1164. AssertNodeType (e3, ExpressionType.GreaterThanOrEqual);
  1165. Assert (true, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)), "D1");
  1166. }
  1167. void GreaterThanOrEqualTest_4 ()
  1168. {
  1169. Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a >= b;
  1170. AssertNodeType (e4, ExpressionType.GreaterThanOrEqual);
  1171. Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
  1172. Assert (false, e4.Compile ().Invoke (null, null));
  1173. Assert (true, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
  1174. }
  1175. void GreaterThanOrEqualTest_5 ()
  1176. {
  1177. Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a >= b;
  1178. AssertNodeType (e5, ExpressionType.GreaterThanOrEqual);
  1179. Assert (false, e5.Compile ().Invoke (null, 33));
  1180. Assert (false, e5.Compile ().Invoke (null, 0));
  1181. Assert (true, e5.Compile ().Invoke (new MyType (120), 3));
  1182. }
  1183. void GreaterThanOrEqualTest_6 ()
  1184. {
  1185. Expression<Func<ushort, bool>> e6 = (ushort a) => a >= null;
  1186. AssertNodeType (e6, ExpressionType.GreaterThanOrEqual);
  1187. Assert (false, e6.Compile ().Invoke (60));
  1188. }
  1189. void GreaterThanOrEqualTest_7 ()
  1190. {
  1191. Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a >= b;
  1192. AssertNodeType (e7, ExpressionType.GreaterThanOrEqual);
  1193. Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
  1194. Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1195. }
  1196. void GreaterThanOrEqualTest_8 ()
  1197. {
  1198. Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a >= b;
  1199. AssertNodeType (e8, ExpressionType.GreaterThanOrEqual);
  1200. Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
  1201. Assert (true, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1202. }
  1203. void InvokeTest ()
  1204. {
  1205. var del = new IntDelegate (TestInt);
  1206. Expression<Func<IntDelegate, int>> e = (a) => a ();
  1207. AssertNodeType (e, ExpressionType.Invoke);
  1208. Assert (29, e.Compile ().Invoke (del));
  1209. }
  1210. void InvokeTest_2 ()
  1211. {
  1212. Expression<Func<Func<int, string>, int, string>> e2 = (a, b) => a (b);
  1213. AssertNodeType (e2, ExpressionType.Invoke);
  1214. Assert ("4", e2.Compile ().Invoke ((a) => (a+1).ToString (), 3));
  1215. }
  1216. void LambdaTest ()
  1217. {
  1218. Expression<Func<string, Func<string>>> e = (string s) => () => s;
  1219. AssertNodeType (e, ExpressionType.Lambda);
  1220. Assert ("xx", e.Compile ().Invoke ("xx") ());
  1221. }
  1222. void LeftShiftTest ()
  1223. {
  1224. Expression<Func<ulong, short, ulong>> e = (ulong a, short b) => a << b;
  1225. AssertNodeType (e, ExpressionType.LeftShift);
  1226. Assert ((ulong) 0x7F000, e.Compile ().Invoke (0xFE, 11));
  1227. Assert ((ulong) 0x1FFFFFFFE, e.Compile ().Invoke (0xFFFFFFFF, 0xA01));
  1228. // .net produces a strange result
  1229. // see https://bugzilla.novell.com/show_bug.cgi?id=398358
  1230. // Assert ((ulong) 0xFFFFFFFE00000000, e.Compile ().Invoke (0xFFFFFFFF, 0xA01));
  1231. }
  1232. void LeftShiftTest_2 ()
  1233. {
  1234. Expression<Func<MyType, MyType, int>> e2 = (MyType a, MyType b) => a << b;
  1235. AssertNodeType (e2, ExpressionType.LeftShift);
  1236. var c2 = e2.Compile ();
  1237. Assert (1024, c2 (new MyType (256), new MyType (2)));
  1238. }
  1239. void LeftShiftTest_3 ()
  1240. {
  1241. Expression<Func<long?, sbyte, long?>> e3 = (long? a, sbyte b) => a << b;
  1242. AssertNodeType (e3, ExpressionType.LeftShift);
  1243. Assert (null, e3.Compile ().Invoke (null, 11));
  1244. Assert (2048, e3.Compile ().Invoke (1024, 1));
  1245. }
  1246. void LeftShiftTest_4 ()
  1247. {
  1248. Expression<Func<MyType?, MyType?, int?>> e4 = (MyType? a, MyType? b) => a << b;
  1249. AssertNodeType (e4, ExpressionType.LeftShift);
  1250. var c4 = e4.Compile ();
  1251. Assert (null, c4 (new MyType (8), null));
  1252. Assert (null, c4 (null, new MyType (8)));
  1253. Assert (1024, c4 (new MyType (256), new MyType (2)));
  1254. }
  1255. void LeftShiftTest_5 ()
  1256. {
  1257. Expression<Func<ushort, int?>> e5 = (ushort a) => a << null;
  1258. AssertNodeType (e5, ExpressionType.LeftShift);
  1259. Assert (null, e5.Compile ().Invoke (30));
  1260. }
  1261. void LeftShiftTest_6 ()
  1262. {
  1263. Expression<Func<int, MyTypeImplicitOnly, int>> e = (a, b) => a << b;
  1264. AssertNodeType (e, ExpressionType.LeftShift);
  1265. Assert (0x7F0, e.Compile ().Invoke (0xFE, new MyTypeImplicitOnly (3)));
  1266. }
  1267. void LessThanTest ()
  1268. {
  1269. Expression<Func<int, int, bool>> e = (int a, int b) => a < b;
  1270. AssertNodeType (e, ExpressionType.LessThan);
  1271. Assert (false, e.Compile ().Invoke (60, 30));
  1272. }
  1273. void LessThanTest_2 ()
  1274. {
  1275. Expression<Func<uint?, byte?, bool>> e2 = (a, b) => a < b;
  1276. AssertNodeType (e2, ExpressionType.LessThan);
  1277. Assert (false, e2.Compile ().Invoke (null, 3));
  1278. Assert (false, e2.Compile ().Invoke (2, 2));
  1279. }
  1280. void LessThanTest_3 ()
  1281. {
  1282. Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a < b;
  1283. AssertNodeType (e3, ExpressionType.LessThan);
  1284. Assert (false, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  1285. }
  1286. void LessThanTest_4 ()
  1287. {
  1288. Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a < b;
  1289. AssertNodeType (e4, ExpressionType.LessThan);
  1290. Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
  1291. Assert (false, e4.Compile ().Invoke (null, null));
  1292. Assert (false, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
  1293. }
  1294. void LessThanTest_5 ()
  1295. {
  1296. Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a < b;
  1297. AssertNodeType (e5, ExpressionType.LessThan);
  1298. Assert (false, e5.Compile ().Invoke (null, 33));
  1299. Assert (false, e5.Compile ().Invoke (null, 0));
  1300. Assert (false, e5.Compile ().Invoke (new MyType (120), 3));
  1301. }
  1302. void LessThanTest_6 ()
  1303. {
  1304. Expression<Func<ushort, bool>> e6 = (ushort a) => a < null;
  1305. AssertNodeType (e6, ExpressionType.LessThan);
  1306. Assert (false, e6.Compile ().Invoke (60));
  1307. }
  1308. void LessThanTest_7 ()
  1309. {
  1310. Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a < b;
  1311. AssertNodeType (e7, ExpressionType.LessThan);
  1312. Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
  1313. Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1314. }
  1315. void LessThanTest_8 ()
  1316. {
  1317. Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a < b;
  1318. AssertNodeType (e8, ExpressionType.LessThan);
  1319. Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
  1320. Assert (false, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1321. }
  1322. void LessThanTest_9 ()
  1323. {
  1324. Expression<Func<object, int?, bool>> e = (a, b) => (int) a < b;
  1325. AssertNodeType (e, ExpressionType.LessThan);
  1326. Assert (false, e.Compile ().Invoke (1, null));
  1327. Assert (false, e.Compile ().Invoke (3, 3));
  1328. Assert (true, e.Compile ().Invoke (1, 3));
  1329. }
  1330. void LessThanOrEqualTest ()
  1331. {
  1332. Expression<Func<int, int, bool>> e = (int a, int b) => a <= b;
  1333. AssertNodeType (e, ExpressionType.LessThanOrEqual);
  1334. Assert (false, e.Compile ().Invoke (60, 30));
  1335. }
  1336. void LessThanOrEqualTest_2 ()
  1337. {
  1338. Expression<Func<byte?, byte?, bool>> e2 = (a, b) => a <= b;
  1339. AssertNodeType (e2, ExpressionType.LessThanOrEqual);
  1340. Assert (false, e2.Compile ().Invoke (null, 3));
  1341. Assert (true, e2.Compile ().Invoke (2, 2));
  1342. }
  1343. void LessThanOrEqualTest_3 ()
  1344. {
  1345. Expression<Func<MyType, MyType, bool>> e3 = (MyType a, MyType b) => a <= b;
  1346. AssertNodeType (e3, ExpressionType.LessThanOrEqual);
  1347. Assert (true, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  1348. }
  1349. void LessThanOrEqualTest_4 ()
  1350. {
  1351. Expression<Func<MyType?, MyType?, bool>> e4 = (MyType? a, MyType? b) => a <= b;
  1352. AssertNodeType (e4, ExpressionType.LessThanOrEqual);
  1353. Assert (false, e4.Compile ().Invoke (null, new MyType (-20)));
  1354. Assert (false, e4.Compile ().Invoke (null, null));
  1355. Assert (false, e4.Compile ().Invoke (new MyType (120), new MyType (-20)));
  1356. }
  1357. void LessThanOrEqualTest_5 ()
  1358. {
  1359. Expression<Func<MyType?, sbyte, bool>> e5 = (MyType? a, sbyte b) => a <= b;
  1360. AssertNodeType (e5, ExpressionType.LessThanOrEqual);
  1361. Assert (false, e5.Compile ().Invoke (null, 33));
  1362. Assert (false, e5.Compile ().Invoke (null, 0));
  1363. Assert (false, e5.Compile ().Invoke (new MyType (120), 3));
  1364. }
  1365. void LessThanOrEqualTest_6 ()
  1366. {
  1367. Expression<Func<ushort, bool>> e6 = (ushort a) => a <= null;
  1368. AssertNodeType (e6, ExpressionType.LessThanOrEqual);
  1369. Assert (false, e6.Compile ().Invoke (60));
  1370. }
  1371. void LessThanOrEqualTest_7 ()
  1372. {
  1373. Expression<Func<MyEnum, MyEnum, bool>> e7 = (a, b) => a <= b;
  1374. AssertNodeType (e7, ExpressionType.LessThanOrEqual);
  1375. Assert (false, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_1));
  1376. Assert (true, e7.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1377. }
  1378. void LessThanOrEqualTest_8 ()
  1379. {
  1380. Expression<Func<MyEnum?, MyEnum?, bool>> e8 = (a, b) => a <= b;
  1381. AssertNodeType (e8, ExpressionType.LessThanOrEqual);
  1382. Assert (false, e8.Compile ().Invoke (MyEnum.Value_1, null));
  1383. Assert (true, e8.Compile ().Invoke (MyEnum.Value_2, MyEnum.Value_2));
  1384. }
  1385. void ListInitTest ()
  1386. {
  1387. Expression<Func<List<object>>> e1 = () => new List<object> { "Hello", "", null, "World", 5 };
  1388. AssertNodeType (e1, ExpressionType.ListInit);
  1389. var re1 = e1.Compile ().Invoke ();
  1390. Assert (null, re1 [2]);
  1391. Assert ("World", re1 [3]);
  1392. Assert (5, re1 [4]);
  1393. }
  1394. void ListInitTest_2 ()
  1395. {
  1396. Expression<Func<int, Dictionary<string, int>>> e2 = (int value) => new Dictionary<string, int> (3) { { "A", value }, { "B", 2 } };
  1397. AssertNodeType (e2, ExpressionType.ListInit);
  1398. var re2 = e2.Compile ().Invoke (3456);
  1399. Assert (3456, re2 ["A"]);
  1400. }
  1401. void MemberAccessTest ()
  1402. {
  1403. MemberAccessData d = new MemberAccessData ();
  1404. d.BoolValue = true;
  1405. Expression<Func<bool>> e = () => d.BoolValue;
  1406. AssertNodeType (e, ExpressionType.MemberAccess);
  1407. Assert (true, e.Compile ().Invoke ());
  1408. d.BoolValue = false;
  1409. Assert (false, e.Compile ().Invoke ());
  1410. }
  1411. void MemberAccessTest_2 ()
  1412. {
  1413. Expression<Func<decimal>> e2 = () => MemberAccessData.DecimalValue;
  1414. AssertNodeType (e2, ExpressionType.MemberAccess);
  1415. Assert (decimal.MinValue, e2.Compile ().Invoke ());
  1416. }
  1417. void MemberAccessTest_3 ()
  1418. {
  1419. MemberAccessData d = new MemberAccessData ();
  1420. d.VolatileValue = 492;
  1421. Expression<Func<uint>> e3 = () => d.VolatileValue;
  1422. AssertNodeType (e3, ExpressionType.MemberAccess);
  1423. Assert<uint> (492, e3.Compile ().Invoke ());
  1424. }
  1425. void MemberAccessTest_4 ()
  1426. {
  1427. MemberAccessData d = new MemberAccessData ();
  1428. Expression<Func<string[]>> e4 = () => d.StringValues;
  1429. AssertNodeType (e4, ExpressionType.MemberAccess);
  1430. Assert (null, e4.Compile ().Invoke ());
  1431. }
  1432. void MemberAccessTest_5 ()
  1433. {
  1434. MemberAccessData d = new MemberAccessData ();
  1435. var e5 = d.GetEvent ();
  1436. AssertNodeType (e5, ExpressionType.MemberAccess);
  1437. Assert (null, e5.Compile ().Invoke ());
  1438. }
  1439. void MemberAccessTest_6 ()
  1440. {
  1441. MemberAccessData d = new MemberAccessData ();
  1442. Expression<Func<MyType>> e6 = () => d.MyTypeProperty;
  1443. AssertNodeType (e6, ExpressionType.MemberAccess);
  1444. Assert (new MyType (), e6.Compile ().Invoke ());
  1445. }
  1446. void MemberAccessTest_7 ()
  1447. {
  1448. MemberAccessData d = new MemberAccessData ();
  1449. Expression<Func<MyType, short>> e7 = a => a.ShortProp;
  1450. AssertNodeType (e7, ExpressionType.MemberAccess);
  1451. MyType mt = new MyType ();
  1452. mt.ShortProp = 124;
  1453. Assert (124, e7.Compile ().Invoke (mt));
  1454. }
  1455. void MemberAccessTest_8 ()
  1456. {
  1457. Expression<Func<string>> e8 = () => MemberAccessData.StaticProperty;
  1458. AssertNodeType (e8, ExpressionType.MemberAccess);
  1459. Assert ("alo", e8.Compile ().Invoke ());
  1460. }
  1461. void MemberAccessTest_9 ()
  1462. {
  1463. string s = "localvar";
  1464. Expression<Func<string>> e9 = () => s;
  1465. s = "changed";
  1466. AssertNodeType (e9, ExpressionType.MemberAccess);
  1467. Assert ("changed", e9.Compile ().Invoke ());
  1468. }
  1469. void MemberInitTest ()
  1470. {
  1471. Expression<Func<MemberAccessData>> e = () => new MemberAccessData {
  1472. VolatileValue = 2, StringValues = new string [] { "sv" }, MyTypeProperty = new MyType (692)
  1473. };
  1474. AssertNodeType (e, ExpressionType.MemberInit);
  1475. var r1 = e.Compile ().Invoke ();
  1476. Assert<uint> (2, r1.VolatileValue);
  1477. Assert (new string[] { "sv" }, r1.StringValues);
  1478. Assert (new MyType (692), r1.MyTypeProperty);
  1479. }
  1480. void MemberInitTest_2 ()
  1481. {
  1482. Expression<Func<MemberAccessData>> e2 = () => new MemberAccessData {
  1483. ListValues = new List<string> { "a", null }
  1484. };
  1485. AssertNodeType (e2, ExpressionType.MemberInit);
  1486. var r2 = e2.Compile ().Invoke ();
  1487. Assert ("a", r2.ListValues [0]);
  1488. }
  1489. void MemberInitTest_3 ()
  1490. {
  1491. Expression<Func<short, MyType>> e3 = a => new MyType { ShortProp = a };
  1492. AssertNodeType (e3, ExpressionType.MemberInit);
  1493. var r3 = e3.Compile ().Invoke (33);
  1494. Assert (33, r3.ShortProp);
  1495. }
  1496. void MemberInitTest_4 ()
  1497. {
  1498. Expression<Func<int>> e = () => new int { };
  1499. AssertNodeType (e, ExpressionType.MemberInit);
  1500. var r = e.Compile ().Invoke ();
  1501. Assert (0, r);
  1502. }
  1503. void MemberInitTest_5 ()
  1504. {
  1505. Expression<Func<MemberAccessData>> e = () => new MemberAccessData { SetOnly = new object { } };
  1506. AssertNodeType (e, ExpressionType.MemberInit);
  1507. e.Compile () ();
  1508. }
  1509. void ModuloTest ()
  1510. {
  1511. Expression<Func<int, int, int>> e = (int a, int b) => a % b;
  1512. AssertNodeType (e, ExpressionType.Modulo);
  1513. Assert (29, e.Compile ().Invoke (60, 31));
  1514. }
  1515. void ModuloTest_2 ()
  1516. {
  1517. Expression<Func<double?, double?, double?>> e2 = (a, b) => a % b;
  1518. AssertNodeType (e2, ExpressionType.Modulo);
  1519. Assert (null, e2.Compile ().Invoke (null, 3));
  1520. Assert (1.1, e2.Compile ().Invoke (3.1, 2));
  1521. }
  1522. void ModuloTest_3 ()
  1523. {
  1524. Expression<Func<MyType, MyType, MyType>> e3 = (MyType a, MyType b) => a % b;
  1525. AssertNodeType (e3, ExpressionType.Modulo);
  1526. Assert (0, e3.Compile ().Invoke (new MyType (-20), new MyType (-20)));
  1527. }
  1528. void ModuloTest_4 ()
  1529. {
  1530. Expression<Func<MyType?, MyType?, MyType?>> e4 = (MyType? a, MyType? b) => a % b;
  1531. AssertNodeType (e4, ExpressionType.Modulo);
  1532. Assert (null, e4.Compile ().Invoke (null, new MyType (-20)));
  1533. Assert (new MyType (12), e4.Compile ().Invoke (new MyType (12), new MyType (-20)));
  1534. }
  1535. void ModuloTest_5 ()
  1536. {
  1537. Expressio

Large files files are truncated, but you can click here to view the full file