reset($channel); $storage->charge($channel, "first"); $storage->charge($channel, "second"); $storage->charge($channel, "third"); $items = cl::all($storage->discharge($channel, false)); self::assertSame(["first", "second", "third"], $items); } function _testChargeArrays(SqliteStorage $storage, ?string $channel) { $storage->reset($channel); $storage->charge($channel, ["id" => 10, "name" => "first"]); $storage->charge($channel, ["name" => "second", "id" => 20]); $storage->charge($channel, ["name" => "third", "id" => "30"]); } function testChargeStrings() { $storage = new SqliteStorage(__DIR__.'/capacitor.db'); $this->_testChargeStrings($storage, null); $storage->close(); } function testChargeArrays() { $storage = new SqliteStorage(__DIR__.'/capacitor.db'); $storage->addChannel(new class extends CapacitorChannel { const NAME = "arrays"; const COLUMN_DEFINITIONS = ["id" => "integer"]; function getItemValues($item): ?array { return ["id" => $item["id"] ?? null]; } }); $this->_testChargeStrings($storage, "strings"); $this->_testChargeArrays($storage, "arrays"); $storage->close(); } function testEach() { $storage = new SqliteStorage(__DIR__.'/capacitor.db'); $capacitor = new Capacitor($storage, new class extends CapacitorChannel { const NAME = "each"; const COLUMN_DEFINITIONS = [ "age" => "integer", "done" => "integer default 0", ]; function getItemValues($item): ?array { return [ "age" => $item["age"], ]; } }); $capacitor->reset(); $capacitor->charge(["name" => "first", "age" => 5]); $capacitor->charge(["name" => "second", "age" => 10]); $capacitor->charge(["name" => "third", "age" => 15]); $capacitor->charge(["name" => "fourth", "age" => 20]); $setDone = function ($item, $row, $suffix=null) { $updates = ["done" => 1]; if ($suffix !== null) { $item["name"] .= $suffix; $updates["item"] = $item; } return $updates; }; $capacitor->each(["age" => [">", 10]], $setDone, ["++"]); $capacitor->each(["done" => 0], $setDone, null); Txx(cl::all($capacitor->discharge(false))); $capacitor->close(); self::assertTrue(true); } function testPrimayKey() { $storage = new SqliteStorage(__DIR__.'/capacitor.db'); $capacitor = new Capacitor($storage, new class extends CapacitorChannel { const NAME = "pk"; const COLUMN_DEFINITIONS = [ "id_" => "varchar primary key", "done" => "integer default 0", ]; function getItemValues($item): ?array { return [ "id_" => $item["numero"], ]; } }); $capacitor->charge(["numero" => "a", "name" => "first", "age" => 5]); $capacitor->charge(["numero" => "b", "name" => "second", "age" => 10]); $capacitor->charge(["numero" => "c", "name" => "third", "age" => 15]); $capacitor->charge(["numero" => "d", "name" => "fourth", "age" => 20]); sleep(2); $capacitor->charge(["numero" => "b", "name" => "second", "age" => 100]); $capacitor->charge(["numero" => "d", "name" => "fourth", "age" => 200]); $capacitor->close(); self::assertTrue(true); } function testSum() { $storage = new SqliteStorage(__DIR__.'/capacitor.db'); $capacitor = new Capacitor($storage, new class extends CapacitorChannel { const NAME = "sum"; const COLUMN_DEFINITIONS = [ "a__" => "varchar", "b__" => "varchar", "b__sum_" => self::SUM_DEFINITION, ]; function getItemValues($item): ?array { return [ "a" => $item["a"], "b" => $item["b"], ]; } }); $capacitor->reset(); $capacitor->charge(["a" => null, "b" => null]); $capacitor->charge(["a" => "first", "b" => "second"]); Txx("=== all"); /** @var Sqlite $sqlite */ $sqlite = $capacitor->getStorage()->db(); Txx(cl::all($sqlite->all([ "select", "from" => $capacitor->getChannel()->getTableName(), ]))); Txx("=== each"); $capacitor->each(null, function ($item, $values) { Txx($values); }); $capacitor->close(); self::assertTrue(true); } }