reset($channel); $capacitor->charge($channel, "first"); $capacitor->charge($channel, "second"); $capacitor->charge($channel, "third"); $items = cl::all($capacitor->discharge($channel, false)); self::assertSame(["first", "second", "third"], $items); } function _testChargeArrays(SqliteCapacitor $capacitor, CapacitorChannel $channel) { $capacitor->reset($channel); $capacitor->charge($channel, ["id" => 10, "name" => "first"]); $capacitor->charge($channel, ["name" => "second", "id" => 20]); $capacitor->charge($channel, ["name" => "third", "id" => "30"]); } function testChargeStrings() { $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $channel = $capacitor->newChannel(null); $this->_testChargeStrings($capacitor, $channel); self::Txx(cl::all($capacitor->discharge($channel, false))); $channel = $capacitor->newChannel("strings"); $this->_testChargeStrings($capacitor, $channel); self::Txx(cl::all($capacitor->discharge($channel, false))); $capacitor->close(); self::assertTrue(true); } function testChargeArrays() { $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $channel = $capacitor->newChannel(new class extends CapacitorChannel { const NAME = "arrays"; const COLUMN_DEFINITIONS = ["id" => "integer"]; function getItemValues($item): ?array { return ["id" => $item["id"] ?? null]; } }); $this->_testChargeArrays($capacitor, $channel); self::Txx(cl::all($capacitor->discharge($channel, false))); $capacitor->close(); self::assertTrue(true); } function testEach() { $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $each = $capacitor->newChannel(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($each); $capacitor->charge($each, ["name" => "first", "age" => 5]); $capacitor->charge($each, ["name" => "second", "age" => 10]); $capacitor->charge($each, ["name" => "third", "age" => 15]); $capacitor->charge($each, ["name" => "fourth", "age" => 20]); $setDone = function ($row, $suffix=null) { $item = $row["item"]; $updates = ["done" => 1]; if ($suffix !== null) { $item["name"] .= $suffix; $updates["item"] = $item; } return $updates; }; $capacitor->each($each, ["age" => [">", 10]], $setDone, ["++"]); $capacitor->each($each, ["done" => 0], $setDone); self::Txx(cl::all($capacitor->discharge($each, false))); $capacitor->close(); self::assertTrue(true); } function testPrimayKey() { $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $channel = $capacitor->newChannel(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($channel, ["numero" => "a", "name" => "first", "age" => 5]); $capacitor->charge($channel, ["numero" => "b", "name" => "second", "age" => 10]); $capacitor->charge($channel, ["numero" => "c", "name" => "third", "age" => 15]); $capacitor->charge($channel, ["numero" => "d", "name" => "fourth", "age" => 20]); sleep(2); $capacitor->charge($channel, ["numero" => "b", "name" => "second", "age" => 100]); $capacitor->charge($channel, ["numero" => "d", "name" => "fourth", "age" => 200]); self::Txx(cl::all($capacitor->discharge($channel, false))); $capacitor->close(); self::assertTrue(true); } function testSum() { $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $channel = $capacitor->newChannel(new class extends CapacitorChannel { const NAME = "sum"; const COLUMN_DEFINITIONS = [ "a__" => "varchar", "b__" => "varchar", "b__sum_" => "sersum", ]; function getItemValues($item): ?array { return [ "a" => $item["a"], "b" => $item["b"], ]; } }); $capacitor->reset($channel); $capacitor->charge($channel, ["a" => null, "b" => null]); $capacitor->charge($channel, ["a" => "first", "b" => "second"]); self::Txx("=== all"); self::Txx(cl::all($capacitor->db()->all([ "select", "from" => $channel->getTableName(), ]))); self::Txx("=== each"); $capacitor->each($channel, null, function ($row) { self::Txx($row); }); $capacitor->close(); self::assertTrue(true); } function testEachValues() { # tester que values contient bien toutes les valeurs de la ligne $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $channel = $capacitor->newChannel(new class extends CapacitorChannel { const NAME = "each_values"; const COLUMN_DEFINITIONS = [ "name" => "varchar primary key", "age" => "integer", "done" => "integer default 0", "notes" => "text", ]; function getItemValues($item): ?array { return [ "name" => $item["name"], "age" => $item["age"], ]; } }); $capacitor->reset($channel); $capacitor->charge($channel, ["name" => "first", "age" => 5], function($item, ?array $row, ?array $prow) { self::assertSame("first", $item["name"]); self::assertSame(5, $item["age"]); self::assertnotnull($row); self::assertSame(["name", "age", "item", "item__sum_", "created_", "modified_"], array_keys($row)); self::assertSame([ "name" => "first", "age" => 5, "item" => $item, ], cl::select($row, ["name", "age", "item"])); self::assertNull($prow); }); $capacitor->charge($channel, ["name" => "first", "age" => 10], function($item, ?array $row, ?array $prow) { self::assertSame("first", $item["name"]); self::assertSame(10, $item["age"]); self::assertnotnull($row); self::assertSame(["name", "age", "done", "notes", "item", "item__sum_", "created_", "modified_"], array_keys($row)); self::assertSame([ "name" => "first", "age" => 10, "done" => 0, "notes" => null, "item" => $item, ], cl::select($row, ["name", "age", "done", "notes", "item"])); self::assertNotNull($prow); self::assertSame([ "name" => "first", "age" => 5, "done" => 0, "notes" => null, "item" => ["name" => "first", "age" => 5], ], cl::select($prow, ["name", "age", "done", "notes", "item"])); }); $capacitor->each($channel, null, function(array $row) { $item = $row["item"]; self::assertSame("first", $item["name"]); self::assertSame(10, $item["age"]); self::assertnotnull($row); self::assertSame(["name", "age", "done", "notes", "item", "item__sum_", "created_", "modified_"], array_keys($row)); self::assertSame([ "name" => "first", "age" => 10, "done" => 0, "notes" => null, "item" => $item, ], cl::select($row, ["name", "age", "done", "notes", "item"])); return [ "done" => 1, "notes" => "modified", ]; }); $capacitor->charge($channel, ["name" => "first", "age" => 10], function($item, ?array $row, ?array $prow) { self::assertSame("first", $item["name"]); self::assertSame(10, $item["age"]); self::assertnotnull($row); self::assertSame(["name", "age", "done", "notes", "item", "item__sum_", "created_", "modified_"], array_keys($row)); self::assertSame([ "name" => "first", "age" => 10, "done" => 1, "notes" => "modified", "item" => $item, ], cl::select($row, ["name", "age", "done", "notes", "item"])); self::assertNotNull($prow); self::assertSame([ "name" => "first", "age" => 10, "done" => 1, "notes" => "modified", "item" => $item, ], cl::select($prow, ["name", "age", "done", "notes", "item"])); }); $capacitor->charge($channel, ["name" => "first", "age" => 20], function($item, ?array $row, ?array $prow) { self::assertSame("first", $item["name"]); self::assertSame(20, $item["age"]); self::assertnotnull($row); self::assertSame(["name", "age", "done", "notes", "item", "item__sum_", "created_", "modified_"], array_keys($row)); self::assertSame([ "name" => "first", "age" => 20, "done" => 1, "notes" => "modified", "item" => $item, ], cl::select($row, ["name", "age", "done", "notes", "item"])); self::assertNotNull($prow); self::assertSame([ "name" => "first", "age" => 10, "done" => 1, "notes" => "modified", "item" => ["name" => "first", "age" => 10], ], cl::select($prow, ["name", "age", "done", "notes", "item"])); }); } function testSetItemNull() { # tester le forçage de $îtem à null pour économiser la place $capacitor = new SqliteCapacitor(__DIR__.'/capacitor.db'); $channel = $capacitor->newChannel(new class extends CapacitorChannel { const NAME = "set_item_null"; const COLUMN_DEFINITIONS = [ "name" => "varchar primary key", "age" => "integer", "done" => "integer default 0", "notes" => "text", ]; function getItemValues($item): ?array { return [ "name" => $item["name"], "age" => $item["age"], ]; } }); $capacitor->reset($channel); $nbModified = $capacitor->charge($channel, ["name" => "first", "age" => 5], function ($item, ?array $row, ?array $prow) { self::assertSame([ "name" => "first", "age" => 5, "item" => $item, ], cl::select($row, ["name", "age", "item"])); return ["item" => null]; }); self::assertSame(1, $nbModified); sleep(1); # nb: on met des sleep() pour que la date de modification soit systématiquement différente $nbModified = $capacitor->charge($channel, ["name" => "first", "age" => 10], function ($item, ?array $row, ?array $prow) { self::assertSame([ "name" => "first", "age" => 10, "item" => $item, "item__sum_" => "9181336dfca20c86313d6065d89aa2ad5070b0fc", ], cl::select($row, ["name", "age", "item", "item__sum_"])); self::assertSame([ "name" => "first", "age" => 5, "item" => null, "item__sum_" => null, ], cl::select($prow, ["name", "age", "item", "item__sum_"])); return ["item" => null]; }); self::assertSame(1, $nbModified); sleep(1); # pas de modification ici $nbModified = $capacitor->charge($channel, ["name" => "first", "age" => 10], function ($item, ?array $row, ?array $prow) { self::assertSame([ "name" => "first", "age" => 10, "item" => $item, "item__sum_" => "9181336dfca20c86313d6065d89aa2ad5070b0fc", ], cl::select($row, ["name", "age", "item", "item__sum_"])); self::assertSame([ "name" => "first", "age" => 10, "item" => null, "item__sum_" => null, ], cl::select($prow, ["name", "age", "item", "item__sum_"])); return ["item" => null]; }); self::assertSame(0, $nbModified); sleep(1); $nbModified = $capacitor->charge($channel, ["name" => "first", "age" => 20], function ($item, ?array $row, ?array $prow) { self::assertSame([ "name" => "first", "age" => 20, "item" => $item, "item__sum_" => "001b91982b4e0883b75428c0eb28573a5dc5f7a5", ], cl::select($row, ["name", "age", "item", "item__sum_"])); self::assertSame([ "name" => "first", "age" => 10, "item" => null, "item__sum_" => null, ], cl::select($prow, ["name", "age", "item", "item__sum_"])); return ["item" => null]; }); self::assertSame(1, $nbModified); sleep(1); } }