PageRenderTime 44ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/test/test_set.rb

http://github.com/ruby/ruby
Ruby | 929 lines | 731 code | 190 blank | 8 comment | 12 complexity | 4ecd0effab6156145b7ddf51909e76a8 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. require 'set'
  4. class TC_Set < Test::Unit::TestCase
  5. class Set2 < Set
  6. end
  7. def test_aref
  8. assert_nothing_raised {
  9. Set[]
  10. Set[nil]
  11. Set[1,2,3]
  12. }
  13. assert_equal(0, Set[].size)
  14. assert_equal(1, Set[nil].size)
  15. assert_equal(1, Set[[]].size)
  16. assert_equal(1, Set[[nil]].size)
  17. set = Set[2,4,6,4]
  18. assert_equal(Set.new([2,4,6]), set)
  19. end
  20. def test_s_new
  21. assert_nothing_raised {
  22. Set.new()
  23. Set.new(nil)
  24. Set.new([])
  25. Set.new([1,2])
  26. Set.new('a'..'c')
  27. }
  28. assert_raise(ArgumentError) {
  29. Set.new(false)
  30. }
  31. assert_raise(ArgumentError) {
  32. Set.new(1)
  33. }
  34. assert_raise(ArgumentError) {
  35. Set.new(1,2)
  36. }
  37. assert_equal(0, Set.new().size)
  38. assert_equal(0, Set.new(nil).size)
  39. assert_equal(0, Set.new([]).size)
  40. assert_equal(1, Set.new([nil]).size)
  41. ary = [2,4,6,4]
  42. set = Set.new(ary)
  43. ary.clear
  44. assert_equal(false, set.empty?)
  45. assert_equal(3, set.size)
  46. ary = [1,2,3]
  47. s = Set.new(ary) { |o| o * 2 }
  48. assert_equal([2,4,6], s.sort)
  49. end
  50. def test_clone
  51. set1 = Set.new
  52. set2 = set1.clone
  53. set1 << 'abc'
  54. assert_equal(Set.new, set2)
  55. end
  56. def test_dup
  57. set1 = Set[1,2]
  58. set2 = set1.dup
  59. assert_not_same(set1, set2)
  60. assert_equal(set1, set2)
  61. set1.add(3)
  62. assert_not_equal(set1, set2)
  63. end
  64. def test_size
  65. assert_equal(0, Set[].size)
  66. assert_equal(2, Set[1,2].size)
  67. assert_equal(2, Set[1,2,1].size)
  68. end
  69. def test_empty?
  70. assert_equal(true, Set[].empty?)
  71. assert_equal(false, Set[1, 2].empty?)
  72. end
  73. def test_clear
  74. set = Set[1,2]
  75. ret = set.clear
  76. assert_same(set, ret)
  77. assert_equal(true, set.empty?)
  78. end
  79. def test_replace
  80. set = Set[1,2]
  81. ret = set.replace('a'..'c')
  82. assert_same(set, ret)
  83. assert_equal(Set['a','b','c'], set)
  84. set = Set[1,2]
  85. assert_raise(ArgumentError) {
  86. set.replace(3)
  87. }
  88. assert_equal(Set[1,2], set)
  89. end
  90. def test_to_a
  91. set = Set[1,2,3,2]
  92. ary = set.to_a
  93. assert_equal([1,2,3], ary.sort)
  94. end
  95. def test_flatten
  96. # test1
  97. set1 = Set[
  98. 1,
  99. Set[
  100. 5,
  101. Set[7,
  102. Set[0]
  103. ],
  104. Set[6,2],
  105. 1
  106. ],
  107. 3,
  108. Set[3,4]
  109. ]
  110. set2 = set1.flatten
  111. set3 = Set.new(0..7)
  112. assert_not_same(set2, set1)
  113. assert_equal(set3, set2)
  114. # test2; destructive
  115. orig_set1 = set1
  116. set1.flatten!
  117. assert_same(orig_set1, set1)
  118. assert_equal(set3, set1)
  119. # test3; multiple occurrences of a set in an set
  120. set1 = Set[1, 2]
  121. set2 = Set[set1, Set[set1, 4], 3]
  122. assert_nothing_raised {
  123. set2.flatten!
  124. }
  125. assert_equal(Set.new(1..4), set2)
  126. # test4; recursion
  127. set2 = Set[]
  128. set1 = Set[1, set2]
  129. set2.add(set1)
  130. assert_raise(ArgumentError) {
  131. set1.flatten!
  132. }
  133. # test5; miscellaneous
  134. empty = Set[]
  135. set = Set[Set[empty, "a"],Set[empty, "b"]]
  136. assert_nothing_raised {
  137. set.flatten
  138. }
  139. set1 = empty.merge(Set["no_more", set])
  140. assert_nil(Set.new(0..31).flatten!)
  141. x = Set[Set[],Set[1,2]].flatten!
  142. y = Set[1,2]
  143. assert_equal(x, y)
  144. end
  145. def test_include?
  146. set = Set[1,2,3]
  147. assert_equal(true, set.include?(1))
  148. assert_equal(true, set.include?(2))
  149. assert_equal(true, set.include?(3))
  150. assert_equal(false, set.include?(0))
  151. assert_equal(false, set.include?(nil))
  152. set = Set["1",nil,"2",nil,"0","1",false]
  153. assert_equal(true, set.include?(nil))
  154. assert_equal(true, set.include?(false))
  155. assert_equal(true, set.include?("1"))
  156. assert_equal(false, set.include?(0))
  157. assert_equal(false, set.include?(true))
  158. end
  159. def test_eqq
  160. set = Set[1,2,3]
  161. assert_equal(true, set === 1)
  162. assert_equal(true, set === 2)
  163. assert_equal(true, set === 3)
  164. assert_equal(false, set === 0)
  165. assert_equal(false, set === nil)
  166. set = Set["1",nil,"2",nil,"0","1",false]
  167. assert_equal(true, set === nil)
  168. assert_equal(true, set === false)
  169. assert_equal(true, set === "1")
  170. assert_equal(false, set === 0)
  171. assert_equal(false, set === true)
  172. end
  173. def test_superset?
  174. set = Set[1,2,3]
  175. assert_raise(ArgumentError) {
  176. set.superset?()
  177. }
  178. assert_raise(ArgumentError) {
  179. set.superset?(2)
  180. }
  181. assert_raise(ArgumentError) {
  182. set.superset?([2])
  183. }
  184. [Set, Set2].each { |klass|
  185. assert_equal(true, set.superset?(klass[]), klass.name)
  186. assert_equal(true, set.superset?(klass[1,2]), klass.name)
  187. assert_equal(true, set.superset?(klass[1,2,3]), klass.name)
  188. assert_equal(false, set.superset?(klass[1,2,3,4]), klass.name)
  189. assert_equal(false, set.superset?(klass[1,4]), klass.name)
  190. assert_equal(true, set >= klass[1,2,3], klass.name)
  191. assert_equal(true, set >= klass[1,2], klass.name)
  192. assert_equal(true, Set[].superset?(klass[]), klass.name)
  193. }
  194. end
  195. def test_proper_superset?
  196. set = Set[1,2,3]
  197. assert_raise(ArgumentError) {
  198. set.proper_superset?()
  199. }
  200. assert_raise(ArgumentError) {
  201. set.proper_superset?(2)
  202. }
  203. assert_raise(ArgumentError) {
  204. set.proper_superset?([2])
  205. }
  206. [Set, Set2].each { |klass|
  207. assert_equal(true, set.proper_superset?(klass[]), klass.name)
  208. assert_equal(true, set.proper_superset?(klass[1,2]), klass.name)
  209. assert_equal(false, set.proper_superset?(klass[1,2,3]), klass.name)
  210. assert_equal(false, set.proper_superset?(klass[1,2,3,4]), klass.name)
  211. assert_equal(false, set.proper_superset?(klass[1,4]), klass.name)
  212. assert_equal(false, set > klass[1,2,3], klass.name)
  213. assert_equal(true, set > klass[1,2], klass.name)
  214. assert_equal(false, Set[].proper_superset?(klass[]), klass.name)
  215. }
  216. end
  217. def test_subset?
  218. set = Set[1,2,3]
  219. assert_raise(ArgumentError) {
  220. set.subset?()
  221. }
  222. assert_raise(ArgumentError) {
  223. set.subset?(2)
  224. }
  225. assert_raise(ArgumentError) {
  226. set.subset?([2])
  227. }
  228. [Set, Set2].each { |klass|
  229. assert_equal(true, set.subset?(klass[1,2,3,4]), klass.name)
  230. assert_equal(true, set.subset?(klass[1,2,3]), klass.name)
  231. assert_equal(false, set.subset?(klass[1,2]), klass.name)
  232. assert_equal(false, set.subset?(klass[]), klass.name)
  233. assert_equal(true, set <= klass[1,2,3], klass.name)
  234. assert_equal(true, set <= klass[1,2,3,4], klass.name)
  235. assert_equal(true, Set[].subset?(klass[1]), klass.name)
  236. assert_equal(true, Set[].subset?(klass[]), klass.name)
  237. }
  238. end
  239. def test_proper_subset?
  240. set = Set[1,2,3]
  241. assert_raise(ArgumentError) {
  242. set.proper_subset?()
  243. }
  244. assert_raise(ArgumentError) {
  245. set.proper_subset?(2)
  246. }
  247. assert_raise(ArgumentError) {
  248. set.proper_subset?([2])
  249. }
  250. [Set, Set2].each { |klass|
  251. assert_equal(true, set.proper_subset?(klass[1,2,3,4]), klass.name)
  252. assert_equal(false, set.proper_subset?(klass[1,2,3]), klass.name)
  253. assert_equal(false, set.proper_subset?(klass[1,2]), klass.name)
  254. assert_equal(false, set.proper_subset?(klass[]), klass.name)
  255. assert_equal(false, set < klass[1,2,3], klass.name)
  256. assert_equal(true, set < klass[1,2,3,4], klass.name)
  257. assert_equal(false, Set[].proper_subset?(klass[]), klass.name)
  258. }
  259. end
  260. def assert_intersect(expected, set, other)
  261. case expected
  262. when true
  263. assert_send([set, :intersect?, other])
  264. assert_send([other, :intersect?, set])
  265. assert_not_send([set, :disjoint?, other])
  266. assert_not_send([other, :disjoint?, set])
  267. when false
  268. assert_not_send([set, :intersect?, other])
  269. assert_not_send([other, :intersect?, set])
  270. assert_send([set, :disjoint?, other])
  271. assert_send([other, :disjoint?, set])
  272. when Class
  273. assert_raise(expected) {
  274. set.intersect?(other)
  275. }
  276. assert_raise(expected) {
  277. set.disjoint?(other)
  278. }
  279. else
  280. raise ArgumentError, "%s: unsupported expected value: %s" % [__method__, expected.inspect]
  281. end
  282. end
  283. def test_intersect?
  284. set = Set[3,4,5]
  285. assert_intersect(ArgumentError, set, 3)
  286. assert_intersect(ArgumentError, set, [2,4,6])
  287. assert_intersect(true, set, set)
  288. assert_intersect(true, set, Set[2,4])
  289. assert_intersect(true, set, Set[5,6,7])
  290. assert_intersect(true, set, Set[1,2,6,8,4])
  291. assert_intersect(false, set, Set[])
  292. assert_intersect(false, set, Set[0,2])
  293. assert_intersect(false, set, Set[0,2,6])
  294. assert_intersect(false, set, Set[0,2,6,8,10])
  295. # Make sure set hasn't changed
  296. assert_equal(Set[3,4,5], set)
  297. end
  298. def test_each
  299. ary = [1,3,5,7,10,20]
  300. set = Set.new(ary)
  301. ret = set.each { |o| }
  302. assert_same(set, ret)
  303. e = set.each
  304. assert_instance_of(Enumerator, e)
  305. assert_nothing_raised {
  306. set.each { |o|
  307. ary.delete(o) or raise "unexpected element: #{o}"
  308. }
  309. ary.empty? or raise "forgotten elements: #{ary.join(', ')}"
  310. }
  311. assert_equal(6, e.size)
  312. set << 42
  313. assert_equal(7, e.size)
  314. end
  315. def test_add
  316. set = Set[1,2,3]
  317. ret = set.add(2)
  318. assert_same(set, ret)
  319. assert_equal(Set[1,2,3], set)
  320. ret = set.add?(2)
  321. assert_nil(ret)
  322. assert_equal(Set[1,2,3], set)
  323. ret = set.add(4)
  324. assert_same(set, ret)
  325. assert_equal(Set[1,2,3,4], set)
  326. ret = set.add?(5)
  327. assert_same(set, ret)
  328. assert_equal(Set[1,2,3,4,5], set)
  329. end
  330. def test_delete
  331. set = Set[1,2,3]
  332. ret = set.delete(4)
  333. assert_same(set, ret)
  334. assert_equal(Set[1,2,3], set)
  335. ret = set.delete?(4)
  336. assert_nil(ret)
  337. assert_equal(Set[1,2,3], set)
  338. ret = set.delete(2)
  339. assert_equal(set, ret)
  340. assert_equal(Set[1,3], set)
  341. ret = set.delete?(1)
  342. assert_equal(set, ret)
  343. assert_equal(Set[3], set)
  344. end
  345. def test_delete_if
  346. set = Set.new(1..10)
  347. ret = set.delete_if { |i| i > 10 }
  348. assert_same(set, ret)
  349. assert_equal(Set.new(1..10), set)
  350. set = Set.new(1..10)
  351. ret = set.delete_if { |i| i % 3 == 0 }
  352. assert_same(set, ret)
  353. assert_equal(Set[1,2,4,5,7,8,10], set)
  354. set = Set.new(1..10)
  355. enum = set.delete_if
  356. assert_equal(set.size, enum.size)
  357. assert_same(set, enum.each { |i| i % 3 == 0 })
  358. assert_equal(Set[1,2,4,5,7,8,10], set)
  359. end
  360. def test_keep_if
  361. set = Set.new(1..10)
  362. ret = set.keep_if { |i| i <= 10 }
  363. assert_same(set, ret)
  364. assert_equal(Set.new(1..10), set)
  365. set = Set.new(1..10)
  366. ret = set.keep_if { |i| i % 3 != 0 }
  367. assert_same(set, ret)
  368. assert_equal(Set[1,2,4,5,7,8,10], set)
  369. set = Set.new(1..10)
  370. enum = set.keep_if
  371. assert_equal(set.size, enum.size)
  372. assert_same(set, enum.each { |i| i % 3 != 0 })
  373. assert_equal(Set[1,2,4,5,7,8,10], set)
  374. end
  375. def test_collect!
  376. set = Set[1,2,3,'a','b','c',-1..1,2..4]
  377. ret = set.collect! { |i|
  378. case i
  379. when Numeric
  380. i * 2
  381. when String
  382. i.upcase
  383. else
  384. nil
  385. end
  386. }
  387. assert_same(set, ret)
  388. assert_equal(Set[2,4,6,'A','B','C',nil], set)
  389. set = Set[1,2,3,'a','b','c',-1..1,2..4]
  390. enum = set.collect!
  391. assert_equal(set.size, enum.size)
  392. assert_same(set, enum.each { |i|
  393. case i
  394. when Numeric
  395. i * 2
  396. when String
  397. i.upcase
  398. else
  399. nil
  400. end
  401. })
  402. assert_equal(Set[2,4,6,'A','B','C',nil], set)
  403. end
  404. def test_reject!
  405. set = Set.new(1..10)
  406. ret = set.reject! { |i| i > 10 }
  407. assert_nil(ret)
  408. assert_equal(Set.new(1..10), set)
  409. ret = set.reject! { |i| i % 3 == 0 }
  410. assert_same(set, ret)
  411. assert_equal(Set[1,2,4,5,7,8,10], set)
  412. set = Set.new(1..10)
  413. enum = set.reject!
  414. assert_equal(set.size, enum.size)
  415. assert_same(set, enum.each { |i| i % 3 == 0 })
  416. assert_equal(Set[1,2,4,5,7,8,10], set)
  417. end
  418. def test_select!
  419. set = Set.new(1..10)
  420. ret = set.select! { |i| i <= 10 }
  421. assert_equal(nil, ret)
  422. assert_equal(Set.new(1..10), set)
  423. set = Set.new(1..10)
  424. ret = set.select! { |i| i % 3 != 0 }
  425. assert_same(set, ret)
  426. assert_equal(Set[1,2,4,5,7,8,10], set)
  427. set = Set.new(1..10)
  428. enum = set.select!
  429. assert_equal(set.size, enum.size)
  430. assert_equal(nil, enum.each { |i| i <= 10 })
  431. assert_equal(Set.new(1..10), set)
  432. end
  433. def test_filter!
  434. set = Set.new(1..10)
  435. ret = set.filter! { |i| i <= 10 }
  436. assert_equal(nil, ret)
  437. assert_equal(Set.new(1..10), set)
  438. set = Set.new(1..10)
  439. ret = set.filter! { |i| i % 3 != 0 }
  440. assert_same(set, ret)
  441. assert_equal(Set[1,2,4,5,7,8,10], set)
  442. set = Set.new(1..10)
  443. enum = set.filter!
  444. assert_equal(set.size, enum.size)
  445. assert_equal(nil, enum.each { |i| i <= 10 })
  446. assert_equal(Set.new(1..10), set)
  447. end
  448. def test_merge
  449. set = Set[1,2,3]
  450. ret = set.merge([2,4,6])
  451. assert_same(set, ret)
  452. assert_equal(Set[1,2,3,4,6], set)
  453. end
  454. def test_subtract
  455. set = Set[1,2,3]
  456. ret = set.subtract([2,4,6])
  457. assert_same(set, ret)
  458. assert_equal(Set[1,3], set)
  459. end
  460. def test_plus
  461. set = Set[1,2,3]
  462. ret = set + [2,4,6]
  463. assert_not_same(set, ret)
  464. assert_equal(Set[1,2,3,4,6], ret)
  465. end
  466. def test_minus
  467. set = Set[1,2,3]
  468. ret = set - [2,4,6]
  469. assert_not_same(set, ret)
  470. assert_equal(Set[1,3], ret)
  471. end
  472. def test_and
  473. set = Set[1,2,3,4]
  474. ret = set & [2,4,6]
  475. assert_not_same(set, ret)
  476. assert_equal(Set[2,4], ret)
  477. end
  478. def test_xor
  479. set = Set[1,2,3,4]
  480. ret = set ^ [2,4,5,5]
  481. assert_not_same(set, ret)
  482. assert_equal(Set[1,3,5], ret)
  483. end
  484. def test_eq
  485. set1 = Set[2,3,1]
  486. set2 = Set[1,2,3]
  487. assert_equal(set1, set1)
  488. assert_equal(set1, set2)
  489. assert_not_equal(Set[1], [1])
  490. set1 = Class.new(Set)["a", "b"]
  491. set2 = Set["a", "b", set1]
  492. set1 = set1.add(set1.clone)
  493. assert_equal(set2, set2.clone)
  494. assert_equal(set1.clone, set1)
  495. assert_not_equal(Set[Exception.new,nil], Set[Exception.new,Exception.new], "[ruby-dev:26127]")
  496. end
  497. def test_classify
  498. set = Set.new(1..10)
  499. ret = set.classify { |i| i % 3 }
  500. assert_equal(3, ret.size)
  501. assert_instance_of(Hash, ret)
  502. ret.each_value { |value| assert_instance_of(Set, value) }
  503. assert_equal(Set[3,6,9], ret[0])
  504. assert_equal(Set[1,4,7,10], ret[1])
  505. assert_equal(Set[2,5,8], ret[2])
  506. set = Set.new(1..10)
  507. enum = set.classify
  508. assert_equal(set.size, enum.size)
  509. ret = enum.each { |i| i % 3 }
  510. assert_equal(3, ret.size)
  511. assert_instance_of(Hash, ret)
  512. ret.each_value { |value| assert_instance_of(Set, value) }
  513. assert_equal(Set[3,6,9], ret[0])
  514. assert_equal(Set[1,4,7,10], ret[1])
  515. assert_equal(Set[2,5,8], ret[2])
  516. end
  517. def test_divide
  518. set = Set.new(1..10)
  519. ret = set.divide { |i| i % 3 }
  520. assert_equal(3, ret.size)
  521. n = 0
  522. ret.each { |s| n += s.size }
  523. assert_equal(set.size, n)
  524. assert_equal(set, ret.flatten)
  525. set = Set[7,10,5,11,1,3,4,9,0]
  526. ret = set.divide { |a,b| (a - b).abs == 1 }
  527. assert_equal(4, ret.size)
  528. n = 0
  529. ret.each { |s| n += s.size }
  530. assert_equal(set.size, n)
  531. assert_equal(set, ret.flatten)
  532. ret.each { |s|
  533. if s.include?(0)
  534. assert_equal(Set[0,1], s)
  535. elsif s.include?(3)
  536. assert_equal(Set[3,4,5], s)
  537. elsif s.include?(7)
  538. assert_equal(Set[7], s)
  539. elsif s.include?(9)
  540. assert_equal(Set[9,10,11], s)
  541. else
  542. raise "unexpected group: #{s.inspect}"
  543. end
  544. }
  545. set = Set.new(1..10)
  546. enum = set.divide
  547. ret = enum.each { |i| i % 3 }
  548. assert_equal(set.size, enum.size)
  549. assert_equal(3, ret.size)
  550. n = 0
  551. ret.each { |s| n += s.size }
  552. assert_equal(set.size, n)
  553. assert_equal(set, ret.flatten)
  554. end
  555. def test_freeze
  556. orig = set = Set[1,2,3]
  557. assert_equal false, set.frozen?
  558. set << 4
  559. assert_same orig, set.freeze
  560. assert_equal true, set.frozen?
  561. assert_raise(FrozenError) {
  562. set << 5
  563. }
  564. assert_equal 4, set.size
  565. end
  566. def test_freeze_dup
  567. set1 = Set[1,2,3]
  568. set1.freeze
  569. set2 = set1.dup
  570. assert_not_predicate set2, :frozen?
  571. assert_nothing_raised {
  572. set2.add 4
  573. }
  574. end
  575. def test_freeze_clone
  576. set1 = Set[1,2,3]
  577. set1.freeze
  578. set2 = set1.clone
  579. assert_predicate set2, :frozen?
  580. assert_raise(FrozenError) {
  581. set2.add 5
  582. }
  583. end
  584. def test_freeze_clone_false
  585. set1 = Set[1,2,3]
  586. set1.freeze
  587. set2 = set1.clone(freeze: false)
  588. assert_not_predicate set2, :frozen?
  589. set2.add 5
  590. assert_equal Set[1,2,3,5], set2
  591. assert_equal Set[1,2,3], set1
  592. end
  593. def test_inspect
  594. set1 = Set[1, 2]
  595. assert_equal('#<Set: {1, 2}>', set1.inspect)
  596. set2 = Set[Set[0], 1, 2, set1]
  597. assert_equal('#<Set: {#<Set: {0}>, 1, 2, #<Set: {1, 2}>}>', set2.inspect)
  598. set1.add(set2)
  599. assert_equal('#<Set: {#<Set: {0}>, 1, 2, #<Set: {1, 2, #<Set: {...}>}>}>', set2.inspect)
  600. end
  601. def test_to_s
  602. set1 = Set[1, 2]
  603. assert_equal('#<Set: {1, 2}>', set1.to_s)
  604. set2 = Set[Set[0], 1, 2, set1]
  605. assert_equal('#<Set: {#<Set: {0}>, 1, 2, #<Set: {1, 2}>}>', set2.to_s)
  606. set1.add(set2)
  607. assert_equal('#<Set: {#<Set: {0}>, 1, 2, #<Set: {1, 2, #<Set: {...}>}>}>', set2.to_s)
  608. end
  609. def test_compare_by_identity
  610. a1, a2 = "a", "a"
  611. b1, b2 = "b", "b"
  612. c = "c"
  613. array = [a1, b1, c, a2, b2]
  614. iset = Set.new.compare_by_identity
  615. assert_send([iset, :compare_by_identity?])
  616. iset.merge(array)
  617. assert_equal(5, iset.size)
  618. assert_equal(array.map(&:object_id).sort, iset.map(&:object_id).sort)
  619. set = Set.new
  620. assert_not_send([set, :compare_by_identity?])
  621. set.merge(array)
  622. assert_equal(3, set.size)
  623. assert_equal(array.uniq.sort, set.sort)
  624. end
  625. def test_reset
  626. [Set, Class.new(Set)].each { |klass|
  627. a = [1, 2]
  628. b = [1]
  629. set = klass.new([a, b])
  630. b << 2
  631. set.reset
  632. assert_equal(klass.new([a]), set, klass.name)
  633. }
  634. end
  635. end
  636. class TC_SortedSet < Test::Unit::TestCase
  637. def test_sortedset
  638. s = SortedSet[4,5,3,1,2]
  639. assert_equal([1,2,3,4,5], s.to_a)
  640. prev = nil
  641. s.each { |o| assert(prev < o) if prev; prev = o }
  642. assert_not_nil(prev)
  643. s.map! { |o| -2 * o }
  644. assert_equal([-10,-8,-6,-4,-2], s.to_a)
  645. prev = nil
  646. ret = s.each { |o| assert(prev < o) if prev; prev = o }
  647. assert_not_nil(prev)
  648. assert_same(s, ret)
  649. s = SortedSet.new([2,1,3]) { |o| o * -2 }
  650. assert_equal([-6,-4,-2], s.to_a)
  651. s = SortedSet.new(['one', 'two', 'three', 'four'])
  652. a = []
  653. ret = s.delete_if { |o| a << o; o.start_with?('t') }
  654. assert_same(s, ret)
  655. assert_equal(['four', 'one'], s.to_a)
  656. assert_equal(['four', 'one', 'three', 'two'], a)
  657. s = SortedSet.new(['one', 'two', 'three', 'four'])
  658. a = []
  659. ret = s.reject! { |o| a << o; o.start_with?('t') }
  660. assert_same(s, ret)
  661. assert_equal(['four', 'one'], s.to_a)
  662. assert_equal(['four', 'one', 'three', 'two'], a)
  663. s = SortedSet.new(['one', 'two', 'three', 'four'])
  664. a = []
  665. ret = s.reject! { |o| a << o; false }
  666. assert_same(nil, ret)
  667. assert_equal(['four', 'one', 'three', 'two'], s.to_a)
  668. assert_equal(['four', 'one', 'three', 'two'], a)
  669. end
  670. def test_each
  671. ary = [1,3,5,7,10,20]
  672. set = SortedSet.new(ary)
  673. ret = set.each { |o| }
  674. assert_same(set, ret)
  675. e = set.each
  676. assert_instance_of(Enumerator, e)
  677. assert_nothing_raised {
  678. set.each { |o|
  679. ary.delete(o) or raise "unexpected element: #{o}"
  680. }
  681. ary.empty? or raise "forgotten elements: #{ary.join(', ')}"
  682. }
  683. assert_equal(6, e.size)
  684. set << 42
  685. assert_equal(7, e.size)
  686. end
  687. def test_freeze
  688. orig = set = SortedSet[3,2,1]
  689. assert_equal false, set.frozen?
  690. set << 4
  691. assert_same orig, set.freeze
  692. assert_equal true, set.frozen?
  693. assert_raise(FrozenError) {
  694. set << 5
  695. }
  696. assert_equal 4, set.size
  697. # https://bugs.ruby-lang.org/issues/12091
  698. assert_nothing_raised {
  699. assert_equal [1,2,3,4], set.to_a
  700. }
  701. end
  702. def test_freeze_dup
  703. set1 = SortedSet[1,2,3]
  704. set1.freeze
  705. set2 = set1.dup
  706. assert_not_predicate set2, :frozen?
  707. assert_nothing_raised {
  708. set2.add 4
  709. }
  710. end
  711. def test_freeze_clone
  712. set1 = SortedSet[1,2,3]
  713. set1.freeze
  714. set2 = set1.clone
  715. assert_predicate set2, :frozen?
  716. assert_raise(FrozenError) {
  717. set2.add 5
  718. }
  719. end
  720. end
  721. class TC_Enumerable < Test::Unit::TestCase
  722. def test_to_set
  723. ary = [2,5,4,3,2,1,3]
  724. set = ary.to_set
  725. assert_instance_of(Set, set)
  726. assert_equal([1,2,3,4,5], set.sort)
  727. set = ary.to_set { |o| o * -2 }
  728. assert_instance_of(Set, set)
  729. assert_equal([-10,-8,-6,-4,-2], set.sort)
  730. assert_same set, set.to_set
  731. assert_not_same set, set.to_set { |o| o }
  732. set = ary.to_set(SortedSet)
  733. assert_instance_of(SortedSet, set)
  734. assert_equal([1,2,3,4,5], set.to_a)
  735. set = ary.to_set(SortedSet) { |o| o * -2 }
  736. assert_instance_of(SortedSet, set)
  737. assert_equal([-10,-8,-6,-4,-2], set.sort)
  738. end
  739. end