TestGeneric.hx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package unit;
  2. @:generic
  3. class MyGeneric<T> {
  4. public var t:T;
  5. public function new(t:T) {
  6. this.t = t;
  7. }
  8. }
  9. @:generic
  10. class MyGeneric2<T> extends T {
  11. //public function new() { } // not allowed
  12. }
  13. class MyRandomClass {
  14. public var s:String;
  15. public function new(s:String) {
  16. this.s = s;
  17. }
  18. }
  19. class MyRandomEmptyClass { }
  20. @:generic class RBNode<T:RBNode<T>> {
  21. public var rbLeft : T;
  22. public var rbRight : T;
  23. }
  24. @:generic class RBTree<T:RBNode<T>> {
  25. public var root : T;
  26. public function new() { }
  27. }
  28. class MyData extends RBNode<MyData> {
  29. var id : Int;
  30. public function new(id:Int) {
  31. this.id = id;
  32. }
  33. }
  34. class TestGeneric extends Test {
  35. function testBasic() {
  36. var mg = new MyGeneric<Int>(12);
  37. eq(mg.t, 12);
  38. t(Std.is(mg.t, Int));
  39. var mg = new MyGeneric<String>("12");
  40. eq(mg.t,"12");
  41. t(Std.is(mg.t, String));
  42. }
  43. function testExtends() {
  44. // basic class
  45. //t(unit.TestType.typeError(new MyGeneric2<String>()));
  46. // not a class
  47. //t(unit.TestType.typeError(new MyGeneric2<Int>()));
  48. // no constructor
  49. //t(unit.TestType.typeError(new MyGeneric2<MyRandomEmptyClass>()));
  50. var mg = new MyGeneric2<MyRandomClass>("foo");
  51. eq("foo", mg.s);
  52. var mg = new MyGeneric2<MyGeneric<MyRandomClass>>(new MyRandomClass("foo"));
  53. eq("foo", mg.t.s);
  54. }
  55. function testConstraints() {
  56. var n = new RBTree<MyData>();
  57. n.root = new MyData(1);
  58. n.root.rbLeft = new MyData(2);
  59. n.root.rbRight = new MyData(3);
  60. }
  61. }