From fcce538d82a0c9f12dddf6063076f12ec929ddd8 Mon Sep 17 00:00:00 2001 From: andy wharmby Date: Thu, 22 Jan 2009 22:59:58 +0000 Subject: [PATCH] New image tests. Tested on WIndows, Linux and Linux 64 bit --- ext/standard/tests/image/2x2mm.tif | Bin 0 -> 118 bytes ext/standard/tests/image/75x50.wbmp | Bin 0 -> 504 bytes ext/standard/tests/image/75x50.xbm | 59 ++++++ ext/standard/tests/image/blank_file | 0 .../tests/image/getimagesize_error1.phpt | 38 ++++ .../tests/image/getimagesize_jpgapp.phpt | 37 ++++ .../tests/image/getimagesize_tif_mm.phpt | 39 ++++ .../tests/image/getimagesize_variation1.phpt | 192 ++++++++++++++++++ .../tests/image/getimagesize_variation2.phpt | 167 +++++++++++++++ .../tests/image/getimagesize_variation3.phpt | 70 +++++++ .../tests/image/getimagesize_variation4.phpt | 38 ++++ .../tests/image/getimagesize_wbmp.phpt | 39 ++++ .../tests/image/getimagesize_xbm.phpt | 39 ++++ ext/standard/tests/image/testAPP.jpg | Bin 0 -> 12174 bytes 14 files changed, 718 insertions(+) create mode 100644 ext/standard/tests/image/2x2mm.tif create mode 100644 ext/standard/tests/image/75x50.wbmp create mode 100644 ext/standard/tests/image/75x50.xbm create mode 100644 ext/standard/tests/image/blank_file create mode 100644 ext/standard/tests/image/getimagesize_error1.phpt create mode 100644 ext/standard/tests/image/getimagesize_jpgapp.phpt create mode 100644 ext/standard/tests/image/getimagesize_tif_mm.phpt create mode 100644 ext/standard/tests/image/getimagesize_variation1.phpt create mode 100644 ext/standard/tests/image/getimagesize_variation2.phpt create mode 100644 ext/standard/tests/image/getimagesize_variation3.phpt create mode 100644 ext/standard/tests/image/getimagesize_variation4.phpt create mode 100644 ext/standard/tests/image/getimagesize_wbmp.phpt create mode 100644 ext/standard/tests/image/getimagesize_xbm.phpt create mode 100644 ext/standard/tests/image/testAPP.jpg diff --git a/ext/standard/tests/image/2x2mm.tif b/ext/standard/tests/image/2x2mm.tif new file mode 100644 index 0000000000000000000000000000000000000000..8b95242d1aa710b08dbc0fe8cd0f973008676489 GIT binary patch literal 118 zcmebEWzb?^VBlcjU}Rum2C^6#n1BQ$5}OIi766JfL)k#ZjBH43K?WAEUIvCdMlmG4 R;!rjRP!_C!5oiG;0|1ST0onin literal 0 HcmV?d00001 diff --git a/ext/standard/tests/image/75x50.wbmp b/ext/standard/tests/image/75x50.wbmp new file mode 100644 index 0000000000000000000000000000000000000000..84424325677e478e8b7733bb1ae8f6e96e40d0b4 GIT binary patch literal 504 zcmWN|Z%7ki0LSqI&DtBM|EMZ4qPR(dm2``e;_kJ(&B(BW05scW7%Yg`Yv1R{N(k9fc*<$@yZ8ABIUK)zxqpKe7x2SHU!U|Ht3QPqAk`~q6(^rP9?T|B@!I*Z)I2kVA0bj~Dcj<-M0em^Q_ zExCdx&6g*5B3FUx+}NE4bw2hqySpYlVL^JKW5+%7^*wcBKxz5iKffS-ng{IZyCTIj z1AB<|@PaILXyX2UfQ_gHw0!ObQII2w-d^)$k_=yN@b+ +===DONE=== +--EXPECTF-- +*** Testing getimagesize() : error conditions *** + +-- Testing getimagesize() function with Zero arguments -- + +Warning: getimagesize() expects at least 1 parameter, 0 given in %s on line %d +NULL + +-- Testing getimagesize() function with more than expected no. of arguments -- + +Warning: getimagesize() expects at most 2 parameters, 3 given in %s on line %d +NULL +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_jpgapp.phpt b/ext/standard/tests/image/getimagesize_jpgapp.phpt new file mode 100644 index 0000000000..fa92fae982 --- /dev/null +++ b/ext/standard/tests/image/getimagesize_jpgapp.phpt @@ -0,0 +1,37 @@ +--TEST-- +Test getimagesize() function : basic functionality - load APP info from jpeg. +--SKIPIF-- + +--FILE-- + $value) { + echo "$key - length: ". strlen($value) ."; md5: " . md5((binary)$value) . "\n" ; +} + +?> +===DONE=== +--EXPECTF-- +APP1 - length: 1717; md5: 02cbf4ba6640c131422483138c968516 +APP2 - length: 7275; md5: f5036ccca2031e8bf932bcbd4aca4355 +APP13 - length: 42; md5: 2202998bd05e78bcb419f08c070d6f61 +===DONE=== diff --git a/ext/standard/tests/image/getimagesize_tif_mm.phpt b/ext/standard/tests/image/getimagesize_tif_mm.phpt new file mode 100644 index 0000000000..74bd39e3de --- /dev/null +++ b/ext/standard/tests/image/getimagesize_tif_mm.phpt @@ -0,0 +1,39 @@ +--TEST-- +GetImageSize() for tiff format with big-endian (aka Motorola, aka MM) ordering +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +*** Testing getimagesize() : tiff_mm format *** +array(5) { + [0]=> + int(2) + [1]=> + int(2) + [2]=> + int(8) + [3]=> + unicode(20) "width="2" height="2"" + [u"mime"]=> + unicode(10) "image/tiff" +} +array(0) { +} +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_variation1.phpt b/ext/standard/tests/image/getimagesize_variation1.phpt new file mode 100644 index 0000000000..ae5541ab7c --- /dev/null +++ b/ext/standard/tests/image/getimagesize_variation1.phpt @@ -0,0 +1,192 @@ +--TEST-- +Test getimagesize() function : usage variations - unexpected type for arg 1 +--FILE-- + 0, + "1" => 1, + "12345" => 12345, + "-2345" => -2345, + + // float data + "10.5" => 10.5, + "-10.5" => -10.5, + "10.1234567e5" => 10.1234567e10, + "10.7654321e-5" => 10.7654321E-5, + .5, + + // array data + "array()" => array(), + "array(0)" => array(0), + "array(1)" => array(1), + "array(1, 2)" => array(1, 2), + "array('color' => 'red', 'item' => 'pen')" => array('color' => 'red', 'item' => 'pen'), + + // null data + "NULL" => NULL, + "null" => null, + + // boolean data + "true" => true, + "false" => false, + "TRUE" => TRUE, + "FALSE" => FALSE, + + // empty data + "\"\"" => "", + "''" => '', + + // object data + "new stdclass()" => new stdclass(), + + // undefined data + "undefined_var" => $undefined_var, + + // unset data + "unset_var" => $unset_var, +); + +// loop through each element of the array for imagefile + +foreach($values as $key => $value) { + echo "\n-- Arg value: $key --\n"; + var_dump( getimagesize($value, $info) ); +}; + +?> +===DONE=== +--EXPECTF-- +*** Testing getimagesize() : usage variations *** +Error: 8 - Undefined variable: undefined_var, %s(%d) +Error: 8 - Undefined variable: unset_var, %s(%d) + +-- Arg value: 0 -- +Error: 2 - getimagesize(0): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: 1 -- +Error: 2 - getimagesize(1): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: 12345 -- +Error: 2 - getimagesize(12345): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: -2345 -- +Error: 2 - getimagesize(-2345): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: 10.5 -- +Error: 2 - getimagesize(10.5): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: -10.5 -- +Error: 2 - getimagesize(-10.5): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: 10.1234567e5 -- +Error: 2 - getimagesize(101234567000): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: 10.7654321e-5 -- +Error: 2 - getimagesize(0.000107654321): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: 12346 -- +Error: 2 - getimagesize(0.5): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: array() -- +Error: 8 - Array to string conversion, %s +Error: 2 - getimagesize(Array): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: array(0) -- +Error: 8 - Array to string conversion, %s +Error: 2 - getimagesize(Array): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: array(1) -- +Error: 8 - Array to string conversion, %s +Error: 2 - getimagesize(Array): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: array(1, 2) -- +Error: 8 - Array to string conversion, %s +Error: 2 - getimagesize(Array): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: array('color' => 'red', 'item' => 'pen') -- +Error: 8 - Array to string conversion, %s +Error: 2 - getimagesize(Array): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: NULL -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: null -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: true -- +Error: 2 - getimagesize(1): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: false -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: TRUE -- +Error: 2 - getimagesize(1): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: FALSE -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: "" -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: '' -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: new stdclass() -- +Error: 4096 - Object of class stdClass could not be converted to binary string, %s +Error: 8 - Object of class stdClass to string conversion, %s +Error: 2 - getimagesize(Object): failed to open stream: No such file or directory, %s +bool(false) + +-- Arg value: undefined_var -- +Error: 2 - getimagesize(): Filename cannot be empty, %s +bool(false) + +-- Arg value: unset_var -- +Error: 2 - getimagesize(): Filename cannot be empty, %s(%d) +bool(false) +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_variation2.phpt b/ext/standard/tests/image/getimagesize_variation2.phpt new file mode 100644 index 0000000000..03276f90b1 --- /dev/null +++ b/ext/standard/tests/image/getimagesize_variation2.phpt @@ -0,0 +1,167 @@ +--TEST-- +Test getimagesize() function : usage variations - unexpected type for arg 2 +--SKIPIF-- + +--FILE-- + 0, + "1" => 1, + "12345" => 12345, + "-2345" => -2345, + + // float data + "10.5" => 10.5, + "-10.5" => -10.5, + "10.1234567e5" => 10.1234567e10, + "10.7654321e-5" => 10.7654321E-5, + .5, + + // array data + "array()" => array(), + "array(0)" => array(0), + "array(1)" => array(1), + "array(1, 2)" => array(1, 2), + "array('color' => 'red', 'item' => 'pen')" => array('color' => 'red', 'item' => 'pen'), + + // null data + "NULL" => NULL, + "null" => null, + + // boolean data + "true" => true, + "false" => false, + "TRUE" => TRUE, + "FALSE" => FALSE, + + // empty data + "\"\"" => "", + "''" => '', + + // object data + "new stdclass()" => new stdclass(), + + // undefined data + "undefined_var" => $undefined_var, + + // unset data + "unset_var" => $unset_var, +); + +// loop through each element of the array for info + +foreach($values as $key => $value) { + echo "\n-- Arg value $key --\n"; + getimagesize($imagefile, $value); + var_dump(bin2hex((binary)$value["APP0"])); +}; + +?> +===DONE=== +--EXPECTF-- +*** Testing getimagesize() : usage variations *** +Error: 8 - Undefined variable: undefined_var, %s(%d) +Error: 8 - Undefined variable: unset_var, %s(%d) + +-- Arg value 0 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value 1 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value 12345 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value -2345 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value 10.5 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value -10.5 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value 10.1234567e5 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value 10.7654321e-5 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value 12346 -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value array() -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value array(0) -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value array(1) -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value array(1, 2) -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value array('color' => 'red', 'item' => 'pen') -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value NULL -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value null -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value true -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value false -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value TRUE -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value FALSE -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value "" -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value '' -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value new stdclass() -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value undefined_var -- +unicode(28) "4a46494600010201006000600000" + +-- Arg value unset_var -- +unicode(28) "4a46494600010201006000600000" +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_variation3.phpt b/ext/standard/tests/image/getimagesize_variation3.phpt new file mode 100644 index 0000000000..9db2b5eadb --- /dev/null +++ b/ext/standard/tests/image/getimagesize_variation3.phpt @@ -0,0 +1,70 @@ +--TEST-- +Test getimagesize() function : variation - Passing non image files +--FILE-- + "test.txt", + + //File containing forcibly corrupted bmp image + "File with corrupted BMP data" => "200x100_unknown.unknown", + + //File which doesn't exist + "Non-existent file" => "nofile.ext", + + //File having no data + "Empty File" => "blank_file.bmp" +); + +echo "*** Testing getimagesize() : variation ***\n"; + +//loop through each element of the array for filename +foreach($file_types_array as $key => $filename) { + echo "\n-- $key ($filename) --\n"; + var_dump( getimagesize(dirname(__FILE__)."/$filename" ) ); + var_dump( getimagesize(dirname(__FILE__)."/$filename", $info) ); + var_dump( $info ); +}; +?> +===DONE=== +--EXPECTF-- +*** Testing getimagesize() : variation *** + +-- File with text data (test.txt) -- +bool(false) +bool(false) +array(0) { +} + +-- File with corrupted BMP data (200x100_unknown.unknown) -- +bool(false) +bool(false) +array(0) { +} + +-- Non-existent file (nofile.ext) -- + +Warning: getimagesize(%snofile.ext): failed to open stream: No such file or directory in %s on line %d +bool(false) + +Warning: getimagesize(%snofile.ext): failed to open stream: No such file or directory in %s on line %d +bool(false) +array(0) { +} + +-- Empty File (blank_file.bmp) -- + +Notice: getimagesize(): Read error! in %s on line %d +bool(false) + +Notice: getimagesize(): Read error! in %s on line %d +bool(false) +array(0) { +} +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_variation4.phpt b/ext/standard/tests/image/getimagesize_variation4.phpt new file mode 100644 index 0000000000..06166f7041 --- /dev/null +++ b/ext/standard/tests/image/getimagesize_variation4.phpt @@ -0,0 +1,38 @@ +--TEST-- +Test getimagesize() function : variation - For shockwave-flash format +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECTF-- +*** Testing getimagesize() : variation *** +array(5) { + [0]=> + int(550) + [1]=> + int(400) + [2]=> + int(13) + [3]=> + unicode(24) "width="550" height="400"" + [u"mime"]=> + unicode(29) "application/x-shockwave-flash" +} +array(0) { +} +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_wbmp.phpt b/ext/standard/tests/image/getimagesize_wbmp.phpt new file mode 100644 index 0000000000..32d9b6e7ab --- /dev/null +++ b/ext/standard/tests/image/getimagesize_wbmp.phpt @@ -0,0 +1,39 @@ +--TEST-- +GetImageSize() for wbmp format +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +*** Testing getimagesize() : wbmp format *** +array(5) { + [0]=> + int(75) + [1]=> + int(50) + [2]=> + int(15) + [3]=> + unicode(22) "width="75" height="50"" + [u"mime"]=> + unicode(18) "image/vnd.wap.wbmp" +} +array(0) { +} +===DONE=== \ No newline at end of file diff --git a/ext/standard/tests/image/getimagesize_xbm.phpt b/ext/standard/tests/image/getimagesize_xbm.phpt new file mode 100644 index 0000000000..3c4381781b --- /dev/null +++ b/ext/standard/tests/image/getimagesize_xbm.phpt @@ -0,0 +1,39 @@ +--TEST-- +GetImageSize() for xbm format +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +*** Testing getimagesize() : xbm format *** +array(5) { + [0]=> + int(75) + [1]=> + int(50) + [2]=> + int(16) + [3]=> + unicode(22) "width="75" height="50"" + [u"mime"]=> + unicode(9) "image/xbm" +} +array(0) { +} +===DONE=== diff --git a/ext/standard/tests/image/testAPP.jpg b/ext/standard/tests/image/testAPP.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3936a42e423fed4f75d7d93d3250166c2fdedfbc GIT binary patch literal 12174 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