forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
import haxe.ds.WeakMap;
 | 
						|
 | 
						|
class WeakObjectData
 | 
						|
{
 | 
						|
   public var id:Int;
 | 
						|
   public function new(inId:Int) id = inId;
 | 
						|
   public function toString() return "Data " + id;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class TestWeakHash extends haxe.unit.TestCase
 | 
						|
{
 | 
						|
   var retained:Array<WeakObjectData>;
 | 
						|
 | 
						|
   function createMap(inCount:Int)
 | 
						|
   {
 | 
						|
      retained = [];
 | 
						|
      var map = new WeakMap<WeakObjectData,Int>();
 | 
						|
      for(i in 0...inCount)
 | 
						|
      {
 | 
						|
         var obj = new WeakObjectData(i);
 | 
						|
         if ( (i&1)==0 )
 | 
						|
            retained.push(obj);
 | 
						|
         map.set(obj,i);
 | 
						|
      }
 | 
						|
      return map;
 | 
						|
   }
 | 
						|
   function createMapDeep(inDepth:Int, inCount:Int)
 | 
						|
   {
 | 
						|
      if (inDepth<1)
 | 
						|
         return createMap(inCount);
 | 
						|
 | 
						|
      return createMapDeep(inDepth-1, inCount);
 | 
						|
   }
 | 
						|
 | 
						|
   function checkMap(map:WeakMap<WeakObjectData,Int>, expect:Int)
 | 
						|
   {
 | 
						|
      var valid = 0;
 | 
						|
      var oddFound = 0;
 | 
						|
      for(k in map.keys())
 | 
						|
      {
 | 
						|
         if( (k.id&1)!= 0)
 | 
						|
         {
 | 
						|
            oddFound ++;
 | 
						|
            //throw "Odd retained " + k.id;
 | 
						|
         }
 | 
						|
         else
 | 
						|
            valid++;
 | 
						|
      }
 | 
						|
      // There may be one or two values lurking on the stack, which is conservatively marked
 | 
						|
      if (oddFound>2)
 | 
						|
         trace("Too many odd values retained " + oddFound);
 | 
						|
      if (!(valid>=expect && valid<expect+2))
 | 
						|
         trace("WeakHash invalid range "+ expect + "..." + valid + "..." + (expect+2) );
 | 
						|
      assertTrue(valid>=expect && valid<expect+2);
 | 
						|
   }
 | 
						|
   function deepCheckMap(inDepth:Int, map:WeakMap<WeakObjectData,Int>, expect:Int)
 | 
						|
   {
 | 
						|
      if (inDepth<1)
 | 
						|
         checkMap(map,expect);
 | 
						|
      else
 | 
						|
         deepCheckMap(inDepth-1, map, expect);
 | 
						|
   }
 | 
						|
 | 
						|
   function deepClearRetained(inRecurse:Int)
 | 
						|
   {
 | 
						|
      if (inRecurse>0)
 | 
						|
         deepClearRetained(inRecurse-1);
 | 
						|
      else
 | 
						|
         retained = [];
 | 
						|
   }
 | 
						|
 | 
						|
   public function test()
 | 
						|
   {
 | 
						|
      var err = "";
 | 
						|
      try
 | 
						|
      {
 | 
						|
         var map = createMapDeep(20,1000);
 | 
						|
         cpp.vm.Gc.run(true);
 | 
						|
         deepCheckMap(10,map,500);
 | 
						|
         deepClearRetained(10);
 | 
						|
         cpp.vm.Gc.run(true);
 | 
						|
         checkMap(map,0);
 | 
						|
      }
 | 
						|
      catch(e:String)
 | 
						|
      {
 | 
						|
         trace(e);
 | 
						|
         err = e;
 | 
						|
      }
 | 
						|
      assertTrue(err=="");
 | 
						|
   }
 | 
						|
 | 
						|
}
 |