'use strict';

const assert = require('assert');
const testUtil = require('./testUtil');

module.exports = require('./common').runTest(test);

function test (binding) {
  return testUtil.runGCTests([
    'Internal Buffer',
    () => {
      const test = binding.buffer.createBuffer();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);

      const test2 = Buffer.alloc(test.length);
      test.copy(test2);
      binding.buffer.checkBuffer(test2);
    },

    'Buffer copy',
    () => {
      const test = binding.buffer.createBufferCopy();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
    },

    'External Buffer',
    () => {
      const test = binding.buffer.createExternalBuffer();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },

    'External Buffer with finalizer',
    () => {
      const test = binding.buffer.createExternalBufferWithFinalize();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
    },
    () => {
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },

    'External Buffer with finalizer hint',
    () => {
      const test = binding.buffer.createExternalBufferWithFinalizeHint();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
    },
    () => {
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },

    'Create or Copy External Buffer',
    () => {
      const test = binding.buffer.createOrCopyExternalBuffer();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },

    'Create or Copy External Buffer with finalizer',
    () => {
      const test = binding.buffer.createOrCopyExternalBufferWithFinalize();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
    },
    () => {
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },

    'Create or Copy External Buffer with finalizer hint',
    () => {
      const test = binding.buffer.createOrCopyExternalBufferWithFinalizeHint();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
    },
    () => {
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },

    'Create or Copy External Buffer when NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED defined',
    () => {
      const test = binding.bufferNoExternal.createOrCopyExternalBuffer();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
      assert.strictEqual(0, binding.buffer.getFinalizeCount());
    },

    'Create or Copy External Buffer with finalizer when NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED defined',
    () => {
      const test = binding.bufferNoExternal.createOrCopyExternalBufferWithFinalize();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      // finalizer should have been called when the buffer was created.
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
    },
    () => {
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },

    'Create or Copy External Buffer with finalizer hint when NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED defined',
    () => {
      const test = binding.bufferNoExternal.createOrCopyExternalBufferWithFinalizeHint();
      binding.buffer.checkBuffer(test);
      assert.ok(test instanceof Buffer);
      // finalizer should have been called when the buffer was created.
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    },
    () => {
      global.gc();
    },
    () => {
      assert.strictEqual(1, binding.buffer.getFinalizeCount());
    }
  ]);
}
