test("2 + 3 은 5야", () => {
  expect(func.add(2, 3)).toBe(5); // 검증할 값, 기대 되는 값
});

test("2 + 3 은 5야", () => {
  expect(func.add(2, 3)).toEqual(5);
});

// Test Suites: 1 passed, 1 total
// Tests:       2 passed, 2 total

// 둘 다 통과
test("이름과 나이를 전달받아 객체를 반환해주세여", () => {
  expect(func.makeUser("malza", 29)).toBe({
    name: "malza",
    age: 29,
  });
});

// 결과는? 실패! 왜?
// 객체나 배열은 재귀적으로 돌면서 값을 확인해야 하기 때문에 toEqual 사용해야 한다.

test("이름과 나이를 전달받아 객체를 반환해주세여", () => {
  expect(func.makeUser("malza", 29)).toEqual({
    name: "malza",
    age: 29,
  });
});
// Test Suites: 1 failed, 1 total
// Tests:       1 failed, 1 passed, 2 total
// 1 passed 로 toEqual 이 성공한 것을 볼 수 있다.
// 그런데 If it should pass with deep equality, replace "toBe" with "toStrictEqual" 라는 문구가 보인다.
const func = require("./func"); // func.js 요청

test("이름과 나이를 전달받아 객체를 반환해주세여", () => {
  expect(func.makeUser("malza", 29)).toEqual({
    name: "malza",
    age: 29,
  });
});

test("이름과 나이를 전달받아 객체를 반환해주세여", () => {
  expect(func.makeUser("malza", 29)).toStrictEqual({
    name: "malza",
    age: 29,
  });
});

// Test Suites: 1 passed, 1 total
// Tests:       2 passed, 2 total
// 둘 다 통과 되었다.
// 그렇다면 ./func 로 가서 좀 수정을 해보자.
// 원래 코드는 
const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age) => ({ name, age}),
};

module.exports = fn;

==========================================
// gender 를 추가 해 보자.
const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age) => ({ name, age, gender: undefined }),
};

module.exports = fn;
// 다시 테스트 해 보면 결과는?
// Test Suites: 1 failed, 1 total
// Tests:       1 failed, 1 passed, 2 total

// toEqual 은 통과 되었고, toStrictEqual 은 통과하지 못했다.

// 보다 엄격하게 검사하여 정확하게 따지고 들어간다.
const func = require("./func"); // func.js 요청

// toBeNull
// toBeUndefined
// toBeDefined

test("null은 null 입니다.", () => {
  expect(null).toBeNull();
});

test("UndeFined는 UndeFined 입니다.", () => {
  expect(undefined).toBeUndefined(undefined);
});

test("1는 deFined 입니다.", () => {
  expect(1).toBeDefined();
});

// toBeTruthy
// toBeFalsy

test("0은 false 입니다.", () => {
  expect(func.add(1, -1)).toBeFalsy();
});

// √ null은 null 입니다. (2 ms)
// √ UndeFined는 UndeFined 입니다.
// √ 1는 deFined 입니다. (1 ms)
// √ 0은 false 입니다.

// Test Suites: 1 passed, 1 total
// Tests:       4 passed, 4 total
// toBeGreaterThan
// toBeGreaterThanOrEqual
// toBeLessThan
// toBeLessThanOrEqual

test("ID는 10자 이하여야 합니다.", () => {
  const id = `Malza's file`;
  expect(id.length).toBeLessThanOrEqual(10);
});

// Test Suites: 1 failed, 1 total
// Tests:       1 failed, 1 total
// 12글자니까 10보다 작거나 같지 않다. 따라서 실패!

test("password는 4자리이다.", () => {
  const pw = "1234";
  expect(pw.length).toBe(4); // or toEqual(4)
});

// 성공!
test("0.1 + 0.2 는 0.3이다.", () => {
  expect(func.add(0.1, 0.2)).toBe(0.3); // or toEqual(4)
});

//성공?? 아니 실패했다.
// Expected: 0.3
// Received: 0.30000000000000004

// 2진법으로 소수를 표현해야 하기 때문.
// 이럴때는
test("0.1 + 0.2 는 0.3이다.", () => {
  expect(func.add(0.1, 0.2)).toBeCloseTo(0.3); // or toEqual(4)
});
// 성공!
// toMatch 로 문자열을 판별 가능

test("hello, malza 에 a 라는 글자가 있나요?", () => {
  expect("hello, malza").toMatch(/a/);
});

// 성공. 대소문자를 구분한다. 구분하고 싶지 않다면 /a/i 해준다.
// 배열

test("User List 에 malza 가 포함 되어 있나요?", () => {
  const Users = ["mike", "malza", "mina"];
  expect(Users).toContain("malza");
});
// func.js 수정
const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age, gender) => ({ name, age, gender }),
  throwErr: () => {
    throw new Error("Error no.1");
  },
};

module.exports = fn;

///////////////////////////////////////////

// func.test.js

test("에러 나나요?", () => {
  expect(() => func.throwErr()).toThrow("Error no.1");
});

// 통과!

test("에러 나나요?", () => {
  expect(() => func.throwErr()).toThrow("Error no.2");
});

//실패! Error no.2 를 발견하지 못했다.

외에도 많다. 사이트 들어가서 찾아가면서 쓰면 된다. 😂