/* eslint id-length: 0 */

"use strict";

var memoize = require("../..");

module.exports = {
	"": function (a) {
		var i = 0
		  , fn = function (x, y, z) {
				++i;
				return x + y + z;
			}
		  , mfn
		  , y = { toString: function () { return "foo"; } };
		mfn = memoize(fn, { primitive: true });
		a(mfn(y, "bar", "zeta"), "foobarzeta", "#1");
		a(mfn("foo", "bar", "zeta"), "foobarzeta", "#2");
		a(i, 1, "Called once");
	},
	"Delete": function (a) {
		var i = 0
		  , fn = function (x, y, z) {
				++i;
				return x + y + z;
			}
		  , mfn
		  , y = { toString: function () { return "foo"; } };
		mfn = memoize(fn, { primitive: true });
		a(mfn(y, "bar", "zeta"), "foobarzeta", "#1");
		a(mfn("foo", "bar", "zeta"), "foobarzeta", "#2");
		a(i, 1, "Called once");
		mfn.delete("foo", { toString: function () { return "bar"; } }, "zeta");
		a(mfn(y, "bar", "zeta"), "foobarzeta", "#3");
		a(i, 2, "Called twice");
	},
	"Clear": function (a) {
		var i = 0, fn;
		fn = memoize(function (x) { if (++i < 2) fn(x); });
		a.throws(function () { fn("foo"); }, "CIRCULAR_INVOCATION");

		i = 0;
		fn = memoize(function (x, y) { if (++i < 2) fn(x, y); });
		a.throws(function () { fn("foo", "bar"); }, "CIRCULAR_INVOCATION");
	},
};
