TestSerialize.hx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package unit;
  2. class TestSerialize extends Test {
  3. function id<T>( v : T ) : T {
  4. return haxe.Unserializer.run(haxe.Serializer.run(v));
  5. }
  6. function test() {
  7. // basic types
  8. var values : Array<Dynamic> = [null, true, false, 0, 1, 1506, -0xABCDEF, 12.3, -1e10, "hello", "éé", "\r\n", "\n", " ", ""];
  9. for( v in values )
  10. eq( id(v), v );
  11. t( Math.isNaN(id(Math.NaN)) );
  12. t( id(Math.POSITIVE_INFINITY) > 0 );
  13. f( id(Math.NEGATIVE_INFINITY) > 0 );
  14. f( Math.isFinite(id(Math.POSITIVE_INFINITY)) );
  15. f( Math.isFinite(id(Math.NEGATIVE_INFINITY)) );
  16. // array/list
  17. doTestCollection([]);
  18. doTestCollection([1,2,4,5]);
  19. doTestCollection([1,2,null,null,null,null,null,4,5]);
  20. // date
  21. var d = Date.now();
  22. var d2 = id(d);
  23. t( Std.is(d2,Date) );
  24. eq( d2.toString(), d.toString() );
  25. // object
  26. var o = { x : "a", y : -1.56, z : "hello" };
  27. var o2 = id(o);
  28. eq(o.x,o2.x);
  29. eq(o.y,o2.y);
  30. eq(o.z,o2.z);
  31. // class instance
  32. var c = new MyClass(999);
  33. c.intValue = 33;
  34. c.stringValue = "Hello";
  35. var c2 = id(c);
  36. t( Std.is(c2,MyClass) );
  37. f( c == c2 );
  38. eq( c2.intValue, c.intValue );
  39. eq( c2.stringValue, c.stringValue );
  40. eq( c2.get(), 999 );
  41. // enums
  42. haxe.Serializer.USE_ENUM_INDEX = false;
  43. doTestEnums();
  44. haxe.Serializer.USE_ENUM_INDEX = true;
  45. doTestEnums();
  46. // StringMap
  47. var h = new haxe.ds.StringMap();
  48. h.set("keya",2);
  49. h.set("kéyb",-465);
  50. var h2 = id(h);
  51. t( Std.is(h2,haxe.ds.StringMap) );
  52. eq( h2.get("keya"), 2 );
  53. eq( h2.get("kéyb"), -465 );
  54. eq( Lambda.count(h2), 2 );
  55. // IntMap
  56. var h = new haxe.ds.IntMap();
  57. h.set(55,2);
  58. h.set(-101,-465);
  59. var h2 = id(h);
  60. t( Std.is(h2,haxe.ds.IntMap) );
  61. eq( h2.get(55), 2 );
  62. eq( h2.get(-101), -465 );
  63. eq( Lambda.count(h2), 2 );
  64. // ObjectMap
  65. var h = new haxe.ds.ObjectMap();
  66. var a = new unit.MyAbstract.ClassWithoutHashCode(9);
  67. var b = new unit.MyAbstract.ClassWithoutHashCode(8);
  68. h.set(a, b);
  69. h.set(b, a);
  70. var h2 = id(h);
  71. t(Std.is(h2, haxe.ds.ObjectMap));
  72. // these are NOT the same objects
  73. f(h2.exists(a));
  74. f(h2.exists(b));
  75. // all these should still work
  76. t(h.exists(a));
  77. t(h.exists(b));
  78. eq(h.get(a), b);
  79. eq(h.get(b), a);
  80. var nothing = true;
  81. for (k in h2.keys()) {
  82. nothing = false;
  83. t(k.i == 8 || k.i == 9);
  84. t(h2.exists(k));
  85. var v = h2.get(k);
  86. t(v.i == 8 || v.i == 9);
  87. }
  88. f(nothing);
  89. // bytes
  90. doTestBytes(haxe.io.Bytes.alloc(0));
  91. doTestBytes(haxe.io.Bytes.ofString("A"));
  92. doTestBytes(haxe.io.Bytes.ofString("AB"));
  93. doTestBytes(haxe.io.Bytes.ofString("ABC"));
  94. doTestBytes(haxe.io.Bytes.ofString("ABCD"));
  95. doTestBytes(haxe.io.Bytes.ofString("héllé"));
  96. var b = haxe.io.Bytes.alloc(100);
  97. for( i in 0...b.length )
  98. b.set(i,i%10);
  99. doTestBytes(b);
  100. // recursivity
  101. c.ref = c;
  102. haxe.Serializer.USE_CACHE = true;
  103. var c2 = id(c);
  104. haxe.Serializer.USE_CACHE = false;
  105. eq( c2.ref, c2 );
  106. // errors
  107. #if !cpp
  108. exc(function() haxe.Unserializer.run(null));
  109. #end
  110. exc(function() haxe.Unserializer.run(""));
  111. }
  112. function doTestEnums() {
  113. eq( id(MyEnum.A), MyEnum.A );
  114. eq( id(MyEnum.B), MyEnum.B );
  115. var c = MyEnum.C(0,"hello");
  116. t( Type.enumEq( id(c), c ) );
  117. t( Type.enumEq( id(MyEnum.D(MyEnum.D(c))), MyEnum.D(MyEnum.D(c)) ) );
  118. t( Std.is(id(c),MyEnum) );
  119. t(switch( id(c) ) {
  120. case C(_,_): true;
  121. default: false;
  122. });
  123. }
  124. function doTestCollection( a : Array<Dynamic> ) {
  125. var a2 = id(a);
  126. eq( a2.length, a.length );
  127. for( i in 0...a.length )
  128. eq( a2[i], a[i] );
  129. var l = Lambda.list(a);
  130. var l2 = id(l);
  131. t( Std.is(l2,List) );
  132. eq( l2.length, l.length );
  133. var it = l.iterator();
  134. for( x in l2 )
  135. eq( x, it.next() );
  136. f( it.hasNext() );
  137. }
  138. function doTestBytes( b : haxe.io.Bytes ) {
  139. var b2 = id(b);
  140. t( Std.is(b2,haxe.io.Bytes) );
  141. eq( b2.length, b.length );
  142. for( i in 0...b.length )
  143. eq( b2.get(i), b.get(i) );
  144. infos(null);
  145. }
  146. }