gtest 学习之四 testing::Test

本例是gtest中的第三个demo,有一个测试类,这个测试类是从testing::Test中继承而来,在测试类中有一个SetUp和一个TearDown方法,这两个事件是gtest中提供的事件,通过虚函数可以在继承类中重写这两个方法,这两个事件属于玩转gtest测试框架的事件机制中的TestCase事件。

头文件sample3.h定义:

#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
#define GTEST_SAMPLES_SAMPLE3_INL_H_

#include <stddef.h>


// Queue 是一个单向链表的简单实现.
//
// The element 必须支持拷贝构造.
template <typename E>  // E is the element type
class Queue;

// QueueNode 是组成 Queue的一个节点
// type E and a pointer to the next node.
template <typename E>  // E is the element type
class QueueNode {
    friend class Queue<E>;

public:
    // 获取本节点的 element.
    const E& element() const { return element_; }

    // 获取下一个节点.
    QueueNode* next() { return next_; }
    const QueueNode* next() const { return next_; }

private:
    // 用给定的element创建一个节点,next pointer 被设定为空
    QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}

    // We disable the default assignment operator and copy c'tor.
    const QueueNode& operator = (const QueueNode&);
    QueueNode(const QueueNode&);

    E element_;
    QueueNode* next_;
};

template <typename E>  // E is the element type.
class Queue {
public:

    // 创建一个空队列.
    Queue() : head_(NULL), last_(NULL), size_(0) {}

    // 析构
    ~Queue() { Clear(); }

    // 清理队列.
    void Clear() {
        if (size_ > 0) {
            // 1. 删除所有节点.
            QueueNode<E>* node = head_;
            QueueNode<E>* next = node->next();
            for (; ;) {
                delete node;
                node = next;
                if (node == NULL) break;
                next = node->next();
            }

            // 2. Resets the member variables.
            head_ = last_ = NULL;
            size_ = 0;
        }
    }

    // 获取元素数量.
    size_t Size() const { return size_; }

    // 获取队列第一个元素,当队列为空时返回null.
    QueueNode<E>* Head() { return head_; }
    const QueueNode<E>* Head() const { return head_; }

    // 获取队列最后一个元素,当队列为空时返回null.
    QueueNode<E>* Last() { return last_; }
    const QueueNode<E>* Last() const { return last_; }

    // 在队列的尾部加入一个元素,用element的构造函数创建一个element并存贮在队列的尾部
    void Enqueue(const E& element) {
        QueueNode<E>* new_node = new QueueNode<E>(element);

        if (size_ == 0) {
            head_ = last_ = new_node;
            size_ = 1;
        } else {
            last_->next_ = new_node;
            last_ = new_node;
            size_++;
        }
    }

    // 从头部移除一个元素,并将这个元素返加,队列为空时返Null. 
    E* Dequeue() {
        if (size_ == 0) {
            return NULL;
        }

        const QueueNode<E>* const old_head = head_;
        head_ = head_->next_;
        size_--;
        if (size_ == 0) {
            last_ = NULL;
        }

        E* element = new E(old_head->element());
        delete old_head;

        return element;
    }

    // 在队列的每一个元素上应用function,并返回新队列。原队列不受影响
    template <typename F>
    Queue* Map(F function) const {
        Queue* new_queue = new Queue();
        for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {
            new_queue->Enqueue(function(node->element()));
        }

        return new_queue;
    }

private:
    QueueNode<E>* head_;  // 队列头.
    QueueNode<E>* last_;  // 队列尾.
    size_t size_;  // 队列中元素的数量.

    // 禁止队列拷贝及赋值.
    Queue(const Queue&);
    const Queue& operator = (const Queue&);
};

#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_

 

main.cpp:

#include "sample3.h"
#include "gtest/gtest.h"

class QueueTest : public testing::Test {
protected:  // You should make the members protected s.t. they can be
    // accessed from sub-classes.

    // 虚函数SetUp将在所有测试用例之前调用,当有变量需要初始化时,应当定义这个函数
    virtual void SetUp() {
        q1_.Enqueue(1);
        q2_.Enqueue(2);
        q2_.Enqueue(3);
    }

    //虚函数 TearDown()将在所有测试用例运行后调用,这个函数用于清理类中的资源,没有资源需要清理时要以不定义
    // virtual void TearDown() {
    // }

    // 用于测试的函数.
    static int Double(int n) {
        return 2*n;
    }

    // 用于测试Queue::Map()的函数.
    void MapTester(const Queue<int> * q) {
        // 创建一个队列,这个队列是原队列中数值的两倍
        const Queue<int> * const new_q = q->Map(Double);

        // 确认新老队列的元素数量相同
        ASSERT_EQ(q->Size(), new_q->Size());

        // 确认两个队列的关系
        for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
            n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
                EXPECT_EQ(2 * n1->element(), n2->element());
        }

        delete new_q;
    }

    // Declares the variables your tests want to use.
    Queue<int> q0_;
    Queue<int> q1_;
    Queue<int> q2_;
};

// When you have a test fixture, you define a test using TEST_F
// instead of TEST.

// 测试默认构造函数
TEST_F(QueueTest, DefaultConstructor) {
    // You can access data in the test fixture here.
    EXPECT_EQ(0u, q0_.Size());
}

// Tests Dequeue().
TEST_F(QueueTest, Dequeue) {
    int * n = q0_.Dequeue();
    EXPECT_TRUE(n == NULL);

    n = q1_.Dequeue();
    ASSERT_TRUE(n != NULL);
    EXPECT_EQ(1, *n);
    EXPECT_EQ(0u, q1_.Size());
    delete n;

    n = q2_.Dequeue();
    ASSERT_TRUE(n != NULL);
    EXPECT_EQ(2, *n);
    EXPECT_EQ(1u, q2_.Size());
    delete n;
}

// Tests the Queue::Map() function.
TEST_F(QueueTest, Map) {
    MapTester(&q0_);
    MapTester(&q1_);
    MapTester(&q2_);
}


int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

运行结果:

转载于:https://www.cnblogs.com/fanx/p/4574143.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值