CoordinateTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Cell;
  3. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  4. use PhpOffice\PhpSpreadsheet\Exception;
  5. use PHPUnit\Framework\TestCase;
  6. use TypeError;
  7. class CoordinateTest extends TestCase
  8. {
  9. /**
  10. * @dataProvider providerColumnString
  11. *
  12. * @param mixed $expectedResult
  13. * @param mixed $string
  14. */
  15. public function testColumnIndexFromString($expectedResult, $string): void
  16. {
  17. $columnIndex = Coordinate::columnIndexFromString($string);
  18. self::assertEquals($expectedResult, $columnIndex);
  19. $stringBack = Coordinate::stringFromColumnIndex($columnIndex);
  20. self::assertEquals($stringBack, $string, 'should be able to get the original input with opposite method');
  21. }
  22. public function providerColumnString(): array
  23. {
  24. return require 'tests/data/ColumnString.php';
  25. }
  26. public function testColumnIndexFromStringTooLong(): void
  27. {
  28. $cellAddress = 'ABCD';
  29. try {
  30. Coordinate::columnIndexFromString($cellAddress);
  31. } catch (\Exception $e) {
  32. self::assertInstanceOf(Exception::class, $e);
  33. self::assertEquals($e->getMessage(), 'Column string index can not be longer than 3 characters');
  34. return;
  35. }
  36. self::fail('An expected exception has not been raised.');
  37. }
  38. public function testColumnIndexFromStringTooShort(): void
  39. {
  40. $cellAddress = '';
  41. try {
  42. Coordinate::columnIndexFromString($cellAddress);
  43. } catch (\Exception $e) {
  44. self::assertInstanceOf(Exception::class, $e);
  45. self::assertEquals($e->getMessage(), 'Column string index can not be empty');
  46. return;
  47. }
  48. self::fail('An expected exception has not been raised.');
  49. }
  50. /**
  51. * @dataProvider providerColumnIndex
  52. *
  53. * @param mixed $expectedResult
  54. * @param int $columnIndex
  55. */
  56. public function testStringFromColumnIndex($expectedResult, $columnIndex): void
  57. {
  58. $string = Coordinate::stringFromColumnIndex($columnIndex);
  59. self::assertEquals($expectedResult, $string);
  60. $columnIndexBack = Coordinate::columnIndexFromString($string);
  61. self::assertEquals($columnIndexBack, $columnIndex, 'should be able to get the original input with opposite method');
  62. }
  63. public function providerColumnIndex(): array
  64. {
  65. return require 'tests/data/ColumnIndex.php';
  66. }
  67. /**
  68. * @dataProvider providerCoordinates
  69. *
  70. * @param mixed $expectedResult
  71. * @param string $rangeSet
  72. */
  73. public function testCoordinateFromString($expectedResult, $rangeSet): void
  74. {
  75. $result = Coordinate::coordinateFromString($rangeSet);
  76. self::assertEquals($expectedResult, $result);
  77. }
  78. public function providerCoordinates(): array
  79. {
  80. return require 'tests/data/CellCoordinates.php';
  81. }
  82. /**
  83. * @dataProvider providerIndexesFromString
  84. */
  85. public function testIndexesFromString(array $expectedResult, string $rangeSet): void
  86. {
  87. $result = Coordinate::indexesFromString($rangeSet);
  88. self::assertSame($expectedResult, $result);
  89. }
  90. public function providerIndexesFromString(): array
  91. {
  92. return require 'tests/data/Cell/IndexesFromString.php';
  93. }
  94. public function testCoordinateFromStringWithRangeAddress(): void
  95. {
  96. $cellAddress = 'A1:AI2012';
  97. try {
  98. Coordinate::coordinateFromString($cellAddress);
  99. } catch (\Exception $e) {
  100. self::assertInstanceOf(Exception::class, $e);
  101. self::assertEquals($e->getMessage(), 'Cell coordinate string can not be a range of cells');
  102. return;
  103. }
  104. self::fail('An expected exception has not been raised.');
  105. }
  106. public function testCoordinateFromStringWithEmptyAddress(): void
  107. {
  108. $cellAddress = '';
  109. try {
  110. Coordinate::coordinateFromString($cellAddress);
  111. } catch (\Exception $e) {
  112. self::assertInstanceOf(Exception::class, $e);
  113. self::assertEquals($e->getMessage(), 'Cell coordinate can not be zero-length string');
  114. return;
  115. }
  116. self::fail('An expected exception has not been raised.');
  117. }
  118. public function testCoordinateFromStringWithInvalidAddress(): void
  119. {
  120. $cellAddress = 'AI';
  121. try {
  122. Coordinate::coordinateFromString($cellAddress);
  123. } catch (\Exception $e) {
  124. self::assertInstanceOf(Exception::class, $e);
  125. self::assertEquals($e->getMessage(), 'Invalid cell coordinate ' . $cellAddress);
  126. return;
  127. }
  128. self::fail('An expected exception has not been raised.');
  129. }
  130. /**
  131. * @dataProvider providerAbsoluteCoordinates
  132. *
  133. * @param string $expectedResult
  134. * @param string $rangeSet
  135. */
  136. public function testAbsoluteCoordinateFromString($expectedResult, $rangeSet): void
  137. {
  138. $result = Coordinate::absoluteCoordinate($rangeSet);
  139. self::assertEquals($expectedResult, $result);
  140. }
  141. public function providerAbsoluteCoordinates(): array
  142. {
  143. return require 'tests/data/CellAbsoluteCoordinate.php';
  144. }
  145. public function testAbsoluteCoordinateFromStringWithRangeAddress(): void
  146. {
  147. $cellAddress = 'A1:AI2012';
  148. try {
  149. Coordinate::absoluteCoordinate($cellAddress);
  150. } catch (\Exception $e) {
  151. self::assertInstanceOf(Exception::class, $e);
  152. self::assertEquals($e->getMessage(), 'Cell coordinate string can not be a range of cells');
  153. return;
  154. }
  155. self::fail('An expected exception has not been raised.');
  156. }
  157. /**
  158. * @dataProvider providerAbsoluteReferences
  159. *
  160. * @param mixed $expectedResult
  161. * @param string $rangeSet
  162. */
  163. public function testAbsoluteReferenceFromString($expectedResult, $rangeSet): void
  164. {
  165. $result = Coordinate::absoluteReference($rangeSet);
  166. self::assertEquals($expectedResult, $result);
  167. }
  168. public function providerAbsoluteReferences(): array
  169. {
  170. return require 'tests/data/CellAbsoluteReference.php';
  171. }
  172. public function testAbsoluteReferenceFromStringWithRangeAddress(): void
  173. {
  174. $cellAddress = 'A1:AI2012';
  175. try {
  176. Coordinate::absoluteReference($cellAddress);
  177. } catch (\Exception $e) {
  178. self::assertInstanceOf(Exception::class, $e);
  179. self::assertEquals($e->getMessage(), 'Cell coordinate string can not be a range of cells');
  180. return;
  181. }
  182. self::fail('An expected exception has not been raised.');
  183. }
  184. /**
  185. * @dataProvider providerSplitRange
  186. *
  187. * @param mixed $expectedResult
  188. * @param string $rangeSet
  189. */
  190. public function testSplitRange($expectedResult, $rangeSet): void
  191. {
  192. $result = Coordinate::splitRange($rangeSet);
  193. foreach ($result as $key => $split) {
  194. if (!is_array($expectedResult[$key])) {
  195. self::assertEquals($expectedResult[$key], $split[0]);
  196. } else {
  197. self::assertEquals($expectedResult[$key], $split);
  198. }
  199. }
  200. }
  201. public function providerSplitRange(): array
  202. {
  203. return require 'tests/data/CellSplitRange.php';
  204. }
  205. /**
  206. * @dataProvider providerBuildRange
  207. *
  208. * @param mixed $expectedResult
  209. * @param mixed $rangeSets
  210. */
  211. public function testBuildRange($expectedResult, $rangeSets): void
  212. {
  213. $result = Coordinate::buildRange($rangeSets);
  214. self::assertEquals($expectedResult, $result);
  215. }
  216. public function providerBuildRange(): array
  217. {
  218. return require 'tests/data/CellBuildRange.php';
  219. }
  220. public function testBuildRangeInvalid(): void
  221. {
  222. $this->expectException(TypeError::class);
  223. $cellRange = null;
  224. // @phpstan-ignore-next-line
  225. Coordinate::buildRange(/** @scrutinizer ignore-type */ $cellRange);
  226. }
  227. public function testBuildRangeInvalid2(): void
  228. {
  229. $this->expectException(Exception::class);
  230. $this->expectExceptionMessage('Range does not contain any information');
  231. $cellRange = [];
  232. Coordinate::buildRange($cellRange);
  233. }
  234. /**
  235. * @dataProvider providerRangeBoundaries
  236. *
  237. * @param mixed $expectedResult
  238. * @param string $rangeSet
  239. */
  240. public function testRangeBoundaries($expectedResult, $rangeSet): void
  241. {
  242. $result = Coordinate::rangeBoundaries($rangeSet);
  243. self::assertEquals($expectedResult, $result);
  244. }
  245. public function providerRangeBoundaries(): array
  246. {
  247. return require 'tests/data/CellRangeBoundaries.php';
  248. }
  249. /**
  250. * @dataProvider providerRangeDimension
  251. *
  252. * @param mixed $expectedResult
  253. * @param string $rangeSet
  254. */
  255. public function testRangeDimension($expectedResult, $rangeSet): void
  256. {
  257. $result = Coordinate::rangeDimension($rangeSet);
  258. self::assertEquals($expectedResult, $result);
  259. }
  260. public function providerRangeDimension(): array
  261. {
  262. return require 'tests/data/CellRangeDimension.php';
  263. }
  264. /**
  265. * @dataProvider providerGetRangeBoundaries
  266. *
  267. * @param mixed $expectedResult
  268. * @param string $rangeSet
  269. */
  270. public function testGetRangeBoundaries($expectedResult, $rangeSet): void
  271. {
  272. $result = Coordinate::getRangeBoundaries($rangeSet);
  273. self::assertEquals($expectedResult, $result);
  274. }
  275. public function providerGetRangeBoundaries(): array
  276. {
  277. return require 'tests/data/CellGetRangeBoundaries.php';
  278. }
  279. /**
  280. * @dataProvider providerExtractAllCellReferencesInRange
  281. *
  282. * @param array $expectedResult
  283. * @param string $rangeSet
  284. */
  285. public function testExtractAllCellReferencesInRange($expectedResult, $rangeSet): void
  286. {
  287. $result = Coordinate::extractAllCellReferencesInRange($rangeSet);
  288. self::assertEquals($expectedResult, $result);
  289. }
  290. public function providerExtractAllCellReferencesInRange(): array
  291. {
  292. return require 'tests/data/CellExtractAllCellReferencesInRange.php';
  293. }
  294. /**
  295. * @dataProvider providerInvalidRange
  296. *
  297. * @param string $range
  298. */
  299. public function testExtractAllCellReferencesInRangeInvalidRange($range): void
  300. {
  301. $this->expectException(Exception::class);
  302. $this->expectExceptionMessage('Invalid range: "' . $range . '"');
  303. Coordinate::extractAllCellReferencesInRange($range);
  304. }
  305. public function providerInvalidRange(): array
  306. {
  307. return [['Z1:A1'], ['A4:A1'], ['B1:A1'], ['AA1:Z1']];
  308. }
  309. /**
  310. * @dataProvider providerMergeRangesInCollection
  311. *
  312. * @param mixed $expectedResult
  313. * @param mixed $rangeSets
  314. */
  315. public function testMergeRangesInCollection($expectedResult, $rangeSets): void
  316. {
  317. $result = Coordinate::mergeRangesInCollection($rangeSets);
  318. self::assertEquals($expectedResult, $result);
  319. }
  320. public function providerMergeRangesInCollection(): array
  321. {
  322. return require 'tests/data/CellMergeRangesInCollection.php';
  323. }
  324. /**
  325. * @dataProvider providerCoordinateIsRange
  326. *
  327. * @param mixed $expectedResult
  328. * @param string $rangeSet
  329. */
  330. public function testCoordinateIsRange($expectedResult, $rangeSet): void
  331. {
  332. $result = Coordinate::coordinateIsRange($rangeSet);
  333. self::assertEquals($expectedResult, $result);
  334. }
  335. public function providerCoordinateIsRange(): array
  336. {
  337. return require 'tests/data/CoordinateIsRange.php';
  338. }
  339. }