summaryrefslogtreecommitdiff
path: root/ext/ctype/tests
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ctype/tests')
-rw-r--r--ext/ctype/tests/001.phpt39
-rw-r--r--ext/ctype/tests/002.phpt48
-rw-r--r--ext/ctype/tests/bug25745.phpt26
-rw-r--r--ext/ctype/tests/bug34645.phpt13
-rw-r--r--ext/ctype/tests/ctype_alnum_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_alnum_error.phpt45
-rw-r--r--ext/ctype/tests/ctype_alnum_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_alnum_variation2.phpt94
-rw-r--r--ext/ctype/tests/ctype_alnum_variation3.phpt129
-rw-r--r--ext/ctype/tests/ctype_alnum_variation4.phpt64
-rw-r--r--ext/ctype/tests/ctype_alpha_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_alpha_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_alpha_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_alpha_variation2.phpt84
-rw-r--r--ext/ctype/tests/ctype_alpha_variation3.phpt130
-rw-r--r--ext/ctype/tests/ctype_alpha_variation4.phpt64
-rw-r--r--ext/ctype/tests/ctype_cntrl_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_cntrl_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation1.phpt180
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation2.phpt65
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation3.phpt158
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation4.phpt63
-rw-r--r--ext/ctype/tests/ctype_digit_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_digit_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_digit_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_digit_variation2.phpt42
-rw-r--r--ext/ctype/tests/ctype_digit_variation3.phpt160
-rw-r--r--ext/ctype/tests/ctype_digit_variation4.phpt64
-rw-r--r--ext/ctype/tests/ctype_graph_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_graph_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_graph_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_graph_variation2.phpt126
-rw-r--r--ext/ctype/tests/ctype_graph_variation3.phpt148
-rw-r--r--ext/ctype/tests/ctype_graph_variation4.phpt64
-rw-r--r--ext/ctype/tests/ctype_lower_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_lower_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_lower_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_lower_variation2.phpt58
-rw-r--r--ext/ctype/tests/ctype_lower_variation3.phpt140
-rw-r--r--ext/ctype/tests/ctype_lower_variation4.phpt64
-rw-r--r--ext/ctype/tests/ctype_print_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_print_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_print_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_print_variation2.phpt127
-rw-r--r--ext/ctype/tests/ctype_print_variation3.phpt128
-rw-r--r--ext/ctype/tests/ctype_print_variation4.phpt63
-rw-r--r--ext/ctype/tests/ctype_punct_basic.phpt30
-rw-r--r--ext/ctype/tests/ctype_punct_error.phpt46
-rw-r--r--ext/ctype/tests/ctype_punct_variation1.phpt180
-rw-r--r--ext/ctype/tests/ctype_punct_variation2.phpt65
-rw-r--r--ext/ctype/tests/ctype_punct_variation3.phpt140
-rw-r--r--ext/ctype/tests/ctype_punct_variation4.phpt65
-rw-r--r--ext/ctype/tests/ctype_space_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_space_error.phpt45
-rw-r--r--ext/ctype/tests/ctype_space_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_space_variation2.phpt37
-rw-r--r--ext/ctype/tests/ctype_space_variation3.phpt140
-rw-r--r--ext/ctype/tests/ctype_space_variation4.phpt71
-rw-r--r--ext/ctype/tests/ctype_upper_basic.phpt29
-rw-r--r--ext/ctype/tests/ctype_upper_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_upper_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_upper_variation2.phpt57
-rw-r--r--ext/ctype/tests/ctype_upper_variation3.phpt139
-rw-r--r--ext/ctype/tests/ctype_upper_variation4.phpt63
-rw-r--r--ext/ctype/tests/ctype_xdigit_basic.phpt28
-rw-r--r--ext/ctype/tests/ctype_xdigit_error.phpt41
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation1.phpt179
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation2.phpt54
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation3.phpt140
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation4.phpt83
-rw-r--r--ext/ctype/tests/skipif.inc1
71 files changed, 5970 insertions, 0 deletions
diff --git a/ext/ctype/tests/001.phpt b/ext/ctype/tests/001.phpt
new file mode 100644
index 0000000..0c80aec
--- /dev/null
+++ b/ext/ctype/tests/001.phpt
@@ -0,0 +1,39 @@
+--TEST--
+ctype on integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+ setlocale(LC_ALL,"C");
+
+ function ctype_test_001($function) {
+ $n=0;
+ for($a=0;$a<256;$a++) {
+ if($function($a)) $n++;
+ }
+ echo "$function $n\n";
+ }
+ctype_test_001("ctype_lower");
+ctype_test_001("ctype_upper");
+ctype_test_001("ctype_alpha");
+ctype_test_001("ctype_digit");
+ctype_test_001("ctype_alnum");
+ctype_test_001("ctype_cntrl");
+ctype_test_001("ctype_graph");
+ctype_test_001("ctype_print");
+ctype_test_001("ctype_punct");
+ctype_test_001("ctype_space");
+ctype_test_001("ctype_xdigit");
+?>
+--EXPECT--
+ctype_lower 26
+ctype_upper 26
+ctype_alpha 52
+ctype_digit 10
+ctype_alnum 62
+ctype_cntrl 33
+ctype_graph 94
+ctype_print 95
+ctype_punct 32
+ctype_space 6
+ctype_xdigit 22
diff --git a/ext/ctype/tests/002.phpt b/ext/ctype/tests/002.phpt
new file mode 100644
index 0000000..c20612c
--- /dev/null
+++ b/ext/ctype/tests/002.phpt
@@ -0,0 +1,48 @@
+--TEST--
+ctype on strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+setlocale(LC_ALL,"C");
+print "LOCALE is '" . setlocale(LC_ALL,0) . "'\n";
+
+function ctype_test_002($function) {
+ $n1 = $n2 = $n3 = 0;
+ // test portable POSIX characters 0..127
+ for ($a=0;$a<128;$a++) {
+ $c = chr($a);
+ if($function($a)) $n1++;
+ if($function("$c$c$c")) $n2++;
+ if($function("1-$c$c$c-x")) $n3++;
+ }
+ print "$function $n1 $n2 $n3\n";
+}
+
+ctype_test_002("ctype_lower");
+ctype_test_002("ctype_upper");
+ctype_test_002("ctype_alpha");
+ctype_test_002("ctype_digit");
+ctype_test_002("ctype_alnum");
+ctype_test_002("ctype_cntrl");
+ctype_test_002("ctype_graph");
+ctype_test_002("ctype_print");
+ctype_test_002("ctype_punct");
+ctype_test_002("ctype_space");
+ctype_test_002("ctype_xdigit");
+
+?>
+--EXPECTF--
+LOCALE is '%s'
+ctype_lower 26 26 0
+ctype_upper 26 26 0
+ctype_alpha 52 52 0
+ctype_digit 10 10 0
+ctype_alnum 62 62 0
+ctype_cntrl 33 33 0
+ctype_graph 94 94 94
+ctype_print 95 95 95
+ctype_punct 32 32 0
+ctype_space 6 6 0
+ctype_xdigit 22 22 0
diff --git a/ext/ctype/tests/bug25745.phpt b/ext/ctype/tests/bug25745.phpt
new file mode 100644
index 0000000..ecacebb
--- /dev/null
+++ b/ext/ctype/tests/bug25745.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #25745 (ctype functions fail with non-ascii characters)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$funcs = array(
+ "ctype_alnum", "ctype_alpha", "ctype_cntrl", "ctype_digit",
+ "ctype_graph", "ctype_lower", "ctype_print", "ctype_punct",
+ "ctype_space", "ctype_upper", "ctype_xdigit"
+);
+
+foreach ($funcs as $ctype_func) {
+ for ($i = 0; $i < 256; $i++) {
+ $a = $ctype_func($i);
+ $b = $ctype_func(chr($i));
+ if ($a != $b) {
+ echo "broken... $ctype_func($i) = $a, $ctype_func(chr($i)) = $b\n";
+ exit;
+ }
+ }
+}
+echo "ok\n";
+?>
+--EXPECT--
+ok
diff --git a/ext/ctype/tests/bug34645.phpt b/ext/ctype/tests/bug34645.phpt
new file mode 100644
index 0000000..7aa3862
--- /dev/null
+++ b/ext/ctype/tests/bug34645.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #34645 (ctype corrupts memory when validating large numbers)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$id = 394829384;
+var_dump(ctype_digit($id));
+var_dump($id);
+?>
+--EXPECT--
+bool(true)
+int(394829384)
diff --git a/ext/ctype/tests/ctype_alnum_basic.phpt b/ext/ctype/tests/ctype_alnum_basic.phpt
new file mode 100644
index 0000000..2a18b82
--- /dev/null
+++ b/ext/ctype/tests/ctype_alnum_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_alnum() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alnum(mixed $c)
+ * Description: Checks for alphanumeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_alnum() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = 'abcXYZ';
+$c2 = ' \t*@';
+
+var_dump(ctype_alnum($c1));
+var_dump(ctype_alnum($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alnum() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alnum_error.phpt b/ext/ctype/tests/ctype_alnum_error.phpt
new file mode 100644
index 0000000..0b4a636
--- /dev/null
+++ b/ext/ctype/tests/ctype_alnum_error.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Test ctype_alnum() function : error conditions - Incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alnum(mixed $c)
+ * Description: Checks for alphanumeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass incorrect number of arguments to ctype_alnum() to test behaviour
+ */
+
+echo "*** Testing ctype_alnum() : error conditions ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+// Zero arguments
+echo "\n-- Testing ctype_alnum() function with Zero arguments --\n";
+var_dump( ctype_alnum() );
+
+//Test ctype_alnum with one more than the expected number of arguments
+echo "\n-- Testing ctype_alnum() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_alnum($c, $extra_arg) );
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alnum() : error conditions ***
+
+-- Testing ctype_alnum() function with Zero arguments --
+
+Warning: ctype_alnum() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_alnum() function with more than expected no. of arguments --
+
+Warning: ctype_alnum() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_alnum_variation1.phpt b/ext/ctype/tests/ctype_alnum_variation1.phpt
new file mode 100644
index 0000000..2505428
--- /dev/null
+++ b/ext/ctype/tests/ctype_alnum_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_alnum() function : usage variations - Different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alnum(mixed $c)
+ * Description: Checks for alphanumeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_alnum() to test behaviour
+ */
+
+echo "*** Testing ctype_alnum() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "xyz";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+123
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "pqr",
+ 'LMN',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_alnum()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_alnum($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alnum() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(true)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alnum_variation2.phpt b/ext/ctype/tests/ctype_alnum_variation2.phpt
new file mode 100644
index 0000000..94ae22d
--- /dev/null
+++ b/ext/ctype/tests/ctype_alnum_variation2.phpt
@@ -0,0 +1,94 @@
+--TEST--
+Test ctype_alnum() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alnum(mixed $c)
+ * Description: Checks for alphanumeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_alnum() to test which character codes are considered
+ * valid alphanumeric characters
+ */
+
+echo "*** Testing ctype_alnum() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_alnum($i)) {
+ echo "character code $i is alpha numeric\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alnum() : usage variations ***
+character code 48 is alpha numeric
+character code 49 is alpha numeric
+character code 50 is alpha numeric
+character code 51 is alpha numeric
+character code 52 is alpha numeric
+character code 53 is alpha numeric
+character code 54 is alpha numeric
+character code 55 is alpha numeric
+character code 56 is alpha numeric
+character code 57 is alpha numeric
+character code 65 is alpha numeric
+character code 66 is alpha numeric
+character code 67 is alpha numeric
+character code 68 is alpha numeric
+character code 69 is alpha numeric
+character code 70 is alpha numeric
+character code 71 is alpha numeric
+character code 72 is alpha numeric
+character code 73 is alpha numeric
+character code 74 is alpha numeric
+character code 75 is alpha numeric
+character code 76 is alpha numeric
+character code 77 is alpha numeric
+character code 78 is alpha numeric
+character code 79 is alpha numeric
+character code 80 is alpha numeric
+character code 81 is alpha numeric
+character code 82 is alpha numeric
+character code 83 is alpha numeric
+character code 84 is alpha numeric
+character code 85 is alpha numeric
+character code 86 is alpha numeric
+character code 87 is alpha numeric
+character code 88 is alpha numeric
+character code 89 is alpha numeric
+character code 90 is alpha numeric
+character code 97 is alpha numeric
+character code 98 is alpha numeric
+character code 99 is alpha numeric
+character code 100 is alpha numeric
+character code 101 is alpha numeric
+character code 102 is alpha numeric
+character code 103 is alpha numeric
+character code 104 is alpha numeric
+character code 105 is alpha numeric
+character code 106 is alpha numeric
+character code 107 is alpha numeric
+character code 108 is alpha numeric
+character code 109 is alpha numeric
+character code 110 is alpha numeric
+character code 111 is alpha numeric
+character code 112 is alpha numeric
+character code 113 is alpha numeric
+character code 114 is alpha numeric
+character code 115 is alpha numeric
+character code 116 is alpha numeric
+character code 117 is alpha numeric
+character code 118 is alpha numeric
+character code 119 is alpha numeric
+character code 120 is alpha numeric
+character code 121 is alpha numeric
+character code 122 is alpha numeric
+===DONE===
diff --git a/ext/ctype/tests/ctype_alnum_variation3.phpt b/ext/ctype/tests/ctype_alnum_variation3.phpt
new file mode 100644
index 0000000..a9da6c9
--- /dev/null
+++ b/ext/ctype/tests/ctype_alnum_variation3.phpt
@@ -0,0 +1,129 @@
+--TEST--
+Test ctype_alnum() function : usage variations - different string values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alnum(mixed $c)
+ * Description: Checks for alphanumeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different strings to ctype_alnum to test behaviour
+ */
+
+echo "*** Testing ctype_alnum() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ 'abc123\n',
+/*20*/ 'abc 123',
+ '',
+ ' ',
+/*23*/ base64_decode("w4DDoMOHw6fDiMOo") // non-ascii characters
+);
+
+
+// loop through each element of $values to test behaviour of ctype_alnum()
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_alnum($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alnum() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(true)
+
+-- Iteration 6 --
+bool(true)
+
+-- Iteration 7 --
+bool(true)
+
+-- Iteration 8 --
+bool(true)
+
+-- Iteration 9 --
+bool(true)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(true)
+
+-- Iteration 12 --
+bool(true)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(true)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alnum_variation4.phpt b/ext/ctype/tests/ctype_alnum_variation4.phpt
new file mode 100644
index 0000000..49167eb
--- /dev/null
+++ b/ext/ctype/tests/ctype_alnum_variation4.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test ctype_alnum() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alnum(mixed $c)
+ * Description: Checks for alphanumeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values to ctype_alnum() to test behaviour
+ */
+
+echo "*** Testing ctype_alnum() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array (060, 061, 062, 063);
+$hex_values = array(0x30, 0x31, 0x32, 0x33);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_alnum($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_alnum($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alnum() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alpha_basic.phpt b/ext/ctype/tests/ctype_alpha_basic.phpt
new file mode 100644
index 0000000..f0d8af8
--- /dev/null
+++ b/ext/ctype/tests/ctype_alpha_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_alpha() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alpha(mixed $c)
+ * Description: Checks for alphabetic character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_alpha() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = 'abcXYZ';
+$c2 = "Hello, World!";
+
+var_dump(ctype_alpha($c1));
+var_dump(ctype_alpha($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alpha() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alpha_error.phpt b/ext/ctype/tests/ctype_alpha_error.phpt
new file mode 100644
index 0000000..4cf8234
--- /dev/null
+++ b/ext/ctype/tests/ctype_alpha_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_alpha() function : error conditions - Incorrect number of arguments
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alpha(mixed $c)
+ * Description: Checks for alphabetic character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to ctype_alpha() to test behaviour
+ */
+
+echo "*** Testing ctype_alpha() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_alpha() function with Zero arguments --\n";
+var_dump( ctype_alpha() );
+
+//Test ctype_alpha with one more than the expected number of arguments
+echo "\n-- Testing ctype_alpha() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_alpha($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alpha() : error conditions ***
+
+-- Testing ctype_alpha() function with Zero arguments --
+
+Warning: ctype_alpha() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_alpha() function with more than expected no. of arguments --
+
+Warning: ctype_alpha() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_alpha_variation1.phpt b/ext/ctype/tests/ctype_alpha_variation1.phpt
new file mode 100644
index 0000000..baa75c8
--- /dev/null
+++ b/ext/ctype/tests/ctype_alpha_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_alpha() function : usage variations - different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alpha(mixed $c)
+ * Description: Checks for alphabetic character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_alpha() to test behaviour
+ */
+
+echo "*** Testing ctype_alpha() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "abcdef";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+XYZ
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_alpha()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_alpha($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alpha() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alpha_variation2.phpt b/ext/ctype/tests/ctype_alpha_variation2.phpt
new file mode 100644
index 0000000..866f372
--- /dev/null
+++ b/ext/ctype/tests/ctype_alpha_variation2.phpt
@@ -0,0 +1,84 @@
+--TEST--
+Test ctype_alpha() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alpha(mixed $c)
+ * Description: Checks for alphabetic character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_alpha() to test which character codes are considered
+ * valid alphabetic characters
+ */
+
+echo "*** Testing ctype_alpha() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_alpha($i)) {
+ echo "character code $i is alphabetic\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alpha() : usage variations ***
+character code 65 is alphabetic
+character code 66 is alphabetic
+character code 67 is alphabetic
+character code 68 is alphabetic
+character code 69 is alphabetic
+character code 70 is alphabetic
+character code 71 is alphabetic
+character code 72 is alphabetic
+character code 73 is alphabetic
+character code 74 is alphabetic
+character code 75 is alphabetic
+character code 76 is alphabetic
+character code 77 is alphabetic
+character code 78 is alphabetic
+character code 79 is alphabetic
+character code 80 is alphabetic
+character code 81 is alphabetic
+character code 82 is alphabetic
+character code 83 is alphabetic
+character code 84 is alphabetic
+character code 85 is alphabetic
+character code 86 is alphabetic
+character code 87 is alphabetic
+character code 88 is alphabetic
+character code 89 is alphabetic
+character code 90 is alphabetic
+character code 97 is alphabetic
+character code 98 is alphabetic
+character code 99 is alphabetic
+character code 100 is alphabetic
+character code 101 is alphabetic
+character code 102 is alphabetic
+character code 103 is alphabetic
+character code 104 is alphabetic
+character code 105 is alphabetic
+character code 106 is alphabetic
+character code 107 is alphabetic
+character code 108 is alphabetic
+character code 109 is alphabetic
+character code 110 is alphabetic
+character code 111 is alphabetic
+character code 112 is alphabetic
+character code 113 is alphabetic
+character code 114 is alphabetic
+character code 115 is alphabetic
+character code 116 is alphabetic
+character code 117 is alphabetic
+character code 118 is alphabetic
+character code 119 is alphabetic
+character code 120 is alphabetic
+character code 121 is alphabetic
+character code 122 is alphabetic
+===DONE===
diff --git a/ext/ctype/tests/ctype_alpha_variation3.phpt b/ext/ctype/tests/ctype_alpha_variation3.phpt
new file mode 100644
index 0000000..5ab4bd6
--- /dev/null
+++ b/ext/ctype/tests/ctype_alpha_variation3.phpt
@@ -0,0 +1,130 @@
+--TEST--
+Test ctype_alpha() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alpha(mixed $c)
+ * Description: Checks for alphabetic character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_alpha() to test
+ * which are considered valid alphabetic character only strings
+ */
+
+echo "*** Testing ctype_alpha() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ 'abc123\n',
+/*20*/ 'abc 123',
+ '',
+ ' ',
+/*23*/ base64_decode("w4DDoMOHw6fDiMOo") // non-ascii characters
+);
+
+
+// loop through each element of $values to test behaviour of ctype_alnum()
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_alpha($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alpha() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(true)
+
+-- Iteration 6 --
+bool(true)
+
+-- Iteration 7 --
+bool(true)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_alpha_variation4.phpt b/ext/ctype/tests/ctype_alpha_variation4.phpt
new file mode 100644
index 0000000..c41d972
--- /dev/null
+++ b/ext/ctype/tests/ctype_alpha_variation4.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test ctype_alpha() function : usage variations - Octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_alpha(mixed $c)
+ * Description: Checks for alphabetic character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values to ctype_alpha() to test behaviour
+ */
+
+echo "*** Testing ctype_alpha() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array (0101, 0102, 0103, 0104);
+$hex_values = array (0x41, 0x42, 0x43, 0x44);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_alpha($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_alpha($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_alpha() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_cntrl_basic.phpt b/ext/ctype/tests/ctype_cntrl_basic.phpt
new file mode 100644
index 0000000..b9241ad
--- /dev/null
+++ b/ext/ctype/tests/ctype_cntrl_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_cntrl() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_cntrl(mixed $c)
+ * Description: Checks for control character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_cntrl() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = "\r\n\t";
+$c2 = "Hello, World!\n";
+
+var_dump(ctype_cntrl($c1));
+var_dump(ctype_cntrl($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_cntrl() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_cntrl_error.phpt b/ext/ctype/tests/ctype_cntrl_error.phpt
new file mode 100644
index 0000000..7319ef6
--- /dev/null
+++ b/ext/ctype/tests/ctype_cntrl_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_cntrl() function : error conditions - Incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_cntrl(mixed $c)
+ * Description: Checks for control character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to ctype_cntrl() to test behaviour
+ */
+
+echo "*** Testing ctype_cntrl() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_cntrl() function with Zero arguments --\n";
+var_dump( ctype_cntrl() );
+
+//Test ctype_cntrl with one more than the expected number of arguments
+echo "\n-- Testing ctype_cntrl() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_cntrl($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_cntrl() : error conditions ***
+
+-- Testing ctype_cntrl() function with Zero arguments --
+
+Warning: ctype_cntrl() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_cntrl() function with more than expected no. of arguments --
+
+Warning: ctype_cntrl() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_cntrl_variation1.phpt b/ext/ctype/tests/ctype_cntrl_variation1.phpt
new file mode 100644
index 0000000..f74c13f
--- /dev/null
+++ b/ext/ctype/tests/ctype_cntrl_variation1.phpt
@@ -0,0 +1,180 @@
+--TEST--
+Test ctype_cntrl() function : usage variations - Different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_cntrl(mixed $c)
+ * Description: Checks for control character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_cntrl() to test behaviour
+ */
+
+echo "*** Testing ctype_cntrl() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "\n\r\t";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+\t\r\n
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "\t\r\n",
+ '
+',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_cntrl()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_cntrl($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_cntrl() : usage variations ***
+
+-- Iteration 1 --
+bool(true)
+
+-- Iteration 2 --
+bool(true)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_cntrl_variation2.phpt b/ext/ctype/tests/ctype_cntrl_variation2.phpt
new file mode 100644
index 0000000..b48ab94
--- /dev/null
+++ b/ext/ctype/tests/ctype_cntrl_variation2.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test ctype_cntrl() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_cntrl(mixed $c)
+ * Description: Checks for control character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_cntrl() to test which character codes are considered
+ * valid control characters
+ */
+
+echo "*** Testing ctype_cntrl() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_cntrl($i)) {
+ echo "character code $i is control character\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_cntrl() : usage variations ***
+character code 0 is control character
+character code 1 is control character
+character code 2 is control character
+character code 3 is control character
+character code 4 is control character
+character code 5 is control character
+character code 6 is control character
+character code 7 is control character
+character code 8 is control character
+character code 9 is control character
+character code 10 is control character
+character code 11 is control character
+character code 12 is control character
+character code 13 is control character
+character code 14 is control character
+character code 15 is control character
+character code 16 is control character
+character code 17 is control character
+character code 18 is control character
+character code 19 is control character
+character code 20 is control character
+character code 21 is control character
+character code 22 is control character
+character code 23 is control character
+character code 24 is control character
+character code 25 is control character
+character code 26 is control character
+character code 27 is control character
+character code 28 is control character
+character code 29 is control character
+character code 30 is control character
+character code 31 is control character
+character code 127 is control character
+===DONE===
diff --git a/ext/ctype/tests/ctype_cntrl_variation3.phpt b/ext/ctype/tests/ctype_cntrl_variation3.phpt
new file mode 100644
index 0000000..4ae5bc3
--- /dev/null
+++ b/ext/ctype/tests/ctype_cntrl_variation3.phpt
@@ -0,0 +1,158 @@
+--TEST--
+Test ctype_cntrl() function : usage variations - Different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_cntrl(mixed $c)
+ * Description: Checks for control character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_cntrl() to test
+ * which are considered valid control character only strings
+ */
+
+echo "*** Testing ctype_cntrl() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ 'abc123\n',
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ "\n",
+/*25*/ "\r",
+ "\t",
+ "0xD",
+ "0xA",
+ "0xE",
+/*30*/ "\t\r\n",
+);
+
+
+// loop through each element of $values to test behaviour of ctype_cntrl()
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_cntrl($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_cntrl() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(true)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(true)
+
+-- Iteration 25 --
+bool(true)
+
+-- Iteration 26 --
+bool(true)
+
+-- Iteration 27 --
+bool(false)
+
+-- Iteration 28 --
+bool(false)
+
+-- Iteration 29 --
+bool(false)
+
+-- Iteration 30 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_cntrl_variation4.phpt b/ext/ctype/tests/ctype_cntrl_variation4.phpt
new file mode 100644
index 0000000..0e1c503
--- /dev/null
+++ b/ext/ctype/tests/ctype_cntrl_variation4.phpt
@@ -0,0 +1,63 @@
+--TEST--
+Test ctype_cntrl() function : usage variations - Octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_cntrl(mixed $c)
+ * Description: Checks for control character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass hexadecimal and octal values to ctype_cntrl() to test behaviour
+ */
+
+echo "*** Testing ctype_cntrl() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(01, 02, 03, 04);
+$hex_values = array(0x1, 0x2, 0x3, 0x4);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_cntrl($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_cntrl($c));
+ $iterator++;
+}
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_cntrl() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_digit_basic.phpt b/ext/ctype/tests/ctype_digit_basic.phpt
new file mode 100644
index 0000000..049580d
--- /dev/null
+++ b/ext/ctype/tests/ctype_digit_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_digit() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_digit(mixed $c)
+ * Description: Checks for numeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_digit() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = '1234';
+$c2 = 'abc123';
+
+var_dump(ctype_digit($c1));
+var_dump(ctype_digit($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_digit() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_digit_error.phpt b/ext/ctype/tests/ctype_digit_error.phpt
new file mode 100644
index 0000000..5e80882
--- /dev/null
+++ b/ext/ctype/tests/ctype_digit_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_digit() function : error conditions - incorrect number of arguments
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_digit(mixed $c)
+ * Description: Checks for numeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to ctype_digit() to test behaviour
+ */
+
+echo "*** Testing ctype_digit() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_digit() function with Zero arguments --\n";
+var_dump( ctype_digit() );
+
+//Test ctype_digit with one more than the expected number of arguments
+echo "\n-- Testing ctype_digit() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_digit($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_digit() : error conditions ***
+
+-- Testing ctype_digit() function with Zero arguments --
+
+Warning: ctype_digit() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_digit() function with more than expected no. of arguments --
+
+Warning: ctype_digit() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_digit_variation1.phpt b/ext/ctype/tests/ctype_digit_variation1.phpt
new file mode 100644
index 0000000..3069491
--- /dev/null
+++ b/ext/ctype/tests/ctype_digit_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_digit() function : usage variations - different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_digit(mixed $c)
+ * Description: Checks for numeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_digit() to test behaviour
+ */
+
+echo "*** Testing ctype_digit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "123456";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+1
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "2",
+ '309',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_digit()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_digit($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_digit() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(true)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_digit_variation2.phpt b/ext/ctype/tests/ctype_digit_variation2.phpt
new file mode 100644
index 0000000..318737f
--- /dev/null
+++ b/ext/ctype/tests/ctype_digit_variation2.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Test ctype_digit() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_digit(mixed $c)
+ * Description: Checks for numeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_digit() to test which character codes are considered
+ * valid decimal digits
+ */
+
+echo "*** Testing ctype_digit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_digit($i)) {
+ echo "character code $i is a numeric digit\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_digit() : usage variations ***
+character code 48 is a numeric digit
+character code 49 is a numeric digit
+character code 50 is a numeric digit
+character code 51 is a numeric digit
+character code 52 is a numeric digit
+character code 53 is a numeric digit
+character code 54 is a numeric digit
+character code 55 is a numeric digit
+character code 56 is a numeric digit
+character code 57 is a numeric digit
+===DONE===
diff --git a/ext/ctype/tests/ctype_digit_variation3.phpt b/ext/ctype/tests/ctype_digit_variation3.phpt
new file mode 100644
index 0000000..66ef6f3
--- /dev/null
+++ b/ext/ctype/tests/ctype_digit_variation3.phpt
@@ -0,0 +1,160 @@
+--TEST--
+Test ctype_digit() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_digit(mixed $c)
+ * Description: Checks for numeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_digit() to test
+ * which are considered valid decimal digit only strings
+ */
+
+echo "*** Testing ctype_digit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ ")speci@! ch@r$(",
+ '@!$*',
+ "0",
+/*15*/ "3",
+ "9",
+ "1234",
+ "7890",
+ "0677",
+/*20*/ '0',
+ '3',
+ '9',
+ '1234',
+ '7890',
+/*25*/ "123abc",
+ "abc123",
+ "123\r\t",
+ "123 ",
+ " 123",
+/*30*/ "123E4",
+/*31*/ "0x3F",
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_digit($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_digit() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(true)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(true)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(true)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(true)
+
+-- Iteration 23 --
+bool(true)
+
+-- Iteration 24 --
+bool(true)
+
+-- Iteration 25 --
+bool(false)
+
+-- Iteration 26 --
+bool(false)
+
+-- Iteration 27 --
+bool(false)
+
+-- Iteration 28 --
+bool(false)
+
+-- Iteration 29 --
+bool(false)
+
+-- Iteration 30 --
+bool(false)
+
+-- Iteration 31 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_digit_variation4.phpt b/ext/ctype/tests/ctype_digit_variation4.phpt
new file mode 100644
index 0000000..c94be3e
--- /dev/null
+++ b/ext/ctype/tests/ctype_digit_variation4.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test ctype_digit() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_digit(mixed $c)
+ * Description: Checks for numeric character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values as $c argument to ctype_digit() to test behaviour
+ */
+
+echo "*** Testing ctype_digit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(061, 062, 063, 064);
+$hex_values = array (0x31, 0x32, 0x33, 0x34);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_digit($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_digit($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_digit() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_graph_basic.phpt b/ext/ctype/tests/ctype_graph_basic.phpt
new file mode 100644
index 0000000..b45aac6
--- /dev/null
+++ b/ext/ctype/tests/ctype_graph_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_graph() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_graph(mixed $c)
+ * Description: Checks for any printable character(s) except space
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_graph() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = 'helloWorld!';
+$c2 = "Hello, world!\n";
+
+var_dump(ctype_graph($c1));
+var_dump(ctype_graph($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_graph() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_graph_error.phpt b/ext/ctype/tests/ctype_graph_error.phpt
new file mode 100644
index 0000000..953b553
--- /dev/null
+++ b/ext/ctype/tests/ctype_graph_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_graph() function : error conditions - incorrect number of arguments
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_graph(mixed $c)
+ * Description: Checks for any printable character(s) except space
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to ctype_graph() to test behaviour
+ */
+
+echo "*** Testing ctype_graph() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_graph() function with Zero arguments --\n";
+var_dump( ctype_graph() );
+
+//Test ctype_graph with one more than the expected number of arguments
+echo "\n-- Testing ctype_graph() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_graph($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_graph() : error conditions ***
+
+-- Testing ctype_graph() function with Zero arguments --
+
+Warning: ctype_graph() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_graph() function with more than expected no. of arguments --
+
+Warning: ctype_graph() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_graph_variation1.phpt b/ext/ctype/tests/ctype_graph_variation1.phpt
new file mode 100644
index 0000000..03471f1
--- /dev/null
+++ b/ext/ctype/tests/ctype_graph_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_graph() function : usage variations - different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_graph(mixed $c)
+ * Description: Checks for any printable character(s) except space
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_graph() to test behaviour
+ */
+
+echo "*** Testing ctype_graph() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "myClass";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hiWorld!
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_graph()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_graph($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_graph() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(true)
+
+-- Iteration 4 --
+bool(true)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_graph_variation2.phpt b/ext/ctype/tests/ctype_graph_variation2.phpt
new file mode 100644
index 0000000..8f8b3fe
--- /dev/null
+++ b/ext/ctype/tests/ctype_graph_variation2.phpt
@@ -0,0 +1,126 @@
+--TEST--
+Test ctype_graph() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_graph(mixed $c)
+ * Description: Checks for any printable character(s) except space
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_graph() to test which character codes are considered
+ * valid visibly printable characters
+ */
+
+echo "*** Testing ctype_graph() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_graph($i)) {
+ echo "character code $i is a printable character\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_graph() : usage variations ***
+character code 33 is a printable character
+character code 34 is a printable character
+character code 35 is a printable character
+character code 36 is a printable character
+character code 37 is a printable character
+character code 38 is a printable character
+character code 39 is a printable character
+character code 40 is a printable character
+character code 41 is a printable character
+character code 42 is a printable character
+character code 43 is a printable character
+character code 44 is a printable character
+character code 45 is a printable character
+character code 46 is a printable character
+character code 47 is a printable character
+character code 48 is a printable character
+character code 49 is a printable character
+character code 50 is a printable character
+character code 51 is a printable character
+character code 52 is a printable character
+character code 53 is a printable character
+character code 54 is a printable character
+character code 55 is a printable character
+character code 56 is a printable character
+character code 57 is a printable character
+character code 58 is a printable character
+character code 59 is a printable character
+character code 60 is a printable character
+character code 61 is a printable character
+character code 62 is a printable character
+character code 63 is a printable character
+character code 64 is a printable character
+character code 65 is a printable character
+character code 66 is a printable character
+character code 67 is a printable character
+character code 68 is a printable character
+character code 69 is a printable character
+character code 70 is a printable character
+character code 71 is a printable character
+character code 72 is a printable character
+character code 73 is a printable character
+character code 74 is a printable character
+character code 75 is a printable character
+character code 76 is a printable character
+character code 77 is a printable character
+character code 78 is a printable character
+character code 79 is a printable character
+character code 80 is a printable character
+character code 81 is a printable character
+character code 82 is a printable character
+character code 83 is a printable character
+character code 84 is a printable character
+character code 85 is a printable character
+character code 86 is a printable character
+character code 87 is a printable character
+character code 88 is a printable character
+character code 89 is a printable character
+character code 90 is a printable character
+character code 91 is a printable character
+character code 92 is a printable character
+character code 93 is a printable character
+character code 94 is a printable character
+character code 95 is a printable character
+character code 96 is a printable character
+character code 97 is a printable character
+character code 98 is a printable character
+character code 99 is a printable character
+character code 100 is a printable character
+character code 101 is a printable character
+character code 102 is a printable character
+character code 103 is a printable character
+character code 104 is a printable character
+character code 105 is a printable character
+character code 106 is a printable character
+character code 107 is a printable character
+character code 108 is a printable character
+character code 109 is a printable character
+character code 110 is a printable character
+character code 111 is a printable character
+character code 112 is a printable character
+character code 113 is a printable character
+character code 114 is a printable character
+character code 115 is a printable character
+character code 116 is a printable character
+character code 117 is a printable character
+character code 118 is a printable character
+character code 119 is a printable character
+character code 120 is a printable character
+character code 121 is a printable character
+character code 122 is a printable character
+character code 123 is a printable character
+character code 124 is a printable character
+character code 125 is a printable character
+character code 126 is a printable character
+===DONE===
diff --git a/ext/ctype/tests/ctype_graph_variation3.phpt b/ext/ctype/tests/ctype_graph_variation3.phpt
new file mode 100644
index 0000000..327a497
--- /dev/null
+++ b/ext/ctype/tests/ctype_graph_variation3.phpt
@@ -0,0 +1,148 @@
+--TEST--
+Test ctype_graph() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_graph(mixed $c)
+ * Description: Checks for any printable character(s) except space
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_graph() to test
+ * which are considered valid printable character only strings
+ */
+
+echo "*** Testing ctype_graph() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ "abc123\n",
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ "!$%^&*()_+-={}[]:;@~'#<,>.?/",
+/*25*/ "\"ABC\"",
+ "String\twith\ttabs",
+ "Sample string with newline\n",
+/*28*/ "123 ABC XYZ",
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_graph($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_graph() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(true)
+
+-- Iteration 6 --
+bool(true)
+
+-- Iteration 7 --
+bool(true)
+
+-- Iteration 8 --
+bool(true)
+
+-- Iteration 9 --
+bool(true)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(true)
+
+-- Iteration 12 --
+bool(true)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(true)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(true)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(true)
+
+-- Iteration 25 --
+bool(true)
+
+-- Iteration 26 --
+bool(false)
+
+-- Iteration 27 --
+bool(false)
+
+-- Iteration 28 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_graph_variation4.phpt b/ext/ctype/tests/ctype_graph_variation4.phpt
new file mode 100644
index 0000000..d425b4c
--- /dev/null
+++ b/ext/ctype/tests/ctype_graph_variation4.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test ctype_graph() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_graph(mixed $c)
+ * Description: Checks for any printable character(s) except space
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values to ctype_graph() to test behaviour
+ */
+
+echo "*** Testing ctype_graph() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(061, 062, 063, 064);
+$hex_values = array (0x31, 0x32, 0x33, 0x34);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_graph($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_graph($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_graph() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_lower_basic.phpt b/ext/ctype/tests/ctype_lower_basic.phpt
new file mode 100644
index 0000000..be6c0af
--- /dev/null
+++ b/ext/ctype/tests/ctype_lower_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_lower() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_lower(mixed $c)
+ * Description: Checks for lowercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_lower() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = 'helloworld';
+$c2 = "Hello, world!\n";
+
+var_dump(ctype_lower($c1));
+var_dump(ctype_lower($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_lower() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_lower_error.phpt b/ext/ctype/tests/ctype_lower_error.phpt
new file mode 100644
index 0000000..ef49c4c
--- /dev/null
+++ b/ext/ctype/tests/ctype_lower_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_lower() function : error conditions - incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_lower(mixed $c)
+ * Description: Checks for lowercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass incorrect number of arguments to ctype_lower() to test behaviour
+ */
+
+echo "*** Testing ctype_lower() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_lower() function with Zero arguments --\n";
+var_dump( ctype_lower() );
+
+//Test ctype_lower with one more than the expected number of arguments
+echo "\n-- Testing ctype_lower() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_lower($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_lower() : error conditions ***
+
+-- Testing ctype_lower() function with Zero arguments --
+
+Warning: ctype_lower() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_lower() function with more than expected no. of arguments --
+
+Warning: ctype_lower() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_lower_variation1.phpt b/ext/ctype/tests/ctype_lower_variation1.phpt
new file mode 100644
index 0000000..91c8ef5
--- /dev/null
+++ b/ext/ctype/tests/ctype_lower_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_lower() function : usage variations - different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_lower(mixed $c)
+ * Description: Checks for lowercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_lower() to test behaviour
+ */
+
+echo "*** Testing ctype_lower() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "class";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+heredoc
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_lower()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_lower($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_lower() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_lower_variation2.phpt b/ext/ctype/tests/ctype_lower_variation2.phpt
new file mode 100644
index 0000000..39eff9a
--- /dev/null
+++ b/ext/ctype/tests/ctype_lower_variation2.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test ctype_lower() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_lower(mixed $c)
+ * Description: Checks for lowercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_lower() to test which character codes are considered
+ * valid lowercase characters
+ */
+
+echo "*** Testing ctype_lower() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_lower($i)) {
+ echo "character code $i is a lower case character\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_lower() : usage variations ***
+character code 97 is a lower case character
+character code 98 is a lower case character
+character code 99 is a lower case character
+character code 100 is a lower case character
+character code 101 is a lower case character
+character code 102 is a lower case character
+character code 103 is a lower case character
+character code 104 is a lower case character
+character code 105 is a lower case character
+character code 106 is a lower case character
+character code 107 is a lower case character
+character code 108 is a lower case character
+character code 109 is a lower case character
+character code 110 is a lower case character
+character code 111 is a lower case character
+character code 112 is a lower case character
+character code 113 is a lower case character
+character code 114 is a lower case character
+character code 115 is a lower case character
+character code 116 is a lower case character
+character code 117 is a lower case character
+character code 118 is a lower case character
+character code 119 is a lower case character
+character code 120 is a lower case character
+character code 121 is a lower case character
+character code 122 is a lower case character
+===DONE===
diff --git a/ext/ctype/tests/ctype_lower_variation3.phpt b/ext/ctype/tests/ctype_lower_variation3.phpt
new file mode 100644
index 0000000..061cc1c
--- /dev/null
+++ b/ext/ctype/tests/ctype_lower_variation3.phpt
@@ -0,0 +1,140 @@
+--TEST--
+Test ctype_lower() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_lower(mixed $c)
+ * Description: Checks for lowercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_lower() to test
+ * which are considered valid lowercase character only strings
+ */
+
+echo "*** Testing ctype_lower() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ 'abc123\n',
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ "abcXYZ",
+/*25*/ "abc xyz",
+/*26*/ "abc+efg*xyz",
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_lower($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_lower() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(true)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(true)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+
+-- Iteration 26 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_lower_variation4.phpt b/ext/ctype/tests/ctype_lower_variation4.phpt
new file mode 100644
index 0000000..25e3d17
--- /dev/null
+++ b/ext/ctype/tests/ctype_lower_variation4.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test ctype_lower() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_lower(mixed $c)
+ * Description: Checks for lowercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values to ctype_lower() to test behaviour
+ */
+
+echo "*** Testing ctype_lower() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(0141, 0142, 0143, 0144);
+$hex_values = array (0x61, 0x62, 0x63, 0x64);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_lower($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_lower($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_lower() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_print_basic.phpt b/ext/ctype/tests/ctype_print_basic.phpt
new file mode 100644
index 0000000..49cb26f
--- /dev/null
+++ b/ext/ctype/tests/ctype_print_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_print() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_print(mixed $c)
+ * Description: Checks for printable character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_print() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = "Hello, World!";
+$c2 = null;
+
+var_dump(ctype_print($c1));
+var_dump(ctype_print($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_print() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_print_error.phpt b/ext/ctype/tests/ctype_print_error.phpt
new file mode 100644
index 0000000..09ed8c9
--- /dev/null
+++ b/ext/ctype/tests/ctype_print_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_print() function : error conditions - incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_print(mixed $c)
+ * Description: Checks for printable character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass incorrect number of arguments to ctype_print() to test behaviour
+ */
+
+echo "*** Testing ctype_print() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_print() function with Zero arguments --\n";
+var_dump( ctype_print() );
+
+//Test ctype_print with one more than the expected number of arguments
+echo "\n-- Testing ctype_print() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_print($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_print() : error conditions ***
+
+-- Testing ctype_print() function with Zero arguments --
+
+Warning: ctype_print() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_print() function with more than expected no. of arguments --
+
+Warning: ctype_print() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_print_variation1.phpt b/ext/ctype/tests/ctype_print_variation1.phpt
new file mode 100644
index 0000000..a882c96
--- /dev/null
+++ b/ext/ctype/tests/ctype_print_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_print() function : usage variations - different data types as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_print(mixed $c)
+ * Description: Checks for printable character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_print() to test behaviour
+ */
+
+echo "*** Testing ctype_print() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_print()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_print($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_print() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(true)
+
+-- Iteration 4 --
+bool(true)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_print_variation2.phpt b/ext/ctype/tests/ctype_print_variation2.phpt
new file mode 100644
index 0000000..c216e4d
--- /dev/null
+++ b/ext/ctype/tests/ctype_print_variation2.phpt
@@ -0,0 +1,127 @@
+--TEST--
+Test ctype_print() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_print(mixed $c)
+ * Description: Checks for printable character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_print() to test which character codes are considered
+ * valid printable characters
+ */
+
+echo "*** Testing ctype_print() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_print($i)) {
+ echo "character code $i is a printable character\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_print() : usage variations ***
+character code 32 is a printable character
+character code 33 is a printable character
+character code 34 is a printable character
+character code 35 is a printable character
+character code 36 is a printable character
+character code 37 is a printable character
+character code 38 is a printable character
+character code 39 is a printable character
+character code 40 is a printable character
+character code 41 is a printable character
+character code 42 is a printable character
+character code 43 is a printable character
+character code 44 is a printable character
+character code 45 is a printable character
+character code 46 is a printable character
+character code 47 is a printable character
+character code 48 is a printable character
+character code 49 is a printable character
+character code 50 is a printable character
+character code 51 is a printable character
+character code 52 is a printable character
+character code 53 is a printable character
+character code 54 is a printable character
+character code 55 is a printable character
+character code 56 is a printable character
+character code 57 is a printable character
+character code 58 is a printable character
+character code 59 is a printable character
+character code 60 is a printable character
+character code 61 is a printable character
+character code 62 is a printable character
+character code 63 is a printable character
+character code 64 is a printable character
+character code 65 is a printable character
+character code 66 is a printable character
+character code 67 is a printable character
+character code 68 is a printable character
+character code 69 is a printable character
+character code 70 is a printable character
+character code 71 is a printable character
+character code 72 is a printable character
+character code 73 is a printable character
+character code 74 is a printable character
+character code 75 is a printable character
+character code 76 is a printable character
+character code 77 is a printable character
+character code 78 is a printable character
+character code 79 is a printable character
+character code 80 is a printable character
+character code 81 is a printable character
+character code 82 is a printable character
+character code 83 is a printable character
+character code 84 is a printable character
+character code 85 is a printable character
+character code 86 is a printable character
+character code 87 is a printable character
+character code 88 is a printable character
+character code 89 is a printable character
+character code 90 is a printable character
+character code 91 is a printable character
+character code 92 is a printable character
+character code 93 is a printable character
+character code 94 is a printable character
+character code 95 is a printable character
+character code 96 is a printable character
+character code 97 is a printable character
+character code 98 is a printable character
+character code 99 is a printable character
+character code 100 is a printable character
+character code 101 is a printable character
+character code 102 is a printable character
+character code 103 is a printable character
+character code 104 is a printable character
+character code 105 is a printable character
+character code 106 is a printable character
+character code 107 is a printable character
+character code 108 is a printable character
+character code 109 is a printable character
+character code 110 is a printable character
+character code 111 is a printable character
+character code 112 is a printable character
+character code 113 is a printable character
+character code 114 is a printable character
+character code 115 is a printable character
+character code 116 is a printable character
+character code 117 is a printable character
+character code 118 is a printable character
+character code 119 is a printable character
+character code 120 is a printable character
+character code 121 is a printable character
+character code 122 is a printable character
+character code 123 is a printable character
+character code 124 is a printable character
+character code 125 is a printable character
+character code 126 is a printable character
+===DONE===
diff --git a/ext/ctype/tests/ctype_print_variation3.phpt b/ext/ctype/tests/ctype_print_variation3.phpt
new file mode 100644
index 0000000..7b90e4f
--- /dev/null
+++ b/ext/ctype/tests/ctype_print_variation3.phpt
@@ -0,0 +1,128 @@
+--TEST--
+Test ctype_print() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_print(mixed $c)
+ * Description: Checks for printable character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_print() to test
+ * which are considered valid printable character only strings
+ */
+
+echo "*** Testing ctype_print() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ "abc123\n",
+/*20*/ 'abc 123',
+ '',
+ ' ',
+/*23*/ base64_decode("w4DDoMOHw6fDiMOo") // non-ascii characters
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_print($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_print() : usage variations ***
+
+-- Iteration 1 --
+bool(true)
+
+-- Iteration 2 --
+bool(true)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(true)
+
+-- Iteration 5 --
+bool(true)
+
+-- Iteration 6 --
+bool(true)
+
+-- Iteration 7 --
+bool(true)
+
+-- Iteration 8 --
+bool(true)
+
+-- Iteration 9 --
+bool(true)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(true)
+
+-- Iteration 12 --
+bool(true)
+
+-- Iteration 13 --
+bool(true)
+
+-- Iteration 14 --
+bool(true)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(true)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(true)
+
+-- Iteration 23 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_print_variation4.phpt b/ext/ctype/tests/ctype_print_variation4.phpt
new file mode 100644
index 0000000..d6dc84a
--- /dev/null
+++ b/ext/ctype/tests/ctype_print_variation4.phpt
@@ -0,0 +1,63 @@
+--TEST--
+Test ctype_print() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_print(mixed $c)
+ * Description: Checks for printable character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values to ctype_print() to test behaviour
+ */
+
+echo "*** Testing ctype_print() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(040, 041, 042, 043);
+$hex_values = array (0x20, 0x21, 0x23, 0x24);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_print($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_print($c));
+ $iterator++;
+}
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_print() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_punct_basic.phpt b/ext/ctype/tests/ctype_punct_basic.phpt
new file mode 100644
index 0000000..647f851
--- /dev/null
+++ b/ext/ctype/tests/ctype_punct_basic.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Test ctype_punct() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_punct(mixed $c)
+ * Description: Checks for any printable character which is not whitespace
+ * or an alphanumeric character
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_punct() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = '@!$*';
+$c2 = 'hello, world!';
+
+var_dump(ctype_punct($c1));
+var_dump(ctype_punct($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_punct() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_punct_error.phpt b/ext/ctype/tests/ctype_punct_error.phpt
new file mode 100644
index 0000000..afb9ff0
--- /dev/null
+++ b/ext/ctype/tests/ctype_punct_error.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Test ctype_punct() function : error conditions - incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_punct(mixed $c)
+ * Description: Checks for any printable character which is not whitespace
+ * or an alphanumeric character
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass incorrect number of arguments to ctype_punct() to test behaviour
+ */
+
+echo "*** Testing ctype_punct() : error conditions ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+// Zero arguments
+echo "\n-- Testing ctype_punct() function with Zero arguments --\n";
+var_dump( ctype_punct() );
+
+//Test ctype_punct with one more than the expected number of arguments
+echo "\n-- Testing ctype_punct() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_punct($c, $extra_arg) );
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_punct() : error conditions ***
+
+-- Testing ctype_punct() function with Zero arguments --
+
+Warning: ctype_punct() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_punct() function with more than expected no. of arguments --
+
+Warning: ctype_punct() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_punct_variation1.phpt b/ext/ctype/tests/ctype_punct_variation1.phpt
new file mode 100644
index 0000000..0f57c45
--- /dev/null
+++ b/ext/ctype/tests/ctype_punct_variation1.phpt
@@ -0,0 +1,180 @@
+--TEST--
+Test ctype_punct() function : usage variations - different data types as $c argument
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_punct(mixed $c)
+ * Description: Checks for any printable character which is not whitespace
+ * or an alphanumeric character
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_punt() to test behaviour
+ */
+
+echo "*** Testing ctype_punct() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return ",<.>";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+[{}]
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ ";:'@",
+ '#~/?',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_punct
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_punct($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_punct() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_punct_variation2.phpt b/ext/ctype/tests/ctype_punct_variation2.phpt
new file mode 100644
index 0000000..3a4a66a
--- /dev/null
+++ b/ext/ctype/tests/ctype_punct_variation2.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test ctype_punct() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_punct(mixed $c)
+ * Description: Checks for any printable character which is not whitespace
+ * or an alphanumeric character
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_punct() to test which character codes are considered
+ * valid punctuation characters
+ */
+
+echo "*** Testing ctype_punct() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($c = 1; $c < 256; $c++) {
+ if (ctype_punct($c)) {
+ echo "character code $c is punctuation\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_punct() : usage variations ***
+character code 33 is punctuation
+character code 34 is punctuation
+character code 35 is punctuation
+character code 36 is punctuation
+character code 37 is punctuation
+character code 38 is punctuation
+character code 39 is punctuation
+character code 40 is punctuation
+character code 41 is punctuation
+character code 42 is punctuation
+character code 43 is punctuation
+character code 44 is punctuation
+character code 45 is punctuation
+character code 46 is punctuation
+character code 47 is punctuation
+character code 58 is punctuation
+character code 59 is punctuation
+character code 60 is punctuation
+character code 61 is punctuation
+character code 62 is punctuation
+character code 63 is punctuation
+character code 64 is punctuation
+character code 91 is punctuation
+character code 92 is punctuation
+character code 93 is punctuation
+character code 94 is punctuation
+character code 95 is punctuation
+character code 96 is punctuation
+character code 123 is punctuation
+character code 124 is punctuation
+character code 125 is punctuation
+character code 126 is punctuation
+===DONE===
diff --git a/ext/ctype/tests/ctype_punct_variation3.phpt b/ext/ctype/tests/ctype_punct_variation3.phpt
new file mode 100644
index 0000000..73e377e
--- /dev/null
+++ b/ext/ctype/tests/ctype_punct_variation3.phpt
@@ -0,0 +1,140 @@
+--TEST--
+Test ctype_punct() function : usage variations - different punctuation
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_punct(mixed $c)
+ * Description: Checks for any printable character which is not whitespace
+ * or an alphanumeric character
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_punct() to test
+ * which are considered valid punctuation character only strings
+ */
+
+echo "*** Testing ctype_punct() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ "abc123\n",
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ "!$%@\n",
+/*25*/ "\"?!\"",
+/*26*/ "|\ @~",
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_punct($value) );
+ $iterator++;
+};
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_punct() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(true)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(true)
+
+-- Iteration 26 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_punct_variation4.phpt b/ext/ctype/tests/ctype_punct_variation4.phpt
new file mode 100644
index 0000000..7b7201b
--- /dev/null
+++ b/ext/ctype/tests/ctype_punct_variation4.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test ctype_punct() function : usage variations - Octal and Hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_punct(mixed $c)
+ * Description: Checks for any printable character which is not whitespace
+ * or an alphanumeric character
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different octal and hexadecimal values to ctype_punct() to test behaviour
+ */
+
+echo "*** Testing ctype_punct() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(041, 042, 043, 044);
+$hex_values = array(0x21, 0x22, 0x23, 0x24);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_punct($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_punct($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_punct() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_space_basic.phpt b/ext/ctype/tests/ctype_space_basic.phpt
new file mode 100644
index 0000000..55d9a81
--- /dev/null
+++ b/ext/ctype/tests/ctype_space_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_space() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_space(mixed $c)
+ * Description: Checks for whitespace character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_space() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = " \t\r\n";
+var_dump(ctype_space($c1));
+
+$c2 = "Hello, world!\n";
+var_dump(ctype_space($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_space() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_space_error.phpt b/ext/ctype/tests/ctype_space_error.phpt
new file mode 100644
index 0000000..d8f17d4
--- /dev/null
+++ b/ext/ctype/tests/ctype_space_error.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Test ctype_space() function : error conditions - Incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_space(mixed $c)
+ * Description: Checks for whitespace character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to ctype_space() to test behaviour
+ */
+
+echo "*** Testing ctype_space() : error conditions ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+// Zero arguments
+echo "\n-- Testing ctype_space() function with Zero arguments --\n";
+var_dump( ctype_space() );
+
+//Test ctype_space with one more than the expected number of arguments
+echo "\n-- Testing ctype_space() function with more than expected no. of arguments --\n";
+$c = " ";
+$extra_arg = 10;
+var_dump( ctype_space($c, $extra_arg) );
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_space() : error conditions ***
+
+-- Testing ctype_space() function with Zero arguments --
+
+Warning: ctype_space() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_space() function with more than expected no. of arguments --
+
+Warning: ctype_space() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_space_variation1.phpt b/ext/ctype/tests/ctype_space_variation1.phpt
new file mode 100644
index 0000000..4a469ae
--- /dev/null
+++ b/ext/ctype/tests/ctype_space_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_space() function : usage variations - different data types as $c argument
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_space(mixed $c)
+ * Description: Checks for whitespace character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_space() to test behaviour
+ */
+
+echo "*** Testing ctype_space() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "\n\t\r";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "\n\t\r",
+ ' ',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_space()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_space($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_space() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_space_variation2.phpt b/ext/ctype/tests/ctype_space_variation2.phpt
new file mode 100644
index 0000000..6ffdb9c
--- /dev/null
+++ b/ext/ctype/tests/ctype_space_variation2.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Test ctype_space() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_space(mixed $c)
+ * Description: Checks for whitespace character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_space() to test which character codes are considered
+ * valid whitespace characters
+ */
+
+echo "*** Testing ctype_space() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($c = 1; $c < 256; $c++) {
+ if (ctype_space($c)) {
+ echo "character code $c is a space character\n";
+ }
+}
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_space() : usage variations ***
+character code 9 is a space character
+character code 10 is a space character
+character code 11 is a space character
+character code 12 is a space character
+character code 13 is a space character
+character code 32 is a space character
+===DONE===
diff --git a/ext/ctype/tests/ctype_space_variation3.phpt b/ext/ctype/tests/ctype_space_variation3.phpt
new file mode 100644
index 0000000..bb8423b
--- /dev/null
+++ b/ext/ctype/tests/ctype_space_variation3.phpt
@@ -0,0 +1,140 @@
+--TEST--
+Test ctype_space() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_space(mixed $c)
+ * Description: Checks for whitespace character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_space() to test
+ * which are considered valid whitespace character only strings
+ */
+
+echo "*** Testing ctype_space() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ "abc123\n",
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ "\"\n",
+/*25*/ " \t\r\n",
+/*26*/ "\v\f",
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_space($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_space() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(true)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(true)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(true)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(true)
+
+-- Iteration 26 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_space_variation4.phpt b/ext/ctype/tests/ctype_space_variation4.phpt
new file mode 100644
index 0000000..305c123
--- /dev/null
+++ b/ext/ctype/tests/ctype_space_variation4.phpt
@@ -0,0 +1,71 @@
+--TEST--
+Test ctype_space() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_space(mixed $c)
+ * Description: Checks for whitespace character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values as $c to ctype_space() to test behaviour
+ */
+
+echo "*** Testing ctype_space() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array (011, 012, 013, 014, 015, 040);
+$hex_values = array (0x9, 0xA, 0xB, 0xC, 0xD, 0x20);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_space($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_space($c));
+ $iterator++;
+}
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_space() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+-- Iteration 5 --
+bool(true)
+-- Iteration 6 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+-- Iteration 5 --
+bool(true)
+-- Iteration 6 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_upper_basic.phpt b/ext/ctype/tests/ctype_upper_basic.phpt
new file mode 100644
index 0000000..635e481
--- /dev/null
+++ b/ext/ctype/tests/ctype_upper_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test ctype_upper() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_upper(mixed $c)
+ * Description: Checks for uppercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_upper() : basic functionality ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = 'HELLOWORLD';
+$c2 = "Hello, World!\n";
+
+var_dump(ctype_upper($c1));
+var_dump(ctype_upper($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_upper() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_upper_error.phpt b/ext/ctype/tests/ctype_upper_error.phpt
new file mode 100644
index 0000000..e9183f4
--- /dev/null
+++ b/ext/ctype/tests/ctype_upper_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_upper() function : error conditions - incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_upper(mixed $c)
+ * Description: Checks for uppercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass incorrect number of arguments to ctype_upper() to test behaviour
+ */
+
+echo "*** Testing ctype_upper() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_upper() function with Zero arguments --\n";
+var_dump( ctype_upper() );
+
+//Test ctype_upper with one more than the expected number of arguments
+echo "\n-- Testing ctype_upper() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_upper($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_upper() : error conditions ***
+
+-- Testing ctype_upper() function with Zero arguments --
+
+Warning: ctype_upper() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_upper() function with more than expected no. of arguments --
+
+Warning: ctype_upper() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_upper_variation1.phpt b/ext/ctype/tests/ctype_upper_variation1.phpt
new file mode 100644
index 0000000..a257cd3
--- /dev/null
+++ b/ext/ctype/tests/ctype_upper_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_upper() function : usage variations - different data types
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_upper(mixed $c)
+ * Description: Checks for uppercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_upper() to test behaviour
+ */
+
+echo "*** Testing ctype_upper() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "HELLO";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+HI
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "STRING",
+ 'STRING',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_upper()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_upper($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_upper() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_upper_variation2.phpt b/ext/ctype/tests/ctype_upper_variation2.phpt
new file mode 100644
index 0000000..9357feb
--- /dev/null
+++ b/ext/ctype/tests/ctype_upper_variation2.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Test ctype_upper() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_upper(mixed $c)
+ * Description: Checks for uppercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_upper() to test which character codes are considered
+ * valid uppercase characters
+ */
+
+echo "*** Testing ctype_upper() : usage variations ***\n";
+$orig = setlocale(LC_CTYPE, "C");
+
+for ($i = 0; $i < 256; $i++) {
+ if (ctype_upper($i)) {
+ echo "character code $i is a uppercase character\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_upper() : usage variations ***
+character code 65 is a uppercase character
+character code 66 is a uppercase character
+character code 67 is a uppercase character
+character code 68 is a uppercase character
+character code 69 is a uppercase character
+character code 70 is a uppercase character
+character code 71 is a uppercase character
+character code 72 is a uppercase character
+character code 73 is a uppercase character
+character code 74 is a uppercase character
+character code 75 is a uppercase character
+character code 76 is a uppercase character
+character code 77 is a uppercase character
+character code 78 is a uppercase character
+character code 79 is a uppercase character
+character code 80 is a uppercase character
+character code 81 is a uppercase character
+character code 82 is a uppercase character
+character code 83 is a uppercase character
+character code 84 is a uppercase character
+character code 85 is a uppercase character
+character code 86 is a uppercase character
+character code 87 is a uppercase character
+character code 88 is a uppercase character
+character code 89 is a uppercase character
+character code 90 is a uppercase character
+===DONE===
diff --git a/ext/ctype/tests/ctype_upper_variation3.phpt b/ext/ctype/tests/ctype_upper_variation3.phpt
new file mode 100644
index 0000000..3e4509e
--- /dev/null
+++ b/ext/ctype/tests/ctype_upper_variation3.phpt
@@ -0,0 +1,139 @@
+--TEST--
+Test ctype_upper() function : usage variations - different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_upper(mixed $c)
+ * Description: Checks for uppercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_upper() to test
+ * which are considered valid uppercase character only strings
+ */
+
+echo "*** Testing ctype_upper() : usage variations ***\n";
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ 'abc123\n',
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ "abcXYZ",
+/*25*/ "ABC XYZ",
+/*26*/ "ABC+EFG*XYZ",
+);
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_upper($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_upper() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(true)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+
+-- Iteration 26 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_upper_variation4.phpt b/ext/ctype/tests/ctype_upper_variation4.phpt
new file mode 100644
index 0000000..0c27992
--- /dev/null
+++ b/ext/ctype/tests/ctype_upper_variation4.phpt
@@ -0,0 +1,63 @@
+--TEST--
+Test ctype_upper() function : usage variations - octal and hexadecimal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_upper(mixed $c)
+ * Description: Checks for uppercase character(s)
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass octal and hexadecimal values to ctype_upper() to test behaviour
+ */
+
+echo "*** Testing ctype_upper() : usage variations ***\n";
+$orig = setlocale(LC_CTYPE, "C");
+
+$octal_values = array(0101, 0102, 0103, 0104);
+$hex_values = array(0x41, 0x42, 0x43, 0x44);
+
+echo "\n-- Octal Values --\n";
+$iterator = 1;
+foreach($octal_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_upper($c));
+ $iterator++;
+}
+
+echo "\n-- Hexadecimal Values --\n";
+$iterator = 1;
+foreach($hex_values as $c) {
+ echo "-- Iteration $iterator --\n";
+ var_dump(ctype_upper($c));
+ $iterator++;
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_upper() : usage variations ***
+
+-- Octal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+
+-- Hexadecimal Values --
+-- Iteration 1 --
+bool(true)
+-- Iteration 2 --
+bool(true)
+-- Iteration 3 --
+bool(true)
+-- Iteration 4 --
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/ctype_xdigit_basic.phpt b/ext/ctype/tests/ctype_xdigit_basic.phpt
new file mode 100644
index 0000000..179115d
--- /dev/null
+++ b/ext/ctype/tests/ctype_xdigit_basic.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Test ctype_xdigit() function : basic functionality
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_xdigit(mixed $c)
+ * Description: Checks for character(s) representing a hexadecimal digit
+ * Source code: ext/ctype/ctype.c
+ */
+
+echo "*** Testing ctype_xdigit() : basic functionality ***\n";
+$orig = setlocale(LC_CTYPE, "C");
+
+$c1 = 'abcdefABCDEF0123456789';
+$c2 = 'face 034';
+
+var_dump(ctype_xdigit($c1));
+var_dump(ctype_xdigit($c2));
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_xdigit() : basic functionality ***
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_xdigit_error.phpt b/ext/ctype/tests/ctype_xdigit_error.phpt
new file mode 100644
index 0000000..60ea69c
--- /dev/null
+++ b/ext/ctype/tests/ctype_xdigit_error.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test ctype_xdigit() function : error conditions - Incorrect number of args
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_xdigit(mixed $c)
+ * Description: Checks for character(s) representing a hexadecimal digit
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass incorrect number of arguments to ctype_xdigit() to test behaviour
+ */
+
+echo "*** Testing ctype_xdigit() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing ctype_xdigit() function with Zero arguments --\n";
+var_dump( ctype_xdigit() );
+
+//Test ctype_xdigit with one more than the expected number of arguments
+echo "\n-- Testing ctype_xdigit() function with more than expected no. of arguments --\n";
+$c = 1;
+$extra_arg = 10;
+var_dump( ctype_xdigit($c, $extra_arg) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_xdigit() : error conditions ***
+
+-- Testing ctype_xdigit() function with Zero arguments --
+
+Warning: ctype_xdigit() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing ctype_xdigit() function with more than expected no. of arguments --
+
+Warning: ctype_xdigit() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/ctype/tests/ctype_xdigit_variation1.phpt b/ext/ctype/tests/ctype_xdigit_variation1.phpt
new file mode 100644
index 0000000..963755b
--- /dev/null
+++ b/ext/ctype/tests/ctype_xdigit_variation1.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test ctype_xdigit() function : usage variations - different data typse as $c arg
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_xdigit(mixed $c)
+ * Description: Checks for character(s) representing a hexadecimal digit
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different data types as $c argument to ctype_xdigit() to test behaviour
+ */
+
+echo "*** Testing ctype_xdigit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "ABcd";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+234
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $c argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+ array(),
+
+ // string data
+/*19*/ "456",
+ 'def',
+ $heredoc,
+
+ // object data
+/*22*/ new classA(),
+
+ // undefined data
+/*23*/ @$undefined_var,
+
+ // unset data
+/*24*/ @$unset_var,
+
+ // resource variable
+/*25*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of ctype_xdigit()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_xdigit($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_xdigit() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(true)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(false)
+
+-- Iteration 25 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_xdigit_variation2.phpt b/ext/ctype/tests/ctype_xdigit_variation2.phpt
new file mode 100644
index 0000000..1e7b7bd
--- /dev/null
+++ b/ext/ctype/tests/ctype_xdigit_variation2.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Test ctype_xdigit() function : usage variations - different integers
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_xdigit(mixed $c)
+ * Description: Checks for character(s) representing a hexadecimal digit
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different integers to ctype_xdigit() to test which character codes are considered
+ * valid hexadecimal 'digits'
+ */
+
+echo "*** Testing ctype_xdigit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+for($c = 1; $c < 256; $c++) {
+ if (ctype_xdigit($c)) {
+ echo "character code $c is a hexadecimal 'digit'\n";
+ }
+}
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_xdigit() : usage variations ***
+character code 48 is a hexadecimal 'digit'
+character code 49 is a hexadecimal 'digit'
+character code 50 is a hexadecimal 'digit'
+character code 51 is a hexadecimal 'digit'
+character code 52 is a hexadecimal 'digit'
+character code 53 is a hexadecimal 'digit'
+character code 54 is a hexadecimal 'digit'
+character code 55 is a hexadecimal 'digit'
+character code 56 is a hexadecimal 'digit'
+character code 57 is a hexadecimal 'digit'
+character code 65 is a hexadecimal 'digit'
+character code 66 is a hexadecimal 'digit'
+character code 67 is a hexadecimal 'digit'
+character code 68 is a hexadecimal 'digit'
+character code 69 is a hexadecimal 'digit'
+character code 70 is a hexadecimal 'digit'
+character code 97 is a hexadecimal 'digit'
+character code 98 is a hexadecimal 'digit'
+character code 99 is a hexadecimal 'digit'
+character code 100 is a hexadecimal 'digit'
+character code 101 is a hexadecimal 'digit'
+character code 102 is a hexadecimal 'digit'
+===DONE===
diff --git a/ext/ctype/tests/ctype_xdigit_variation3.phpt b/ext/ctype/tests/ctype_xdigit_variation3.phpt
new file mode 100644
index 0000000..2c9960c
--- /dev/null
+++ b/ext/ctype/tests/ctype_xdigit_variation3.phpt
@@ -0,0 +1,140 @@
+--TEST--
+Test ctype_xdigit() function : usage variations - Different strings
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_xdigit(mixed $c)
+ * Description: Checks for character(s) representing a hexadecimal digit
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass strings containing different character types to ctype_xdigit() to test
+ * which are considered valid hexadecimal 'digit' only strings
+ */
+
+echo "*** Testing ctype_xdigit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+$values = array(
+/*1*/ "This string contains just letters and spaces", // Simple string
+ "but this one contains some numbers too 123+456 = 678", // Mixed string
+ "",
+ " ",
+/*5*/ "a",
+ "ABCXYZ",
+ "abcxyz",
+ "ABCXYZ123DEF456",
+ "abczyz123DEF456",
+/*10*/ "\r\n",
+ "123",
+ "03F", // hexadecimal 'digits'
+ ")speci@! ch@r$(",
+ '@!$*',
+/*15*/ 'ABC',
+ 'abc',
+ 'ABC123',
+ 'abc123',
+ 'abc123\n',
+/*20*/ 'abc 123',
+ '',
+ ' ',
+ base64_decode("w4DDoMOHw6fDiMOo"), // non-ascii characters
+ 'ABCdef07',
+ "56ea\tFB",
+ "0x2A"
+ );
+
+$iterator = 1;
+foreach($values as $value) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( ctype_xdigit($value) );
+ $iterator++;
+};
+
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_xdigit() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(true)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(true)
+
+-- Iteration 12 --
+bool(true)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(true)
+
+-- Iteration 16 --
+bool(true)
+
+-- Iteration 17 --
+bool(true)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+bool(true)
+
+-- Iteration 25 --
+bool(false)
+
+-- Iteration 26 --
+bool(false)
+===DONE===
diff --git a/ext/ctype/tests/ctype_xdigit_variation4.phpt b/ext/ctype/tests/ctype_xdigit_variation4.phpt
new file mode 100644
index 0000000..4707bce
--- /dev/null
+++ b/ext/ctype/tests/ctype_xdigit_variation4.phpt
@@ -0,0 +1,83 @@
+--TEST--
+Test ctype_xdigit() function : usage variations - heaxadecimal and octal values
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+/* Prototype : bool ctype_xdigit(mixed $c)
+ * Description: Checks for character(s) representing a hexadecimal digit
+ * Source code: ext/ctype/ctype.c
+ */
+
+/*
+ * Pass different hexadecimal and octal values that:
+ * 1. contain hexadecimal digits
+ * 2. correspond to character codes recognised as hexadecimal digits (see variation2)
+ * referred to as 'correct' integers below
+ */
+
+echo "*** Testing ctype_xdigit() : usage variations ***\n";
+
+$orig = setlocale(LC_CTYPE, "C");
+
+// contain hexadecimal digits but do not correspond to 'correct' ints
+$octal_values1 = array(012, 013, 014, 015);
+
+// correspond to 'correct' integers
+$octal_values2 = array(061, 062, 063, 064);
+
+// contain hexadecimal digits but do not correspond to 'correct' ints
+$hex_values1 = array(0x1A, 0x1B, 0x1C, 0x1D);
+
+//correspond to 'correct' integers
+$hex_values2 = array(0x61, 0x62, 0x63, 0x64);
+
+echo "\n-- Octal values --\n";
+echo "'Incorrect' Integers: \n";
+foreach($octal_values1 as $c) {
+ var_dump(ctype_xdigit($c));
+}
+echo "'Correct' Integers: \n";
+foreach($octal_values2 as $c) {
+ var_dump(ctype_xdigit($c));
+}
+
+echo "\n-- Hexadecimal values --\n";
+echo "'Incorrect' Integers: \n";
+foreach($hex_values1 as $c) {
+ var_dump(ctype_xdigit($c));
+}
+echo "'Correct' Integers: \n";
+foreach($hex_values2 as $c) {
+ var_dump(ctype_xdigit($c));
+}
+setlocale(LC_CTYPE, $orig);
+?>
+===DONE===
+--EXPECTF--
+*** Testing ctype_xdigit() : usage variations ***
+
+-- Octal values --
+'Incorrect' Integers:
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+'Correct' Integers:
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+
+-- Hexadecimal values --
+'Incorrect' Integers:
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+'Correct' Integers:
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+===DONE===
diff --git a/ext/ctype/tests/skipif.inc b/ext/ctype/tests/skipif.inc
new file mode 100644
index 0000000..55f6c11
--- /dev/null
+++ b/ext/ctype/tests/skipif.inc
@@ -0,0 +1 @@
+<?php if (!extension_loaded('ctype')) die('skip ctype extension not available');?>