tsequtils.nim 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. discard """
  2. matrix: "--mm:refc; --mm:orc"
  3. targets: "c js"
  4. """
  5. # xxx move all tests under `main`
  6. import std/sequtils
  7. import strutils
  8. from algorithm import sorted
  9. import std/assertions
  10. {.experimental: "strictEffects".}
  11. {.push warningAsError[Effect]: on.}
  12. {.experimental: "strictFuncs".}
  13. # helper for testing double substitution side effects which are handled
  14. # by `evalOnceAs`
  15. var counter = 0
  16. proc identity[T](a: T): auto =
  17. counter.inc
  18. a
  19. block: # concat test
  20. let
  21. s1 = @[1, 2, 3]
  22. s2 = @[4, 5]
  23. s3 = @[6, 7]
  24. total = concat(s1, s2, s3)
  25. doAssert total == @[1, 2, 3, 4, 5, 6, 7]
  26. block: # count test
  27. let
  28. s1 = @[1, 2, 3, 2]
  29. s2 = @['a', 'b', 'x', 'a']
  30. a1 = [1, 2, 3, 2]
  31. a2 = ['a', 'b', 'x', 'a']
  32. r0 = count(s1, 0)
  33. r1 = count(s1, 1)
  34. r2 = count(s1, 2)
  35. r3 = count(s2, 'y')
  36. r4 = count(s2, 'x')
  37. r5 = count(s2, 'a')
  38. ar0 = count(a1, 0)
  39. ar1 = count(a1, 1)
  40. ar2 = count(a1, 2)
  41. ar3 = count(a2, 'y')
  42. ar4 = count(a2, 'x')
  43. ar5 = count(a2, 'a')
  44. doAssert r0 == 0
  45. doAssert r1 == 1
  46. doAssert r2 == 2
  47. doAssert r3 == 0
  48. doAssert r4 == 1
  49. doAssert r5 == 2
  50. doAssert ar0 == 0
  51. doAssert ar1 == 1
  52. doAssert ar2 == 2
  53. doAssert ar3 == 0
  54. doAssert ar4 == 1
  55. doAssert ar5 == 2
  56. block: # cycle tests
  57. let
  58. a = @[1, 2, 3]
  59. b: seq[int] = @[]
  60. c = [1, 2, 3]
  61. doAssert a.cycle(3) == @[1, 2, 3, 1, 2, 3, 1, 2, 3]
  62. doAssert a.cycle(0) == @[]
  63. #doAssert a.cycle(-1) == @[] # will not compile!
  64. doAssert b.cycle(3) == @[]
  65. doAssert c.cycle(3) == @[1, 2, 3, 1, 2, 3, 1, 2, 3]
  66. doAssert c.cycle(0) == @[]
  67. block: # repeat tests
  68. doAssert repeat(10, 5) == @[10, 10, 10, 10, 10]
  69. doAssert repeat(@[1, 2, 3], 2) == @[@[1, 2, 3], @[1, 2, 3]]
  70. doAssert repeat([1, 2, 3], 2) == @[[1, 2, 3], [1, 2, 3]]
  71. block: # deduplicates test
  72. let
  73. dup1 = @[1, 1, 3, 4, 2, 2, 8, 1, 4]
  74. dup2 = @["a", "a", "c", "d", "d"]
  75. dup3 = [1, 1, 3, 4, 2, 2, 8, 1, 4]
  76. dup4 = ["a", "a", "c", "d", "d"]
  77. unique1 = deduplicate(dup1)
  78. unique2 = deduplicate(dup2)
  79. unique3 = deduplicate(dup3)
  80. unique4 = deduplicate(dup4)
  81. unique5 = deduplicate(dup1.sorted, true)
  82. unique6 = deduplicate(dup2, true)
  83. unique7 = deduplicate(dup3.sorted, true)
  84. unique8 = deduplicate(dup4, true)
  85. doAssert unique1 == @[1, 3, 4, 2, 8]
  86. doAssert unique2 == @["a", "c", "d"]
  87. doAssert unique3 == @[1, 3, 4, 2, 8]
  88. doAssert unique4 == @["a", "c", "d"]
  89. doAssert unique5 == @[1, 2, 3, 4, 8]
  90. doAssert unique6 == @["a", "c", "d"]
  91. doAssert unique7 == @[1, 2, 3, 4, 8]
  92. doAssert unique8 == @["a", "c", "d"]
  93. block: # zip test
  94. let
  95. short = @[1, 2, 3]
  96. long = @[6, 5, 4, 3, 2, 1]
  97. words = @["one", "two", "three"]
  98. ashort = [1, 2, 3]
  99. along = [6, 5, 4, 3, 2, 1]
  100. awords = ["one", "two", "three"]
  101. zip1 = zip(short, long)
  102. zip2 = zip(short, words)
  103. zip3 = zip(ashort, along)
  104. doAssert zip1 == @[(1, 6), (2, 5), (3, 4)]
  105. doAssert zip2 == @[(1, "one"), (2, "two"), (3, "three")]
  106. doAssert zip3 == @[(1, 6), (2, 5), (3, 4)]
  107. doAssert zip1[2][1] == 4
  108. doAssert zip2[2][1] == "three"
  109. doAssert zip3[2][1] == 4
  110. when (NimMajor, NimMinor) <= (1, 0):
  111. let
  112. # In Nim 1.0.x and older, zip returned a seq of tuple strictly
  113. # with fields named "a" and "b".
  114. zipAb = zip(ashort, awords)
  115. doAssert zipAb == @[(a: 1, b: "one"), (2, "two"), (3, "three")]
  116. doAssert zipAb[2].b == "three"
  117. else:
  118. let
  119. # As zip returns seq of anonymous tuples, they can be assigned
  120. # to any variable that's a sequence of named tuples too.
  121. zipXy: seq[tuple[x: int, y: string]] = zip(ashort, awords)
  122. zipMn: seq[tuple[m: int, n: string]] = zip(ashort, words)
  123. doAssert zipXy == @[(x: 1, y: "one"), (2, "two"), (3, "three")]
  124. doAssert zipMn == @[(m: 1, n: "one"), (2, "two"), (3, "three")]
  125. doAssert zipXy[2].y == "three"
  126. doAssert zipMn[2].n == "three"
  127. block: # distribute tests
  128. let numbers = @[1, 2, 3, 4, 5, 6, 7]
  129. doAssert numbers.distribute(3) == @[@[1, 2, 3], @[4, 5], @[6, 7]]
  130. doAssert numbers.distribute(6)[0] == @[1, 2]
  131. doAssert numbers.distribute(6)[5] == @[7]
  132. let a = @[1, 2, 3, 4, 5, 6, 7]
  133. doAssert a.distribute(1, true) == @[@[1, 2, 3, 4, 5, 6, 7]]
  134. doAssert a.distribute(1, false) == @[@[1, 2, 3, 4, 5, 6, 7]]
  135. doAssert a.distribute(2, true) == @[@[1, 2, 3, 4], @[5, 6, 7]]
  136. doAssert a.distribute(2, false) == @[@[1, 2, 3, 4], @[5, 6, 7]]
  137. doAssert a.distribute(3, true) == @[@[1, 2, 3], @[4, 5], @[6, 7]]
  138. doAssert a.distribute(3, false) == @[@[1, 2, 3], @[4, 5, 6], @[7]]
  139. doAssert a.distribute(4, true) == @[@[1, 2], @[3, 4], @[5, 6], @[7]]
  140. doAssert a.distribute(4, false) == @[@[1, 2], @[3, 4], @[5, 6], @[7]]
  141. doAssert a.distribute(5, true) == @[@[1, 2], @[3, 4], @[5], @[6], @[7]]
  142. doAssert a.distribute(5, false) == @[@[1, 2], @[3, 4], @[5, 6], @[7], @[]]
  143. doAssert a.distribute(6, true) == @[@[1, 2], @[3], @[4], @[5], @[6], @[7]]
  144. doAssert a.distribute(6, false) == @[
  145. @[1, 2], @[3, 4], @[5, 6], @[7], @[], @[]]
  146. doAssert a.distribute(8, false) == a.distribute(8, true)
  147. doAssert a.distribute(90, false) == a.distribute(90, true)
  148. var b = @[0]
  149. for f in 1 .. 25: b.add(f)
  150. doAssert b.distribute(5, true)[4].len == 5
  151. doAssert b.distribute(5, false)[4].len == 2
  152. block: # map test
  153. let
  154. numbers = @[1, 4, 5, 8, 9, 7, 4]
  155. anumbers = [1, 4, 5, 8, 9, 7, 4]
  156. m1 = map(numbers, proc(x: int): int = 2*x)
  157. m2 = map(anumbers, proc(x: int): int = 2*x)
  158. doAssert m1 == @[2, 8, 10, 16, 18, 14, 8]
  159. doAssert m2 == @[2, 8, 10, 16, 18, 14, 8]
  160. block: # apply test
  161. var a = @["1", "2", "3", "4"]
  162. apply(a, proc(x: var string) = x &= "42")
  163. doAssert a == @["142", "242", "342", "442"]
  164. block: # filter proc test
  165. let
  166. colors = @["red", "yellow", "black"]
  167. acolors = ["red", "yellow", "black"]
  168. f1 = filter(colors, proc(x: string): bool = x.len < 6)
  169. f2 = filter(colors) do (x: string) -> bool: x.len > 5
  170. f3 = filter(acolors, proc(x: string): bool = x.len < 6)
  171. f4 = filter(acolors) do (x: string) -> bool: x.len > 5
  172. doAssert f1 == @["red", "black"]
  173. doAssert f2 == @["yellow"]
  174. doAssert f3 == @["red", "black"]
  175. doAssert f4 == @["yellow"]
  176. block: # filter iterator test
  177. let numbers = @[1, 4, 5, 8, 9, 7, 4]
  178. let anumbers = [1, 4, 5, 8, 9, 7, 4]
  179. doAssert toSeq(filter(numbers, proc (x: int): bool = x mod 2 == 0)) ==
  180. @[4, 8, 4]
  181. doAssert toSeq(filter(anumbers, proc (x: int): bool = x mod 2 == 0)) ==
  182. @[4, 8, 4]
  183. block: # keepIf test
  184. var floats = @[13.0, 12.5, 5.8, 2.0, 6.1, 9.9, 10.1]
  185. keepIf(floats, proc(x: float): bool = x > 10)
  186. doAssert floats == @[13.0, 12.5, 10.1]
  187. block: # insert tests
  188. var dest = @[1, 1, 1, 1, 1, 1, 1, 1]
  189. let
  190. src = @[2, 2, 2, 2, 2, 2]
  191. outcome = @[1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1]
  192. dest.insert(src, 3)
  193. doAssert dest == outcome, """\
  194. Inserting [2,2,2,2,2,2] into [1,1,1,1,1,1,1,1]
  195. at 3 is [1,1,1,2,2,2,2,2,2,1,1,1,1,1]"""
  196. block: # filterIt test
  197. let
  198. temperatures = @[-272.15, -2.0, 24.5, 44.31, 99.9, -113.44]
  199. acceptable = filterIt(temperatures, it < 50 and it > -10)
  200. notAcceptable = filterIt(temperatures, it > 50 or it < -10)
  201. doAssert acceptable == @[-2.0, 24.5, 44.31]
  202. doAssert notAcceptable == @[-272.15, 99.9, -113.44]
  203. block: # keepItIf test
  204. var candidates = @["foo", "bar", "baz", "foobar"]
  205. keepItIf(candidates, it.len == 3 and it[0] == 'b')
  206. doAssert candidates == @["bar", "baz"]
  207. block: # all
  208. let
  209. numbers = @[1, 4, 5, 8, 9, 7, 4]
  210. anumbers = [1, 4, 5, 8, 9, 7, 4]
  211. len0seq: seq[int] = @[]
  212. doAssert all(numbers, proc (x: int): bool = return x < 10) == true
  213. doAssert all(numbers, proc (x: int): bool = return x < 9) == false
  214. doAssert all(len0seq, proc (x: int): bool = return false) == true
  215. doAssert all(anumbers, proc (x: int): bool = return x < 10) == true
  216. doAssert all(anumbers, proc (x: int): bool = return x < 9) == false
  217. block: # allIt
  218. let
  219. numbers = @[1, 4, 5, 8, 9, 7, 4]
  220. anumbers = [1, 4, 5, 8, 9, 7, 4]
  221. len0seq: seq[int] = @[]
  222. doAssert allIt(numbers, it < 10) == true
  223. doAssert allIt(numbers, it < 9) == false
  224. doAssert allIt(len0seq, false) == true
  225. doAssert allIt(anumbers, it < 10) == true
  226. doAssert allIt(anumbers, it < 9) == false
  227. block: # any
  228. let
  229. numbers = @[1, 4, 5, 8, 9, 7, 4]
  230. anumbers = [1, 4, 5, 8, 9, 7, 4]
  231. len0seq: seq[int] = @[]
  232. doAssert any(numbers, proc (x: int): bool = return x > 8) == true
  233. doAssert any(numbers, proc (x: int): bool = return x > 9) == false
  234. doAssert any(len0seq, proc (x: int): bool = return true) == false
  235. doAssert any(anumbers, proc (x: int): bool = return x > 8) == true
  236. doAssert any(anumbers, proc (x: int): bool = return x > 9) == false
  237. block: # anyIt
  238. let
  239. numbers = @[1, 4, 5, 8, 9, 7, 4]
  240. anumbers = [1, 4, 5, 8, 9, 7, 4]
  241. len0seq: seq[int] = @[]
  242. doAssert anyIt(numbers, it > 8) == true
  243. doAssert anyIt(numbers, it > 9) == false
  244. doAssert anyIt(len0seq, true) == false
  245. doAssert anyIt(anumbers, it > 8) == true
  246. doAssert anyIt(anumbers, it > 9) == false
  247. block: # toSeq test
  248. block:
  249. let
  250. numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
  251. oddNumbers = toSeq(filter(numeric) do (x: int) -> bool:
  252. if x mod 2 == 1:
  253. result = true)
  254. doAssert oddNumbers == @[1, 3, 5, 7, 9]
  255. block:
  256. doAssert [1, 2].toSeq == @[1, 2]
  257. doAssert @[1, 2].toSeq == @[1, 2]
  258. doAssert @[1, 2].toSeq == @[1, 2]
  259. doAssert toSeq(@[1, 2]) == @[1, 2]
  260. block:
  261. iterator myIter(seed: int): auto =
  262. for i in 0..<seed:
  263. yield i
  264. doAssert toSeq(myIter(2)) == @[0, 1]
  265. block:
  266. iterator myIter(): auto {.inline.} =
  267. yield 1
  268. yield 2
  269. doAssert myIter.toSeq == @[1, 2]
  270. doAssert toSeq(myIter) == @[1, 2]
  271. when not defined(js):
  272. # pending #4695
  273. block:
  274. iterator myIter(): int {.closure.} =
  275. yield 1
  276. yield 2
  277. doAssert myIter.toSeq == @[1, 2]
  278. doAssert toSeq(myIter) == @[1, 2]
  279. block:
  280. proc myIter(): auto =
  281. iterator ret(): int {.closure.} =
  282. yield 1
  283. yield 2
  284. result = ret
  285. doAssert myIter().toSeq == @[1, 2]
  286. doAssert toSeq(myIter()) == @[1, 2]
  287. block:
  288. proc myIter(n: int): auto =
  289. var counter = 0
  290. iterator ret(): int {.closure.} =
  291. while counter < n:
  292. yield counter
  293. counter.inc
  294. result = ret
  295. block:
  296. let myIter3 = myIter(3)
  297. doAssert myIter3.toSeq == @[0, 1, 2]
  298. block:
  299. let myIter3 = myIter(3)
  300. doAssert toSeq(myIter3) == @[0, 1, 2]
  301. block:
  302. # makes sure this does not hang forever
  303. doAssert myIter(3).toSeq == @[0, 1, 2]
  304. doAssert toSeq(myIter(3)) == @[0, 1, 2]
  305. block:
  306. # tests https://github.com/nim-lang/Nim/issues/7187
  307. counter = 0
  308. let ret = toSeq(@[1, 2, 3].identity().filter(proc (x: int): bool = x < 3))
  309. doAssert ret == @[1, 2]
  310. doAssert counter == 1
  311. block: # foldl tests
  312. let
  313. numbers = @[5, 9, 11]
  314. addition = foldl(numbers, a + b)
  315. subtraction = foldl(numbers, a - b)
  316. multiplication = foldl(numbers, a * b)
  317. words = @["nim", "is", "cool"]
  318. concatenation = foldl(words, a & b)
  319. doAssert addition == 25, "Addition is (((5)+9)+11)"
  320. doAssert subtraction == -15, "Subtraction is (((5)-9)-11)"
  321. doAssert multiplication == 495, "Multiplication is (((5)*9)*11)"
  322. doAssert concatenation == "nimiscool"
  323. block: # foldr tests
  324. let
  325. numbers = @[5, 9, 11]
  326. addition = foldr(numbers, a + b)
  327. subtraction = foldr(numbers, a - b)
  328. multiplication = foldr(numbers, a * b)
  329. words = @["nim", "is", "cool"]
  330. concatenation = foldr(words, a & b)
  331. doAssert addition == 25, "Addition is (5+(9+(11)))"
  332. doAssert subtraction == 7, "Subtraction is (5-(9-(11)))"
  333. doAssert multiplication == 495, "Multiplication is (5*(9*(11)))"
  334. doAssert concatenation == "nimiscool"
  335. doAssert toSeq(1..3).foldr(a + b) == 6 # issue #14404
  336. block: # mapIt + applyIt test
  337. counter = 0
  338. var
  339. nums = @[1, 2, 3, 4]
  340. strings = nums.identity.mapIt($(4 * it))
  341. doAssert counter == 1
  342. nums.applyIt(it * 3)
  343. doAssert nums[0] + nums[3] == 15
  344. doAssert strings[2] == "12"
  345. block: # newSeqWith tests
  346. var seq2D = newSeqWith(4, newSeq[bool](2))
  347. seq2D[0][0] = true
  348. seq2D[1][0] = true
  349. seq2D[0][1] = true
  350. doAssert seq2D == @[@[true, true], @[true, false], @[false, false], @[false, false]]
  351. block: # bug #21538
  352. var x: seq[int] = @[2, 4]
  353. var y = newSeqWith(x.pop(), true)
  354. doAssert y == @[true, true, true, true]
  355. block: # mapLiterals tests
  356. let x = mapLiterals([0.1, 1.2, 2.3, 3.4], int)
  357. doAssert x is array[4, int]
  358. doAssert mapLiterals((1, ("abc"), 2), float, nested = false) ==
  359. (float(1), "abc", float(2))
  360. doAssert mapLiterals(([1], ("abc"), 2), `$`, nested = true) ==
  361. (["1"], "abc", "2")
  362. block: # mapIt with openArray
  363. counter = 0
  364. proc foo(x: openArray[int]): seq[int] = x.mapIt(it * 10)
  365. doAssert foo([identity(1), identity(2)]) == @[10, 20]
  366. doAssert counter == 2
  367. block: # mapIt with direct openArray
  368. proc foo1(x: openArray[int]): seq[int] = x.mapIt(it * 10)
  369. counter = 0
  370. doAssert foo1(openArray[int]([identity(1), identity(2)])) == @[10, 20]
  371. doAssert counter == 2
  372. # Corner cases (openArray literals should not be common)
  373. template foo2(x: openArray[int]): seq[int] = x.mapIt(it * 10)
  374. counter = 0
  375. doAssert foo2(openArray[int]([identity(1), identity(2)])) == @[10, 20]
  376. doAssert counter == 2
  377. counter = 0
  378. doAssert openArray[int]([identity(1), identity(2)]).mapIt(it) == @[1, 2]
  379. doAssert counter == 2
  380. block: # mapIt empty test, see https://github.com/nim-lang/Nim/pull/8584#pullrequestreview-144723468
  381. # NOTE: `[].mapIt(it)` is illegal, just as `let a = @[]` is (lacks type
  382. # of elements)
  383. doAssert: not compiles(mapIt(@[], it))
  384. doAssert: not compiles(mapIt([], it))
  385. doAssert newSeq[int](0).mapIt(it) == @[]
  386. block: # mapIt redifinition check, see https://github.com/nim-lang/Nim/issues/8580
  387. let s2 = [1, 2].mapIt(it)
  388. doAssert s2 == @[1, 2]
  389. block:
  390. counter = 0
  391. doAssert [1, 2].identity().mapIt(it*2).mapIt(it*10) == @[20, 40]
  392. # https://github.com/nim-lang/Nim/issues/7187 test case
  393. doAssert counter == 1
  394. block: # mapIt with invalid RHS for `let` (#8566)
  395. type X = enum
  396. A, B
  397. doAssert mapIt(X, $it) == @["A", "B"]
  398. block:
  399. # bug #9093
  400. let inp = "a:b,c:d"
  401. let outp = inp.split(",").mapIt(it.split(":"))
  402. doAssert outp == @[@["a", "b"], @["c", "d"]]
  403. block:
  404. proc iter(len: int): auto =
  405. result = iterator(): int =
  406. for i in 0..<len:
  407. yield i
  408. # xxx: obscure CT error: basic_types.nim(16, 16) Error: internal error: symbol has no generated name: true
  409. when not defined(js):
  410. doAssert: iter(3).mapIt(2*it).foldl(a + b) == 6
  411. block: # strictFuncs tests with ref object
  412. type Foo = ref object
  413. let foo1 = Foo()
  414. let foo2 = Foo()
  415. let foos = @[foo1, foo2]
  416. # Procedures that are `func`
  417. discard concat(foos, foos)
  418. discard count(foos, foo1)
  419. discard cycle(foos, 3)
  420. discard deduplicate(foos)
  421. discard minIndex(foos)
  422. discard maxIndex(foos)
  423. discard distribute(foos, 2)
  424. var mutableFoos = foos
  425. mutableFoos.delete(0..1)
  426. mutableFoos.insert(foos)
  427. # Some procedures that are `proc`, but were reverted from `func`
  428. discard repeat(foo1, 3)
  429. discard zip(foos, foos)
  430. let fooTuples = @[(foo1, 1), (foo2, 2)]
  431. discard unzip(fooTuples)
  432. template main =
  433. # xxx move all tests here
  434. block: # delete tests
  435. let outcome = @[1, 1, 1, 1, 1, 1, 1, 1]
  436. var dest = @[1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1]
  437. dest.delete(3, 8)
  438. doAssert outcome == dest, """\
  439. Deleting range 3-9 from [1,1,1,2,2,2,2,2,2,1,1,1,1,1]
  440. is [1,1,1,1,1,1,1,1]"""
  441. var x = @[1, 2, 3]
  442. x.delete(100, 100)
  443. doAssert x == @[1, 2, 3]
  444. block: # delete tests
  445. var a = @[10, 11, 12, 13, 14]
  446. doAssertRaises(IndexDefect): a.delete(4..5)
  447. doAssertRaises(IndexDefect): a.delete(4..<6)
  448. doAssertRaises(IndexDefect): a.delete(-1..1)
  449. doAssertRaises(IndexDefect): a.delete(-1 .. -1)
  450. doAssertRaises(IndexDefect): a.delete(5..5)
  451. doAssertRaises(IndexDefect): a.delete(5..3)
  452. doAssertRaises(IndexDefect): a.delete(5..<5) # edge case
  453. doAssert a == @[10, 11, 12, 13, 14]
  454. a.delete(4..4)
  455. doAssert a == @[10, 11, 12, 13]
  456. a.delete(1..2)
  457. doAssert a == @[10, 13]
  458. a.delete(1..<1) # empty slice
  459. doAssert a == @[10, 13]
  460. a.delete(0..<0)
  461. doAssert a == @[10, 13]
  462. a.delete(0..0)
  463. doAssert a == @[13]
  464. a.delete(0..0)
  465. doAssert a == @[]
  466. doAssertRaises(IndexDefect): a.delete(0..0)
  467. doAssertRaises(IndexDefect): a.delete(0..<0) # edge case
  468. block:
  469. type A = object
  470. a0: int
  471. var a = @[A(a0: 10), A(a0: 11), A(a0: 12)]
  472. a.delete(0..1)
  473. doAssert a == @[A(a0: 12)]
  474. block:
  475. type A = ref object
  476. let a0 = A()
  477. let a1 = A()
  478. let a2 = A()
  479. var a = @[a0, a1, a2]
  480. a.delete(0..1)
  481. doAssert a == @[a2]
  482. static: main()
  483. main()
  484. {.pop.}