+describe("isArraylikeObject", () => {
+ it("[[Call]] returns false for primitives", () => {
+ assertStrictEquals(isArraylikeObject("failure"), false);
+ });
+
+ it("[[Call]] returns false if length throws", () => {
+ assertStrictEquals(
+ isArraylikeObject({
+ get length() {
+ throw void {};
+ },
+ }),
+ false,
+ );
+ });
+
+ it("[[Call]] returns false if length is not a number and cannot be converted to one", () => {
+ assertStrictEquals(isArraylikeObject({ length: 1n }), false);
+ });
+
+ it("[[Call]] returns true if length is convertable to a number", () => {
+ assertStrictEquals(isArraylikeObject({ length: -0 }), true);
+ assertStrictEquals(isArraylikeObject({ length: 1 }), true);
+ assertStrictEquals(isArraylikeObject({ length: -1.25 }), true);
+ assertStrictEquals(
+ isArraylikeObject({ length: 9007199254740992 }),
+ true,
+ );
+ assertStrictEquals(isArraylikeObject({ length: Infinity }), true);
+ assertStrictEquals(isArraylikeObject({ length: "success" }), true);
+ });
+
+ it("[[Construct]] throws an error", () => {
+ assertThrows(() => new isArraylikeObject({}));
+ });
+
+ describe(".length", () => {
+ it("[[Get]] returns the correct length", () => {
+ assertStrictEquals(isArraylikeObject.length, 1);
+ });
+ });
+
+ describe(".name", () => {
+ it("[[Get]] returns the correct name", () => {
+ assertStrictEquals(
+ isArraylikeObject.name,
+ "isArraylikeObject",
+ );
+ });
+ });
+});
+
+describe("isConcatSpreadableObject", () => {
+ it("[[Call]] returns false for primitives", () => {
+ assertStrictEquals(isConcatSpreadableObject("failure"), false);
+ });
+
+ it("[[Call]] returns false if [Symbol.isConcatSpreadable] is null or false", () => {
+ assertStrictEquals(
+ isConcatSpreadableObject(
+ Object.assign([], { [Symbol.isConcatSpreadable]: null }),
+ ),
+ false,
+ );
+ assertStrictEquals(
+ isConcatSpreadableObject(
+ Object.assign([], { [Symbol.isConcatSpreadable]: false }),
+ ),
+ false,
+ );
+ });
+
+ it("[[Call]] returns true if [Symbol.isConcatSpreadable] is undefined and the object is an array", () => {
+ assertStrictEquals(
+ isConcatSpreadableObject(
+ Object.assign([], { [Symbol.isConcatSpreadable]: undefined }),
+ ),
+ true,
+ );
+ });
+
+ it("[[Call]] returns true if [Symbol.isConcatSpreadable] is true", () => {
+ assertStrictEquals(
+ isConcatSpreadableObject({ [Symbol.isConcatSpreadable]: true }),
+ true,
+ );
+ });
+
+ it("[[Construct]] throws an error", () => {
+ assertThrows(() => new isConcatSpreadableObject({}));
+ });
+
+ describe(".length", () => {
+ it("[[Get]] returns the correct length", () => {
+ assertStrictEquals(isConcatSpreadableObject.length, 1);
+ });
+ });
+
+ describe(".name", () => {
+ it("[[Get]] returns the correct name", () => {
+ assertStrictEquals(
+ isConcatSpreadableObject.name,
+ "isConcatSpreadableObject",
+ );
+ });
+ });
+});
+