PageRenderTime 58ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/mcs/tests/dtest-006.cs

https://bitbucket.org/steenlund/mono-2.6.7-for-amiga
C# | 1795 lines | 1371 code | 359 blank | 65 comment | 82 complexity | ed9881d36346bc822912c5e6ee4b7ad9 MD5 | raw file
Possible License(s): LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0, LGPL-2.1
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Reflection;
  6. // Dynamic binary and unary operators tests
  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: Create a clone which uses +(MyType, int) pattern and an implicit conversion
  24. // is required to do the user-conversion
  25. public struct MyType
  26. {
  27. int value;
  28. public MyType (int value) : this ()
  29. {
  30. this.value = value;
  31. }
  32. public short ShortProp { get; set; }
  33. public override int GetHashCode ()
  34. {
  35. throw new NotImplementedException ();
  36. }
  37. public static implicit operator int (MyType o)
  38. {
  39. return o.value;
  40. }
  41. public static bool operator true (MyType a)
  42. {
  43. return a.value == a;
  44. }
  45. public static bool operator false (MyType a)
  46. {
  47. return a.value != a;
  48. }
  49. public static MyType operator + (MyType a, MyType b)
  50. {
  51. return new MyType (a.value + b.value);
  52. }
  53. public static MyType operator - (MyType a, MyType b)
  54. {
  55. return new MyType (a.value - b.value);
  56. }
  57. public static MyType operator / (MyType a, MyType b)
  58. {
  59. return new MyType (a.value / b.value);
  60. }
  61. public static MyType operator * (MyType a, MyType b)
  62. {
  63. return new MyType (a.value * b.value);
  64. }
  65. public static MyType operator % (MyType a, MyType b)
  66. {
  67. return new MyType (a.value % b.value);
  68. }
  69. public static MyType operator &(MyType a, MyType b)
  70. {
  71. return new MyType (a.value & b.value);
  72. }
  73. public static MyType operator | (MyType a, MyType b)
  74. {
  75. return new MyType (a.value | b.value);
  76. }
  77. public static MyType operator ^ (MyType a, MyType b)
  78. {
  79. return new MyType (a.value ^ b.value);
  80. }
  81. public static bool operator == (MyType a, MyType b)
  82. {
  83. return a.value == b.value;
  84. }
  85. public static bool operator != (MyType a, MyType b)
  86. {
  87. return a.value != b.value;
  88. }
  89. public static bool operator > (MyType a, MyType b)
  90. {
  91. return a.value > b.value;
  92. }
  93. public static bool operator < (MyType a, MyType b)
  94. {
  95. return a.value < b.value;
  96. }
  97. public static bool operator >= (MyType a, MyType b)
  98. {
  99. return a.value >= b.value;
  100. }
  101. public static bool operator <= (MyType a, MyType b)
  102. {
  103. return a.value <= b.value;
  104. }
  105. public static bool operator ! (MyType a)
  106. {
  107. return a.value > 0;
  108. }
  109. public static int operator >> (MyType a, int b)
  110. {
  111. return a.value >> b;
  112. }
  113. public static int operator << (MyType a, int b)
  114. {
  115. return a.value << b;
  116. }
  117. public static MyType operator - (MyType a)
  118. {
  119. return new MyType (-a.value);
  120. }
  121. public static MyType operator + (MyType a)
  122. {
  123. return new MyType (+a.value);
  124. }
  125. public override string ToString ()
  126. {
  127. return value.ToString ();
  128. }
  129. }
  130. class MyTypeExplicit
  131. {
  132. int value;
  133. public MyTypeExplicit (int value)
  134. {
  135. this.value = value;
  136. }
  137. public static explicit operator int (MyTypeExplicit m)
  138. {
  139. return m.value;
  140. }
  141. }
  142. struct MyTypeImplicitOnly
  143. {
  144. short b;
  145. public MyTypeImplicitOnly (short b)
  146. {
  147. this.b = b;
  148. }
  149. public static implicit operator short (MyTypeImplicitOnly m)
  150. {
  151. return m.b;
  152. }
  153. }
  154. enum MyEnum : byte
  155. {
  156. Value_1 = 1,
  157. Value_2 = 2
  158. }
  159. enum MyEnumUlong : ulong
  160. {
  161. Value_1 = 1,
  162. Value_2 = 2
  163. }
  164. class Tester
  165. {
  166. delegate void EmptyDelegate ();
  167. delegate int IntDelegate ();
  168. static void Assert<T> (T expected, T value, string name)
  169. {
  170. if (!EqualityComparer<T>.Default.Equals (expected, value)) {
  171. name += ": ";
  172. throw new ApplicationException (name + expected + " != " + value);
  173. }
  174. }
  175. static void AssertChecked<T> (Func<T> expected, T value, string name)
  176. {
  177. try {
  178. Assert (expected (), value, name);
  179. throw new ApplicationException (name + ": OverflowException expected");
  180. } catch (OverflowException) {
  181. // passed
  182. }
  183. }
  184. static void AssertChecked (Action expected, string name)
  185. {
  186. try {
  187. expected ();
  188. throw new ApplicationException (name + ": OverflowException expected");
  189. } catch (OverflowException) {
  190. // passed
  191. }
  192. }
  193. #pragma warning disable 169
  194. void AddTest ()
  195. {
  196. dynamic d = 5;
  197. int v = 2;
  198. Assert (d + v, 7, "#1");
  199. double v2 = 0.5;
  200. Assert (d + v2, 5.5, "#1a");
  201. MyType v3 = new MyType (30);
  202. Assert (d + v3, new MyType (35), "#3");
  203. dynamic d3 = new MyType (-7);
  204. Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
  205. Assert (d3 + 11, 4, "#3b");
  206. decimal v4 = 4m;
  207. Assert (d + v4, 9m, "#4");
  208. }
  209. void AddNullableTest ()
  210. {
  211. dynamic d = 5;
  212. int? v2 = null;
  213. Assert<int?> (d + v2, null, "#1");
  214. Assert<int?> (d + null, null, "#1a");
  215. Assert<int?> (null + d, null, "#1b");
  216. v2 = -2;
  217. Assert (d + v2, 3, "#2");
  218. dynamic d2 = (int?) -2;
  219. Assert (d2 + 1, -1, "#2a");
  220. MyType? v3 = new MyType (30);
  221. Assert (d + v3, new MyType (35), "#3");
  222. dynamic d3 = new MyType? (new MyType (-7));
  223. Assert (d3 + new MyType (6), new MyType (-1), "#3a");
  224. Assert<MyType?> (d3 + null, null, "#3b");
  225. decimal? v4 = 4m;
  226. Assert (d + v4, 9m, "#4");
  227. v4 = null;
  228. Assert<decimal?> (d + v4, null, "#4a");
  229. }
  230. void AddEnumTest ()
  231. {
  232. dynamic d = MyEnum.Value_1;
  233. // CSC: Invalid System.InvalidOperationException
  234. Assert (d + null, null, "#1");
  235. Assert (d + 1, MyEnum.Value_2, "#2");
  236. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  237. Assert (d2 + (byte) 1, MyEnumUlong.Value_2, "#3");
  238. Assert<MyEnumUlong?> (d2 + (object) null, null, "#3a");
  239. }
  240. void AddCheckedTest ()
  241. {
  242. checked {
  243. dynamic d = 5;
  244. int v = int.MaxValue;
  245. AssertChecked (() => d + v, 7, "#1");
  246. int? v2 = v;
  247. AssertChecked (() => d + v2, null, "#2");
  248. MyType v3 = new MyType (int.MaxValue);
  249. AssertChecked (() => d + v3, new MyType (35), "#3");
  250. }
  251. }
  252. void AddStringTest ()
  253. {
  254. dynamic d = "foo";
  255. string v = "->";
  256. Assert (d + v, "foo->", "#1");
  257. Assert (d + 1, "foo1", "#1a");
  258. Assert (d + null, "foo", "#1b");
  259. Assert (d + 1 + v, "foo1->", "#1a");
  260. uint? v2 = 4;
  261. Assert (d + v2, "foo4", "#2");
  262. }
  263. void AddAssignTest ()
  264. {
  265. dynamic d = 5;
  266. int v = 2;
  267. d += v;
  268. Assert (d, 7, "#1");
  269. d = 5.0;
  270. double v2 = 0.5;
  271. d += v2;
  272. Assert (d, 5.5, "#1a");
  273. d += v;
  274. Assert (d, 7.5, "#1b");
  275. dynamic d3 = new MyType (-7);
  276. d3 += new MyType (6);
  277. Assert<MyType> (d3, new MyType (-1), "#3");
  278. d = 5m;
  279. decimal v4 = 4m;
  280. d += v4;
  281. Assert (d, 9m, "#4");
  282. }
  283. void AddAssignNullableTest ()
  284. {
  285. dynamic d = (int?) 5;
  286. // FEATURE
  287. // For now it's impossible to use nullable compound assignment
  288. // due to the way how DLR works. GetType () on nullable object returns
  289. // underlying type and not nullable type, that means that
  290. // C# binder is initialized with wrong operand type and any operation
  291. // fails to resolve
  292. /*
  293. long? v2 = null;
  294. d += v2;
  295. Assert<int?> (d, null, "#1");
  296. d += null;
  297. Assert<int?> (d, null, "#1a");
  298. long? l = (long?) 3;
  299. d = l;
  300. v2 = -2;
  301. d += v2;
  302. Assert (d, 3, "#2");
  303. d = (int?) -2;
  304. d += 1;
  305. Assert (d, -1, "#2a");
  306. MyType? v3 = new MyType (30);
  307. d += v3;
  308. Assert (d, new MyType (35), "#3");
  309. dynamic d3 = new MyType? (new MyType (-7));
  310. Assert (d3 + new MyType (6), new MyType (-1), "#3a");
  311. Assert<MyType?> (d3 + null, null, "#3b");
  312. decimal? v4 = 4m;
  313. d = 2m;
  314. d += v4;
  315. Assert (d, 9m, "#4");
  316. d += null;
  317. Assert<decimal?> (d, null, "#4a");
  318. */
  319. }
  320. void AddAssignEnumTest ()
  321. {
  322. dynamic d = MyEnum.Value_1;
  323. d = MyEnum.Value_1;
  324. d += 1;
  325. Assert (d, MyEnum.Value_2, "#2");
  326. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  327. d2 += (byte) 1;
  328. Assert (d2, MyEnumUlong.Value_2, "#3");
  329. }
  330. void AddAssignCheckedTest ()
  331. {
  332. checked {
  333. dynamic d = 5;
  334. int v = int.MaxValue;
  335. AssertChecked (() => { d += v; Assert (d, 0, "#1-"); }, "#1");
  336. MyType v3 = new MyType (int.MaxValue);
  337. AssertChecked (() => { d += v3; Assert (d, 0, "#3-"); }, "#3");
  338. }
  339. }
  340. void AddAssignStringTest ()
  341. {
  342. dynamic d = "foo";
  343. string v = "->";
  344. d += v;
  345. Assert (d, "foo->", "#1");
  346. d = "foo";
  347. d += 1;
  348. Assert (d, "foo1", "#1a");
  349. d += null;
  350. Assert (d, "foo1", "#1b");
  351. uint? v2 = 4;
  352. d = "foo";
  353. d += v2;
  354. Assert (d, "foo4", "#2");
  355. }
  356. // TODO:
  357. void AddAssignmentEvent ()
  358. {
  359. // IMPLEMENT
  360. }
  361. void AndTest ()
  362. {
  363. dynamic d = true;
  364. var v = false;
  365. Assert (d & v, false, "#1");
  366. Assert (d & true, true, "#1a");
  367. d = 42;
  368. var v2 = 62;
  369. Assert (d & v2, 42, "#2");
  370. Assert (d & 0, 0, "#2a");
  371. MyType v3 = new MyType (30);
  372. Assert (d & v3, new MyType (10), "#3");
  373. dynamic d3 = new MyType (-7);
  374. Assert<MyType> (d3 & new MyType (6), new MyType (0), "#3a");
  375. Assert (d3 & 11, 9, "#3b");
  376. }
  377. void AndTestEnum ()
  378. {
  379. dynamic d = MyEnum.Value_1;
  380. Assert<MyEnum?> (d & null, null, "#1");
  381. Assert (d & d, MyEnum.Value_1, "#2");
  382. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  383. Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
  384. }
  385. void AndTestNullable ()
  386. {
  387. dynamic d = 5;
  388. int? v2 = null;
  389. Assert<int?> (d & v2, null, "#1");
  390. Assert<int?> (d & null, null, "#1a");
  391. Assert<int?> (null & d, null, "#1b");
  392. v2 = -2;
  393. Assert (d & v2, 4, "#2");
  394. dynamic d2 = (int?) -2;
  395. Assert (d2 & 1, 0, "#2a");
  396. MyType? v3 = new MyType (30);
  397. Assert (d & v3, new MyType (4), "#3");
  398. dynamic d3 = new MyType? (new MyType (-7));
  399. Assert (d3 & new MyType (6), new MyType (0), "#3a");
  400. Assert<MyType?> (d3 + null, null, "#3b");
  401. }
  402. void AndAssignedTest ()
  403. {
  404. dynamic d = true;
  405. var v = false;
  406. d &= v;
  407. Assert (d, false, "#1");
  408. d = true;
  409. d &= true;
  410. Assert (d, true, "#1a");
  411. d = 42;
  412. var v2 = 62;
  413. d &= v2;
  414. Assert (d, 42, "#2");
  415. MyType v3 = new MyType (30);
  416. dynamic d3 = new MyType (-7);
  417. d3 &= new MyType (6);
  418. Assert<MyType> (d3, new MyType (0), "#3");
  419. }
  420. void AndAssignedTestEnum ()
  421. {
  422. dynamic d = MyEnum.Value_1;
  423. d &= MyEnum.Value_2;
  424. Assert<MyEnum>(d, 0, "#1");
  425. d = MyEnum.Value_2;
  426. d &= d;
  427. Assert (d, MyEnum.Value_2, "#2");
  428. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  429. Assert<MyEnumUlong> (d2 & MyEnumUlong.Value_2, 0, "#3");
  430. }
  431. void AndAlsoTest ()
  432. {
  433. dynamic d = true;
  434. var v = false;
  435. Assert<bool> (d && v, false, "#1");
  436. Assert (d && true, true, "#1a");
  437. d = true;
  438. Assert (d && d, true, "#2");
  439. dynamic d3 = new MyType (-7);
  440. Assert<MyType> (d3 && new MyType (6), new MyType (0), "#3");
  441. // This should not compile
  442. Assert (d3 && 11, 9, "#3b");
  443. }
  444. void DivideTest ()
  445. {
  446. dynamic d = 5;
  447. int v = 2;
  448. Assert (d / v, 2, "#1");
  449. MyType v3 = new MyType (30);
  450. Assert (d / v3, new MyType (0), "#3");
  451. dynamic d3 = new MyType (-7);
  452. Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
  453. Assert (d3 / 11, 0, "#3b");
  454. decimal v4 = 4m;
  455. Assert (d / v4, 1.25m, "#4");
  456. }
  457. void DivideNullableTest ()
  458. {
  459. dynamic d = 5;
  460. double? v2 = null;
  461. Assert<double?> (d / v2, null, "#1");
  462. Assert<double?> (d / null, null, "#1a");
  463. Assert<double?> (null / d, null, "#1b");
  464. v2 = -2;
  465. Assert (d / v2, -2.5, "#2");
  466. dynamic d2 = (int?) -2;
  467. Assert (d2 / 1, -2, "#2a");
  468. MyType? v3 = new MyType (30);
  469. Assert (d / v3, new MyType (0), "#3");
  470. dynamic d3 = new MyType? (new MyType (-7));
  471. Assert (d3 / new MyType (6), new MyType (-1), "#3a");
  472. Assert<MyType?> (d3 + null, null, "#3b");
  473. decimal? v4 = 4m;
  474. Assert (d / v4, 1.25m, "#4");
  475. v4 = null;
  476. Assert<decimal?> (d / v4, null, "#4a");
  477. }
  478. void DivideCheckedTest ()
  479. {
  480. checked {
  481. // TODO:
  482. }
  483. }
  484. void DivideAssignTest ()
  485. {
  486. dynamic d = 5;
  487. int v = 2;
  488. d /= v;
  489. Assert (d, 2, "#1");
  490. d = 5.0;
  491. double v2 = 0.5;
  492. d /= v2;
  493. Assert (d, 10, "#1a");
  494. d /= v;
  495. Assert (d, 5, "#1b");
  496. dynamic d3 = new MyType (-7);
  497. d3 /= new MyType (6);
  498. Assert<MyType> (d3, new MyType (-1), "#3");
  499. d = 5m;
  500. decimal v4 = 4m;
  501. d /= v4;
  502. Assert (d, 1.25m, "#4");
  503. }
  504. void DivideAssignCheckedTest ()
  505. {
  506. checked {
  507. // TODO:
  508. }
  509. }
  510. void EqualTest ()
  511. {
  512. dynamic d = 5;
  513. int v = 2;
  514. Assert (d == v, false, "#1");
  515. double v2 = 5;
  516. Assert (d == v2, true, "#1a");
  517. d = true;
  518. Assert (d == false, false, "#2");
  519. bool b2 = true;
  520. Assert (d == b2, true, "#2a");
  521. d = new MyType (30);
  522. MyType v3 = new MyType (30);
  523. Assert (d == v3, true, "#3");
  524. dynamic d3 = new MyType (-7);
  525. Assert (d3 == new MyType (6), false, "#3a");
  526. Assert (d3 == 11, false, "#3b");
  527. d = 2m;
  528. decimal v4 = 4m;
  529. Assert (d == v4, false, "#4");
  530. Assert (d == 2m, true, "#4a");
  531. d = null;
  532. Assert (d == null, true, "#5");
  533. }
  534. void EqualNullableTest ()
  535. {
  536. dynamic d = 5;
  537. int? v2 = null;
  538. Assert (d == v2, false, "#1");
  539. Assert (d == null, false, "#1a");
  540. Assert (null == d, false, "#1b");
  541. v2 = -2;
  542. Assert (d == v2, false, "#2");
  543. dynamic d2 = (int?) -2;
  544. Assert (d2 == 1, false, "#2a");
  545. d2 = (uint?) 44;
  546. Assert (d2 == 44, true, "#2b");
  547. d = new MyType (30);
  548. MyType? v3 = new MyType (30);
  549. Assert (d == v3, true, "#3");
  550. dynamic d3 = new MyType? (new MyType (-7));
  551. Assert (d3 == new MyType (6), false, "#3a");
  552. Assert (d3 == null, false, "#3b");
  553. d = 4.1m;
  554. decimal? v4 = 4m;
  555. Assert (d == v4, false, "#4");
  556. v4 = null;
  557. Assert (d == v4, false, "#4a");
  558. d = (bool?) true;
  559. Assert (d == true, true, "#5");
  560. Assert (d == null, false, "#5a");
  561. Assert (d == false, false, "#5b");
  562. }
  563. void EqualEnumTest ()
  564. {
  565. dynamic d = MyEnum.Value_1;
  566. Assert (d == null, false, "#1");
  567. Assert (d == MyEnum.Value_1, true, "#2");
  568. Assert (d == 0, false, "#2a");
  569. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  570. Assert (d2 == MyEnumUlong.Value_2, true, "#3");
  571. Assert (d2 == null, false, "#3a");
  572. }
  573. void EqualStringTest ()
  574. {
  575. dynamic d = "text";
  576. Assert (d == "te", false, "#1");
  577. Assert (d == "text", true, "#1a");
  578. Assert (d == null, false, "#1b");
  579. }
  580. void EqualDelegateTest ()
  581. {
  582. dynamic d = this;
  583. // Assert (d == delegate { }, true, "#1");
  584. EmptyDelegate b = EqualDelegateTest;
  585. d = b;
  586. //Assert (d == EqualDelegateTest, true, "#2");
  587. /*
  588. void EqualTestDelegate_2 ()
  589. {
  590. EmptyDelegate ed = delegate () {};
  591. Expression<Func<EmptyDelegate, EmptyDelegate, bool>> e2 = (a, b) => a == b;
  592. AssertNodeType (e2, ExpressionType.Equal);
  593. Assert (false, e2.Compile ().Invoke (delegate () {}, null));
  594. Assert (false, e2.Compile ().Invoke (delegate () {}, delegate {}));
  595. Assert (false, e2.Compile ().Invoke (ed, delegate {}));
  596. Assert (true, e2.Compile ().Invoke (ed, ed));
  597. */
  598. }
  599. void ExclusiveOrTest ()
  600. {
  601. dynamic d = true;
  602. var v = false;
  603. Assert (d ^ v, true, "#1");
  604. Assert (d ^ true, false, "#1a");
  605. d = 42;
  606. var v2 = 62;
  607. Assert (d ^ v2, 20, "#2");
  608. Assert (d ^ 0, 42, "#2a");
  609. MyType v3 = new MyType (30);
  610. Assert (d ^ v3, new MyType (52), "#3");
  611. dynamic d3 = new MyType (-7);
  612. Assert<MyType> (d3 ^ new MyType (6), new MyType (-1), "#3a");
  613. Assert (d3 ^ 11, -14, "#3b");
  614. }
  615. void ExclusiveOrNullableTest ()
  616. {
  617. dynamic d = 5;
  618. int? v2 = null;
  619. Assert<int?> (d ^ v2, null, "#1");
  620. Assert<int?> (d ^ null, null, "#1a");
  621. Assert<int?> (null ^ d, null, "#1b");
  622. v2 = -2;
  623. Assert (d ^ v2, -5, "#2");
  624. dynamic d2 = (int?) -2;
  625. Assert (d2 ^ 1, -1, "#2a");
  626. MyType? v3 = new MyType (30);
  627. Assert (d ^ v3, new MyType (27), "#3");
  628. dynamic d3 = new MyType? (new MyType (-7));
  629. Assert (d3 ^ new MyType (6), new MyType (-1), "#3a");
  630. Assert<MyType?> (d3 ^ null, null, "#3b");
  631. }
  632. void ExclusiveOrTestEnum ()
  633. {
  634. dynamic d = MyEnum.Value_1;
  635. Assert<MyEnum?> (d ^ null, null, "#1");
  636. Assert<MyEnum> (d ^ d, 0, "#2");
  637. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  638. Assert<MyEnumUlong> (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
  639. }
  640. void ExclusiveOrAssignedTest ()
  641. {
  642. dynamic d = true;
  643. var v = false;
  644. d ^= v;
  645. Assert (d, true, "#1");
  646. d = true;
  647. d ^= true;
  648. Assert (d, false, "#1a");
  649. d = 42;
  650. var v2 = 62;
  651. d ^= v2;
  652. Assert (d, 20, "#2");
  653. MyType v3 = new MyType (30);
  654. dynamic d3 = new MyType (-7);
  655. d3 ^= new MyType (6);
  656. Assert (d3, new MyType (-1), "#3");
  657. }
  658. void ExclusiveOrAssignedTestEnum ()
  659. {
  660. dynamic d = MyEnum.Value_1;
  661. d ^= MyEnum.Value_2;
  662. Assert<MyEnum>(d, (MyEnum) 3, "#1");
  663. d = MyEnum.Value_2;
  664. d ^= d;
  665. Assert<MyEnum> (d, 0, "#2");
  666. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  667. Assert (d2 ^ MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
  668. }
  669. void GreaterThanTest ()
  670. {
  671. dynamic d = 5;
  672. int v = 2;
  673. Assert (d > v, true, "#1");
  674. double v2 = 5;
  675. Assert (d > v2, false, "#1a");
  676. d = 4.6;
  677. Assert (d > 4.59, true, "#2");
  678. var b2 = 4.6;
  679. Assert (d > b2, false, "#2a");
  680. d = new MyType (30);
  681. MyType v3 = new MyType (30);
  682. Assert (d > v3, false, "#3");
  683. dynamic d3 = new MyType (-7);
  684. Assert (d3 > new MyType (6), false, "#3a");
  685. Assert (d3 > 11, false, "#3b");
  686. d = 2m;
  687. decimal v4 = 4m;
  688. Assert (d > v4, false, "#4");
  689. Assert (d > 2m, false, "#4a");
  690. }
  691. void GreaterThanNullableTest ()
  692. {
  693. dynamic d = 5;
  694. int? v2 = null;
  695. Assert (d > v2, false, "#1");
  696. Assert (d > null, false, "#1a");
  697. Assert (null > d, false, "#1b");
  698. v2 = -2;
  699. Assert (d > v2, true, "#2");
  700. dynamic d2 = (int?) -2;
  701. Assert (d2 > 1, false, "#2a");
  702. d2 = (uint?) 44;
  703. Assert (d2 > 44, false, "#2b");
  704. d = new MyType (30);
  705. MyType? v3 = new MyType (30);
  706. Assert (d > v3, false, "#3");
  707. dynamic d3 = new MyType? (new MyType (-7));
  708. Assert (d3 > new MyType (6), false, "#3a");
  709. Assert (d3 > null, false, "#3b");
  710. d = 4.1m;
  711. decimal? v4 = 4m;
  712. Assert (d > v4, true, "#4");
  713. v4 = null;
  714. Assert (d > v4, false, "#4a");
  715. }
  716. void GreaterThanEnumTest ()
  717. {
  718. dynamic d = MyEnum.Value_1;
  719. Assert (d > null, false, "#1");
  720. Assert (d > MyEnum.Value_1, false, "#2");
  721. Assert (d > 0, true, "#2a");
  722. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  723. Assert (d2 > MyEnumUlong.Value_2, false, "#3");
  724. Assert (d2 > null, false, "#3a");
  725. }
  726. void GreaterThanEqualTest ()
  727. {
  728. dynamic d = 5;
  729. int v = 2;
  730. Assert (d >= v, true, "#1");
  731. double v2 = 5;
  732. Assert (d >= v2, true, "#1a");
  733. d = 4.6;
  734. Assert (d >= 4.59, true, "#2");
  735. var b2 = 4.6;
  736. Assert (d >= b2, true, "#2a");
  737. d = new MyType (30);
  738. MyType v3 = new MyType (30);
  739. Assert (d >= v3, true, "#3");
  740. dynamic d3 = new MyType (-7);
  741. Assert (d3 >= new MyType (6), false, "#3a");
  742. Assert (d3 >= 11, false, "#3b");
  743. d = 2m;
  744. decimal v4 = 4m;
  745. Assert (d >= v4, false, "#4");
  746. Assert (d >= 2m, true, "#4a");
  747. }
  748. void GreaterThanEqualNullableTest ()
  749. {
  750. dynamic d = 5;
  751. int? v2 = null;
  752. Assert (d >= v2, false, "#1");
  753. Assert (d >= null, false, "#1a");
  754. Assert (null >= d, false, "#1b");
  755. v2 = -2;
  756. Assert (d >= v2, true, "#2");
  757. dynamic d2 = (int?) -2;
  758. Assert (d2 >= 1, false, "#2a");
  759. d2 = (uint?) 44;
  760. Assert (d2 >= 44, true, "#2b");
  761. d = new MyType (30);
  762. MyType? v3 = new MyType (30);
  763. Assert (d >= v3, true, "#3");
  764. dynamic d3 = new MyType? (new MyType (-7));
  765. Assert (d3 >= new MyType (6), false, "#3a");
  766. Assert (d3 >= null, false, "#3b");
  767. d = 4.1m;
  768. decimal? v4 = 4m;
  769. Assert (d >= v4, true, "#4");
  770. v4 = null;
  771. Assert (d >= v4, false, "#4a");
  772. }
  773. void GreaterThanEqualEnumTest ()
  774. {
  775. dynamic d = MyEnum.Value_1;
  776. Assert (d >= null, false, "#1");
  777. Assert (d >= MyEnum.Value_1, true, "#2");
  778. Assert (d >= 0, true, "#2a");
  779. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  780. Assert (d2 >= MyEnumUlong.Value_2, true, "#3");
  781. Assert (d2 >= null, false, "#3a");
  782. }
  783. void LeftShiftTest ()
  784. {
  785. dynamic d = (ulong) 0x7F000;
  786. int v = 2;
  787. Assert<ulong> (d << v, 0x1FC000, "#1");
  788. Assert<ulong> (d << 1, 0xFE000, "#1a");
  789. short s = 2;
  790. Assert<ulong> (d << s, 0x1FC000, "#1b");
  791. d = 0x7F000;
  792. MyType v3 = new MyType (3);
  793. Assert (d << v3, new MyType (0x3F8000), "#3");
  794. dynamic d3 = new MyType (-7);
  795. Assert (d3 << new MyType (6), new MyType (-448), "#3a");
  796. Assert (d3 << 11, -14336, "#3b");
  797. }
  798. void LeftShiftNullableTest ()
  799. {
  800. dynamic d = 5;
  801. int? v2 = null;
  802. Assert<int?> (d << v2, null, "#1");
  803. d = 5;
  804. Assert<int?> (d << null, null, "#1a");
  805. d = 5;
  806. Assert<int?> (null << d, null, "#1b");
  807. v2 = -2;
  808. Assert (d << v2, 0x40000000, "#2");
  809. dynamic d2 = (int?) -2;
  810. Assert (d2 << 1, -4, "#2a");
  811. d = 0xFFFFFF;
  812. MyType? v3 = new MyType (30);
  813. Assert (d << v3, new MyType (-1073741824), "#3");
  814. dynamic d3 = new MyType? (new MyType (-7));
  815. Assert (d3 << new MyType (6), new MyType (-448), "#3a");
  816. Assert<MyType?> (d3 << null, null, "#3b");
  817. }
  818. void LeftShiftAssignTest ()
  819. {
  820. dynamic d = 0x7F000;
  821. int v = 2;
  822. d <<= v;
  823. Assert (d, 0x1FC000, "#1");
  824. d <<= 1;
  825. Assert (d, 0x3F8000, "#1a");
  826. sbyte s = 2;
  827. d <<= s;
  828. Assert (d, 0xFE0000, "#1b");
  829. }
  830. void LeftShiftAssignNullableTest ()
  831. {
  832. dynamic d = 5;
  833. var v2 = -2;
  834. d <<= v2;
  835. Assert (d, 0x40000000, "#2");
  836. dynamic d2 = (int?) -2;
  837. d2 <<= 1;
  838. Assert (d2, -4, "#2a");
  839. d = 0xFFFFFF;
  840. MyType? v3 = new MyType (30);
  841. d <<= v3;
  842. Assert (d, new MyType (-1073741824), "#3");
  843. dynamic d3 = new MyType? (new MyType (-7));
  844. }
  845. void LessThanTest ()
  846. {
  847. dynamic d = 5;
  848. int v = 2;
  849. Assert (d < v, false, "#1");
  850. double v2 = 5;
  851. Assert (d < v2, false, "#1a");
  852. d = 4.6;
  853. Assert (d < 4.59, false, "#2");
  854. var b2 = 4.6;
  855. Assert (d < b2, false, "#2a");
  856. d = new MyType (30);
  857. MyType v3 = new MyType (30);
  858. Assert (d < v3, false, "#3");
  859. dynamic d3 = new MyType (-7);
  860. Assert (d3 < new MyType (6), true, "#3a");
  861. Assert (d3 < 11, true, "#3b");
  862. d = 2m;
  863. decimal v4 = 4m;
  864. Assert (d < v4, true, "#4");
  865. Assert (d < 2m, false, "#4a");
  866. }
  867. void LessThanNullableTest ()
  868. {
  869. dynamic d = 5;
  870. int? v2 = null;
  871. Assert (d < v2, false, "#1");
  872. Assert (d < null, false, "#1a");
  873. Assert (null < d, false, "#1b");
  874. v2 = -2;
  875. Assert (d < v2, false, "#2");
  876. dynamic d2 = (int?) -2;
  877. Assert (d2 < 1, true, "#2a");
  878. d2 = (uint?) 44;
  879. Assert (d2 < 44, false, "#2b");
  880. d = new MyType (30);
  881. MyType? v3 = new MyType (30);
  882. Assert (d < v3, false, "#3");
  883. dynamic d3 = new MyType? (new MyType (-7));
  884. Assert (d3 < new MyType (6), true, "#3a");
  885. Assert (d3 < null, false, "#3b");
  886. d = 4.1m;
  887. decimal? v4 = 4m;
  888. Assert (d < v4, false, "#4");
  889. v4 = null;
  890. Assert (d < v4, false, "#4a");
  891. }
  892. void LessThanEnumTest ()
  893. {
  894. dynamic d = MyEnum.Value_1;
  895. Assert (d < null, false, "#1");
  896. Assert (d < MyEnum.Value_1, false, "#2");
  897. Assert (d < 0, false, "#2a");
  898. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  899. Assert (d2 < MyEnumUlong.Value_2, false, "#3");
  900. Assert (d2 < null, false, "#3a");
  901. }
  902. void LessThanOrEqualTest ()
  903. {
  904. dynamic d = 5;
  905. int v = 2;
  906. Assert (d <= v, false, "#1");
  907. double v2 = 5;
  908. Assert (d <= v2, true, "#1a");
  909. d = 4.6;
  910. Assert (d <= 4.59, false, "#2");
  911. var b2 = 4.6;
  912. Assert (d <= b2, true, "#2a");
  913. d = new MyType (30);
  914. MyType v3 = new MyType (30);
  915. Assert (d <= v3, true, "#3");
  916. dynamic d3 = new MyType (-7);
  917. Assert (d3 <= new MyType (6), true, "#3a");
  918. Assert (d3 <= 11, true, "#3b");
  919. d = 2m;
  920. decimal v4 = 4m;
  921. Assert (d <= v4, true, "#4");
  922. Assert (d <= 2m, true, "#4a");
  923. }
  924. void LessThanOrEqualNullableTest ()
  925. {
  926. dynamic d = 5;
  927. int? v2 = null;
  928. Assert (d <= v2, false, "#1");
  929. Assert (d <= null, false, "#1a");
  930. Assert (null <= d, false, "#1b");
  931. v2 = -2;
  932. Assert (d <= v2, false, "#2");
  933. dynamic d2 = (int?) -2;
  934. Assert (d2 <= 1, true, "#2a");
  935. d2 = (uint?) 44;
  936. Assert (d2 <= 44, true, "#2b");
  937. d = new MyType (30);
  938. MyType? v3 = new MyType (30);
  939. Assert (d <= v3, true, "#3");
  940. dynamic d3 = new MyType? (new MyType (-7));
  941. Assert (d3 <= new MyType (6), true, "#3a");
  942. Assert (d3 <= null, false, "#3b");
  943. d = 4.1m;
  944. decimal? v4 = 4m;
  945. Assert (d <= v4, false, "#4");
  946. v4 = null;
  947. Assert (d <= v4, false, "#4a");
  948. }
  949. void LessThanOrEqualEnumTest ()
  950. {
  951. dynamic d = MyEnum.Value_1;
  952. Assert (d <= null, false, "#1");
  953. Assert (d <= MyEnum.Value_1, true, "#2");
  954. Assert (d <= 0, false, "#2a");
  955. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  956. Assert (d2 <= MyEnumUlong.Value_2, true, "#3");
  957. Assert (d2 <= null, false, "#3a");
  958. }
  959. void ModuloTest ()
  960. {
  961. dynamic d = 5;
  962. int v = 2;
  963. Assert (d % v, 1, "#1");
  964. MyType v3 = new MyType (30);
  965. Assert (d % v3, new MyType (5), "#3");
  966. dynamic d3 = new MyType (-7);
  967. Assert<MyType> (d3 + new MyType (6), new MyType (-1), "#3a");
  968. Assert (d3 % 11, -7, "#3b");
  969. decimal v4 = 4m;
  970. Assert (d % v4, 1m, "#4");
  971. }
  972. void ModuloNullableTest ()
  973. {
  974. dynamic d = 5;
  975. double? v2 = null;
  976. Assert<double?> (d % v2, null, "#1");
  977. Assert<double?> (d % null, null, "#1a");
  978. Assert<double?> (null % d, null, "#1b");
  979. v2 = -2;
  980. Assert (d % v2, 1, "#2");
  981. dynamic d2 = (int?) -2;
  982. Assert (d2 % 1, 0, "#2a");
  983. MyType? v3 = new MyType (30);
  984. Assert (d % v3, new MyType (5), "#3");
  985. dynamic d3 = new MyType? (new MyType (-7));
  986. Assert (d3 % new MyType (6), new MyType (-1), "#3a");
  987. Assert<MyType?> (d3 + null, null, "#3b");
  988. decimal? v4 = 4m;
  989. Assert (d % v4, 1m, "#4");
  990. v4 = null;
  991. Assert<decimal?> (d % v4, null, "#4a");
  992. }
  993. void ModuloAssignTest ()
  994. {
  995. dynamic d = 5;
  996. int v = 2;
  997. d %= v;
  998. Assert (d, 1, "#1");
  999. d = 5.0;
  1000. double v2 = 0.5;
  1001. d %= v2;
  1002. Assert (d, 0, "#1a");
  1003. d %= v;
  1004. Assert (d, 0, "#1b");
  1005. dynamic d3 = new MyType (-7);
  1006. d3 %= new MyType (6);
  1007. Assert<MyType> (d3, new MyType (-1), "#3");
  1008. d = 5m;
  1009. decimal v4 = 4m;
  1010. d %= v4;
  1011. Assert (d, 1m, "#4");
  1012. }
  1013. void MultiplyTest ()
  1014. {
  1015. dynamic d = 5;
  1016. int v = 2;
  1017. Assert (d * v, 10, "#1");
  1018. double v2 = 0.5;
  1019. Assert (d * v2, 2.5, "#1a");
  1020. MyType v3 = new MyType (30);
  1021. Assert (d * v3, new MyType (150), "#3");
  1022. dynamic d3 = new MyType (-7);
  1023. Assert<MyType> (d3 * new MyType (6), new MyType (-42), "#3a");
  1024. Assert (d3 * 11, -77, "#3b");
  1025. decimal v4 = 4m;
  1026. d = 7.9m;
  1027. Assert (d * v4, 31.6m, "#4");
  1028. }
  1029. void MultiplyNullableTest ()
  1030. {
  1031. dynamic d = 5;
  1032. int? v2 = null;
  1033. Assert<int?> (d * v2, null, "#1");
  1034. Assert<int?> (d * null, null, "#1a");
  1035. Assert<int?> (null * d, null, "#1b");
  1036. v2 = -2;
  1037. Assert (d * v2, -10, "#2");
  1038. dynamic d2 = (int?) -2;
  1039. Assert (d2 * 1, -2, "#2a");
  1040. MyType? v3 = new MyType (30);
  1041. Assert (d * v3, new MyType (150), "#3");
  1042. dynamic d3 = new MyType? (new MyType (-7));
  1043. Assert (d3 * new MyType (6), new MyType (-42), "#3a");
  1044. Assert<MyType?> (d3 * null, null, "#3b");
  1045. decimal? v4 = 4m;
  1046. Assert (d * v4, 20m, "#4");
  1047. v4 = null;
  1048. Assert<decimal?> (d * v4, null, "#4a");
  1049. }
  1050. void MultiplyCheckedTest ()
  1051. {
  1052. checked {
  1053. dynamic d = 5;
  1054. int v = int.MaxValue;
  1055. AssertChecked (() => d * v, 7, "#1");
  1056. int? v2 = v;
  1057. AssertChecked (() => d * v2, null, "#2");
  1058. MyType v3 = new MyType (int.MaxValue);
  1059. AssertChecked (() => d * v3, new MyType (35), "#3");
  1060. }
  1061. }
  1062. void MultiplyAssignTest ()
  1063. {
  1064. dynamic d = 5;
  1065. int v = 2;
  1066. d *= v;
  1067. Assert (d, 10, "#1");
  1068. d = 5.0;
  1069. double v2 = 0.5;
  1070. d *= v2;
  1071. Assert (d, 2.5, "#1a");
  1072. d *= v;
  1073. Assert (d, 5, "#1b");
  1074. dynamic d3 = new MyType (-7);
  1075. d3 *= new MyType (6);
  1076. Assert<MyType> (d3, new MyType (-42), "#3");
  1077. d = 5m;
  1078. decimal v4 = 4m;
  1079. d *= v4;
  1080. Assert (d, 20m, "#4");
  1081. }
  1082. void MultiplyAssignCheckedTest ()
  1083. {
  1084. checked {
  1085. dynamic d = 5;
  1086. int v = int.MaxValue;
  1087. AssertChecked (() => { d *= v; Assert (d, 0, "#1-"); }, "#1");
  1088. MyType v3 = new MyType (int.MaxValue);
  1089. AssertChecked (() => { d *= v3; Assert (d, 0, "#3-"); }, "#3");
  1090. }
  1091. }
  1092. void NotEqualTest ()
  1093. {
  1094. dynamic d = 5;
  1095. int v = 2;
  1096. Assert (d != v, true, "#1");
  1097. double v2 = 5;
  1098. Assert (d != v2, false, "#1a");
  1099. d = true;
  1100. Assert (d != false, true, "#2");
  1101. bool b2 = true;
  1102. Assert (d != b2, false, "#2a");
  1103. d = new MyType (30);
  1104. MyType v3 = new MyType (30);
  1105. Assert (d != v3, false, "#3");
  1106. dynamic d3 = new MyType (-7);
  1107. Assert (d3 != new MyType (6), true, "#3a");
  1108. Assert (d3 != 11, true, "#3b");
  1109. d = 2m;
  1110. decimal v4 = 4m;
  1111. Assert (d != v4, true, "#4");
  1112. Assert (d != 2m, false, "#4a");
  1113. d = null;
  1114. Assert (d != null, false, "#5");
  1115. }
  1116. void NotEqualNullableTest ()
  1117. {
  1118. dynamic d = 5;
  1119. int? v2 = null;
  1120. Assert (d != v2, true, "#1");
  1121. Assert (d != null, true, "#1a");
  1122. Assert (null != d, true, "#1b");
  1123. v2 = -2;
  1124. Assert (d != v2, true, "#2");
  1125. dynamic d2 = (int?) -2;
  1126. Assert (d2 != 1, true, "#2a");
  1127. d2 = (uint?) 44;
  1128. Assert (d2 != 44, false, "#2b");
  1129. d = new MyType (30);
  1130. MyType? v3 = new MyType (30);
  1131. Assert (d != v3, false, "#3");
  1132. dynamic d3 = new MyType? (new MyType (-7));
  1133. Assert (d3 != new MyType (6), true, "#3a");
  1134. Assert (d3 != null, true, "#3b");
  1135. d = 4.1m;
  1136. decimal? v4 = 4m;
  1137. Assert (d != v4, true, "#4");
  1138. v4 = null;
  1139. Assert (d != v4, true, "#4a");
  1140. d = (bool?) true;
  1141. Assert (d != true, false, "#5");
  1142. Assert (d != null, true, "#5a");
  1143. Assert (d != false, true, "#5b");
  1144. }
  1145. void NotEqualEnumTest ()
  1146. {
  1147. dynamic d = MyEnum.Value_1;
  1148. Assert (d != null, true, "#1");
  1149. Assert (d != MyEnum.Value_1, false, "#2");
  1150. Assert (d != 0, true, "#2a");
  1151. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  1152. Assert (d2 != MyEnumUlong.Value_2, false, "#3");
  1153. Assert (d2 != null, true, "#3a");
  1154. }
  1155. void NotEqualStringTest ()
  1156. {
  1157. dynamic d = "text";
  1158. Assert (d != "te", true, "#1");
  1159. Assert (d != "text", false, "#1a");
  1160. Assert (d != null, true, "#1b");
  1161. }
  1162. void OrTest ()
  1163. {
  1164. dynamic d = true;
  1165. var v = false;
  1166. Assert (d | v, true, "#1");
  1167. Assert (d | false, true, "#1a");
  1168. d = 42;
  1169. var v2 = 62;
  1170. Assert (d | v2, 62, "#2");
  1171. Assert (d | 0, 42, "#2a");
  1172. MyType v3 = new MyType (30);
  1173. Assert (d | v3, new MyType (62), "#3");
  1174. dynamic d3 = new MyType (-7);
  1175. Assert<MyType> (d3 | new MyType (6), new MyType (-1), "#3a");
  1176. Assert (d3 | 11, -5, "#3b");
  1177. }
  1178. void OrTestEnum ()
  1179. {
  1180. dynamic d = MyEnum.Value_1;
  1181. Assert<MyEnum?> (d | null, null, "#1");
  1182. Assert (d | d, MyEnum.Value_1, "#2");
  1183. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  1184. Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong) 3, "#3");
  1185. }
  1186. void OrTestNullable ()
  1187. {
  1188. dynamic d = 5;
  1189. int? v2 = null;
  1190. Assert<int?> (d | v2, null, "#1");
  1191. Assert<int?> (d | null, null, "#1a");
  1192. Assert<int?> (null | d, null, "#1b");
  1193. v2 = -2;
  1194. Assert (d | v2, -1, "#2");
  1195. dynamic d2 = (int?) -2;
  1196. Assert (d2 | 1, -1, "#2a");
  1197. MyType? v3 = new MyType (30);
  1198. Assert (d | v3, new MyType (31), "#3");
  1199. dynamic d3 = new MyType? (new MyType (-7));
  1200. Assert (d3 | new MyType (6), new MyType (-1), "#3a");
  1201. Assert<MyType?> (d3 + null, null, "#3b");
  1202. }
  1203. void OrAssignedTest ()
  1204. {
  1205. dynamic d = true;
  1206. var v = false;
  1207. d |= v;
  1208. Assert (d, true, "#1");
  1209. d = true;
  1210. d |= true;
  1211. Assert (d, true, "#1a");
  1212. d = 42;
  1213. var v2 = 62;
  1214. d |= v2;
  1215. Assert (d, 62, "#2");
  1216. MyType v3 = new MyType (30);
  1217. dynamic d3 = new MyType (-7);
  1218. d3 |= new MyType (6);
  1219. Assert<MyType> (d3, new MyType (-1), "#3");
  1220. }
  1221. void OrAssignedTestEnum ()
  1222. {
  1223. dynamic d = MyEnum.Value_1;
  1224. d |= MyEnum.Value_2;
  1225. Assert<MyEnum> (d, (MyEnum) 3, "#1");
  1226. d = MyEnum.Value_2;
  1227. d |= d;
  1228. Assert (d, MyEnum.Value_2, "#2");
  1229. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  1230. Assert<MyEnumUlong> (d2 | MyEnumUlong.Value_2, (MyEnumUlong)3, "#3");
  1231. }
  1232. void OrElseTest ()
  1233. {
  1234. dynamic d = true;
  1235. var v = false;
  1236. Assert<bool> (d || v, true, "#1");
  1237. Assert (d || true, true, "#1a");
  1238. d = true;
  1239. Assert (d || d, true, "#2");
  1240. dynamic d3 = new MyType (-7);
  1241. Assert<MyType> (d3 || new MyType (6), new MyType (-7), "#3");
  1242. Assert (d3 || 11, -7, "#3b");
  1243. }
  1244. void RightShiftTest ()
  1245. {
  1246. dynamic d = (ulong) 0x7F000;
  1247. int v = 2;
  1248. Assert<ulong> (d >> v, 0x1FC00, "#1");
  1249. Assert<ulong> (d >> 1, 0x3F800, "#1a");
  1250. short s = 2;
  1251. Assert<ulong> (d >> s, 0x1FC00, "#1b");
  1252. d = 0x7F000;
  1253. MyType v3 = new MyType (3);
  1254. Assert (d >> v3, new MyType (0xFE00), "#3");
  1255. dynamic d3 = new MyType (-7);
  1256. Assert (d3 >> new MyType (6), new MyType (-1), "#3a");
  1257. Assert (d3 >> 11, -1, "#3b");
  1258. }
  1259. void RightShiftNullableTest ()
  1260. {
  1261. dynamic d = 5;
  1262. int? v2 = null;
  1263. Assert<int?> (d >> v2, null, "#1");
  1264. d = 5;
  1265. Assert<int?> (d >> null, null, "#1a");
  1266. d = 5;
  1267. Assert<int?> (null >> d, null, "#1b");
  1268. v2 = -2;
  1269. Assert (d >> v2, 0, "#2");
  1270. dynamic d2 = (int?) -200;
  1271. Assert (d2 >> 1, -100, "#2a");
  1272. d = 0xFFFFFF;
  1273. MyType? v3 = new MyType (3);
  1274. Assert (d >> v3, new MyType (0x1FFFFF), "#3");
  1275. dynamic d3 = new MyType? (new MyType (-7));
  1276. Assert (d3 >> new MyType (6), new MyType (-1), "#3a");
  1277. Assert<MyType?> (d3 >> null, null, "#3b");
  1278. }
  1279. void RightShiftAssignTest ()
  1280. {
  1281. dynamic d = 0x7F000;
  1282. int v = 2;
  1283. d >>= v;
  1284. Assert (d, 0x1FC00, "#1");
  1285. d >>= 1;
  1286. Assert (d, 0xFE00, "#1a");
  1287. sbyte s = 2;
  1288. d >>= s;
  1289. Assert (d, 0x3F80, "#1b");
  1290. }
  1291. void RightShiftAssignNullableTest ()
  1292. {
  1293. dynamic d = 0x2A0;
  1294. var v2 = -2;
  1295. d >>= v2;
  1296. Assert (d, 0, "#2");
  1297. dynamic d2 = (int?) -2;
  1298. d2 >>= 1;
  1299. Assert (d2, -1, "#2a");
  1300. d = 0xFFFFFF;
  1301. MyType? v3 = new MyType (3);
  1302. d >>= v3;
  1303. Assert (d, new MyType (0x1FFFFF), "#3");
  1304. }
  1305. void SubtractTest ()
  1306. {
  1307. dynamic d = 5;
  1308. int v = 2;
  1309. Assert (d - v, 3, "#1");
  1310. double v2 = 0.5;
  1311. Assert (d - v2, 4.5, "#1a");
  1312. MyType v3 = new MyType (30);
  1313. Assert (d - v3, new MyType (-25), "#3");
  1314. dynamic d3 = new MyType (-7);
  1315. Assert<MyType> (d3 - new MyType (6), new MyType (-13), "#3a");
  1316. Assert (d3 - 11, -18, "#3b");
  1317. decimal v4 = 4m;
  1318. Assert (d - v4, 1m, "#4");
  1319. }
  1320. void SubtractNullableTest ()
  1321. {
  1322. dynamic d = 5;
  1323. int? v2 = null;
  1324. Assert<int?> (d - v2, null, "#1");
  1325. Assert<int?> (d - null, null, "#1a");
  1326. Assert<int?> (null - d, null, "#1b");
  1327. v2 = -2;
  1328. Assert (d - v2, 7, "#2");
  1329. dynamic d2 = (int?) -2;
  1330. Assert (d2 - 1, -3, "#2a");
  1331. MyType? v3 = new MyType (30);
  1332. Assert (d - v3, new MyType (-25), "#3");
  1333. dynamic d3 = new MyType? (new MyType (-7));
  1334. Assert (d3 - new MyType (6), new MyType (-13), "#3a");
  1335. Assert<MyType?> (d3 - null, null, "#3b");
  1336. decimal? v4 = 4m;
  1337. Assert (d - v4, 1m, "#4");
  1338. v4 = null;
  1339. Assert<decimal?> (d - v4, null, "#4a");
  1340. }
  1341. void SubtractEnumTest ()
  1342. {
  1343. dynamic d = MyEnum.Value_1;
  1344. // CSC: Invalid System.InvalidOperationException
  1345. Assert (d - null, null, "#1");
  1346. Assert (d - 1, MyEnum.Value_2, "#2");
  1347. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_1;
  1348. Assert (d2 - (byte) 1, MyEnumUlong.Value_2, "#3");
  1349. Assert<MyEnumUlong?> (d2 - (object) null, null, "#3a");
  1350. }
  1351. void SubtractCheckedTest ()
  1352. {
  1353. checked {
  1354. dynamic d = 5;
  1355. int v = int.MinValue;
  1356. AssertChecked (() => d - v, 7, "#1");
  1357. int? v2 = v;
  1358. AssertChecked (() => d - v2, null, "#2");
  1359. MyType v3 = new MyType (int.MinValue);
  1360. AssertChecked (() => d - v3, new MyType (35), "#3");
  1361. }
  1362. }
  1363. void SubtractAssignTest ()
  1364. {
  1365. dynamic d = 5;
  1366. int v = 2;
  1367. d -= v;
  1368. Assert (d, 3, "#1");
  1369. d = 5.0;
  1370. double v2 = 0.5;
  1371. d -= v2;
  1372. Assert (d, 4.5, "#1a");
  1373. d -= v;
  1374. Assert (d, 2.5, "#1b");
  1375. dynamic d3 = new MyType (-7);
  1376. d3 -= new MyType (6);
  1377. Assert<MyType> (d3, new MyType (-13), "#3");
  1378. d = 5m;
  1379. decimal v4 = 4m;
  1380. d -= v4;
  1381. Assert (d, 1m, "#4");
  1382. }
  1383. void SubtractAssignEnumTest ()
  1384. {
  1385. dynamic d = MyEnum.Value_1;
  1386. d -= 1;
  1387. Assert<MyEnum> (d, 0, "#2");
  1388. dynamic d2 = (MyEnumUlong?) MyEnumUlong.Value_2;
  1389. d2 -= (byte) 1;
  1390. Assert (d2, MyEnumUlong.Value_1, "#3");
  1391. }
  1392. void SubtractAssignCheckedTest ()
  1393. {
  1394. checked {
  1395. dynamic d = 5;
  1396. int v = int.MinValue;
  1397. AssertChecked (() => { d -= v; Assert (d, 0, "#1a"); }, "#1");
  1398. MyType v3 = new MyType (int.MinValue);
  1399. AssertChecked (() => { d -= v3; Assert (d, 0, "#3a"); }, "#3");
  1400. }
  1401. }
  1402. // TODO:
  1403. void SubtractAssignmentEvent ()
  1404. {
  1405. // IMPLEMENT
  1406. }
  1407. #pragma warning restore 169
  1408. static bool RunTest (MethodInfo test)
  1409. {
  1410. Console.Write ("Running test {0, -25}", test.Name);
  1411. try {
  1412. test.Invoke (new Tester (), null);
  1413. Console.WriteLine ("OK");
  1414. return true;
  1415. } catch (Exception e) {
  1416. Console.WriteLine ("FAILED");
  1417. Console.WriteLine (e.InnerException.Message);
  1418. return false;
  1419. }
  1420. }
  1421. public static int Main ()
  1422. {
  1423. var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
  1424. where test.GetParameters ().Length == 0
  1425. orderby test.Name
  1426. select RunTest (test);
  1427. int failures = tests.Count (a => !a);
  1428. Console.WriteLine (failures + " tests failed");
  1429. return failures;
  1430. }
  1431. }