반응형
// StackTest.cpp
#include <gtest/gtest.h>
#include "Stack.h"
#include <string>

// 1) Test Fixture 클래스 정의
class StackTest : public ::testing::Test {
protected:
    // protected 영역에 멤버 변수를 선언하고,
    // SetUp()에서 초기화하는 패턴이 일반적입니다.

    // 테스트 대상인 스택 객체 2개
    Stack<int> intStack;
    Stack<std::string> stringStack;

    // 모든 테스트가 시작하기 전 한 번만 실행 (선택 사항)
    // GTest 최신 버전에서는 SetUpTestSuite() 사용 권장
    static void SetUpTestCase() {
        // 예: 전역 리소스 초기화 등
    }

    // 모든 테스트가 끝난 후 한 번만 실행 (선택 사항)
    // GTest 최신 버전에서는 TearDownTestSuite() 사용 권장
    static void TearDownTestCase() {
        // 예: 전역 리소스 해제 등
    }

    // 각 테스트 케이스(메서드) 실행 전마다 호출
    void SetUp() override {
        // 테스트마다 초기 상태를 보장하기 위해
        // 스택에 몇 개의 데이터를 넣어두는 등 사전작업 가능
        intStack.Push(1);
        intStack.Push(2);
        intStack.Push(3);

        stringStack.Push("Hello");
        stringStack.Push("World");
    }

    // 각 테스트 케이스(메서드) 실행 후마다 호출
    void TearDown() override {
        // 사용한 리소스를 해제하거나 정리하는 로직을 여기에 둘 수 있음.
    }
};

// 2) Test Fixture를 사용하는 테스트 사례들

TEST_F(StackTest, IntStack_PushAndTopTest) {
    // 이미 SetUp()에서 1, 2, 3이 들어간 상태
    EXPECT_EQ(intStack.Size(), 3U);
    EXPECT_EQ(intStack.Top(), 3); // 가장 최근에 푸시된 값

    intStack.Push(99);
    EXPECT_EQ(intStack.Top(), 99);
    EXPECT_EQ(intStack.Size(), 4U);
}

TEST_F(StackTest, IntStack_PopTest) {
    // 초기 상태: [1, 2, 3]
    intStack.Pop(); // 3 제거
    EXPECT_EQ(intStack.Top(), 2);
    EXPECT_EQ(intStack.Size(), 2U);

    intStack.Pop(); // 2 제거
    EXPECT_EQ(intStack.Top(), 1);
    EXPECT_EQ(intStack.Size(), 1U);

    // 더 이상 Pop()해도 예외가 발생하지 않는지, 
    // 혹은 예외가 발생해야 하는지 등을 테스트
    intStack.Pop(); // 1 제거
    EXPECT_TRUE(intStack.Empty());
    EXPECT_THROW(intStack.Pop(), std::out_of_range); // 비어있으므로 예외
}

TEST_F(StackTest, StringStack_Test) {
    // 초기 상태: ["Hello", "World"]
    EXPECT_EQ(stringStack.Top(), "World");
    EXPECT_EQ(stringStack.Size(), 2U);

    stringStack.Pop();
    EXPECT_EQ(stringStack.Top(), "Hello");
    EXPECT_EQ(stringStack.Size(), 1U);

    // 비었을 때 예외 테스트
    stringStack.Pop();
    EXPECT_TRUE(stringStack.Empty());
    EXPECT_THROW(stringStack.Top(), std::out_of_range);
}
반응형