// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-finalization-registry-target
description: >
  cleanupCallback has only one optional chance to be called for a GC that cleans up
  a registered target.
info: |
  FinalizationRegistry ( cleanupCallback )

  FinalizationRegistry.prototype.cleanupSome ( [ callback ] )

  ...
  4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception.
  5. Perform ? CleanupFinalizationRegistry(finalizationRegistry, callback).
  6. Return undefined.

  Execution

  At any time, if an object obj is not live, an ECMAScript implementation may perform the following steps atomically:

  1. For each WeakRef ref such that ref.[[Target]] is obj,
    a. Set ref.[[Target]] to empty.
  2. For each FinalizationRegistry finalizationRegistry such that finalizationRegistry.[[Cells]] contains cell, such that cell.[[Target]] is obj,
    a. Set cell.[[Target]] to empty.
    b. Optionally, perform ! HostCleanupFinalizationRegistry(finalizationRegistry).
features: [FinalizationRegistry, async-functions, host-gc-required]
flags: [async, non-deterministic]
includes: [async-gc.js]
---*/

var cleanupCallback = 0;
var called = 0;

function cb(holding) {
  assert.sameValue(holding, 'a');
  called += 1;
}

var finalizationRegistry = new FinalizationRegistry(function() {
  cleanupCallback += 1;
});

function emptyCells() {
  var target = {};
  finalizationRegistry.register(target, 'a');

  var prom = asyncGC(target);
  target = null;

  return prom;
}

emptyCells()
  .then(async function() {
  await Promise.resolve(1);

  finalizationRegistry.cleanupSome(cb);

  // cleanupSome will be invoked if there are empty cells left. If the
  // cleanupCallback already ran, then cb won't be called.
  let expectedCalled = cleanupCallback === 1 ? 0 : 1;
  // This asserts the registered object was emptied in the previous GC.
  assert.sameValue(called, expectedCalled, 'cleanupSome callback for the first time');

  // At this point, we can't assert if cleanupCallback was called, because it's
  // optional. Although, we can finally assert it's not gonna be called anymore
  // for the other executions of the Garbage Collector.
  // The chance of having it called only happens right after the
  // cell.[[Target]] is set to empty.
  assert(cleanupCallback >= 0, 'cleanupCallback might be 0');
  assert(cleanupCallback <= 1, 'cleanupCallback might be 1');

  // Restoring the cleanupCallback variable to 0 will help us asserting the
  // finalizationRegistry callback is not called again.
  cleanupCallback = 0;

  await $262.gc();
  await Promise.resolve(2); // tick

  finalizationRegistry.cleanupSome(cb);

  assert.sameValue(called, expectedCalled, 'cleanupSome callback is not called anymore, no empty cells');
  assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #1');

  await $262.gc();
  await Promise.resolve(3); // tick

  finalizationRegistry.cleanupSome(cb);

  assert.sameValue(called, expectedCalled, 'cleanupSome callback is not called again #2');
  assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #2');

  await $262.gc();
  })
  .then($DONE, resolveAsyncGC);
