OSDN Git Service

Added
[pukiwiki/pukiwiki_sandbox.git] / spam / SpamTest.php
index d30c76b..20171a4 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// $Id: SpamTest.php,v 1.2 2007/04/12 14:39:39 henoheno Exp $
+// $Id: SpamTest.php,v 1.17 2007/06/23 15:21:32 henoheno Exp $
 // Copyright (C) 2007 heno
 //
 // Design test case for spam.php (called from runner.php)
@@ -11,15 +11,227 @@ require_once('PHPUnit/PHPUnit.php');
 
 class SpamTest extends PHPUnit_TestCase
 {
+       function setup_string_null()
+       {
+               return array(
+                       '[NULL]'        => NULL,
+                       '[TRUE]'        => TRUE,
+                       '[FALSE]'       => FALSE,
+                       '[array(foobar)]' => array('foobar'),
+                       '[]'            => '',
+                       '[0]'           => 0,
+                       '[1]'           => 1
+               );
+       }
+
+       function testFunc_strings()
+       {
+               // 1st argument: Null
+               $this->assertEquals('',  strings(NULL,  0));
+               $this->assertEquals('',  strings(TRUE,  0));
+               $this->assertEquals('',  strings(FALSE, 0));
+               $this->assertEquals('',  strings('',    0));
+               $this->assertEquals('0', strings(0,     0));
+               $this->assertEquals('1', strings(1,     0));
+
+               // Setup
+               $t1 = '1'    . "\n";
+               $t2 = '12'   . "\n";
+               $t3 = '123'  . "\n";
+               $t4 = '1234' . "\n";
+               $t5 = '12345';
+               $test = $t1 . $t2 . $t3 . $t4 . $t5;
+
+               // Minimum length
+               $this->assertEquals($t1 . $t2 . $t3 . $t4 . $t5, strings($test, -1));
+               $this->assertEquals($t1 . $t2 . $t3 . $t4 . $t5, strings($test,  0));
+               $this->assertEquals($t1 . $t2 . $t3 . $t4 . $t5, strings($test,  1));
+               $this->assertEquals(      $t2 . $t3 . $t4 . $t5, strings($test,  2));
+               $this->assertEquals(            $t3 . $t4 . $t5, strings($test,  3));
+               $this->assertEquals(                  $t4 . $t5, strings($test,  4));
+               $this->assertEquals(                  $t4 . $t5, strings($test)); // Default
+               $this->assertEquals(                        $t5, strings($test,  5));
+
+               // Preserve the last newline
+               $this->assertEquals($t4 . $t5,        strings($test       , 4));
+               $this->assertEquals($t4 . $t5 . "\n", strings($test . "\n", 4));
+
+               // Ignore sequential spaces, and spaces at the beginning/end of lines
+               $test = '   A' . '      ' . '   ' . 'B  ';
+               $this->assertEquals($test, strings($test, 0, FALSE));
+               $this->assertEquals('A B', strings($test, 0, TRUE ));
+       }
+
+       function testFunc_array_count_leaves()
+       {
+               // Empty array = 0, if option is not set
+               $array = array();
+               $this->assertEquals(0, array_count_leaves($array, FALSE));
+               $this->assertEquals(1, array_count_leaves($array, TRUE));
+               $array = array(
+                       array(
+                               array()
+                       )
+               );
+               $this->assertEquals(0, array_count_leaves($array, FALSE));
+               $this->assertEquals(1, array_count_leaves($array, TRUE));
+
+               // One leaf = 1
+               foreach(array(NULL, TRUE, FALSE, -1, 0, 1, '', 'foobar') as $value) {
+                       $this->assertEquals(1, array_count_leaves($value, FALSE));
+                       $this->assertEquals(1, array_count_leaves($value, TRUE));
+               }
+
+               // Compisite
+               $array = array(
+                       1,
+                       'v1',
+                       array(),        // Empty array
+                       array(
+                               2,
+                               'v2',
+                               'k1' => TRUE,
+                               'k2' => FALSE,
+                               'k3' => array(),        // Empty array
+                               'k4' => array(
+                                       3,
+                                       'v3',
+                                       'k5' => NULL,
+                                       'k6' => array(),        // Empty array
+                               ),
+                       ),
+                       'k7'  => 4,
+                       'k8'  => 'v4',
+                       'k9'  => array(),       // Empty array
+                       'k10' => array(
+                               5,
+                               'v5',
+                               'k11' => NULL,
+                               'k12' => array(),       // Empty array
+                       ),
+               );
+               $this->assertEquals(14, array_count_leaves($array, FALSE));
+               $this->assertEquals(19, array_count_leaves($array, TRUE));
+       }
+
+       function testPhpFunc_array_unique()
+       {
+               $this->assertEquals(array(1), array_unique(array(1, 1)));
+
+               // Keys are preserved, array()s inside are preserved
+               $this->assertEquals(
+                       array(0, 2 => array(1, 1), 3 => 2),
+                       array_unique(
+                               array(0, 0, array(1, 1), 2, 2)
+                       )
+               );
+
+               // Keys are preserved
+               $this->assertEquals(
+                       array(0, 2 => array(1, 1), 3 => 2),
+                       array_unique(array(0, 0, array(1, 1), 2, 2))
+               );
+
+               // ONLY the first array() is preserved
+               $this->assertEquals(
+                       array(0 => array(1, 1)),
+                       array_unique(array_unique(array(0 => array(1, 1), 'a' => array(2,2), 'b' => array(3, 3))))
+               );
+       }
+
+       // And array_unique_recursive()
+       function testPhPFunc_array_merge_recursive()
+       {
+               $array1 = array(1);
+               $array2 = array(1);
+               $result = array_merge_recursive($array1, $array2);
+               $this->assertEquals(array(1, 1), $result);
+               $result = array_unique_recursive($result);
+               $this->assertEquals(array(1),    $result);
+
+               $array1 = array(2);
+               $array2 = array(1);
+               $result = array(2, 1);
+               $this->assertEquals($result, array_merge_recursive($array1, $array2));
+
+               // All NUMERIC keys are always renumbered from 0
+               $array1 = array('10' => 'f3');
+               $array2 = array('10' => 'f4');
+               $result = array('f3', 'f4');
+               $this->assertEquals($result, array_merge_recursive($array1, $array2));
+
+               // One more thing ...
+               $array1 = array('20' => 'f5');
+               $array2 = array();
+               $result = array('f5');
+               $this->assertEquals($result, array_merge_recursive($array1, $array2));
+
+               // Non-numeric keys and values will be marged as you think
+               $array1 = array('a' => 'f1');
+               $array2 = array('a' => 'f2');
+               $result = array('a' => array('f1', 'f2'));
+               $this->assertEquals($result, array_merge_recursive($array1, $array2));
+
+               // Non-numeric keys: An array and a value will be marged
+               $array1 = array('b' => array('k1'));
+               $array2 = array('b' => 'k2');
+               $result = array('b' => array('k1', 'k2'));
+               $this->assertEquals($result, array_merge_recursive($array1, $array2));
+
+               // Combination
+               $array1 = array(
+                       2,
+                       'a' => 'f1',
+                       '10' => 'f3',
+                       '20' => 'f5',
+                       'b' => array('k1'),
+               );
+               $array2 = array(
+                       1,
+                       'a' => 'f2',
+                       '10' => 'f4',
+                       'b' => 'k2',
+               );
+               $result = array (
+                       2,
+                       'a' => array (
+                               'f1',
+                               'f2',
+                       ),
+                       'f3',
+                       'f5',
+                       'b' => array (
+                               'k1',
+                               'k2',
+                       ),
+                       1,
+                       'f4',
+               );
+               $this->assertEquals($result, array_merge_recursive($array1, $array2));
+
+               // Values will not be unique
+               $array1 = array(5, 4);
+               $array2 = array(4, 5);
+               $result = array_merge_recursive($array1, $array2);
+               $this->assertEquals(array(5, 4, 4, 5), $result);
+               $result = array_unique_recursive($result);
+               $this->assertEquals(array(5, 4),       $result);
+
+               // One more thing ...
+               $array1 = array('b' => array('k3'));
+               $array2 = array('b' => 'k3');
+               $result = array_merge_recursive($array1, $array2);
+               $this->assertEquals(array('b' => array('k3', 'k3')), $result);
+               $result = array_unique_recursive($result);
+               $this->assertEquals(array('b' => array('k3')),       $result);
+       }
+
        function testFunc_uri_pickup()
        {
                // 1st argument: Null
-               $this->assertEquals(0, count(uri_pickup(NULL)));
-               $this->assertEquals(0, count(uri_pickup(TRUE)));
-               $this->assertEquals(0, count(uri_pickup(FALSE)));
-               $this->assertEquals(0, count(uri_pickup(array('foobar'))));
-               $this->assertEquals(0, count(uri_pickup('')));
-               $this->assertEquals(0, count(uri_pickup(0)));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals(0, count(uri_pickup($value)), $key);
+               }
 
                // 1st argument: Some
                $test_string = <<<EOF
@@ -71,18 +283,62 @@ EOF;
                $this->assertEquals('top_story.htm',  $results[3]['file']);
                $this->assertEquals('',               $results[3]['query']);
                $this->assertEquals('',               $results[3]['fragment']);
+
+
+               // Specific tests ----
+
+               // Divider: Back-slash
+               $test_string = ' http:\\backslash.org\fobar.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals('backslash.org',  $results[0]['host']);
+
+               // Host: Underscore
+               $test_string = ' http://under_score.org/fobar.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals('under_score.org',$results[0]['host']);     // Not 'under'
+
+               // Host: IPv4
+               $test_string = ' http://192.168.0.1/fobar.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals('192.168.0.1',    $results[0]['host']);
+
+               // Host: Starts
+               $test_string = ' http://_sss/foo.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals('_sss',           $results[0]['host']);
+               $this->assertEquals('foo.html',       $results[0]['file']);
+
+               // Host: Ends
+               $test_string = ' http://sss_/foo.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals('sss_',           $results[0]['host']);
+               $this->assertEquals('foo.html',       $results[0]['file']);
+
+
+               // Specific tests ---- Fails
+
+               // Divider: Colon only (Too sensitive to capture)
+               $test_string = ' http:colon.org ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals(0, count($results));
+
+               // Host: Too short
+               $test_string = ' http://s/foo.html http://ss/foo.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals(0, count($results));
+
+               $test_string = ' http://sss/foo.html ';
+               $results = uri_pickup_normalize(uri_pickup($test_string));
+               $this->assertEquals('sss',            $results[0]['host']);
+               $this->assertEquals('foo.html',       $results[0]['file']);
        }
 
        function testFunc_scheme_normalize()
        {
                // Null
-               $this->assertEquals('', scheme_normalize(NULL));
-               $this->assertEquals('', scheme_normalize(TRUE));
-               $this->assertEquals('', scheme_normalize(FALSE));
-               $this->assertEquals('', scheme_normalize(array('foobar')));
-               $this->assertEquals('', scheme_normalize(''));
-               $this->assertEquals('', scheme_normalize(0));
-               $this->assertEquals('', scheme_normalize(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('', scheme_normalize($value), $key);
+               }
 
                // CASE
                $this->assertEquals('http', scheme_normalize('HTTP'));
@@ -108,13 +364,9 @@ EOF;
        function testFunc_host_normalize()
        {
                // Null
-               $this->assertEquals('', host_normalize(NULL));
-               $this->assertEquals('', host_normalize(TRUE));
-               $this->assertEquals('', host_normalize(FALSE));
-               $this->assertEquals('', host_normalize(array('foobar')));
-               $this->assertEquals('', host_normalize(''));
-               $this->assertEquals('', host_normalize(0));
-               $this->assertEquals('', host_normalize(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('', host_normalize($value), $key);
+               }
 
                // Hostname is case-insensitive
                $this->assertEquals('example.org', host_normalize('ExAMPle.ORG'));
@@ -135,32 +387,32 @@ EOF;
                $this->assertEquals('', port_normalize('',   $scheme));
 
                // 1st argument: Known port
-               $this->assertEquals('',    port_normalize(-1,   $scheme));
-               $this->assertEquals(0,     port_normalize(0,    $scheme));
-               $this->assertEquals(1,     port_normalize(1,    $scheme));
-               $this->assertEquals('',    port_normalize(  21, 'ftp'));
-               $this->assertEquals('',    port_normalize(  22, 'ssh'));
-               $this->assertEquals('',    port_normalize(  23, 'telnet'));
-               $this->assertEquals('',    port_normalize(  25, 'smtp'));
-               $this->assertEquals('',    port_normalize(  69, 'tftp'));
-               $this->assertEquals('',    port_normalize(  70, 'gopher'));
-               $this->assertEquals('',    port_normalize(  79, 'finger'));
-               $this->assertEquals('',    port_normalize(  80, 'http'));
-               $this->assertEquals('',    port_normalize( 110, 'pop3'));
-               $this->assertEquals('',    port_normalize( 115, 'sftp'));
-               $this->assertEquals('',    port_normalize( 119, 'nntp'));
-               $this->assertEquals('',    port_normalize( 143, 'imap'));
-               $this->assertEquals('',    port_normalize( 194, 'irc'));
-               $this->assertEquals('',    port_normalize( 210, 'wais'));
-               $this->assertEquals('',    port_normalize( 443, 'https'));
-               $this->assertEquals('',    port_normalize( 563, 'nntps'));
-               $this->assertEquals('',    port_normalize( 873, 'rsync'));
-               $this->assertEquals('',    port_normalize( 990, 'ftps'));
-               $this->assertEquals('',    port_normalize( 992, 'telnets'));
-               $this->assertEquals('',    port_normalize( 993, 'imaps'));
-               $this->assertEquals('',    port_normalize( 994, 'ircs'));
-               $this->assertEquals('',    port_normalize( 995, 'pop3s'));
-               $this->assertEquals('',    port_normalize(3306, 'mysql'));
+               $this->assertEquals('',    port_normalize(   -1, $scheme));
+               $this->assertEquals(0,     port_normalize(    0, $scheme));
+               $this->assertEquals(1,     port_normalize(    1, $scheme));
+               $this->assertEquals('',    port_normalize(   21, 'ftp'));
+               $this->assertEquals('',    port_normalize(   22, 'ssh'));
+               $this->assertEquals('',    port_normalize(   23, 'telnet'));
+               $this->assertEquals('',    port_normalize(   25, 'smtp'));
+               $this->assertEquals('',    port_normalize(   69, 'tftp'));
+               $this->assertEquals('',    port_normalize(   70, 'gopher'));
+               $this->assertEquals('',    port_normalize(   79, 'finger'));
+               $this->assertEquals('',    port_normalize(   80, 'http'));
+               $this->assertEquals('',    port_normalize(  110, 'pop3'));
+               $this->assertEquals('',    port_normalize(  115, 'sftp'));
+               $this->assertEquals('',    port_normalize(  119, 'nntp'));
+               $this->assertEquals('',    port_normalize(  143, 'imap'));
+               $this->assertEquals('',    port_normalize(  194, 'irc'));
+               $this->assertEquals('',    port_normalize(  210, 'wais'));
+               $this->assertEquals('',    port_normalize(  443, 'https'));
+               $this->assertEquals('',    port_normalize(  563, 'nntps'));
+               $this->assertEquals('',    port_normalize(  873, 'rsync'));
+               $this->assertEquals('',    port_normalize(  990, 'ftps'));
+               $this->assertEquals('',    port_normalize(  992, 'telnets'));
+               $this->assertEquals('',    port_normalize(  993, 'imaps'));
+               $this->assertEquals('',    port_normalize(  994, 'ircs'));
+               $this->assertEquals('',    port_normalize(  995, 'pop3s'));
+               $this->assertEquals('',    port_normalize( 3306, 'mysql'));
                $this->assertEquals(8080,  port_normalize( 8080, $scheme));
                $this->assertEquals(65535, port_normalize(65535, $scheme));
                $this->assertEquals(65536, port_normalize(65536, $scheme)); // Seems not invalid in RFC
@@ -187,13 +439,9 @@ EOF;
        function testFunc_path_normalize()
        {
                // 1st argument: Null
-               $this->assertEquals('/', path_normalize(NULL));
-               $this->assertEquals('/', path_normalize(TRUE));
-               $this->assertEquals('/', path_normalize(FALSE));
-               $this->assertEquals('/', path_normalize(array('foobar')));
-               $this->assertEquals('/', path_normalize(''));
-               $this->assertEquals('/', path_normalize(0));
-               $this->assertEquals('/', path_normalize(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('/', path_normalize($value), $key);
+               }
 
                // 1st argument: CASE sensitive
                $this->assertEquals('/ExAMPle', path_normalize('ExAMPle'));
@@ -212,95 +460,91 @@ EOF;
        function testFunc_file_normalize()
        {
                // 1st argument: Null
-               $this->assertEquals('', file_normalize(NULL));
-               $this->assertEquals('', file_normalize(TRUE));
-               $this->assertEquals('', file_normalize(FALSE));
-               $this->assertEquals('', file_normalize(array('foobar')));
-               $this->assertEquals('', file_normalize(''));
-               $this->assertEquals('', file_normalize(0));
-               $this->assertEquals('', file_normalize(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('', file_normalize($value), $key);
+               }
 
                // 1st argument: Cut DirectoryIndexes (Destructive)
-               $this->assertEquals('', file_normalize('default.htm'));
-               $this->assertEquals('', file_normalize('default.html'));
-               $this->assertEquals('', file_normalize('default.asp'));
-               $this->assertEquals('', file_normalize('default.aspx'));
-\r              $this->assertEquals('', file_normalize('index'));
-               $this->assertEquals('', file_normalize('index.htm'));
-               $this->assertEquals('', file_normalize('index.html'));
-               $this->assertEquals('', file_normalize('index.shtml'));
-               $this->assertEquals('', file_normalize('index.jsp'));
-               $this->assertEquals('', file_normalize('index.php'));
-               $this->assertEquals('', file_normalize('index.php'));
-               $this->assertEquals('', file_normalize('index.php3'));
-               $this->assertEquals('', file_normalize('index.php4'));
-               $this->assertEquals('', file_normalize('index.pl'));
-               $this->assertEquals('', file_normalize('index.py'));
-               $this->assertEquals('', file_normalize('index.rb'));
-               $this->assertEquals('', file_normalize('index.cgi'));
-
-               // Apache 2.0.59 default 'index.html' variants
-               $this->assertEquals('', file_normalize('index.html.ca'));
-               $this->assertEquals('', file_normalize('index.html.cz.iso8859-2'));
-               $this->assertEquals('', file_normalize('index.html.de'));
-               $this->assertEquals('', file_normalize('index.html.dk'));
-               $this->assertEquals('', file_normalize('index.html.ee'));
-               $this->assertEquals('', file_normalize('index.html.el'));
-               $this->assertEquals('', file_normalize('index.html.en'));
-               $this->assertEquals('', file_normalize('index.html.es'));
-               $this->assertEquals('', file_normalize('index.html.et'));
-               $this->assertEquals('', file_normalize('index.html.fr'));
-               $this->assertEquals('', file_normalize('index.html.he.iso8859-8'));
-               $this->assertEquals('', file_normalize('index.html.hr.iso8859-2'));
-               $this->assertEquals('', file_normalize('index.html.it'));
-               $this->assertEquals('', file_normalize('index.html.ja.iso2022-jp'));
-               $this->assertEquals('', file_normalize('index.html.ko.euc-kr'));
-               $this->assertEquals('', file_normalize('index.html.lb.utf8'));
-               $this->assertEquals('', file_normalize('index.html.nl'));
-               $this->assertEquals('', file_normalize('index.html.nn'));
-               $this->assertEquals('', file_normalize('index.html.no'));
-               $this->assertEquals('', file_normalize('index.html.po.iso8859-2'));
-               $this->assertEquals('', file_normalize('index.html.pt'));
-               $this->assertEquals('', file_normalize('index.html.pt-br'));
-               $this->assertEquals('', file_normalize('index.html.ru.cp866'));
-               $this->assertEquals('', file_normalize('index.html.ru.cp-1251'));
-               $this->assertEquals('', file_normalize('index.html.ru.iso-ru'));
-               $this->assertEquals('', file_normalize('index.html.ru.koi8-r'));
-               $this->assertEquals('', file_normalize('index.html.ru.utf8'));
-               $this->assertEquals('', file_normalize('index.html.sv'));
-               $this->assertEquals('', file_normalize('index.html.var'));      // default
-               $this->assertEquals('', file_normalize('index.html.zh-cn.gb2312'));
-               $this->assertEquals('', file_normalize('index.html.zh-tw.big5'));
-
-               $this->assertEquals('', file_normalize('index.html.po.iso8859-2'));
-               $this->assertEquals('', file_normalize('index.html.zh-tw.big5'));
-
-               $this->assertEquals('', file_normalize('index.ja.en.de.html'));
+               foreach(array(
+                       'default.htm',
+                       'default.html',
+                       'default.asp',
+                       'default.aspx',
+\r                      'index',
+                       'index.htm',
+                       'index.html',
+                       'index.shtml',
+                       'index.jsp',
+                       'index.php',
+                       'index.php',
+                       'index.php3',
+                       'index.php4',
+                       'index.pl',
+                       'index.py',
+                       'index.rb',
+                       'index.cgi',
+
+                       // Apache 2.0.59 default 'index.html' variants
+                       'index.html.ca',
+                       'index.html.cz.iso8859-2',
+                       'index.html.de',
+                       'index.html.dk',
+                       'index.html.ee',
+                       'index.html.el',
+                       'index.html.en',
+                       'index.html.es',
+                       'index.html.et',
+                       'index.html.fr',
+                       'index.html.he.iso8859-8',
+                       'index.html.hr.iso8859-2',
+                       'index.html.it',
+                       'index.html.ja.iso2022-jp',
+                       'index.html.ko.euc-kr',
+                       'index.html.lb.utf8',
+                       'index.html.nl',
+                       'index.html.nn',
+                       'index.html.no',
+                       'index.html.po.iso8859-2',
+                       'index.html.pt',
+                       'index.html.pt-br',
+                       'index.html.ru.cp866',
+                       'index.html.ru.cp-1251',
+                       'index.html.ru.iso-ru',
+                       'index.html.ru.koi8-r',
+                       'index.html.ru.utf8',
+                       'index.html.sv',
+                       'index.html.var',       // default
+                       'index.html.zh-cn.gb2312',
+                       'index.html.zh-tw.big5',
+
+                       'index.html.po.iso8859-2',
+                       'index.html.zh-tw.big5',
+
+                       'index.ja.en.de.html',
                
-               // .gz
-               $this->assertEquals('', file_normalize('index.html.ca.gz'));
-               $this->assertEquals('', file_normalize('index.html.en.ja.ca.z'));
-
-       //      $this->assertEquals('foo/', file_normalize('foo/index.html'));
-
-       //      $this->assertEquals('ExAMPle', file_normalize('ExAMPle'));
-       //      $this->assertEquals('exe.exe', file_normalize('exe.exe'));
-       //      $this->assertEquals('sample.html', file_normalize('sample.html.en'));
-       //      $this->assertEquals('sample.html', file_normalize('sample.html.pt-br'));
-       //      $this->assertEquals('sample.html', file_normalize('sample.html.po.iso8859-2'));
-       //      $this->assertEquals('sample.html', file_normalize('sample.html.zh-tw.big5'));
+                       // .gz
+                       'index.html.ca.gz',
+                       'index.html.en.ja.ca.z',
+               ) as $arg){
+                       $this->assertEquals('', file_normalize($arg));
+               }
+
+               //$this->assertEquals('foo/', file_normalize('foo/index.html'));
+
+               //$this->assertEquals('ExAMPle', file_normalize('ExAMPle'));
+               //$this->assertEquals('exe.exe', file_normalize('exe.exe'));
+               //$this->assertEquals('sample.html', file_normalize('sample.html.en'));
+               //$this->assertEquals('sample.html', file_normalize('sample.html.pt-br'));
+               //$this->assertEquals('sample.html', file_normalize('sample.html.po.iso8859-2'));
+               //$this->assertEquals('sample.html', file_normalize('sample.html.zh-tw.big5'));
        }
 
        function testFunc_query_normalize()
        {
                // 1st argument: Null
-               $this->assertEquals('', query_normalize(NULL));
-               $this->assertEquals('', query_normalize(TRUE));
-               $this->assertEquals('', query_normalize(FALSE));
-               $this->assertEquals('', query_normalize(array('foobar')));
-               $this->assertEquals('', query_normalize(''));
-               $this->assertEquals('', query_normalize(0));
-               $this->assertEquals('', query_normalize(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('', query_normalize($value), $key);
+               }
 
                $this->assertEquals('a=0dd&b&c&d&f=d', query_normalize('&&&&f=d&b&d&c&a=0dd'));
                $this->assertEquals('eg=foobar',       query_normalize('nothing==&eg=dummy&eg=padding&eg=foobar'));
@@ -309,13 +553,9 @@ EOF;
        function testFunc_generate_glob_regex()
        {
                // 1st argument: Null
-               $this->assertEquals('', generate_glob_regex(NULL));
-               $this->assertEquals('', generate_glob_regex(TRUE));
-               $this->assertEquals('', generate_glob_regex(FALSE));
-               $this->assertEquals('', generate_glob_regex(array('foobar')));
-               $this->assertEquals('', generate_glob_regex(''));
-               $this->assertEquals('', generate_glob_regex(0));
-               $this->assertEquals('', generate_glob_regex(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('', generate_glob_regex($value), $key);
+               }
 
                $this->assertEquals('.*\.txt', generate_glob_regex('*.txt'));
                $this->assertEquals('A.A',     generate_glob_regex('A?A'));
@@ -324,13 +564,9 @@ EOF;
        function testFunc_generate_host_regex()
        {
                // 1st argument: Null
-               $this->assertEquals('', generate_host_regex(NULL));
-               $this->assertEquals('', generate_host_regex(TRUE));
-               $this->assertEquals('', generate_host_regex(FALSE));
-               $this->assertEquals('', generate_host_regex(array('foobar')));
-               $this->assertEquals('', generate_host_regex(''));
-               $this->assertEquals('', generate_host_regex(0));
-               $this->assertEquals('', generate_host_regex(1));
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('', generate_host_regex($value), $key);
+               }
 
                $this->assertEquals('localhost',             generate_host_regex('localhost'));
                $this->assertEquals('example\.org',          generate_host_regex('example.org'));
@@ -371,23 +607,50 @@ EOF;
                // get_blocklist()
                // ALL
                $array = get_blocklist();
-               $this->assertTrue(isset($array['badhost']));
+               $this->assertTrue(isset($array['C']));
                $this->assertTrue(isset($array['goodhost']));
                // badhost
-               $array = get_blocklist('badhost');
+               $array = get_blocklist('B-1');
                $this->assertTrue(isset($array['*.blogspot.com']));
                // goodhost
                $array = get_blocklist('goodhost');
                $this->assertTrue(isset($array['IANA-examples']));
        }
 
-       function testFunc_is_badhost()
+
+       function testFunc_whois_responsibility()
        {
-               // is_badhost_avail()
+               // 1st argument: Null
+               foreach($this->setup_string_null() as $key => $value){
+                       $this->assertEquals('',        whois_responsibility($value), $key);
+               }
 
-               // is_badhost()
-               $remains = array();
-               $this->assertTrue(is_badhost('something...blogspot.com', TRUE, $remains));
+               // 'act.edu.au' is known as 3rd level domain
+               $this->AssertEquals('bar.act.edu.au', whois_responsibility('foo.bar.act.edu.au'));
+               $this->AssertEquals('bar.act.edu.au', whois_responsibility('bar.act.edu.au'));
+               $this->AssertEquals('act.edu.au',  whois_responsibility('act.edu.au'));
+               $this->AssertEquals('edu.au',      whois_responsibility('edu.au'));
+               $this->AssertEquals('au',          whois_responsibility('au'));
+
+               // 'co.uk' is known as 2nd level domain
+               $this->AssertEquals('bar.co.uk',   whois_responsibility('foo.bar.co.uk'));
+               $this->AssertEquals('bar.co.uk',   whois_responsibility('bar.co.uk'));
+               $this->AssertEquals('co.uk',       whois_responsibility('co.uk'));
+               $this->AssertEquals('uk',          whois_responsibility('uk'));
+
+               // 'bar.uk' is not 2nd level (implicit responsibility)
+               $this->AssertEquals('bar.uk',      whois_responsibility('foo.bar.uk'));
+               $this->AssertEquals('bar.uk',      whois_responsibility('bar.uk'));
+
+               // IPv4
+               $this->AssertEquals('192.168.0.1', whois_responsibility('192.168.0.1'));
+
+               // Invalid Top-Level Domain (With implicit)
+               $this->AssertEquals('bar.local',  whois_responsibility('foo.bar.local'));       // Implicit responsibility
+               $this->AssertEquals('bar.local',  whois_responsibility('bar.local'));
+               $this->AssertEquals('local',      whois_responsibility('local'));
+               $this->AssertEquals('localhost',  whois_responsibility('localhost'));
+               $this->AssertEquals('s',          whois_responsibility('s'));
        }
 }