--TEST--
Test count() function 
--SKIPIF--
<?php if (!extension_loaded("spl")) die("skip no SPL extension"); ?>
--FILE--
<?php
/* Prototype: int count ( mixed $var [, int $mode] );
   Discription: Count elements in an array, or properties in an object
*/

echo "*** Testing basic functionality of count() function ***\n";
print 
"-- Testing NULL --\n";
$arr NULL;
print 
"COUNT_NORMAL: should be 0, is ".count($arrCOUNT_NORMAL)."\n";
print 
"COUNT_RECURSIVE: should be 0, is ".count($arrCOUNT_RECURSIVE)."\n";

print 
"-- Testing arrays --\n";
$arr = array(1, array(34, array(6, array(8))));
print 
"COUNT_NORMAL: should be 2, is ".count($arrCOUNT_NORMAL)."\n";
print 
"COUNT_RECURSIVE: should be 8, is ".count($arrCOUNT_RECURSIVE)."\n";

print 
"-- Testing hashes --\n";
$arr = array("a" => 1"b" => 2, array("c" => 3, array("d" => 5)));
print 
"COUNT_NORMAL: should be 3, is ".count($arrCOUNT_NORMAL)."\n";
print 
"COUNT_RECURSIVE: should be 6, is ".count($arrCOUNT_RECURSIVE)."\n";

print 
"-- Testing strings --\n";
print 
"COUNT_NORMAL: should be 1, is ".count("string"COUNT_NORMAL)."\n";
print 
"COUNT_RECURSIVE: should be 1, is ".count("string"COUNT_RECURSIVE)."\n";

print 
"-- Testing various types with no second argument --\n";
print 
"COUNT_NORMAL: should be 1, is ".count("string")."\n";
print 
"COUNT_NORMAL: should be 2, is ".count(array("a", array("b")))."\n";

$arr = array('a'=>array(NULLNULLNULL), 1=>array(NULL=>11=>NULL),
    array(array(array(array(array(
NULL))))));
print 
"-- Testing really cool arrays --\n";
print 
"COUNT_NORMAL: should be 3, is ".count($arrCOUNT_NORMAL)."\n";
print 
"COUNT_RECURSIVE: should be 13, is ".count($arrCOUNT_RECURSIVE)."\n";

echo 
"\n*** Testing possible variations of count() function on arrays ***";
$count_array = array(
  array(),
  array( 
=> "string"),
  array( 
"" => "string"=> "a"NULL => "b", -1.00 => "c",
         array(array(array(
NULL)))),
  array( -
2.44444 => 12, array(array(12, array(array("0"))))),
  array( 
"a" => 1"b" => -2.344"b" => "string""c" => NULL"d" => -2.344),
  array( 
=> 1=> -2.344"3" => "string""2" => NULL,
         
=> -2.344, array()),
  array( 
TRUE => TRUEFALSE => FALSE"" => """ " => " "
     
NULL => NULL"\x000" => "\x000""\000" => "\000"),
  array( 
NULL1.23 => "Hi""string" => "hello"
         array(
"" => "World""-2.34" => "a""0" => "b"))
);

$i 0;
foreach (
$count_array as $count_value) {
  echo 
"\n-- Iteration $i --\n";
  print 
"COUNT_NORMAL is ".count($count_valueCOUNT_NORMAL)."\n";
  print 
"COUNT_RECURSIVE is ".count($count_valueCOUNT_RECURSIVE)."\n";  
  
$i++;
}


/* Testing count() by passing constant with no second argument */
print "\n-- Testing count() on constants with no second argument --\n";
print 
"COUNT_NORMAL: should be 1, is ".count(100)."\n"
print 
"COUNT_NORMAL: should be 1, is ".count(-23.45)."\n";

print 
"\n-- Testing count() on NULL and Unset variables --\n";
print 
"COUNT_NORMAL: should be 0, is ".count(NULL)."\n";
print 
"COUNT_NORMAL: should be 1, is ".count("")."\n";
print 
"COUNT_NORMAL: should be 0, is ".@count($a)."\n";


print 
"\n-- Testing count() on an empty sub-array --\n";
$arr = array(1, array(34, array()));
print 
"COUNT_NORMAL: should be 2, is ".count($arrCOUNT_NORMAL)."\n";
print 
"COUNT_RECURSIVE: should be 5, is ".count($arrCOUNT_RECURSIVE)."\n";

echo 
"\n-- Testing count() on objects with Countable interface --\n";
class 
count_class implements Countable {
  private 
$var_private;
  public 
$var_public;
  protected 
$var_protected;

  public function 
count() {
    return 
3;
  }
}

$obj = new count_class();
print 
"COUNT_NORMAL: should be 3, is ".count($obj)."\n";


echo 
"\n-- Testing count() on resource type --\n";
$resource1 fopen__FILE__"r" );  // Creating file(stream type) resource
$resource2 opendir"." );  // Creating dir resource

/* creating an array with resources as elements */
$arr_resource = array("a" => $resource1"b" => $resource2);
var_dump(count($arr_resource));

echo 
"\n-- Testing count() on arrays containing references --\n";
$arr = array(1, array("a""b""c"));
$arr[2] = &$arr[1];

$mode_arr = array( COUNT_NORMALCOUNT_RECURSIVE01, -1, -1.452TRUE
                   
FALSENULL);
for( 
$i =0$i count$mode_arr ); $i++) {
  echo 
"For mode '$mode_arr[$i]' count is => ";
  
var_dump(count($arr$mode_arr[$i]));
}
  

echo 
"\n-- Testing error conditions --";
var_dumpcount() );  // No. of args = 0
var_dumpcount(array(), COUNT_NORMAL100) );  // No. of args > expected

/* Testing Invalid type arguments */
var_dumpcount("string"ABCD) );
var_dumpcount(100"string") );
var_dumpcount(array(), "") );

echo 
"\nDone";

/* closing the resource handles */
fclose$resource1 );
closedir$resource2 );
?>
--EXPECTF--
*** Testing basic functionality of count() function ***
-- Testing NULL --
COUNT_NORMAL: should be 0, is 0
COUNT_RECURSIVE: should be 0, is 0
-- Testing arrays --
COUNT_NORMAL: should be 2, is 2
COUNT_RECURSIVE: should be 8, is 8
-- Testing hashes --
COUNT_NORMAL: should be 3, is 3
COUNT_RECURSIVE: should be 6, is 6
-- Testing strings --
COUNT_NORMAL: should be 1, is 1
COUNT_RECURSIVE: should be 1, is 1
-- Testing various types with no second argument --
COUNT_NORMAL: should be 1, is 1
COUNT_NORMAL: should be 2, is 2
-- Testing really cool arrays --
COUNT_NORMAL: should be 3, is 3
COUNT_RECURSIVE: should be 13, is 13

*** Testing possible variations of count() function on arrays ***
-- Iteration 0 --
COUNT_NORMAL is 0
COUNT_RECURSIVE is 0

-- Iteration 1 --
COUNT_NORMAL is 1
COUNT_RECURSIVE is 1

-- Iteration 2 --
COUNT_NORMAL is 4
COUNT_RECURSIVE is 7

-- Iteration 3 --
COUNT_NORMAL is 2
COUNT_RECURSIVE is 8

-- Iteration 4 --
COUNT_NORMAL is 4
COUNT_RECURSIVE is 4

-- Iteration 5 --
COUNT_NORMAL is 5
COUNT_RECURSIVE is 5

-- Iteration 6 --
COUNT_NORMAL is 6
COUNT_RECURSIVE is 6

-- Iteration 7 --
COUNT_NORMAL is 4
COUNT_RECURSIVE is 7

-- Testing count() on constants with no second argument --
COUNT_NORMAL: should be 1, is 1
COUNT_NORMAL: should be 1, is 1

-- Testing count() on NULL and Unset variables --
COUNT_NORMAL: should be 0, is 0
COUNT_NORMAL: should be 1, is 1
COUNT_NORMAL: should be 0, is 0

-- Testing count() on an empty sub-array --
COUNT_NORMAL: should be 2, is 2
COUNT_RECURSIVE: should be 5, is 5

-- Testing count() on objects with Countable interface --
COUNT_NORMAL: should be 3, is 3

-- Testing count() on resource type --
int(2)

-- Testing count() on arrays containing references --
For mode '0' count is => int(3)
For mode '1' count is => int(9)
For mode '0' count is => int(3)
For mode '1' count is => int(9)
For mode '-1' count is => int(3)
For mode '-1.45' count is => int(3)
For mode '2' count is => int(3)
For mode '1' count is => int(9)
For mode '' count is => int(3)
For mode '' count is => int(3)

-- Testing error conditions --
Warning: count() expects at least 1 parameter, 0 given in %s on line %d
NULL

Warning: count() expects at most 2 parameters, 3 given in %s on line %d
NULL

Notice: Use of undefined constant ABCD - assumed 'ABCD' in %s on line %d

Warning: count() expects parameter 2 to be long, %s given in %s on line %d
NULL

Warning: count() expects parameter 2 to be long, %s given in %s on line %d
NULL

Warning: count() expects parameter 2 to be long, %s given in %s on line %d
NULL

Done