--- /dev/null
+--TEST--
+Test incremental inflate_add() functionality
+--SKIPIF--
+<?php
+if (!extension_loaded("zlib")) {
+ print "skip - ZLIB extension not loaded";
+}
+?>
+--FILE--
+<?php
+function inflateStream($mode, $flushSize) {
+ $buffer = "";
+ $inflated = null;
+ $resource = inflate_init($mode);
+
+ while (true) {
+ $dataToInflate = yield $inflated;
+ if (isset($dataToInflate)) {
+ $buffer .= $dataToInflate;
+ if (strlen($buffer) >= $flushSize) {
+ $inflated = inflate_add($resource, $buffer);
+ $buffer = "";
+ } else {
+ $inflated = null;
+ }
+ } else {
+ $inflated = inflate_add($resource, $buffer, ZLIB_FINISH);
+ }
+ }
+}
+
+$modes = [
+ 'ZLIB_ENCODING_RAW' => ZLIB_ENCODING_RAW,
+ 'ZLIB_ENCODING_GZIP' => ZLIB_ENCODING_GZIP,
+ 'ZLIB_ENCODING_DEFLATE' => ZLIB_ENCODING_DEFLATE,
+];
+$flushSizes = [1, 4, 32768];
+$flushTypes = [
+ 'ZLIB_SYNC_FLUSH' => ZLIB_SYNC_FLUSH,
+ 'ZLIB_PARTIAL_FLUSH' => ZLIB_PARTIAL_FLUSH,
+ 'ZLIB_FULL_FLUSH' => ZLIB_FULL_FLUSH,
+ 'ZLIB_NO_FLUSH' => ZLIB_NO_FLUSH,
+ 'ZLIB_BLOCK' => ZLIB_BLOCK,
+];
+
+$uncompressed = "";
+for ($i=0;$i<(32768*2);$i++) {
+ $uncompressed .= chr(rand(48,125));
+}
+
+foreach ($modes as $modeKey => $mode) {
+ $compressed = zlib_encode($uncompressed, $mode);
+ $compressedLen = strlen($compressed);
+ foreach ($flushSizes as $flushSize) {
+ foreach ($flushTypes as $flushTypeKey => $flushType) {
+ $inflated = "";
+ $stream = inflateStream($mode, $flushSize, $flushType);
+ for ($i=0;$i<$compressedLen;$i++) {
+ $inflated .= $stream->send($compressed[$i]);
+ }
+ $inflated .= $stream->send(null);
+ if ($inflated !== $uncompressed) {
+ echo "Error: {$modeKey} | {$flushSize} | {$flushTypeKey}\n";
+ }
+ }
+
+ }
+}
+
+?>
+===DONE===
+--EXPECTF--
+===DONE===
--- /dev/null
+--TEST--
+Test incremental inflate_add() error functionality
+--SKIPIF--
+<?php
+if (!extension_loaded("zlib")) {
+ print "skip - ZLIB extension not loaded";
+}
+?>
+--FILE--
+<?php
+$badResource = fopen("php://memory", "r+");
+var_dump(inflate_add($badResource, "test"));
+$resource = inflate_init(ZLIB_ENCODING_DEFLATE);
+$badFlushType = 6789;
+var_dump(inflate_add($resource, "test", $badFlushType));
+?>
+--EXPECTF--
+
+Warning: inflate_add(): Invalid zlib.inflate resource in %s on line %d
+bool(false)
+
+Warning: inflate_add(): flush mode must be ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH, ZLIB_FULL_FLUSH, ZLIB_BLOCK or ZLIB_FINISH in %s on line %d
+bool(false)
--- /dev/null
+--TEST--
+Test inflate_init() error
+--SKIPIF--
+<?php
+if (!extension_loaded("zlib")) {
+ print "skip - ZLIB extension not loaded";
+}
+?>
+--FILE--
+<?php
+var_dump(inflate_init());
+var_dump(inflate_init(42));
+?>
+--EXPECTF--
+
+Warning: inflate_init() expects exactly 1 parameter, 0 given in %s on line %d
+bool(false)
+
+Warning: inflate_init(): encoding mode must be ZLIB_ENCODING_RAW, ZLIB_ENCODING_GZIP or ZLIB_ENCODING_DEFLATE in %s on line %d
+bool(false)
--- /dev/null
+--TEST--
+Test incremental inflate_init() context reuse
+--SKIPIF--
+<?php
+if (!extension_loaded("zlib")) {
+ print "skip - ZLIB extension not loaded";
+}
+?>
+--FILE--
+<?php
+$resource = inflate_init(ZLIB_ENCODING_GZIP);
+
+$uncompressed = implode(range("a","z"));
+$compressed = gzencode($uncompressed);
+$inflated = "";
+for ($i=0;$i<strlen($compressed);$i++) {
+ $inflated .= inflate_add($resource, $compressed[$i]);
+}
+$inflated .= inflate_add($resource, "", ZLIB_FINISH);
+assert($inflated === $uncompressed);
+
+// Now reuse the existing resource after finishing the previous operations ...
+$inflated = "";
+for ($i=0;$i<strlen($compressed);$i++) {
+ $inflated .= inflate_add($resource, $compressed[$i]);
+}
+$inflated .= inflate_add($resource, "", ZLIB_FINISH);
+assert($inflated === $uncompressed);
+?>
+===DONE===
+--EXPECTF--
+===DONE===