fd9c925a7b
This drop a lot of non-core features code and delegate their maintainance to third parties. Also it open the door to any missing implementation out of the box, such as Redis for the moment. Finally this consistently enforce a constraint where there can be one and only one active cell at any point in time in code. This used to be true for non-default implementation of cache, but it was not true for default implementation where all cells were kept in-memory and thus were never detached from their worksheet and thus were all kept functionnal at any point in time. This inconsistency of behavior between in-memory and off-memory could lead to bugs when changing cache system if the end-user code was badly written. Now end-user will never be able to write buggy code in the first place, avoiding future headache when introducing caching. Closes #3
119 lines
4.9 KiB
PHP
119 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Collection;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Cell;
|
|
use PhpOffice\PhpSpreadsheet\Collection\Cells;
|
|
use PhpOffice\PhpSpreadsheet\Collection\Memory;
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet;
|
|
|
|
class CellsTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
public function testCollectionCell()
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$collection = $sheet->getCellCollection();
|
|
|
|
// Assert empty state
|
|
$this->assertEquals([], $collection->getCoordinates(), 'cell list should be empty');
|
|
$this->assertEquals([], $collection->getSortedCoordinates(), 'sorted cell list should be empty');
|
|
$this->assertNull($collection->get('B2'), 'getting non-existing cell must return null');
|
|
$this->assertFalse($collection->has('B2'), 'non-existing cell should be non-existent');
|
|
|
|
// Add one cell
|
|
$cell1 = $sheet->getCell('B2');
|
|
$this->assertSame($cell1, $collection->add('B2', $cell1), 'adding a cell should return the cell');
|
|
|
|
// Assert cell presence
|
|
$this->assertEquals(['B2'], $collection->getCoordinates(), 'cell list should contains the cell');
|
|
$this->assertEquals(['B2'], $collection->getSortedCoordinates(), 'sorted cell list contains the cell');
|
|
$this->assertSame($cell1, $collection->get('B2'), 'should get exact same object');
|
|
$this->assertTrue($collection->has('B2'), 'cell should exists');
|
|
|
|
// Add a second cell
|
|
$cell2 = $sheet->getCell('A1');
|
|
$this->assertSame($cell2, $collection->add('A1', $cell2), 'adding a second cell should return the cell');
|
|
$this->assertEquals(['B2', 'A1'], $collection->getCoordinates(), 'cell list should contains the cell');
|
|
$this->assertEquals(['A1', 'B2'], $collection->getSortedCoordinates(), 'sorted cell list contains the cell');
|
|
|
|
// Assert collection copy
|
|
$sheet2 = $spreadsheet->createSheet();
|
|
$collection2 = $collection->cloneCellCollection($sheet2);
|
|
$this->assertTrue($collection2->has('A1'));
|
|
$copiedCell2 = $collection2->get('A1');
|
|
$this->assertNotSame($cell2, $copiedCell2, 'copied cell should not be the same object any more');
|
|
$this->assertSame($collection2, $copiedCell2->getParent(), 'copied cell should be owned by the copied collection');
|
|
$this->assertSame('A1', $copiedCell2->getCoordinate(), 'copied cell should keep attributes');
|
|
|
|
// Assert deletion
|
|
$collection->delete('B2');
|
|
$this->assertFalse($collection->has('B2'), 'cell should have been deleted');
|
|
$this->assertEquals(['A1'], $collection->getCoordinates(), 'cell list should contains the cell');
|
|
|
|
// Assert update
|
|
$cell2 = $sheet->getCell('A1');
|
|
$this->assertSame($sheet->getCellCollection(), $collection);
|
|
$this->assertSame($cell2, $collection->update($cell2), 'should update existing cell');
|
|
|
|
$cell3 = $sheet->getCell('C3');
|
|
$this->assertSame($cell3, $collection->update($cell3), 'should silently add non-existing cell');
|
|
$this->assertEquals(['A1', 'C3'], $collection->getCoordinates(), 'cell list should contains the cell');
|
|
}
|
|
|
|
public function testCacheLastCell()
|
|
{
|
|
$workbook = new Spreadsheet();
|
|
$cells = ['A1', 'A2'];
|
|
$sheet = $workbook->getActiveSheet();
|
|
$sheet->setCellValue('A1', 1);
|
|
$sheet->setCellValue('A2', 2);
|
|
$this->assertEquals($cells, $sheet->getCoordinates(), 'list should include last added cell');
|
|
}
|
|
|
|
public function testCanGetCellAfterAnotherIsDeleted()
|
|
{
|
|
$workbook = new Spreadsheet();
|
|
$sheet = $workbook->getActiveSheet();
|
|
$collection = $sheet->getCellCollection();
|
|
$sheet->setCellValue('A1', 1);
|
|
$sheet->setCellValue('A2', 1);
|
|
$collection->delete('A1');
|
|
$sheet->setCellValue('A3', 1);
|
|
$this->assertNotNull($collection->get('A2'), 'should be able to get back the cell even when another cell was deleted while this one was the current one');
|
|
}
|
|
|
|
/**
|
|
* @expectedException \PhpOffice\PhpSpreadsheet\Exception
|
|
*/
|
|
public function testThrowsWhenCellCannotBeRetrievedFromCache()
|
|
{
|
|
$collection = $this->getMockBuilder(Cells::class)
|
|
->setConstructorArgs([new Worksheet(), new Memory()])
|
|
->setMethods(['has'])
|
|
->getMock();
|
|
|
|
$collection->method('has')
|
|
->willReturn(true);
|
|
|
|
$collection->get('A2');
|
|
}
|
|
|
|
/**
|
|
* @expectedException \PhpOffice\PhpSpreadsheet\Exception
|
|
*/
|
|
public function testThrowsWhenCellCannotBeStoredInCache()
|
|
{
|
|
$cache = $this->createMock(Memory::class);
|
|
$cell = $this->createMock(Cell::class);
|
|
$cache->method('set')
|
|
->willReturn(false);
|
|
|
|
$collection = new Cells(new Worksheet(), $cache);
|
|
|
|
$collection->add('A1', $cell);
|
|
$collection->add('A2', $cell);
|
|
}
|
|
}
|