Skip to content

Commit 59e297d

Browse files
authored
Merge pull request #8 from klmhyeonwoo/feature/util-workspace
2 parents c6d9a8b + 7efa5c0 commit 59e297d

4 files changed

Lines changed: 136 additions & 0 deletions

File tree

package/commonUtil/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as isEmpty } from "./isEmpty";
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import { describe, expect, test } from "vitest";
2+
import isEmpty from ".";
3+
4+
describe("isEmpty 유틸 함수 테스트", () => {
5+
describe("비어있지 않은 값에 대해 false를 반환해야 함", () => {
6+
test("비어있지 않은 문자열에 대해 false를 반환한다", () => {
7+
expect(isEmpty("hello")).toBe(false);
8+
expect(isEmpty("world")).toBe(false);
9+
expect(isEmpty(" ")).toBe(false);
10+
});
11+
12+
test("0이 아닌 숫자에 대해 false를 반환한다", () => {
13+
expect(isEmpty(123)).toBe(false);
14+
expect(isEmpty(-1)).toBe(false);
15+
expect(isEmpty(3.14)).toBe(false);
16+
expect(isEmpty(Infinity)).toBe(false);
17+
expect(isEmpty(-Infinity)).toBe(false);
18+
});
19+
20+
test("비어있지 않은 배열에 대해 false를 반환한다", () => {
21+
expect(isEmpty([1, 2, 3])).toBe(false);
22+
expect(isEmpty(["a"])).toBe(false);
23+
expect(isEmpty([null])).toBe(false);
24+
expect(isEmpty([undefined])).toBe(false);
25+
});
26+
27+
test("0에 대해 false를 반환한다", () => {
28+
expect(isEmpty(0)).toBe(false);
29+
});
30+
31+
test("비어있지 않은 객체에 대해 false를 반환한다", () => {
32+
expect(isEmpty({ a: 1 })).toBe(false);
33+
expect(isEmpty({ foo: "bar" })).toBe(false);
34+
expect(isEmpty({ nested: { value: true } })).toBe(false);
35+
expect(isEmpty({ null: null })).toBe(false);
36+
});
37+
38+
test("불린 값에 대해 false를 반환한다", () => {
39+
expect(isEmpty(true)).toBe(false);
40+
expect(isEmpty(false)).toBe(false);
41+
});
42+
});
43+
44+
describe("빈 값에 대해 true를 반환해야 함", () => {
45+
test("빈 문자열에 대해 true를 반환한다", () => {
46+
expect(isEmpty("")).toBe(true);
47+
});
48+
49+
test("빈 배열에 대해 true를 반환한다", () => {
50+
expect(isEmpty([])).toBe(true);
51+
});
52+
53+
test("빈 객체에 대해 true를 반환한다", () => {
54+
expect(isEmpty({})).toBe(true);
55+
});
56+
57+
test("null과 undefined에 대해 true를 반환한다", () => {
58+
expect(isEmpty(null)).toBe(true);
59+
expect(isEmpty(undefined)).toBe(true);
60+
});
61+
});
62+
63+
describe("엣지 케이스", () => {
64+
test("NaN을 처리한다", () => {
65+
expect(isEmpty(NaN)).toBe(true);
66+
});
67+
68+
test("Date 객체를 처리한다", () => {
69+
const validDate = new Date();
70+
const invalidDate = new Date("invalid");
71+
72+
expect(isEmpty(validDate)).toBe(false);
73+
expect(isEmpty(invalidDate)).toBe(true);
74+
});
75+
76+
test("Set과 Map을 처리한다", () => {
77+
const emptySet = new Set();
78+
const nonEmptySet = new Set([1, 2, 3]);
79+
const emptyMap = new Map();
80+
const nonEmptyMap = new Map([["key", "value"]]);
81+
82+
expect(isEmpty(emptySet)).toBe(true);
83+
expect(isEmpty(nonEmptySet)).toBe(false);
84+
expect(isEmpty(emptyMap)).toBe(true);
85+
expect(isEmpty(nonEmptyMap)).toBe(false);
86+
});
87+
88+
test("함수를 처리한다", () => {
89+
const func = () => {};
90+
const namedFunc = function test() {};
91+
92+
expect(isEmpty(func)).toBe(false);
93+
expect(isEmpty(namedFunc)).toBe(false);
94+
});
95+
96+
test("심볼을 처리한다", () => {
97+
const symbol = Symbol("test");
98+
expect(isEmpty(symbol)).toBe(false);
99+
});
100+
101+
test("빈 심볼의 경우 true를 반환한다", () => {
102+
const emptySymbol = Symbol();
103+
expect(isEmpty(emptySymbol)).toBe(true);
104+
});
105+
});
106+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export default function isEmpty(value: unknown): boolean {
2+
if (value == null) return true;
3+
4+
if (typeof value === "number" && isNaN(value)) return true;
5+
6+
7+
if (typeof value === "string" || Array.isArray(value)) {
8+
return value.length === 0;
9+
}
10+
11+
if (value instanceof Date) {
12+
return isNaN(value.getTime());
13+
}
14+
15+
if (typeof value === "symbol") {
16+
return value.description === undefined;
17+
}
18+
19+
if (value instanceof Set || value instanceof Map) {
20+
return value.size === 0;
21+
}
22+
23+
if (typeof value === "object" && value.constructor === Object) {
24+
return Object.keys(value).length === 0;
25+
}
26+
27+
return false;
28+
}

package/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * as objectUtil from "./objectUtil";
33
export * as cookieUtil from "./cookieUtil";
44
export * as numberUtil from "./numberUtil";
55
export * as validationUtil from "./validationUtil";
6+
export * as commonUtil from "./commonUtil";

0 commit comments

Comments
 (0)