// Debugger.Memory.prototype.takeCensus behaves plausibly as we allocate objects.

// Exact object counts vary in ways we can't predict. For example,
// BaselineScripts can hold onto "template objects", which exist only to hold
// the shape and type for newly created objects. When BaselineScripts are
// discarded, these template objects go with them.
//
// So instead of expecting precise counts, we expect counts that are at least as
// many as we would expect given the object graph we've built.

load(libdir + 'census.js');

// A Debugger with no debuggees had better not find anything.
var dbg = new Debugger;
var census0 = dbg.memory.takeCensus();
Census.walkCensus(census0, "census0", Census.assertAllZeros);

function newGlobalWithDefs() {
  var g = newGlobal();
  g.eval(`
         function times(n, fn) {
           var a=[];
           for (var i = 0; i<n; i++)
             a.push(fn());
           return a;
         }`);
  return g;
}

// Allocate a large number of various types of objects, and check that census
// finds them.
var g = newGlobalWithDefs();
dbg.addDebuggee(g);

g.eval('var objs = times(100, () => ({}));');
g.eval('var rxs  = times(200, () => /foo/);');
g.eval('var ars  = times(400, () => []);');
g.eval('var fns  = times(800, () => () => {});');

var census1 = dbg.memory.takeCensus();
Census.walkCensus(census1, "census1",
                  Census.assertAllNotLessThan(
                    { 'objects':
                      { 'Object':   { count: 100 },
                        'RegExp':   { count: 200 },
                        'Array':    { count: 400 },
                        'Function': { count: 800 }
                      }
                    }));
