ColumnIteratorTest.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
  3. use PhpOffice\PhpSpreadsheet\Exception as Except;
  4. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  5. use PhpOffice\PhpSpreadsheet\Worksheet\Column;
  6. use PhpOffice\PhpSpreadsheet\Worksheet\ColumnIterator;
  7. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  8. use PHPUnit\Framework\TestCase;
  9. class ColumnIteratorTest extends TestCase
  10. {
  11. private const CELL_VALUES =
  12. [
  13. [110, 210, 310, 410, 510, 610],
  14. [120, 220, 320, 420, 520, 620],
  15. [130, null, 330, null, 530],
  16. ];
  17. private static function getPopulatedSheet(Spreadsheet $spreadsheet): Worksheet
  18. {
  19. $sheet = $spreadsheet->getActiveSheet();
  20. $sheet->fromArray(self::CELL_VALUES);
  21. return $sheet;
  22. }
  23. public function testIteratorFullRange(): void
  24. {
  25. $spreadsheet = new Spreadsheet();
  26. $sheet = self::getPopulatedSheet($spreadsheet);
  27. $iterator = new ColumnIterator($sheet);
  28. $columnIndexResult = 'A';
  29. self::assertEquals($columnIndexResult, $iterator->key());
  30. $counter = 0;
  31. foreach ($iterator as $key => $column) {
  32. ++$counter;
  33. self::assertEquals($columnIndexResult++, $key);
  34. self::assertInstanceOf(Column::class, $column);
  35. }
  36. self::assertCount($counter, self::CELL_VALUES[0]);
  37. $spreadsheet->disconnectWorksheets();
  38. }
  39. public function testIteratorStartEndRange(): void
  40. {
  41. $spreadsheet = new Spreadsheet();
  42. $sheet = self::getPopulatedSheet($spreadsheet);
  43. $iterator = new ColumnIterator($sheet, 'B', 'D');
  44. $columnIndexResult = 'B';
  45. self::assertEquals($columnIndexResult, $iterator->key());
  46. $counter = 0;
  47. foreach ($iterator as $key => $column) {
  48. ++$counter;
  49. self::assertEquals($columnIndexResult++, $key);
  50. self::assertInstanceOf(Column::class, $column);
  51. }
  52. self::assertSame(3, $counter);
  53. $spreadsheet->disconnectWorksheets();
  54. }
  55. public function testIteratorSeekAndPrev(): void
  56. {
  57. $spreadsheet = new Spreadsheet();
  58. $sheet = self::getPopulatedSheet($spreadsheet);
  59. $iterator = new ColumnIterator($sheet, 'B', 'D');
  60. $columnIndexResult = 'D';
  61. $iterator->seek('D');
  62. self::assertEquals($columnIndexResult, $iterator->key());
  63. $counter = 0;
  64. while ($iterator->valid() !== false) {
  65. ++$counter;
  66. self::assertEquals($columnIndexResult, $iterator->key(), "counter $counter");
  67. // https://stackoverflow.com/questions/37027277/decrement-character-with-php
  68. $columnIndexResult = chr(ord($columnIndexResult) - 1);
  69. $iterator->prev();
  70. }
  71. self::assertSame(3, $counter);
  72. $spreadsheet->disconnectWorksheets();
  73. }
  74. public function testIteratorResetStart(): void
  75. {
  76. $spreadsheet = new Spreadsheet();
  77. $sheet = self::getPopulatedSheet($spreadsheet);
  78. $iterator = new ColumnIterator($sheet, 'B', 'D');
  79. $iterator->resetStart('E');
  80. $key = $iterator->key();
  81. self::assertSame('E', $key);
  82. $lastColumn = $iterator->key();
  83. while ($iterator->valid() !== false) {
  84. $iterator->next();
  85. $lastColumn = $iterator->key();
  86. }
  87. self::assertSame('F', $lastColumn);
  88. $spreadsheet->disconnectWorksheets();
  89. }
  90. public function testSeekOutOfRange(): void
  91. {
  92. $spreadsheet = new Spreadsheet();
  93. $sheet = self::getPopulatedSheet($spreadsheet);
  94. $this->expectException(Except::class);
  95. $iterator = new ColumnIterator($sheet, 'B', 'D');
  96. $iterator->seek('A');
  97. $spreadsheet->disconnectWorksheets();
  98. }
  99. public function testPrevOutOfRange(): void
  100. {
  101. $spreadsheet = new Spreadsheet();
  102. $sheet = self::getPopulatedSheet($spreadsheet);
  103. $iterator = new ColumnIterator($sheet, 'B', 'D');
  104. $iterator->prev();
  105. self::assertFalse($iterator->valid());
  106. $spreadsheet->disconnectWorksheets();
  107. }
  108. public function testResetStartOutOfRange(): void
  109. {
  110. $spreadsheet = new Spreadsheet();
  111. $sheet = self::getPopulatedSheet($spreadsheet);
  112. $this->expectException(Except::class);
  113. $iterator = new ColumnIterator($sheet, 'B', 'D');
  114. $iterator->resetStart('H');
  115. $spreadsheet->disconnectWorksheets();
  116. }
  117. }