'use strict';

var test = require('tape');
var inspect = require('object-inspect');
var is = require('object-is');
var forEach = require('for-each');
var v = require('es-value-fixtures');

var unboxPrimitive = require('..');

test('primitives', function (t) {
	forEach([null, undefined], function (nullValue) {
		t['throws'](
			// @ts-expect-error
			function () { unboxPrimitive(nullValue); },
			TypeError,
			inspect(nullValue) + ' is not a primitive'
		);
	});

	// eslint-disable-next-line no-extra-parens
	forEach(/** @type {typeof v.nonNullPrimitives} */ ([].concat(
		// @ts-expect-error TS sucks with concat
		v.nonNullPrimitives,
		v.zeroes,
		v.infinities,
		NaN
	)), function (primitive) {
		var obj = Object(primitive);
		t.ok(
			is(unboxPrimitive(obj), primitive),
			inspect(obj) + 'unboxes to ' + inspect(primitive)
		);
	});

	t.end();
});

test('objects', function (t) {
	// eslint-disable-next-line no-extra-parens
	forEach(/** @type {typeof v.objects} */ (/** @type {unknown} */ ([].concat(
		// @ts-expect-error TS sucks with concat
		v.objects,
		{},
		[],
		function () {},
		/a/g,
		new Date()
	))), function (object) {
		t['throws'](
			// @ts-expect-error
			function () { unboxPrimitive(object); },
			TypeError,
			inspect(object) + ' is not a primitive'
		);
	});

	t.end();
});