學習 PHP 程序新東西的另外一種方法

昨天在學習 SplDoublyLinkedList 的時候發現一個有趣的現象,好比php

php$obj = new SplDoublyLinkedList();
$obj->push('string');

這時候想判斷 $obj 裏面到底有沒有值,或是否是一個,而且裏面的值爲 'string',咱們一般會:html

phpprint_r($obj);

而後經過肉眼去看打印出來的,確實與咱們想的一致,那麼咱們就會認爲是成功的。若是不一致就會認爲是失敗的。node

仔細想一想,這種與咱們要作的測試程序不是如出一轍嘛,只不過測試程序是用來檢測咱們的代碼有沒有問題,但如今因爲代碼是 PHP 官網這種權威組織寫的,咱們能夠認爲都是對的,如今要是寫測試程序的話,就是另外一層函義了,不是測試他們的代碼是否有問題,而是表明咱們對這個功能的認識。函數

常常咱們會用 print_r 來打印,有時候本身會主觀的認爲是這樣是那樣,而後看的也不必定很仔細,而後就認爲是對的,最後實際使用時發現不是的想的那樣(我有親身經歷),寫測試就是讓程序來判斷,咱們的想法是否是有問題,哪裏出錯了,最主要它還能夠把當時的思路保持下來,之後再繼續回顧。學習

如下是我在學習 SplDoublyLinkedList 時寫的一些測試,之後看到這個測試類,就知道了 SplDoublyLinkedList 該怎麼用了。測試

php<?php

class SplDoublyLinkedListTest extends PHPUnit_Framework_TestCase
{
    public function testSplDoublyLinkedListPart1()
    {
        $obj = new SplDoublyLinkedList();
        // Pushes value at the end of the doubly linked list.
        $obj->push(0);
        $obj->push(1);
        $obj->push(2);

        // Prepends value at the beginning of the doubly linked list.
        $obj->unshift(10);
        $obj->unshift(11);

        /*
         * 由於指針還未初始化
         * 因此
         * 1. 當前指針是否有效爲 FALSE
         * 2. 直接獲取當前指針的值會是 NULL
         */
        $this->assertEquals(FALSE, $obj->valid());
        $this->assertEquals(NULL, $obj->current());

        $obj->rewind();
        // 將指針重置以後,第一個確定是 11 ,由於它是在最後執行了一個
        // 將 11 插入到鏈表最前面的一個函數 unshift
        $this->assertEquals(11, $obj->current());

        $obj->next();
        // 11 下面應該是 10
        $this->assertEquals(10, $obj->current());

        // (下一個 下一個 上一個) === (下一個)
        $obj->next(); // 0
        $obj->next(); // 1
        $obj->prev(); // 0
        $this->assertEquals(0, $obj->current());

        $obj->next(); // 1
        $obj->next(); // 2
        $obj->next(); // 已經超過最大的了,使用 valid 判斷應該是 false
        $this->assertEquals(false, $obj->valid());
    }

    public function testSplDoublyLinkedListPart2()
    {
        $obj = new SplDoublyLinkedList();
        // Pushes value at the end of the doubly linked list.
        $obj->push(0);
        $obj->push(1);
        $obj->push(2);

        // Prepends value at the beginning of the doubly linked list.
        $obj->unshift(10);
        $obj->unshift(11);

        //  Peeks at the node from the end of the doubly linked list
        //  Return: The value of the last node.
        //  獲取最後一個節點的值
        $this->assertEquals(2, $obj->top());

        // Peeks at the node from the beginning of the doubly linked list
        // Return: The value of the first node.
        // 獲取第一個節點的值
        $this->assertEquals(11, $obj->bottom());
    }

    public function testIsEmpty(){
        $obj = new SplDoublyLinkedList();

        $this->assertEquals(true, $obj->isEmpty());

        $obj->unshift('string');
        // 這裏已經有值了就應該是 false
        $this->assertEquals(false, $obj->isEmpty());

        // 這時再使用 pop 彈出最後一個就應該是 'string'
        $this->assertEquals('string', $obj->pop());

    }

    /**
     * 若是是空的時候試圖 pop 彈出最後一個節點的值則會 拋出一個 RuntimeException
     *
     * @expectedException RuntimeException
     */
    public function testRuntimeException(){
        $obj = new SplDoublyLinkedList();
        $obj->pop();
    }

    public function testOffset(){
        $obj = new SplDoublyLinkedList();
        $obj->push('one');
        $obj->push('two');
        $obj->unshift('three');

        // 下標是從0 開始的 因此如今3 應該是不存在的
        $this->assertEquals(false, $obj->offsetExists(3));

        // 下標爲2 的應該是存在的
        $this->assertEquals(true, $obj->offsetExists(2));

        $this->assertEquals('two', $obj->offsetGet(2));

        // 刪除下標爲0 的值
        $obj->offsetUnset(0);
        // 刪除爲 0 的值以後,後面的都會向前移一位
        // 因此如今的順序爲: one two
        $obj->rewind();
        $this->assertEquals('one', $obj->current());
        $this->assertEquals(0, $obj->key());

        $obj->next();
        $this->assertEquals('two', $obj->current());
        $this->assertEquals(1, $obj->key());
        // 而且總個數爲 2
        $this->assertEquals(2, $obj->count());
    }

    public function testAdd(){
        $obj = new SplDoublyLinkedList();
        $obj->push('one');
        $obj->push('two');
        $obj->push('three');
        $obj->unshift('four');
        $obj->add(1, 'five');

        // 這時候的順序應該是:
        // four five one two three

        $obj->rewind();
        $this->assertEquals('four', $obj->current());
        $obj->next();
        $this->assertEquals('five', $obj->current());
        $obj->next();
        $this->assertEquals('one', $obj->current());
        $obj->next();
        $this->assertEquals('two', $obj->current());
        $obj->next();
        $this->assertEquals('three', $obj->current());
    }
}

原文連接 學習 PHP 程序新東西的另外一種方法this

相關文章
相關標籤/搜索