test.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. var tap = require("tap")
  2. , test = tap.test
  3. , semver = require("./semver.js")
  4. , eq = semver.eq
  5. , gt = semver.gt
  6. , lt = semver.lt
  7. , neq = semver.neq
  8. , cmp = semver.cmp
  9. , gte = semver.gte
  10. , lte = semver.lte
  11. , satisfies = semver.satisfies
  12. , validRange = semver.validRange
  13. , inc = semver.inc
  14. , replaceStars = semver.replaceStars
  15. , toComparators = semver.toComparators
  16. tap.plan(8)
  17. test("\ncomparison tests", function (t) {
  18. // [version1, version2]
  19. // version1 should be greater than version2
  20. ; [ ["0.0.0", "0.0.0foo"]
  21. , ["0.0.1", "0.0.0"]
  22. , ["1.0.0", "0.9.9"]
  23. , ["0.10.0", "0.9.0"]
  24. , ["0.99.0", "0.10.0"]
  25. , ["2.0.0", "1.2.3"]
  26. , ["v0.0.0", "0.0.0foo"]
  27. , ["v0.0.1", "0.0.0"]
  28. , ["v1.0.0", "0.9.9"]
  29. , ["v0.10.0", "0.9.0"]
  30. , ["v0.99.0", "0.10.0"]
  31. , ["v2.0.0", "1.2.3"]
  32. , ["0.0.0", "v0.0.0foo"]
  33. , ["0.0.1", "v0.0.0"]
  34. , ["1.0.0", "v0.9.9"]
  35. , ["0.10.0", "v0.9.0"]
  36. , ["0.99.0", "v0.10.0"]
  37. , ["2.0.0", "v1.2.3"]
  38. , ["1.2.3", "1.2.3-asdf"]
  39. , ["1.2.3-4", "1.2.3"]
  40. , ["1.2.3-4-foo", "1.2.3"]
  41. , ["1.2.3-5", "1.2.3-5-foo"]
  42. , ["1.2.3-5", "1.2.3-4"]
  43. , ["1.2.3-5-foo", "1.2.3-5-Foo"]
  44. , ["3.0.0", "2.7.2+"]
  45. ].forEach(function (v) {
  46. var v0 = v[0]
  47. , v1 = v[1]
  48. t.ok(gt(v0, v1), "gt('"+v0+"', '"+v1+"')")
  49. t.ok(lt(v1, v0), "lt('"+v1+"', '"+v0+"')")
  50. t.ok(!gt(v1, v0), "!gt('"+v1+"', '"+v0+"')")
  51. t.ok(!lt(v0, v1), "!lt('"+v0+"', '"+v1+"')")
  52. t.ok(eq(v0, v0), "eq('"+v0+"', '"+v0+"')")
  53. t.ok(eq(v1, v1), "eq('"+v1+"', '"+v1+"')")
  54. t.ok(neq(v0, v1), "neq('"+v0+"', '"+v1+"')")
  55. t.ok(cmp(v1, "==", v1), "cmp('"+v1+"' == '"+v1+"')")
  56. t.ok(cmp(v0, ">=", v1), "cmp('"+v0+"' >= '"+v1+"')")
  57. t.ok(cmp(v1, "<=", v0), "cmp('"+v1+"' <= '"+v0+"')")
  58. t.ok(cmp(v0, "!=", v1), "cmp('"+v0+"' != '"+v1+"')")
  59. })
  60. t.end()
  61. })
  62. test("\nequality tests", function (t) {
  63. // [version1, version2]
  64. // version1 should be equivalent to version2
  65. ; [ ["1.2.3", "v1.2.3"]
  66. , ["1.2.3", "=1.2.3"]
  67. , ["1.2.3", "v 1.2.3"]
  68. , ["1.2.3", "= 1.2.3"]
  69. , ["1.2.3", " v1.2.3"]
  70. , ["1.2.3", " =1.2.3"]
  71. , ["1.2.3", " v 1.2.3"]
  72. , ["1.2.3", " = 1.2.3"]
  73. , ["1.2.3-0", "v1.2.3-0"]
  74. , ["1.2.3-0", "=1.2.3-0"]
  75. , ["1.2.3-0", "v 1.2.3-0"]
  76. , ["1.2.3-0", "= 1.2.3-0"]
  77. , ["1.2.3-0", " v1.2.3-0"]
  78. , ["1.2.3-0", " =1.2.3-0"]
  79. , ["1.2.3-0", " v 1.2.3-0"]
  80. , ["1.2.3-0", " = 1.2.3-0"]
  81. , ["1.2.3-01", "v1.2.3-1"]
  82. , ["1.2.3-01", "=1.2.3-1"]
  83. , ["1.2.3-01", "v 1.2.3-1"]
  84. , ["1.2.3-01", "= 1.2.3-1"]
  85. , ["1.2.3-01", " v1.2.3-1"]
  86. , ["1.2.3-01", " =1.2.3-1"]
  87. , ["1.2.3-01", " v 1.2.3-1"]
  88. , ["1.2.3-01", " = 1.2.3-1"]
  89. , ["1.2.3beta", "v1.2.3beta"]
  90. , ["1.2.3beta", "=1.2.3beta"]
  91. , ["1.2.3beta", "v 1.2.3beta"]
  92. , ["1.2.3beta", "= 1.2.3beta"]
  93. , ["1.2.3beta", " v1.2.3beta"]
  94. , ["1.2.3beta", " =1.2.3beta"]
  95. , ["1.2.3beta", " v 1.2.3beta"]
  96. , ["1.2.3beta", " = 1.2.3beta"]
  97. ].forEach(function (v) {
  98. var v0 = v[0]
  99. , v1 = v[1]
  100. t.ok(eq(v0, v1), "eq('"+v0+"', '"+v1+"')")
  101. t.ok(!neq(v0, v1), "!neq('"+v0+"', '"+v1+"')")
  102. t.ok(cmp(v0, "==", v1), "cmp("+v0+"=="+v1+")")
  103. t.ok(!cmp(v0, "!=", v1), "!cmp("+v0+"!="+v1+")")
  104. t.ok(!cmp(v0, "===", v1), "!cmp("+v0+"==="+v1+")")
  105. t.ok(cmp(v0, "!==", v1), "cmp("+v0+"!=="+v1+")")
  106. t.ok(!gt(v0, v1), "!gt('"+v0+"', '"+v1+"')")
  107. t.ok(gte(v0, v1), "gte('"+v0+"', '"+v1+"')")
  108. t.ok(!lt(v0, v1), "!lt('"+v0+"', '"+v1+"')")
  109. t.ok(lte(v0, v1), "lte('"+v0+"', '"+v1+"')")
  110. })
  111. t.end()
  112. })
  113. test("\nrange tests", function (t) {
  114. // [range, version]
  115. // version should be included by range
  116. ; [ ["1.0.0 - 2.0.0", "1.2.3"]
  117. , ["1.0.0", "1.0.0"]
  118. , [">=*", "0.2.4"]
  119. , ["", "1.0.0"]
  120. , ["*", "1.2.3"]
  121. , ["*", "v1.2.3-foo"]
  122. , [">=1.0.0", "1.0.0"]
  123. , [">=1.0.0", "1.0.1"]
  124. , [">=1.0.0", "1.1.0"]
  125. , [">1.0.0", "1.0.1"]
  126. , [">1.0.0", "1.1.0"]
  127. , ["<=2.0.0", "2.0.0"]
  128. , ["<=2.0.0", "1.9999.9999"]
  129. , ["<=2.0.0", "0.2.9"]
  130. , ["<2.0.0", "1.9999.9999"]
  131. , ["<2.0.0", "0.2.9"]
  132. , [">= 1.0.0", "1.0.0"]
  133. , [">= 1.0.0", "1.0.1"]
  134. , [">= 1.0.0", "1.1.0"]
  135. , ["> 1.0.0", "1.0.1"]
  136. , ["> 1.0.0", "1.1.0"]
  137. , ["<= 2.0.0", "2.0.0"]
  138. , ["<= 2.0.0", "1.9999.9999"]
  139. , ["<= 2.0.0", "0.2.9"]
  140. , ["< 2.0.0", "1.9999.9999"]
  141. , ["<\t2.0.0", "0.2.9"]
  142. , [">=0.1.97", "v0.1.97"]
  143. , [">=0.1.97", "0.1.97"]
  144. , ["0.1.20 || 1.2.4", "1.2.4"]
  145. , [">=0.2.3 || <0.0.1", "0.0.0"]
  146. , [">=0.2.3 || <0.0.1", "0.2.3"]
  147. , [">=0.2.3 || <0.0.1", "0.2.4"]
  148. , ["||", "1.3.4"]
  149. , ["2.x.x", "2.1.3"]
  150. , ["1.2.x", "1.2.3"]
  151. , ["1.2.x || 2.x", "2.1.3"]
  152. , ["1.2.x || 2.x", "1.2.3"]
  153. , ["x", "1.2.3"]
  154. , ["2.*.*", "2.1.3"]
  155. , ["1.2.*", "1.2.3"]
  156. , ["1.2.* || 2.*", "2.1.3"]
  157. , ["1.2.* || 2.*", "1.2.3"]
  158. , ["*", "1.2.3"]
  159. , ["2", "2.1.2"]
  160. , ["2.3", "2.3.1"]
  161. , ["~2.4", "2.4.0"] // >=2.4.0 <2.5.0
  162. , ["~2.4", "2.4.5"]
  163. , ["~>3.2.1", "3.2.2"] // >=3.2.1 <3.3.0
  164. , ["~1", "1.2.3"] // >=1.0.0 <2.0.0
  165. , ["~>1", "1.2.3"]
  166. , ["~> 1", "1.2.3"]
  167. , ["~1.0", "1.0.2"] // >=1.0.0 <1.1.0
  168. , ["~ 1.0", "1.0.2"]
  169. , [">=1", "1.0.0"]
  170. , [">= 1", "1.0.0"]
  171. , ["<1.2", "1.1.1"]
  172. , ["< 1.2", "1.1.1"]
  173. , ["1", "1.0.0beta"]
  174. , ["~v0.5.4-pre", "0.5.5"]
  175. , ["~v0.5.4-pre", "0.5.4"]
  176. , ["=0.7.x", "0.7.2"]
  177. , [">=0.7.x", "0.7.2"]
  178. , ["=0.7.x", "0.7.0-asdf"]
  179. , [">=0.7.x", "0.7.0-asdf"]
  180. , ["<=0.7.x", "0.6.2"]
  181. , ["~1.2.1 >=1.2.3", "1.2.3"]
  182. , ["~1.2.1 =1.2.3", "1.2.3"]
  183. , ["~1.2.1 1.2.3", "1.2.3"]
  184. , ['~1.2.1 >=1.2.3 1.2.3', '1.2.3']
  185. , ['~1.2.1 1.2.3 >=1.2.3', '1.2.3']
  186. , ['~1.2.1 1.2.3', '1.2.3']
  187. , ['>=1.2.1 1.2.3', '1.2.3']
  188. , ['1.2.3 >=1.2.1', '1.2.3']
  189. , ['>=1.2.3 >=1.2.1', '1.2.3']
  190. , ['>=1.2.1 >=1.2.3', '1.2.3']
  191. ].forEach(function (v) {
  192. t.ok(satisfies(v[1], v[0]), v[0]+" satisfied by "+v[1])
  193. })
  194. t.end()
  195. })
  196. test("\nnegative range tests", function (t) {
  197. // [range, version]
  198. // version should not be included by range
  199. ; [ ["1.0.0 - 2.0.0", "2.2.3"]
  200. , ["1.0.0", "1.0.1"]
  201. , [">=1.0.0", "0.0.0"]
  202. , [">=1.0.0", "0.0.1"]
  203. , [">=1.0.0", "0.1.0"]
  204. , [">1.0.0", "0.0.1"]
  205. , [">1.0.0", "0.1.0"]
  206. , ["<=2.0.0", "3.0.0"]
  207. , ["<=2.0.0", "2.9999.9999"]
  208. , ["<=2.0.0", "2.2.9"]
  209. , ["<2.0.0", "2.9999.9999"]
  210. , ["<2.0.0", "2.2.9"]
  211. , [">=0.1.97", "v0.1.93"]
  212. , [">=0.1.97", "0.1.93"]
  213. , ["0.1.20 || 1.2.4", "1.2.3"]
  214. , [">=0.2.3 || <0.0.1", "0.0.3"]
  215. , [">=0.2.3 || <0.0.1", "0.2.2"]
  216. , ["2.x.x", "1.1.3"]
  217. , ["2.x.x", "3.1.3"]
  218. , ["1.2.x", "1.3.3"]
  219. , ["1.2.x || 2.x", "3.1.3"]
  220. , ["1.2.x || 2.x", "1.1.3"]
  221. , ["2.*.*", "1.1.3"]
  222. , ["2.*.*", "3.1.3"]
  223. , ["1.2.*", "1.3.3"]
  224. , ["1.2.* || 2.*", "3.1.3"]
  225. , ["1.2.* || 2.*", "1.1.3"]
  226. , ["2", "1.1.2"]
  227. , ["2.3", "2.4.1"]
  228. , ["~2.4", "2.5.0"] // >=2.4.0 <2.5.0
  229. , ["~2.4", "2.3.9"]
  230. , ["~>3.2.1", "3.3.2"] // >=3.2.1 <3.3.0
  231. , ["~>3.2.1", "3.2.0"] // >=3.2.1 <3.3.0
  232. , ["~1", "0.2.3"] // >=1.0.0 <2.0.0
  233. , ["~>1", "2.2.3"]
  234. , ["~1.0", "1.1.0"] // >=1.0.0 <1.1.0
  235. , ["<1", "1.0.0"]
  236. , [">=1.2", "1.1.1"]
  237. , ["1", "2.0.0beta"]
  238. , ["~v0.5.4-beta", "0.5.4-alpha"]
  239. , ["<1", "1.0.0beta"]
  240. , ["< 1", "1.0.0beta"]
  241. , ["=0.7.x", "0.8.2"]
  242. , [">=0.7.x", "0.6.2"]
  243. , ["<=0.7.x", "0.7.2"]
  244. ].forEach(function (v) {
  245. t.ok(!satisfies(v[1], v[0]), v[0]+" not satisfied by "+v[1])
  246. })
  247. t.end()
  248. })
  249. test("\nincrement versions test", function (t) {
  250. // [version, inc, result]
  251. // inc(version, inc) -> result
  252. ; [ [ "1.2.3", "major", "2.0.0" ]
  253. , [ "1.2.3", "minor", "1.3.0" ]
  254. , [ "1.2.3", "patch", "1.2.4" ]
  255. , [ "1.2.3", "build", "1.2.3-1" ]
  256. , [ "1.2.3-4", "build", "1.2.3-5" ]
  257. , [ "1.2.3tag", "major", "2.0.0" ]
  258. , [ "1.2.3-tag", "major", "2.0.0" ]
  259. , [ "1.2.3tag", "build", "1.2.3-1" ]
  260. , [ "1.2.3-tag", "build", "1.2.3-1" ]
  261. , [ "1.2.3-4-tag", "build", "1.2.3-5" ]
  262. , [ "1.2.3-4tag", "build", "1.2.3-5" ]
  263. , [ "1.2.3", "fake", null ]
  264. , [ "fake", "major", null ]
  265. ].forEach(function (v) {
  266. t.equal(inc(v[0], v[1]), v[2], "inc("+v[0]+", "+v[1]+") === "+v[2])
  267. })
  268. t.end()
  269. })
  270. test("\nreplace stars test", function (t) {
  271. // replace stars with ""
  272. ; [ [ "", "" ]
  273. , [ "*", "" ]
  274. , [ "> *", "" ]
  275. , [ "<*", "" ]
  276. , [ " >= *", "" ]
  277. , [ "* || 1.2.3", " || 1.2.3" ]
  278. ].forEach(function (v) {
  279. t.equal(replaceStars(v[0]), v[1], "replaceStars("+v[0]+") === "+v[1])
  280. })
  281. t.end()
  282. })
  283. test("\nvalid range test", function (t) {
  284. // [range, result]
  285. // validRange(range) -> result
  286. // translate ranges into their canonical form
  287. ; [ ["1.0.0 - 2.0.0", ">=1.0.0 <=2.0.0"]
  288. , ["1.0.0", "1.0.0"]
  289. , [">=*", ""]
  290. , ["", ""]
  291. , ["*", ""]
  292. , ["*", ""]
  293. , [">=1.0.0", ">=1.0.0"]
  294. , [">1.0.0", ">1.0.0"]
  295. , ["<=2.0.0", "<=2.0.0"]
  296. , ["1", ">=1.0.0- <2.0.0-"]
  297. , ["<=2.0.0", "<=2.0.0"]
  298. , ["<=2.0.0", "<=2.0.0"]
  299. , ["<2.0.0", "<2.0.0"]
  300. , ["<2.0.0", "<2.0.0"]
  301. , [">= 1.0.0", ">=1.0.0"]
  302. , [">= 1.0.0", ">=1.0.0"]
  303. , [">= 1.0.0", ">=1.0.0"]
  304. , ["> 1.0.0", ">1.0.0"]
  305. , ["> 1.0.0", ">1.0.0"]
  306. , ["<= 2.0.0", "<=2.0.0"]
  307. , ["<= 2.0.0", "<=2.0.0"]
  308. , ["<= 2.0.0", "<=2.0.0"]
  309. , ["< 2.0.0", "<2.0.0"]
  310. , ["< 2.0.0", "<2.0.0"]
  311. , [">=0.1.97", ">=0.1.97"]
  312. , [">=0.1.97", ">=0.1.97"]
  313. , ["0.1.20 || 1.2.4", "0.1.20||1.2.4"]
  314. , [">=0.2.3 || <0.0.1", ">=0.2.3||<0.0.1"]
  315. , [">=0.2.3 || <0.0.1", ">=0.2.3||<0.0.1"]
  316. , [">=0.2.3 || <0.0.1", ">=0.2.3||<0.0.1"]
  317. , ["||", "||"]
  318. , ["2.x.x", ">=2.0.0- <3.0.0-"]
  319. , ["1.2.x", ">=1.2.0- <1.3.0-"]
  320. , ["1.2.x || 2.x", ">=1.2.0- <1.3.0-||>=2.0.0- <3.0.0-"]
  321. , ["1.2.x || 2.x", ">=1.2.0- <1.3.0-||>=2.0.0- <3.0.0-"]
  322. , ["x", ""]
  323. , ["2.*.*", null]
  324. , ["1.2.*", null]
  325. , ["1.2.* || 2.*", null]
  326. , ["1.2.* || 2.*", null]
  327. , ["*", ""]
  328. , ["2", ">=2.0.0- <3.0.0-"]
  329. , ["2.3", ">=2.3.0- <2.4.0-"]
  330. , ["~2.4", ">=2.4.0- <2.5.0-"]
  331. , ["~2.4", ">=2.4.0- <2.5.0-"]
  332. , ["~>3.2.1", ">=3.2.1- <3.3.0-"]
  333. , ["~1", ">=1.0.0- <2.0.0-"]
  334. , ["~>1", ">=1.0.0- <2.0.0-"]
  335. , ["~> 1", ">=1.0.0- <2.0.0-"]
  336. , ["~1.0", ">=1.0.0- <1.1.0-"]
  337. , ["~ 1.0", ">=1.0.0- <1.1.0-"]
  338. , ["<1", "<1.0.0-"]
  339. , ["< 1", "<1.0.0-"]
  340. , [">=1", ">=1.0.0-"]
  341. , [">= 1", ">=1.0.0-"]
  342. , ["<1.2", "<1.2.0-"]
  343. , ["< 1.2", "<1.2.0-"]
  344. , ["1", ">=1.0.0- <2.0.0-"]
  345. ].forEach(function (v) {
  346. t.equal(validRange(v[0]), v[1], "validRange("+v[0]+") === "+v[1])
  347. })
  348. t.end()
  349. })
  350. test("\ncomparators test", function (t) {
  351. // [range, comparators]
  352. // turn range into a set of individual comparators
  353. ; [ ["1.0.0 - 2.0.0", [[">=1.0.0", "<=2.0.0"]] ]
  354. , ["1.0.0", [["1.0.0"]] ]
  355. , [">=*", [[">=0.0.0-"]] ]
  356. , ["", [[""]]]
  357. , ["*", [[""]] ]
  358. , ["*", [[""]] ]
  359. , [">=1.0.0", [[">=1.0.0"]] ]
  360. , [">=1.0.0", [[">=1.0.0"]] ]
  361. , [">=1.0.0", [[">=1.0.0"]] ]
  362. , [">1.0.0", [[">1.0.0"]] ]
  363. , [">1.0.0", [[">1.0.0"]] ]
  364. , ["<=2.0.0", [["<=2.0.0"]] ]
  365. , ["1", [[">=1.0.0-", "<2.0.0-"]] ]
  366. , ["<=2.0.0", [["<=2.0.0"]] ]
  367. , ["<=2.0.0", [["<=2.0.0"]] ]
  368. , ["<2.0.0", [["<2.0.0"]] ]
  369. , ["<2.0.0", [["<2.0.0"]] ]
  370. , [">= 1.0.0", [[">=1.0.0"]] ]
  371. , [">= 1.0.0", [[">=1.0.0"]] ]
  372. , [">= 1.0.0", [[">=1.0.0"]] ]
  373. , ["> 1.0.0", [[">1.0.0"]] ]
  374. , ["> 1.0.0", [[">1.0.0"]] ]
  375. , ["<= 2.0.0", [["<=2.0.0"]] ]
  376. , ["<= 2.0.0", [["<=2.0.0"]] ]
  377. , ["<= 2.0.0", [["<=2.0.0"]] ]
  378. , ["< 2.0.0", [["<2.0.0"]] ]
  379. , ["<\t2.0.0", [["<2.0.0"]] ]
  380. , [">=0.1.97", [[">=0.1.97"]] ]
  381. , [">=0.1.97", [[">=0.1.97"]] ]
  382. , ["0.1.20 || 1.2.4", [["0.1.20"], ["1.2.4"]] ]
  383. , [">=0.2.3 || <0.0.1", [[">=0.2.3"], ["<0.0.1"]] ]
  384. , [">=0.2.3 || <0.0.1", [[">=0.2.3"], ["<0.0.1"]] ]
  385. , [">=0.2.3 || <0.0.1", [[">=0.2.3"], ["<0.0.1"]] ]
  386. , ["||", [[""], [""]] ]
  387. , ["2.x.x", [[">=2.0.0-", "<3.0.0-"]] ]
  388. , ["1.2.x", [[">=1.2.0-", "<1.3.0-"]] ]
  389. , ["1.2.x || 2.x", [[">=1.2.0-", "<1.3.0-"], [">=2.0.0-", "<3.0.0-"]] ]
  390. , ["1.2.x || 2.x", [[">=1.2.0-", "<1.3.0-"], [">=2.0.0-", "<3.0.0-"]] ]
  391. , ["x", [[""]] ]
  392. , ["2.*.*", [[">=2.0.0-", "<3.0.0-"]] ]
  393. , ["1.2.*", [[">=1.2.0-", "<1.3.0-"]] ]
  394. , ["1.2.* || 2.*", [[">=1.2.0-", "<1.3.0-"], [">=2.0.0-", "<3.0.0-"]] ]
  395. , ["1.2.* || 2.*", [[">=1.2.0-", "<1.3.0-"], [">=2.0.0-", "<3.0.0-"]] ]
  396. , ["*", [[""]] ]
  397. , ["2", [[">=2.0.0-", "<3.0.0-"]] ]
  398. , ["2.3", [[">=2.3.0-", "<2.4.0-"]] ]
  399. , ["~2.4", [[">=2.4.0-", "<2.5.0-"]] ]
  400. , ["~2.4", [[">=2.4.0-", "<2.5.0-"]] ]
  401. , ["~>3.2.1", [[">=3.2.1-", "<3.3.0-"]] ]
  402. , ["~1", [[">=1.0.0-", "<2.0.0-"]] ]
  403. , ["~>1", [[">=1.0.0-", "<2.0.0-"]] ]
  404. , ["~> 1", [[">=1.0.0-", "<2.0.0-"]] ]
  405. , ["~1.0", [[">=1.0.0-", "<1.1.0-"]] ]
  406. , ["~ 1.0", [[">=1.0.0-", "<1.1.0-"]] ]
  407. , ["<1", [["<1.0.0-"]] ]
  408. , ["< 1", [["<1.0.0-"]] ]
  409. , [">=1", [[">=1.0.0-"]] ]
  410. , [">= 1", [[">=1.0.0-"]] ]
  411. , ["<1.2", [["<1.2.0-"]] ]
  412. , ["< 1.2", [["<1.2.0-"]] ]
  413. , ["1", [[">=1.0.0-", "<2.0.0-"]] ]
  414. , ["1 2", [[">=1.0.0-", "<2.0.0-", ">=2.0.0-", "<3.0.0-"]] ]
  415. ].forEach(function (v) {
  416. t.equivalent(toComparators(v[0]), v[1], "toComparators("+v[0]+") === "+JSON.stringify(v[1]))
  417. })
  418. t.end()
  419. })