public function testList()
{
$library = $this->dataLibrary->createEmpty();
$library->set('name', 'nameA');
$this->dataLibrary->create($library);
$book = $this->dataBook->createEmpty();
$book->set('title', 'title');
$book->set('author', 'author');
$book->set('pages', 111);
$book->set('library', $library->get('id'));
$this->dataBook->create($book);
$library->set('libraryBook', [['id' => $book->get('id')]]);
$this->dataLibrary->update($library);
$entity = new Entity($this->dataBook->getDefinition());
$entity->set('name', 'nameB');
$this->dataLibrary->create($entity);
$list = $this->dataLibrary->listEntries(['name' => 'nameA'], ['name' => '=']);
$read = $list[0]->get('libraryBook');
$expected = [['id' => $book->get('id'), 'name' => $book->get('title')]];
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries(['libraryBook' => [['id' => $book->get('id')]]], ['libraryBook' => '=']);
$read = count($list);
$expected = 1;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries();
$read = count($list);
$expected = 2;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries(['name' => 'nameB'], ['name' => '=']);
$read = count($list);
$expected = 1;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries(['name' => 'nameB', 'id' => 2], ['name' => '=', 'id' => '=']);
$read = count($list);
$expected = 1;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries(['type' => null], ['type' => '=']);
$read = count($list);
$expected = 2;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries(['name' => '%eB%'], ['name' => 'LIKE']);
$read = count($list);
$expected = 1;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries([], [], null, null, 'name');
$expected = 'nameB';
$this->assertSame($expected, $list[0]->get('name'));
$expected = 'nameA';
$this->assertSame($expected, $list[1]->get('name'));
// Sorting by many fields should fall back to the initial sort field
$list = $this->dataLibrary->listEntries([], [], null, null, 'libraryBook');
$expected = 'nameB';
$this->assertSame($expected, $list[0]->get('name'));
$expected = 'nameA';
$this->assertSame($expected, $list[1]->get('name'));
for ($i = 0; $i < 15; ++$i) {
$entity->set('name', 'name' . $i);
$this->dataLibrary->create($entity);
}
$list = $this->dataLibrary->listEntries([], [], null, null);
$read = count($list);
$expected = 17;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries([], [], null, 5);
$read = count($list);
$expected = 5;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries([], [], 0, 5);
$read = count($list);
$expected = 5;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries([], [], 15, 5);
$read = count($list);
$expected = 2;
$this->assertSame($expected, $read);
$list = $this->dataLibrary->listEntries([], [], 5, null);
$read = count($list);
$expected = 12;
$this->assertSame($expected, $read);
}