Login   Register  
PHP Classes
elePHPant
Icontem

File: test.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Thiemo Mättig  >  TM::MyCSV  >  test.php  >  Download  
File: test.php
Role: Unit test script
Content type: text/plain
Description: PHPUnit 1 Unit Test
Class: TM::MyCSV
Manage CSV files like database tables
Author: By
Last change: - sort() accepts SORT_TIME and SORT_LOCALE_STRING to order values as dates ot based to the current locale.
- SORT_NULL and SORT_STRING fixed.
Date: 4 years ago
Size: 21,433 bytes
 

Contents

Class file image Download
<?php

/*
 * Collection of test cases for the TM::MyCSV class. Requires PEAR::PHPUnit 1,
 * see http://pear.php.net/package/PHPUnit/
 */

require_once("MyCSV.class.php");
require_once("PHPUnit.php");
require_once("PHPUnit/GUI/HTML.php");

class MyCSVTest extends PHPUnit_TestCase
{
    var $t = null;
    var $tMixed = null;

    function setUp()
    {
        $this->t = new MyCSV();
        $this->t->insert(array('id' => 8));
        $this->t->insert(array('id' => 2));
        $this->t->insert(array('id' => 15));
        $this->t->insert(array('id' => 3));
        $this->t->insert(array('id' => 19));
        $this->t->insert(array('id' => 9));
        $this->t->insert(array('id' => 4));
        $this->t->insert(array('id' => 11));
        $this->t->each();
        $this->t->each();
        $this->t->each();

        $this->tMixed = new MyCSV();
        $this->tMixed->add_field("a");
        $this->tMixed->add_field("b");
        $this->tMixed->add_field("c");
        $this->tMixed->insert(array('a' => "A1", 'b' => "38", 'c' => 12));
        $this->tMixed->insert(array('a' => "A2", 'b' => "27", 'c' => "12"));
        $this->tMixed->insert(array('a' => "A3", 'b' => "42", 'c' => "111"));
        $this->tMixed->insert(array('id' => 5, 'a' => "A5", 'b' => "13", 'c' => 15));
        $this->tMixed->insert(array('id' => "x", 'a' => "Ax", 'b' => "31", 'c' => 11.0));
    }

    function tearDown()
    {
        $this->t = null;
        $this->tMixed = null;
    }

    function testConstants()
    {
        $this->assertNotNull(SORT_NAT);
        $this->assertTrue(SORT_NAT > SORT_ASC);
        $this->assertNotNull(SORT_NULL);
        $this->assertTrue(SORT_NULL > SORT_ASC);
    }

    function testMyCSV()
    {
        $t = new MyCSV();
        $this->assertEquals(array("id"), $t->fields);
        $this->assertEquals(array(), $t->data);
        $this->assertEquals(",", $t->delimiter);
    }

    function testBinary()
    {
        $binaries = array(
            "a", str_repeat("a", 1000), "", "a,a", ",", ";",
            "\0", "\x00", chr(0), "\0\0\0\0", "\\\0", "\x7F", "\\\x7F",
            "\",\"", "a \"a\" a", "\"a\"", "\"", "\"\"", "\\\"a\"", "\\\\\"a\"",
            "\\\x13\"\x13\\\x13\\\\\x13\\", "a\\\"\"", "\x93", "\\\x93\"",
            "\\\"\x93", '\\\\\\' . chr(0) . '\\' . chr(127) . '""\\');
        $tablename = uniqid("tmp") . ".csv";
        $a = new MyCSV($tablename);
        foreach ($binaries as $id => $binary)
        {
            $a->insert(array('id' => $id, 'mid' => $binary, 'end' => $binary));
        }
        $a->write();
        $b = new MyCSV($tablename);
        foreach ($binaries as $id => $binary)
        {
            $this->assertEquals($binary, $a->data[$id]['mid'], $id . ' mid org:');
            $this->assertEquals($binary, $a->data[$id]['end'], $id . ' end org:');
            $this->assertEquals($binary, $b->data[$id]['mid'], $id . ' mid:');
            $this->assertEquals($binary, $b->data[$id]['end'], $id . ' end:');
        }
        $b->close();
        unlink($tablename);
    }

    function testCount()
    {
        $this->assertEquals(8, $this->t->count());
        $this->t->drop_table();
        $this->assertEquals(0, $this->t->count());
    }

    function testMin()
    {
        $this->assertEquals(2, $this->t->min());
        $this->t->drop_table();
        $this->assertFalse($this->t->min());
    }

    function testMax()
    {
        $this->assertEquals(19, $this->t->max());
        $this->t->drop_table();
        $this->assertFalse($this->t->max());
    }

    function testFirst()
    {
        $this->assertEquals(8, $this->t->first());
        $this->assertEquals(array('id' => 3), $this->t->each());
        $this->assertEquals(8, $this->t->first());
        $this->assertEquals(array('id' => 11), $this->t->end());
        $this->assertEquals(8, $this->t->first());
        $this->assertEquals(array('id' => 8), $this->t->reset());
        $this->assertEquals(8, $this->t->first());
        $this->t->drop_table();
        $this->assertFalse($this->t->first());
    }

    function testLast()
    {
        $this->assertEquals(11, $this->t->last());
        $this->assertEquals(array('id' => 3), $this->t->each());
        $this->assertEquals(11, $this->t->last());
        $this->assertEquals(array('id' => 11), $this->t->end());
        $this->assertEquals(11, $this->t->last());
        $this->assertEquals(array('id' => 8), $this->t->reset());
        $this->assertEquals(11, $this->t->last());
        $this->t->drop_table();
        $this->assertFalse($this->t->last());
    }

    function testPrev()
    {
        $this->assertEquals(15, $this->t->prev(3));
        $this->assertEquals(array('id' => 3), $this->t->each());
        $this->assertEquals(15, $this->t->prev(3));
        $this->assertEquals(2, $this->t->prev(3, 2));
        $this->assertEquals(8, $this->t->prev(3, 3));
        $this->assertFalse($this->t->prev(3, 5));
        $this->t->drop_table();
        $this->assertFalse($this->t->prev(3));
    }

    function testNext()
    {
        $this->assertEquals(19, $this->t->next(3));
        $this->assertEquals(array('id' => 3), $this->t->each());
        $this->assertEquals(19, $this->t->next(3));
        $this->assertEquals(9, $this->t->next(3, 2));
        $this->assertEquals(11, $this->t->next(3, 4));
        $this->assertFalse($this->t->next(3, 5));
        $this->t->drop_table();
        $this->assertFalse($this->t->next(3));
    }

    function testRand()
    {
        $r = $this->t->rand();
        $this->assertTrue(2 <= $r && $r <= 19);
        $r = $this->t->rand(2);
        $this->assertEquals(2, count($r));
        $this->assertTrue(2 <= $r[0] && $r[0] <= 19);
        $this->assertTrue(2 <= $r[1] && $r[1] <= 19);
        $r = $this->t->rand(7);
        $this->assertEquals(7, count($r));
        $this->t->drop_table();
        $this->assertFalse(@$this->t->rand());
        $this->assertFalse(@$this->t->rand(2));
        $this->assertFalse(@$this->t->rand(7));
    }

    function testSeek()
    {
        $this->assertEquals(true, $this->t->seek(5, SEEK_SET));
        $this->assertEquals(array('id' => 9), current($this->t->data));
        $this->assertEquals(true, $this->t->seek(2, SEEK_SET));
        $this->assertEquals(array('id' => 15), current($this->t->data));
        $this->assertEquals(true, $this->t->seek(1, SEEK_CUR));
        $this->assertEquals(array('id' => 3), current($this->t->data));
        $this->assertEquals(true, $this->t->seek(3, SEEK_CUR));
        $this->assertEquals(array('id' => 4), current($this->t->data));
        $this->assertEquals(false, $this->t->seek(2, SEEK_CUR));
        $this->assertEquals(false, current($this->t->data));
        $this->assertEquals(true, $this->t->seek(5, SEEK_END));
        $this->assertEquals(array('id' => 15), current($this->t->data));
        $this->assertEquals(true, $this->t->seek(9));
        $this->assertEquals(array('id' => 9), current($this->t->data));
        $this->assertEquals(true, $this->t->seek(2));
        $this->assertEquals(array('id' => 2), current($this->t->data));
    }

    function testData_seek()
    {
        $this->assertEquals(true, $this->t->data_seek(5));
        $this->assertEquals(array('id' => 9), $this->t->each());
        $this->assertEquals(true, $this->t->data_seek(2));
        $this->assertEquals(array('id' => 15), $this->t->each());
    }

    function testLimit()
    {
        $this->t->limit(2);
        $this->assertEquals(array('id' => 8), $this->t->each());
        $this->assertEquals(array('id' => 2), $this->t->each());
        $this->assertEquals(false, $this->t->each());
        $this->assertEquals(true, $this->t->limit(2, 9));
        $this->assertEquals(array('id' => 9), $this->t->each());
        $this->assertEquals(array('id' => 4), $this->t->each());
        $this->assertEquals(false, $this->t->each());
        $this->assertEquals(true, $this->t->limit(2, 11));
        $this->assertEquals(array('id' => 11), $this->t->each());
        $this->assertEquals(false, $this->t->each());
    }

    function testAdd_field()
    {
        $this->assertTrue($this->tMixed->add_field("neu"));
        $this->assertEquals(array("id", "a", "b", "c", "neu"), $this->tMixed->fields);
        $this->assertTrue($this->tMixed->add_field("mitte", "a"));
        $this->assertEquals(array("id", "a", "mitte", "b", "c", "neu"), $this->tMixed->fields);
        $this->assertFalse($this->tMixed->add_field("b"));
        $this->assertEquals(array("id", "a", "mitte", "b", "c", "neu"), $this->tMixed->fields);
    }

    function testDrop_field()
    {
        $this->assertEquals(4, count($this->tMixed->fields));
        $this->assertEquals(5, $this->tMixed->count());
        $this->assertFalse($this->tMixed->drop_field("id"));
        $this->assertTrue($this->tMixed->drop_field("b"));
        $this->assertEquals(3, count($this->tMixed->fields));
        $this->assertEquals(array('id' => 1, 'a' => "A1", 'c' => 12), $this->tMixed->fetch_assoc());
        $this->assertFalse($this->tMixed->drop_field("unknown"));
        $this->assertEquals(3, count($this->tMixed->fields));
        $this->assertEquals(array('id' => 2, 'a' => "A2", 'c' => "12"), $this->tMixed->fetch_assoc());
        $this->assertFalse($this->tMixed->drop_field(array("crap")));
    }

    function testDrop_table()
    {
        $this->assertEquals(4, count($this->tMixed->fields));
        $this->assertEquals(5, $this->tMixed->count());
        $this->tMixed->drop_table();
        $this->assertEquals(1, count($this->tMixed->fields));
        $this->assertEquals(array("id"), $this->tMixed->fields);
        $this->assertEquals(0, $this->tMixed->count());
    }

    function testInsert()
    {
        $this->assertEquals(5, $this->tMixed->count());
        $this->tMixed->insert(array('a' => 21));
        $this->tMixed->insert(array('id' => 88,'a' => 22));
        $this->tMixed->insert(array('id' => 1,'a' => 23));
        $a = $this->tMixed->each();
        $this->assertEquals(1, $a['id']);
        $a = $this->tMixed->each();
        $this->assertEquals(2, $a['id']);
        $a = $this->tMixed->each();
        $this->assertEquals(3, $a['id']);
        $a = $this->tMixed->each();
        $this->assertEquals(5, $a['id']);
        $a = $this->tMixed->each();
        $this->assertEquals("x", $a['id']);
        $this->assertEquals(array('id' => 6, 'a' => 21), $this->tMixed->each());
        $this->assertEquals(array('id' => 88, 'a' => 22), $this->tMixed->each());
        $this->assertEquals(array('id' => 89, 'a' => 23), $this->tMixed->each());
        $this->tMixed->fields = array();
        $this->tMixed->insert(array('a' => "a", 'b' => "b", 'id' => 30, 'c' => "c"));
        $this->assertEquals(array("id", "a", "b", "c"), $this->tMixed->fields);
        $this->assertEquals(array('id' => 30, 'a' => "a", 'b' => "b", 'c' => "c"), $this->tMixed->each());
    }

    function testInsert_id()
    {
        $this->assertEquals("x", $this->tMixed->insert_id());
        $this->tMixed->insert(array('a' => 1));
        $this->assertEquals(6, $this->tMixed->insert_id());
        $this->tMixed->insert(array('id' => 13, 'a' => 1));
        $this->assertEquals(13, $this->tMixed->insert_id());
        $this->tMixed->insert(array('a' => 1));
        $this->assertEquals(14, $this->tMixed->insert_id());
        $this->tMixed->insert(array('id' => 13, 'a' => 1));
        $this->assertEquals(15, $this->tMixed->insert_id());
        $this->tMixed->drop_table();
        $this->tMixed->insert(array('a' => 1));
        $this->assertEquals(1, $this->tMixed->insert_id());
    }

    function testAuto_increment()
    {
        $t = new MyCSV();
        $this->assertFalse($t->insert_id());
        $this->assertTrue(false === $t->insert_id());
        $t->insert(array('a' => "a"));
        $this->assertEquals(1, $t->insert_id());
        $t->insert(array('id' => 12, 'a' => "a"));
        $this->assertEquals(12, $t->insert_id());
        $t->insert_id = 7;
        $t->insert(array('a' => "a"));
        $this->assertEquals(7, $t->insert_id());
        $t->insert(array('a' => "a"));
        $this->assertEquals(8, $t->insert_id());
        $t->insert(array('id' => "x3", 'a' => "a"));
        $this->assertEquals("x3", $t->insert_id());
        $t->insert_id = "x25";
        $t->insert(array('a' => "a"));
        $this->assertEquals("x25", $t->insert_id());
    }

    function testDelete()
    {
        $this->assertEquals(5, $this->tMixed->count());
        $this->tMixed->delete(2);
        $this->assertFalse($this->tMixed->id_exists(2));
        $this->assertEquals(4, $this->tMixed->count());
        $this->tMixed->delete(19);
        $this->assertEquals(4, $this->tMixed->count());
        $this->assertTrue($this->tMixed->id_exists("x"));
        $this->tMixed->delete(array('id' => "x"));
        $this->assertFalse($this->tMixed->id_exists("x"));
        $this->assertEquals(3, $this->tMixed->count());
        $this->tMixed->delete(array(5));
        $this->assertEquals(3, $this->tMixed->count());
        $this->tMixed->delete("");
        $this->assertEquals(3, $this->tMixed->count());
        $this->tMixed->delete();
        $this->assertEquals(0, $this->tMixed->count());
    }

    function testSort()
    {
        $this->tMixed->sort("b DESC");
        $this->assertEquals("id,a,b,c\r\n" .
            "3,\"A3\",\"42\",\"111\"\r\n" .
            "1,\"A1\",\"38\",\"12\"\r\n" .
            "x,\"Ax\",\"31\",\"11\"\r\n" .
            "2,\"A2\",\"27\",\"12\"\r\n" .
            "5,\"A5\",\"13\",\"15\"\r\n", $this->tMixed->export());
        $this->tMixed->sort("b", SORT_ASC);
        $this->tMixed->sort("a,c,b");
        $this->tMixed->sort("c,SORT_STRING,SORT_NULL,a,b ASC");
        $this->assertEquals("id,a,b,c\r\n" .
            "x,\"Ax\",\"31\",\"11\"\r\n" .
            "3,\"A3\",\"42\",\"111\"\r\n" .
            "1,\"A1\",\"38\",\"12\"\r\n" .
            "2,\"A2\",\"27\",\"12\"\r\n" .
            "5,\"A5\",\"13\",\"15\"\r\n", $this->tMixed->export());
    }

    function testSortNumeric()
    {
        $a = array("a" => 100);
        $b = array("a" => 101);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_NUMERIC, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);

        $a = array("a" => 10000);
        $b = array("a" => -10000);
        $this->assertTrue($this->t->_cmp($a, $b) > 0);

        $a = array("a" => "100x");
        $b = array("a" => "100y");
        $this->assertTrue($this->t->_cmp($a, $b) == 0);

        $a = array("a" => 100);
        $b = array("a" => "100y");
        $this->assertTrue($this->t->_cmp($a, $b) == 0);

        $a = array("a" => "10");
        $b = array("a" => "2");
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);

        $a = array("a" => 1.00);
        $b = array("a" => 1.01);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_NUMERIC, 'order' => -1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
    }

    function testSortString()
    {
        $a = array("a" => "z");
        $b = array("a" => "a");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);

        $a = array("a" => "90a");
        $b = array("a" => "90b");
        $this->assertTrue($this->t->_cmp($a, $b) < 0);

        // Isn't PHP strange?
        $a = array("a" => 9000);
        $b = array("a" => "9000b");
        $this->assertTrue($this->t->_cmp($a, $b) < 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_NUMERIC, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) == 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => 0, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) == 0);

        $a = array("a" => "z");
        $b = array("a" => "aaaaaa");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING, 'order' => -1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);
    }

    function testSortLocaleString()
    {
        setlocale(LC_ALL, "de_DE@euro", "de_DE", "deu_deu");
        $a = array("a" => "ä");
        $b = array("a" => "b");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_LOCALE_STRING, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);

        $a = array("a" => "Ä");
        $b = array("a" => "ä");
        $this->assertTrue($this->t->_cmp($a, $b) == 0);
    }

    function testSortNatural()
    {
        $a = array("a" => "x10");
        $b = array("a" => "x2");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_NAT, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => 0, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);
    }

    function testSortTime()
    {
        $a = array("a" => "March 1st 1980");
        $b = array("a" => "December 1st 1980");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_TIME, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => 0, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
    }

    function testSortNull()
    {
        $a = array("a" => "");
        $b = array("a" => "x");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_NULL, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_NULL, 'order' => -1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);

        $a = array("a" => "0");
        $b = array("a" => "!");
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING | SORT_NULL, 'order' => 1));
        $this->assertTrue($this->t->_cmp($a, $b) > 0);
        $this->t->_cmpFields = array(array('field' => 'a', 'type' => SORT_STRING | SORT_NULL, 'order' => -1));
        $this->assertTrue($this->t->_cmp($a, $b) < 0);
    }

    function testJoin()
    {
        $rightTable = new MyCSV();
        $rightTable->insert(array('id' => 27, 'extra' => "X1"));
        $rightTable->insert(array('id' => 42, 'extra' => "X2"));
        $this->tMixed->join($rightTable, "b");
        $this->assertEquals(5, $this->tMixed->count());
        $a = $this->tMixed->each();
        $this->assertFalse(isset($a['extra']));
        $a = $this->tMixed->each();
        $this->assertEquals("X1", $a['extra']);
        $a = $this->tMixed->each();
        $this->assertEquals("X2", $a['extra']);
        $a = $this->tMixed->each();
        $this->assertFalse(isset($a['extra']));
        $a = $this->tMixed->each();
        $this->assertFalse(isset($a['extra']));
        $rightTable = new MyCSV("dummy/path/rigHt.CSv");
        $rightTable->insert(array('id' => 31, 'c' => "Yyy1"));
        $rightTable->insert(array('id' => 42, 'c' => "Yyy2", 'k9' => "k9"));
        $this->tMixed->join($rightTable, "b");
        $a = $this->tMixed->each();
        $this->assertFalse(isset($a['rigHt.c']));
        $a = $this->tMixed->each();
        $this->assertFalse(isset($a['rigHt.c']));
        $a = $this->tMixed->each();
        $this->assertEquals("Yyy2", $a['rigHt.c']);
        $this->tMixed->data[3]['k9'] = "k22";
        $this->assertEquals("k22", $this->tMixed->data[3]['rigHt.k9']);
    }

    function testExport()
    {
        $this->tMixed->drop_table();
        $this->assertEquals("id\r\n", $this->tMixed->export());
        $this->tMixed->insert(array('a' => 'Me "q" & \'d\\/b\''));
        $this->tMixed->insert(array('a' => "'xtr\a \"lrg\" e'\\"));
        $this->tMixed->insert(array('a' => "a", 'b' => "b"));
        $this->assertEquals("id,a\r\n" .
            "1,\"Me \"\"q\"\" & 'd\/b'\"\r\n" .
            "2,\"'xtr\a \"\"lrg\"\" e'\\\\\"\r\n" .
            "3,\"a\"\r\n", $this->tMixed->export());
        $this->tMixed->delete();
        $this->tMixed->add_field("b");
        $this->tMixed->insert(array('b' => "b"));
        $this->assertEquals("id,a,b\r\n" .
            "4,,\"b\"\r\n", $this->tMixed->export());
    }
}

$suite = new PHPUnit_TestSuite("MyCSVTest");
// $result = PHPUnit::run($suite);
// echo $result->toHTML();
$gui = new PHPUnit_GUI_HTML($suite);
$gui->show();