SemverTest.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <?php
  2. /*
  3. * This file is part of composer/semver.
  4. *
  5. * (c) Composer <https://github.com/composer>
  6. *
  7. * For the full copyright and license information, please view
  8. * the LICENSE file that was distributed with this source code.
  9. */
  10. namespace Composer\Semver;
  11. use PHPUnit\Framework\TestCase;
  12. /**
  13. * @coversDefaultClass \Composer\Semver\Semver
  14. */
  15. class SemverTest extends TestCase
  16. {
  17. /**
  18. * @covers ::satisfies
  19. * @dataProvider satisfiesProvider
  20. *
  21. * @param bool $expected
  22. * @param string $version
  23. * @param string $constraint
  24. */
  25. public function testSatisfies($expected, $version, $constraint)
  26. {
  27. $this->assertEquals($expected, Semver::satisfies($version, $constraint));
  28. }
  29. /**
  30. * @covers ::satisfiedBy
  31. * @dataProvider satisfiedByProvider
  32. *
  33. * @param string $constraint
  34. * @param array<string> $versions
  35. * @param array<string> $expected
  36. */
  37. public function testSatisfiedBy($constraint, $versions, $expected)
  38. {
  39. $this->assertEquals($expected, Semver::satisfiedBy($versions, $constraint));
  40. }
  41. /**
  42. * @covers ::sort
  43. * @covers ::rsort
  44. * @covers ::usort
  45. * @dataProvider sortProvider
  46. *
  47. * @param array<string> $versions
  48. * @param array<string> $sorted
  49. * @param array<string> $rsorted
  50. */
  51. public function testSort(array $versions, array $sorted, array $rsorted)
  52. {
  53. $this->assertEquals($sorted, Semver::sort($versions));
  54. $this->assertEquals($rsorted, Semver::rsort($versions));
  55. }
  56. public function testUsortShouldInitialVersionParserClass()
  57. {
  58. $versions = array('1.0', '2.0', '2.1');
  59. $semver = new \ReflectionClass('\Composer\Semver\Semver');
  60. $versionParserProperty = $semver->getProperty('versionParser');
  61. $versionParserProperty->setAccessible(true);
  62. $versionParserProperty->setValue(null);
  63. $manipulateVersionStringMethod = $semver->getMethod('usort');
  64. $manipulateVersionStringMethod->setAccessible(true);
  65. $result = $manipulateVersionStringMethod->invoke(new Semver(), $versions, 1);
  66. $this->assertTrue(is_array($result));
  67. $this->assertCount(3, $versions);
  68. }
  69. /**
  70. * @return array<mixed>
  71. */
  72. public function sortProvider()
  73. {
  74. return array(
  75. array(
  76. array('1.0', '0.1', '0.1', '3.2.1', '2.4.0-alpha', '2.4.0'),
  77. array('0.1', '0.1', '1.0', '2.4.0-alpha', '2.4.0', '3.2.1'),
  78. array('3.2.1', '2.4.0', '2.4.0-alpha', '1.0', '0.1', '0.1'),
  79. ),
  80. array(
  81. array('dev-foo', 'dev-master', '1.0', '50.2'),
  82. array('dev-foo', '1.0', '50.2', 'dev-master'),
  83. array('dev-master', '50.2', '1.0', 'dev-foo'),
  84. ),
  85. );
  86. }
  87. /**
  88. * @return array<mixed>
  89. */
  90. public function satisfiesProvider()
  91. {
  92. $positive = array_map(function ($array) {
  93. array_unshift($array, true);
  94. return $array;
  95. }, $this->satisfiesProviderPositive());
  96. $negative = array_map(function ($array) {
  97. array_unshift($array, false);
  98. return $array;
  99. }, $this->satisfiesProviderNegative());
  100. return array_merge($positive, $negative);
  101. }
  102. /**
  103. * @return array<mixed>
  104. */
  105. public function satisfiesProviderPositive()
  106. {
  107. return array(
  108. array('1.2.3', '1.0.0 - 2.0.0'),
  109. array('1.2.3', '^1.2.3+build'),
  110. array('1.3.0', '^1.2.3+build'),
  111. array('2.4.3-alpha', '1.2.3+asdf - 2.4.3+asdf'),
  112. array('1.3.0-beta', '>1.2'),
  113. array('1.2.3-beta', '<=1.2.3'),
  114. array('1.2.3-beta', '^1.2.3'),
  115. array('1.2.3', '1.2.3+asdf - 2.4.3+asdf'),
  116. array('1.0.0', '1.0.0'),
  117. array('1.2.3', '*'),
  118. array('v1.2.3', '*'),
  119. array('1.0.0', '>=1.0.0'),
  120. array('1.0.1', '>=1.0.0'),
  121. array('1.1.0', '>=1.0.0'),
  122. array('1.0.1', '>1.0.0'),
  123. array('1.1.0', '>1.0.0'),
  124. array('2.0.0', '<=2.0.0'),
  125. array('1.9999.9999', '<=2.0.0'),
  126. array('0.2.9', '<=2.0.0'),
  127. array('1.9999.9999', '<2.0.0'),
  128. array('0.2.9', '<2.0.0'),
  129. array('1.0.0', '>= 1.0.0'),
  130. array('1.0.1', '>= 1.0.0'),
  131. array('1.1.0', '>= 1.0.0'),
  132. array('1.0.1', '> 1.0.0'),
  133. array('1.1.0', '> 1.0.0'),
  134. array('2.0.0', '<= 2.0.0'),
  135. array('1.9999.9999', '<= 2.0.0'),
  136. array('0.2.9', '<= 2.0.0'),
  137. array('1.9999.9999', '< 2.0.0'),
  138. array('0.2.9', "<\t2.0.0"),
  139. array('v0.1.97', '>=0.1.97'),
  140. array('0.1.97', '>=0.1.97'),
  141. array('1.2.4', '0.1.20 || 1.2.4'),
  142. array('0.0.0', '>=0.2.3 || <0.0.1'),
  143. array('0.2.3', '>=0.2.3 || <0.0.1'),
  144. array('0.2.4', '>=0.2.3 || <0.0.1'),
  145. array('2.1.3', '2.x.x'),
  146. array('1.2.3', '1.2.x'),
  147. array('2.1.3', '1.2.x || 2.x'),
  148. array('1.2.3', '1.2.x || 2.x'),
  149. array('1.2.3', 'x'),
  150. array('2.1.3', '2.*.*'),
  151. array('1.2.3', '1.2.*'),
  152. array('2.1.3', '1.2.* || 2.*'),
  153. array('1.2.3', '1.2.* || 2.*'),
  154. array('1.2.3', '*'),
  155. array('2.9.0', '~2.4'), // >=2.4.0 <3.0.0
  156. array('2.4.5', '~2.4'),
  157. array('1.2.3', '~1'), // >=1.0.0 <2.0.0
  158. array('1.4.7', '~1.0'), // >=1.0.0 <2.0.0
  159. array('1.0.0', '>=1'),
  160. array('1.0.0', '>= 1'),
  161. array('1.2.8', '>1.2'), // >1.2.0
  162. array('1.1.1', '<1.2'), // <1.2.0
  163. array('1.1.1', '< 1.2'),
  164. array('1.2.3', '~1.2.1 >=1.2.3'),
  165. array('1.2.3', '~1.2.1 =1.2.3'),
  166. array('1.2.3', '~1.2.1 1.2.3'),
  167. array('1.2.3', '~1.2.1 >=1.2.3 1.2.3'),
  168. array('1.2.3', '~1.2.1 1.2.3 >=1.2.3'),
  169. array('1.2.3', '~1.2.1 1.2.3'),
  170. array('1.2.3', '>=1.2.1 1.2.3'),
  171. array('1.2.3', '1.2.3 >=1.2.1'),
  172. array('1.2.3', '>=1.2.3 >=1.2.1'),
  173. array('1.2.3', '>=1.2.1 >=1.2.3'),
  174. array('1.2.8', '>=1.2'),
  175. array('1.8.1', '^1.2.3'),
  176. array('0.1.2', '^0.1.2'),
  177. array('0.1.2', '^0.1'),
  178. array('1.4.2', '^1.2'),
  179. array('1.4.2', '^1.2 ^1'),
  180. array('0.0.1-beta', '^0.0.1-alpha'),
  181. );
  182. }
  183. /**
  184. * @return array<mixed>
  185. */
  186. public function satisfiesProviderNegative()
  187. {
  188. return array(
  189. array('2.2.3', '1.0.0 - 2.0.0'),
  190. array('2.0.0', '^1.2.3+build'),
  191. array('1.2.0', '^1.2.3+build'),
  192. array('1.0.0beta', '1'),
  193. array('1.0.0beta', '<1'),
  194. array('1.0.0beta', '< 1'),
  195. array('1.0.1', '1.0.0'),
  196. array('0.0.0', '>=1.0.0'),
  197. array('0.0.1', '>=1.0.0'),
  198. array('0.1.0', '>=1.0.0'),
  199. array('0.0.1', '>1.0.0'),
  200. array('0.1.0', '>1.0.0'),
  201. array('3.0.0', '<=2.0.0'),
  202. array('2.9999.9999', '<=2.0.0'),
  203. array('2.2.9', '<=2.0.0'),
  204. array('2.9999.9999', '<2.0.0'),
  205. array('2.2.9', '<2.0.0'),
  206. array('v0.1.93', '>=0.1.97'),
  207. array('0.1.93', '>=0.1.97'),
  208. array('1.2.3', '0.1.20 || 1.2.4'),
  209. array('0.0.3', '>=0.2.3 || <0.0.1'),
  210. array('0.2.2', '>=0.2.3 || <0.0.1'),
  211. array('1.1.3', '2.x.x'),
  212. array('3.1.3', '2.x.x'),
  213. array('1.3.3', '1.2.x'),
  214. array('3.1.3', '1.2.x || 2.x'),
  215. array('1.1.3', '1.2.x || 2.x'),
  216. array('1.1.3', '2.*.*'),
  217. array('3.1.3', '2.*.*'),
  218. array('1.3.3', '1.2.*'),
  219. array('3.1.3', '1.2.* || 2.*'),
  220. array('1.1.3', '1.2.* || 2.*'),
  221. array('1.1.2', '2'),
  222. array('2.4.1', '2.3'),
  223. array('3.0.0', '~2.4'), // >=2.4.0 <3.0.0
  224. array('2.3.9', '~2.4'),
  225. array('0.2.3', '~1'), // >=1.0.0 <2.0.0
  226. array('1.0.0', '<1'),
  227. array('1.1.1', '>=1.2'),
  228. array('2.0.0beta', '1'),
  229. array('0.5.4-alpha', '~v0.5.4-beta'),
  230. array('1.2.3-beta', '<1.2.3'),
  231. array('2.0.0-alpha', '^1.2.3'),
  232. array('1.2.2', '^1.2.3'),
  233. array('1.1.9', '^1.2'),
  234. );
  235. }
  236. /**
  237. * @return array<mixed>
  238. */
  239. public function satisfiedByProvider()
  240. {
  241. return array(
  242. array(
  243. '~1.0',
  244. array('1.0', '1.2', '1.9999.9999', '2.0', '2.1', '0.9999.9999'),
  245. array('1.0', '1.2', '1.9999.9999'),
  246. ),
  247. array(
  248. '>1.0 <3.0 || >=4.0',
  249. array('1.0', '1.1', '2.9999.9999', '3.0', '3.1', '3.9999.9999', '4.0', '4.1'),
  250. array('1.1', '2.9999.9999', '4.0', '4.1'),
  251. ),
  252. array(
  253. '^0.2.0',
  254. array('0.1.1', '0.1.9999', '0.2.0', '0.2.1', '0.3.0'),
  255. array('0.2.0', '0.2.1'),
  256. ),
  257. );
  258. }
  259. }