PageRenderTime 24ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/test/ruby/test_range.rb

http://github.com/ruby/ruby
Ruby | 963 lines | 814 code | 146 blank | 3 comment | 34 complexity | fac42dcadb99aaae55e2edf9f067bea2 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 'delegate'
  4. require 'timeout'
  5. require 'bigdecimal'
  6. require 'rbconfig/sizeof'
  7. class TestRange < Test::Unit::TestCase
  8. def test_new
  9. assert_equal((0..2), Range.new(0, 2))
  10. assert_equal((0..2), Range.new(0, 2, false))
  11. assert_equal((0...2), Range.new(0, 2, true))
  12. assert_raise(ArgumentError) { (1.."3") }
  13. assert_equal((0..nil), Range.new(0, nil, false))
  14. assert_equal((0...nil), Range.new(0, nil, true))
  15. obj = Object.new
  16. def obj.<=>(other)
  17. raise RuntimeError, "cmp"
  18. end
  19. assert_raise_with_message(RuntimeError, "cmp") { (obj..3) }
  20. end
  21. def test_frozen_initialize
  22. r = Range.allocate
  23. r.freeze
  24. assert_raise(FrozenError){r.__send__(:initialize, 1, 2)}
  25. end
  26. def test_range_string
  27. # XXX: Is this really the test of Range?
  28. assert_equal([], ("a" ... "a").to_a)
  29. assert_equal(["a"], ("a" .. "a").to_a)
  30. assert_equal(["a"], ("a" ... "b").to_a)
  31. assert_equal(["a", "b"], ("a" .. "b").to_a)
  32. assert_equal([*"a".."z", "aa"], ("a"..).take(27))
  33. end
  34. def test_range_numeric_string
  35. assert_equal(["6", "7", "8"], ("6".."8").to_a, "[ruby-talk:343187]")
  36. assert_equal(["6", "7"], ("6"..."8").to_a)
  37. assert_equal(["9", "10"], ("9".."10").to_a)
  38. assert_equal(["9", "10"], ("9"..).take(2))
  39. assert_equal(["09", "10"], ("09".."10").to_a, "[ruby-dev:39361]")
  40. assert_equal(["9", "10"], (SimpleDelegator.new("9").."10").to_a)
  41. assert_equal(["9", "10"], (SimpleDelegator.new("9")..).take(2))
  42. assert_equal(["9", "10"], ("9"..SimpleDelegator.new("10")).to_a)
  43. end
  44. def test_range_symbol
  45. assert_equal([:a, :b], (:a .. :b).to_a)
  46. end
  47. def test_evaluation_order
  48. arr = [1,2]
  49. r = (arr.shift)..(arr.shift)
  50. assert_equal(1..2, r, "[ruby-dev:26383]")
  51. end
  52. class DuckRange
  53. def initialize(b,e,excl=false)
  54. @begin = b
  55. @end = e
  56. @excl = excl
  57. end
  58. attr_reader :begin, :end
  59. def exclude_end?
  60. @excl
  61. end
  62. end
  63. def test_duckrange
  64. assert_equal("bc", "abcd"[DuckRange.new(1,2)])
  65. end
  66. def test_min
  67. assert_equal(1, (1..2).min)
  68. assert_equal(nil, (2..1).min)
  69. assert_equal(1, (1...2).min)
  70. assert_equal(1, (1..).min)
  71. assert_raise(RangeError) { (..1).min }
  72. assert_raise(RangeError) { (...1).min }
  73. assert_equal(1.0, (1.0..2.0).min)
  74. assert_equal(nil, (2.0..1.0).min)
  75. assert_equal(1, (1.0...2.0).min)
  76. assert_equal(1, (1.0..).min)
  77. assert_equal(0, (0..0).min)
  78. assert_equal(nil, (0...0).min)
  79. assert_equal([0,1,2], (0..10).min(3))
  80. assert_equal([0,1], (0..1).min(3))
  81. assert_equal([0,1,2], (0..).min(3))
  82. assert_raise(RangeError) { (..1).min(3) }
  83. assert_raise(RangeError) { (...1).min(3) }
  84. assert_raise(RangeError) { (0..).min {|a, b| a <=> b } }
  85. end
  86. def test_max
  87. assert_equal(2, (1..2).max)
  88. assert_equal(nil, (2..1).max)
  89. assert_equal(1, (1...2).max)
  90. assert_raise(RangeError) { (1..).max }
  91. assert_raise(RangeError) { (1...).max }
  92. assert_equal(2.0, (1.0..2.0).max)
  93. assert_equal(nil, (2.0..1.0).max)
  94. assert_raise(TypeError) { (1.0...2.0).max }
  95. assert_raise(TypeError) { (1...1.5).max }
  96. assert_raise(TypeError) { (1.5...2).max }
  97. assert_equal(-0x80000002, ((-0x80000002)...(-0x80000001)).max)
  98. assert_equal(0, (0..0).max)
  99. assert_equal(nil, (0...0).max)
  100. assert_equal([10,9,8], (0..10).max(3))
  101. assert_equal([9,8,7], (0...10).max(3))
  102. assert_raise(RangeError) { (1..).max(3) }
  103. assert_raise(RangeError) { (1...).max(3) }
  104. assert_raise(RangeError) { (..0).min {|a, b| a <=> b } }
  105. end
  106. def test_minmax
  107. assert_equal([1, 2], (1..2).minmax)
  108. assert_equal([nil, nil], (2..1).minmax)
  109. assert_equal([1, 1], (1...2).minmax)
  110. assert_raise(RangeError) { (1..).minmax }
  111. assert_raise(RangeError) { (1...).minmax }
  112. assert_equal([1.0, 2.0], (1.0..2.0).minmax)
  113. assert_equal([nil, nil], (2.0..1.0).minmax)
  114. assert_raise(TypeError) { (1.0...2.0).minmax }
  115. assert_raise(TypeError) { (1...1.5).minmax }
  116. assert_raise(TypeError) { (1.5...2).minmax }
  117. assert_equal([-0x80000002, -0x80000002], ((-0x80000002)...(-0x80000001)).minmax)
  118. assert_equal([0, 0], (0..0).minmax)
  119. assert_equal([nil, nil], (0...0).minmax)
  120. assert_equal([2, 1], (1..2).minmax{|a, b| b <=> a})
  121. end
  122. def test_initialize_twice
  123. r = eval("1..2")
  124. assert_raise(NameError) { r.instance_eval { initialize 3, 4 } }
  125. assert_raise(NameError) { r.instance_eval { initialize_copy 3..4 } }
  126. end
  127. def test_uninitialized_range
  128. r = Range.allocate
  129. s = Marshal.dump(r)
  130. r = Marshal.load(s)
  131. assert_nothing_raised { r.instance_eval { initialize 5, 6} }
  132. end
  133. def test_marshal
  134. r = 1..2
  135. assert_equal(r, Marshal.load(Marshal.dump(r)))
  136. r = 1...2
  137. assert_equal(r, Marshal.load(Marshal.dump(r)))
  138. r = (1..)
  139. assert_equal(r, Marshal.load(Marshal.dump(r)))
  140. r = (1...)
  141. assert_equal(r, Marshal.load(Marshal.dump(r)))
  142. end
  143. def test_bad_value
  144. assert_raise(ArgumentError) { (1 .. :a) }
  145. end
  146. def test_exclude_end
  147. assert_not_predicate(0..1, :exclude_end?)
  148. assert_predicate(0...1, :exclude_end?)
  149. assert_not_predicate(0.., :exclude_end?)
  150. assert_predicate(0..., :exclude_end?)
  151. end
  152. def test_eq
  153. r = (0..1)
  154. assert_equal(r, r)
  155. assert_equal(r, (0..1))
  156. assert_not_equal(r, 0)
  157. assert_not_equal(r, (1..2))
  158. assert_not_equal(r, (0..2))
  159. assert_not_equal(r, (0...1))
  160. assert_not_equal(r, (0..nil))
  161. subclass = Class.new(Range)
  162. assert_equal(r, subclass.new(0,1))
  163. r = (0..nil)
  164. assert_equal(r, r)
  165. assert_equal(r, (0..nil))
  166. assert_not_equal(r, 0)
  167. assert_not_equal(r, (0...nil))
  168. subclass = Class.new(Range)
  169. assert_equal(r, subclass.new(0,nil))
  170. end
  171. def test_eql
  172. r = (0..1)
  173. assert_operator(r, :eql?, r)
  174. assert_operator(r, :eql?, 0..1)
  175. assert_not_operator(r, :eql?, 0)
  176. assert_not_operator(r, :eql?, 1..2)
  177. assert_not_operator(r, :eql?, 0..2)
  178. assert_not_operator(r, :eql?, 0...1)
  179. subclass = Class.new(Range)
  180. assert_operator(r, :eql?, subclass.new(0,1))
  181. r = (0..nil)
  182. assert_operator(r, :eql?, r)
  183. assert_operator(r, :eql?, 0..nil)
  184. assert_not_operator(r, :eql?, 0)
  185. assert_not_operator(r, :eql?, 0...nil)
  186. subclass = Class.new(Range)
  187. assert_operator(r, :eql?, subclass.new(0,nil))
  188. end
  189. def test_hash
  190. assert_kind_of(Integer, (0..1).hash)
  191. assert_equal((0..1).hash, (0..1).hash)
  192. assert_not_equal((0..1).hash, (0...1).hash)
  193. assert_equal((0..nil).hash, (0..nil).hash)
  194. assert_not_equal((0..nil).hash, (0...nil).hash)
  195. assert_kind_of(String, (0..1).hash.to_s)
  196. end
  197. def test_step
  198. a = []
  199. (0..10).step {|x| a << x }
  200. assert_equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], a)
  201. a = []
  202. (0..).step {|x| a << x; break if a.size == 10 }
  203. assert_equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], a)
  204. a = []
  205. (0..10).step(2) {|x| a << x }
  206. assert_equal([0, 2, 4, 6, 8, 10], a)
  207. a = []
  208. (0..).step(2) {|x| a << x; break if a.size == 10 }
  209. assert_equal([0, 2, 4, 6, 8, 10, 12, 14, 16, 18], a)
  210. assert_kind_of(Enumerator::ArithmeticSequence, (0..10).step)
  211. assert_kind_of(Enumerator::ArithmeticSequence, (0..10).step(2))
  212. assert_kind_of(Enumerator::ArithmeticSequence, (0..10).step(0.5))
  213. assert_kind_of(Enumerator::ArithmeticSequence, (10..0).step(-1))
  214. assert_kind_of(Enumerator::ArithmeticSequence, (..10).step(2))
  215. assert_kind_of(Enumerator::ArithmeticSequence, (1..).step(2))
  216. assert_raise(ArgumentError) { (0..10).step(-1) { } }
  217. assert_raise(ArgumentError) { (0..10).step(0) { } }
  218. assert_raise(ArgumentError) { (0..).step(-1) { } }
  219. assert_raise(ArgumentError) { (0..).step(0) { } }
  220. a = []
  221. ("a" .. "z").step(2) {|x| a << x }
  222. assert_equal(%w(a c e g i k m o q s u w y), a)
  223. a = []
  224. ("a" .. ).step(2) {|x| a << x; break if a.size == 13 }
  225. assert_equal(%w(a c e g i k m o q s u w y), a)
  226. a = []
  227. ("a" .. "z").step(2**32) {|x| a << x }
  228. assert_equal(["a"], a)
  229. a = []
  230. (:a .. :z).step(2) {|x| a << x }
  231. assert_equal(%i(a c e g i k m o q s u w y), a)
  232. a = []
  233. (:a .. ).step(2) {|x| a << x; break if a.size == 13 }
  234. assert_equal(%i(a c e g i k m o q s u w y), a)
  235. a = []
  236. (:a .. :z).step(2**32) {|x| a << x }
  237. assert_equal([:a], a)
  238. a = []
  239. (2**32-1 .. 2**32+1).step(2) {|x| a << x }
  240. assert_equal([4294967295, 4294967297], a)
  241. zero = (2**32).coerce(0).first
  242. assert_raise(ArgumentError) { (2**32-1 .. 2**32+1).step(zero) { } }
  243. a = []
  244. (2**32-1 .. ).step(2) {|x| a << x; break if a.size == 2 }
  245. assert_equal([4294967295, 4294967297], a)
  246. max = RbConfig::LIMITS["FIXNUM_MAX"]
  247. a = []
  248. (max..).step {|x| a << x; break if a.size == 2 }
  249. assert_equal([max, max+1], a)
  250. a = []
  251. (max..).step(max) {|x| a << x; break if a.size == 4 }
  252. assert_equal([max, 2*max, 3*max, 4*max], a)
  253. o1 = Object.new
  254. o2 = Object.new
  255. def o1.<=>(x); -1; end
  256. def o2.<=>(x); 0; end
  257. assert_raise(TypeError) { (o1..o2).step(1) { } }
  258. assert_raise(TypeError) { (o1..).step(1) { } }
  259. class << o1; self; end.class_eval do
  260. define_method(:succ) { o2 }
  261. end
  262. a = []
  263. (o1..o2).step(1) {|x| a << x }
  264. assert_equal([o1, o2], a)
  265. a = []
  266. (o1...o2).step(1) {|x| a << x }
  267. assert_equal([o1], a)
  268. assert_nothing_raised("[ruby-dev:34557]") { (0..2).step(0.5) {|x| } }
  269. a = []
  270. (0..2).step(0.5) {|x| a << x }
  271. assert_equal([0, 0.5, 1.0, 1.5, 2.0], a)
  272. a = []
  273. (0..).step(0.5) {|x| a << x; break if a.size == 5 }
  274. assert_equal([0, 0.5, 1.0, 1.5, 2.0], a)
  275. a = []
  276. (0x40000000..0x40000002).step(0.5) {|x| a << x }
  277. assert_equal([1073741824, 1073741824.5, 1073741825.0, 1073741825.5, 1073741826], a)
  278. o = Object.new
  279. def o.to_int() 1 end
  280. assert_nothing_raised("[ruby-dev:34558]") { (0..2).step(o) {|x| } }
  281. o = Object.new
  282. class << o
  283. def to_str() "a" end
  284. def <=>(other) to_str <=> other end
  285. end
  286. a = []
  287. (o.."c").step(1) {|x| a << x}
  288. assert_equal(["a", "b", "c"], a)
  289. a = []
  290. (o..).step(1) {|x| a << x; break if a.size >= 3}
  291. assert_equal(["a", "b", "c"], a)
  292. end
  293. def test_step_bug15537
  294. assert_equal([10.0, 9.0, 8.0, 7.0], (10 ..).step(-1.0).take(4))
  295. assert_equal([10.0, 9.0, 8.0, 7.0], (10.0 ..).step(-1).take(4))
  296. end
  297. def test_percent_step
  298. aseq = (1..10) % 2
  299. assert_equal(Enumerator::ArithmeticSequence, aseq.class)
  300. assert_equal(1, aseq.begin)
  301. assert_equal(10, aseq.end)
  302. assert_equal(2, aseq.step)
  303. assert_equal([1, 3, 5, 7, 9], aseq.to_a)
  304. end
  305. def test_step_ruby_core_35753
  306. assert_equal(6, (1...6.3).step.to_a.size)
  307. assert_equal(5, (1.1...6).step.to_a.size)
  308. assert_equal(5, (1...6).step(1.1).to_a.size)
  309. assert_equal(3, (1.0...5.4).step(1.5).to_a.size)
  310. assert_equal(3, (1.0...5.5).step(1.5).to_a.size)
  311. assert_equal(4, (1.0...5.6).step(1.5).to_a.size)
  312. end
  313. def test_each
  314. a = []
  315. (0..10).each {|x| a << x }
  316. assert_equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], a)
  317. a = []
  318. (0..).each {|x| a << x; break if a.size == 10 }
  319. assert_equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], a)
  320. o1 = Object.new
  321. o2 = Object.new
  322. def o1.setcmp(v) @cmpresult = v end
  323. o1.setcmp(-1)
  324. def o1.<=>(x); @cmpresult; end
  325. def o2.setcmp(v) @cmpresult = v end
  326. o2.setcmp(0)
  327. def o2.<=>(x); @cmpresult; end
  328. class << o1; self; end.class_eval do
  329. define_method(:succ) { o2 }
  330. end
  331. r1 = (o1..o2)
  332. r2 = (o1...o2)
  333. a = []
  334. r1.each {|x| a << x }
  335. assert_equal([o1, o2], a)
  336. a = []
  337. r2.each {|x| a << x }
  338. assert_equal([o1], a)
  339. o2.setcmp(1)
  340. a = []
  341. r1.each {|x| a << x }
  342. assert_equal([o1], a)
  343. o2.setcmp(nil)
  344. a = []
  345. r1.each {|x| a << x }
  346. assert_equal([o1], a)
  347. o1.setcmp(nil)
  348. a = []
  349. r2.each {|x| a << x }
  350. assert_equal([], a)
  351. o = Object.new
  352. class << o
  353. def to_str() "a" end
  354. def <=>(other) to_str <=> other end
  355. end
  356. a = []
  357. (o.."c").each {|x| a << x}
  358. assert_equal(["a", "b", "c"], a)
  359. a = []
  360. (o..).each {|x| a << x; break if a.size >= 3}
  361. assert_equal(["a", "b", "c"], a)
  362. end
  363. def test_begin_end
  364. assert_equal(0, (0..1).begin)
  365. assert_equal(1, (0..1).end)
  366. assert_equal(1, (0...1).end)
  367. assert_equal(0, (0..nil).begin)
  368. assert_equal(nil, (0..nil).end)
  369. assert_equal(nil, (0...nil).end)
  370. end
  371. def test_first_last
  372. assert_equal([0, 1, 2], (0..10).first(3))
  373. assert_equal([8, 9, 10], (0..10).last(3))
  374. assert_equal(0, (0..10).first)
  375. assert_equal(10, (0..10).last)
  376. assert_equal("a", ("a".."c").first)
  377. assert_equal("c", ("a".."c").last)
  378. assert_equal(0, (2..0).last)
  379. assert_equal([0, 1, 2], (0...10).first(3))
  380. assert_equal([7, 8, 9], (0...10).last(3))
  381. assert_equal(0, (0...10).first)
  382. assert_equal(10, (0...10).last)
  383. assert_equal("a", ("a"..."c").first)
  384. assert_equal("c", ("a"..."c").last)
  385. assert_equal(0, (2...0).last)
  386. assert_equal([0, 1, 2], (0..nil).first(3))
  387. assert_equal(0, (0..nil).first)
  388. assert_equal("a", ("a"..nil).first)
  389. assert_raise(RangeError) { (0..nil).last }
  390. assert_raise(RangeError) { (0..nil).last(3) }
  391. assert_raise(RangeError) { (nil..0).first }
  392. assert_raise(RangeError) { (nil..0).first(3) }
  393. assert_equal([0, 1, 2], (0..10).first(3.0))
  394. assert_equal([8, 9, 10], (0..10).last(3.0))
  395. assert_raise(TypeError) { (0..10).first("3") }
  396. assert_raise(TypeError) { (0..10).last("3") }
  397. class << (o = Object.new)
  398. def to_int; 3; end
  399. end
  400. assert_equal([0, 1, 2], (0..10).first(o))
  401. assert_equal([8, 9, 10], (0..10).last(o))
  402. assert_raise(ArgumentError) { (0..10).first(-1) }
  403. assert_raise(ArgumentError) { (0..10).last(-1) }
  404. end
  405. def test_last_with_redefine_each
  406. assert_in_out_err([], <<-'end;', ['true'], [])
  407. class Range
  408. remove_method :each
  409. def each(&b)
  410. [1, 2, 3, 4, 5].each(&b)
  411. end
  412. end
  413. puts [3, 4, 5] == (1..10).last(3)
  414. end;
  415. end
  416. def test_to_s
  417. assert_equal("0..1", (0..1).to_s)
  418. assert_equal("0...1", (0...1).to_s)
  419. assert_equal("0..", (0..nil).to_s)
  420. assert_equal("0...", (0...nil).to_s)
  421. end
  422. def test_inspect
  423. assert_equal("0..1", (0..1).inspect)
  424. assert_equal("0...1", (0...1).inspect)
  425. assert_equal("0..", (0..nil).inspect)
  426. assert_equal("0...", (0...nil).inspect)
  427. assert_equal("..1", (nil..1).inspect)
  428. assert_equal("...1", (nil...1).inspect)
  429. assert_equal("nil..nil", (nil..nil).inspect)
  430. assert_equal("nil...nil", (nil...nil).inspect)
  431. end
  432. def test_eqq
  433. assert_operator(0..10, :===, 5)
  434. assert_not_operator(0..10, :===, 11)
  435. assert_operator(5..nil, :===, 11)
  436. assert_not_operator(5..nil, :===, 0)
  437. end
  438. def test_eqq_string
  439. assert_operator('A'..'Z', :===, 'ANA')
  440. assert_not_operator('A'..'Z', :===, 'ana')
  441. assert_operator('A'.., :===, 'ANA')
  442. assert_operator(..'Z', :===, 'ANA')
  443. assert_operator(nil..nil, :===, 'ANA')
  444. end
  445. def test_eqq_time
  446. bug11113 = '[ruby-core:69052] [Bug #11113]'
  447. t = Time.now
  448. assert_nothing_raised(TypeError, bug11113) {
  449. assert_operator(t..(t+10), :===, t+5)
  450. assert_operator(t.., :===, t+5)
  451. assert_not_operator(t.., :===, t-5)
  452. }
  453. end
  454. def test_eqq_non_linear
  455. bug12003 = '[ruby-core:72908] [Bug #12003]'
  456. c = Class.new {
  457. attr_reader :value
  458. def initialize(value)
  459. @value = value
  460. end
  461. def succ
  462. self.class.new(@value.succ)
  463. end
  464. def ==(other)
  465. @value == other.value
  466. end
  467. def <=>(other)
  468. @value <=> other.value
  469. end
  470. }
  471. assert_operator(c.new(0)..c.new(10), :===, c.new(5), bug12003)
  472. end
  473. def test_eqq_non_iteratable
  474. k = Class.new do
  475. include Comparable
  476. attr_reader :i
  477. def initialize(i) @i = i; end
  478. def <=>(o); i <=> o.i; end
  479. end
  480. assert_operator(k.new(0)..k.new(2), :===, k.new(1))
  481. end
  482. def test_include
  483. assert_include("a".."z", "c")
  484. assert_not_include("a".."z", "5")
  485. assert_include("a"..."z", "y")
  486. assert_not_include("a"..."z", "z")
  487. assert_not_include("a".."z", "cc")
  488. assert_include("a".., "c")
  489. assert_not_include("a".., "5")
  490. assert_include(0...10, 5)
  491. assert_include(5..., 10)
  492. assert_not_include(5..., 0)
  493. end
  494. def test_cover
  495. assert_operator("a".."z", :cover?, "c")
  496. assert_not_operator("a".."z", :cover?, "5")
  497. assert_operator("a"..."z", :cover?, "y")
  498. assert_not_operator("a"..."z", :cover?, "z")
  499. assert_operator("a".."z", :cover?, "cc")
  500. assert_not_operator(5..., :cover?, 0)
  501. assert_not_operator(5..., :cover?, "a")
  502. assert_operator(5.., :cover?, 10)
  503. assert_operator(2..5, :cover?, 2..5)
  504. assert_operator(2...6, :cover?, 2...6)
  505. assert_operator(2...6, :cover?, 2..5)
  506. assert_operator(2..5, :cover?, 2...6)
  507. assert_operator(2..5, :cover?, 2..4)
  508. assert_operator(2..5, :cover?, 2...4)
  509. assert_operator(2..5, :cover?, 2...5)
  510. assert_operator(2..5, :cover?, 3..5)
  511. assert_operator(2..5, :cover?, 3..4)
  512. assert_operator(2..5, :cover?, 3...6)
  513. assert_operator(2...6, :cover?, 2...5)
  514. assert_operator(2...6, :cover?, 2..5)
  515. assert_operator(2..6, :cover?, 2...6)
  516. assert_operator(2.., :cover?, 2..)
  517. assert_operator(2.., :cover?, 3..)
  518. assert_operator(1.., :cover?, 1..10)
  519. assert_operator(..2, :cover?, ..2)
  520. assert_operator(..2, :cover?, ..1)
  521. assert_operator(..2, :cover?, 0..1)
  522. assert_operator(2.0..5.0, :cover?, 2..3)
  523. assert_operator(2..5, :cover?, 2.0..3.0)
  524. assert_operator(2..5, :cover?, 2.0...3.0)
  525. assert_operator(2..5, :cover?, 2.0...5.0)
  526. assert_operator(2.0..5.0, :cover?, 2.0...3.0)
  527. assert_operator(2.0..5.0, :cover?, 2.0...5.0)
  528. assert_operator('aa'..'zz', :cover?, 'aa'...'bb')
  529. assert_not_operator(2..5, :cover?, 1..5)
  530. assert_not_operator(2...6, :cover?, 1..5)
  531. assert_not_operator(2..5, :cover?, 1...6)
  532. assert_not_operator(1..3, :cover?, 1...6)
  533. assert_not_operator(2..5, :cover?, 2..6)
  534. assert_not_operator(2...6, :cover?, 2..6)
  535. assert_not_operator(2...6, :cover?, 2...7)
  536. assert_not_operator(2..3, :cover?, 1..4)
  537. assert_not_operator(1..2, :cover?, 1.0..3.0)
  538. assert_not_operator(1.0..2.9, :cover?, 1.0..3.0)
  539. assert_not_operator(1..2, :cover?, 4..3)
  540. assert_not_operator(2..1, :cover?, 1..2)
  541. assert_not_operator(1...2, :cover?, 1...3)
  542. assert_not_operator(2.., :cover?, 1..)
  543. assert_not_operator(2.., :cover?, 1..10)
  544. assert_not_operator(2.., :cover?, ..10)
  545. assert_not_operator(1..10, :cover?, 1..)
  546. assert_not_operator(1..10, :cover?, ..1)
  547. assert_not_operator(1..5, :cover?, 3..2)
  548. assert_not_operator(1..10, :cover?, 3...2)
  549. assert_not_operator(1..10, :cover?, 3...3)
  550. assert_not_operator('aa'..'zz', :cover?, 'aa'...'zzz')
  551. assert_not_operator(1..10, :cover?, 1...10.1)
  552. end
  553. def test_beg_len
  554. o = Object.new
  555. assert_raise(TypeError) { [][o] }
  556. class << o; attr_accessor :begin end
  557. o.begin = -10
  558. assert_raise(TypeError) { [][o] }
  559. class << o; attr_accessor :end end
  560. o.end = 0
  561. assert_raise(TypeError) { [][o] }
  562. def o.exclude_end=(v) @exclude_end = v end
  563. def o.exclude_end?() @exclude_end end
  564. o.exclude_end = false
  565. assert_nil([0][o])
  566. assert_raise(RangeError) { [0][o] = 1 }
  567. class << o
  568. private :begin, :end
  569. end
  570. o.begin = 10
  571. o.end = 10
  572. assert_nil([0][o])
  573. o.begin = 0
  574. assert_equal([0], [0][o])
  575. o.begin = 2
  576. o.end = 0
  577. assert_equal([], [0, 1, 2][o])
  578. end
  579. class CyclicRange < Range
  580. def <=>(other); true; end
  581. end
  582. def test_cyclic_range_inspect
  583. o = CyclicRange.allocate
  584. o.instance_eval { initialize(o, 1) }
  585. assert_equal("(... .. ...)..1", o.inspect)
  586. end
  587. def test_comparison_when_recursive
  588. x = CyclicRange.allocate; x.send(:initialize, x, 1)
  589. y = CyclicRange.allocate; y.send(:initialize, y, 1)
  590. Timeout.timeout(1) {
  591. assert_equal x, y
  592. assert_operator x, :eql?, y
  593. }
  594. z = CyclicRange.allocate; z.send(:initialize, z, :another)
  595. Timeout.timeout(1) {
  596. assert_not_equal x, z
  597. assert_not_operator x, :eql?, z
  598. }
  599. x = CyclicRange.allocate
  600. y = CyclicRange.allocate
  601. x.send(:initialize, y, 1)
  602. y.send(:initialize, x, 1)
  603. Timeout.timeout(1) {
  604. assert_equal x, y
  605. assert_operator x, :eql?, y
  606. }
  607. x = CyclicRange.allocate
  608. z = CyclicRange.allocate
  609. x.send(:initialize, z, 1)
  610. z.send(:initialize, x, :other)
  611. Timeout.timeout(1) {
  612. assert_not_equal x, z
  613. assert_not_operator x, :eql?, z
  614. }
  615. end
  616. def test_size
  617. assert_equal 42, (1..42).size
  618. assert_equal 41, (1...42).size
  619. assert_equal 6, (1...6.3).size
  620. assert_equal 5, (1.1...6).size
  621. assert_equal 42, (1..42).each.size
  622. assert_nil ("a"..."z").size
  623. assert_equal Float::INFINITY, (1...).size
  624. assert_equal Float::INFINITY, (1.0...).size
  625. assert_equal Float::INFINITY, (...1).size
  626. assert_equal Float::INFINITY, (...1.0).size
  627. assert_nil ("a"...).size
  628. end
  629. def test_bsearch_typechecks_return_values
  630. assert_raise(TypeError) do
  631. (1..42).bsearch{ "not ok" }
  632. end
  633. c = eval("class C\u{309a 26a1 26c4 1f300};self;end")
  634. assert_raise_with_message(TypeError, /C\u{309a 26a1 26c4 1f300}/) do
  635. (1..42).bsearch {c.new}
  636. end
  637. assert_equal (1..42).bsearch{}, (1..42).bsearch{false}
  638. end
  639. def test_bsearch_with_no_block
  640. enum = (42...666).bsearch
  641. assert_nil enum.size
  642. assert_equal 200, enum.each{|x| x >= 200 }
  643. end
  644. def test_bsearch_for_other_numerics
  645. assert_raise(TypeError) {
  646. (Rational(-1,2)..Rational(9,4)).bsearch
  647. }
  648. assert_raise(TypeError) {
  649. (BigDecimal('0.5')..BigDecimal('2.25')).bsearch
  650. }
  651. end
  652. def test_bsearch_for_fixnum
  653. ary = [3, 4, 7, 9, 12]
  654. assert_equal(0, (0...ary.size).bsearch {|i| ary[i] >= 2 })
  655. assert_equal(1, (0...ary.size).bsearch {|i| ary[i] >= 4 })
  656. assert_equal(2, (0...ary.size).bsearch {|i| ary[i] >= 6 })
  657. assert_equal(3, (0...ary.size).bsearch {|i| ary[i] >= 8 })
  658. assert_equal(4, (0...ary.size).bsearch {|i| ary[i] >= 10 })
  659. assert_equal(nil, (0...ary.size).bsearch {|i| ary[i] >= 100 })
  660. assert_equal(0, (0...ary.size).bsearch {|i| true })
  661. assert_equal(nil, (0...ary.size).bsearch {|i| false })
  662. ary = [0, 100, 100, 100, 200]
  663. assert_equal(1, (0...ary.size).bsearch {|i| ary[i] >= 100 })
  664. assert_equal(1_000_001, (0...).bsearch {|i| i > 1_000_000 })
  665. assert_equal( -999_999, (...0).bsearch {|i| i > -1_000_000 })
  666. end
  667. def test_bsearch_for_float
  668. inf = Float::INFINITY
  669. assert_in_delta(10.0, (0.0...100.0).bsearch {|x| x > 0 && Math.log(x / 10) >= 0 }, 0.0001)
  670. assert_in_delta(10.0, (0.0...inf).bsearch {|x| x > 0 && Math.log(x / 10) >= 0 }, 0.0001)
  671. assert_in_delta(-10.0, (-inf..100.0).bsearch {|x| x >= 0 || Math.log(-x / 10) < 0 }, 0.0001)
  672. assert_in_delta(10.0, (-inf..inf).bsearch {|x| x > 0 && Math.log(x / 10) >= 0 }, 0.0001)
  673. assert_equal(nil, (-inf..5).bsearch {|x| x > 0 && Math.log(x / 10) >= 0 }, 0.0001)
  674. assert_in_delta(10.0, (-inf.. 10).bsearch {|x| x > 0 && Math.log(x / 10) >= 0 }, 0.0001)
  675. assert_equal(nil, (-inf...10).bsearch {|x| x > 0 && Math.log(x / 10) >= 0 }, 0.0001)
  676. assert_equal(nil, (-inf..inf).bsearch { false })
  677. assert_equal(-inf, (-inf..inf).bsearch { true })
  678. assert_equal(inf, (0..inf).bsearch {|x| x == inf })
  679. assert_equal(nil, (0...inf).bsearch {|x| x == inf })
  680. v = (-inf..0).bsearch {|x| x != -inf }
  681. assert_operator(-Float::MAX, :>=, v)
  682. assert_operator(-inf, :<, v)
  683. v = (0.0..1.0).bsearch {|x| x > 0 } # the nearest positive value to 0.0
  684. assert_in_delta(0, v, 0.0001)
  685. assert_operator(0, :<, v)
  686. assert_equal(0.0, (-1.0..0.0).bsearch {|x| x >= 0 })
  687. assert_equal(nil, (-1.0...0.0).bsearch {|x| x >= 0 })
  688. v = (0..Float::MAX).bsearch {|x| x >= Float::MAX }
  689. assert_in_delta(Float::MAX, v)
  690. assert_equal(nil, v.infinite?)
  691. v = (0..inf).bsearch {|x| x >= Float::MAX }
  692. assert_in_delta(Float::MAX, v)
  693. assert_equal(nil, v.infinite?)
  694. v = (-Float::MAX..0).bsearch {|x| x > -Float::MAX }
  695. assert_operator(-Float::MAX, :<, v)
  696. assert_equal(nil, v.infinite?)
  697. v = (-inf..0).bsearch {|x| x >= -Float::MAX }
  698. assert_in_delta(-Float::MAX, v)
  699. assert_equal(nil, v.infinite?)
  700. v = (-inf..0).bsearch {|x| x > -Float::MAX }
  701. assert_operator(-Float::MAX, :<, v)
  702. assert_equal(nil, v.infinite?)
  703. assert_in_delta(1.0, (0.0..inf).bsearch {|x| Math.log(x) >= 0 })
  704. assert_in_delta(7.0, (0.0..10).bsearch {|x| 7.0 - x })
  705. assert_equal( 1_000_000.0.next_float, (0.0..).bsearch {|x| x > 1_000_000 })
  706. assert_equal(-1_000_000.0.next_float, (..0.0).bsearch {|x| x > -1_000_000 })
  707. end
  708. def check_bsearch_values(range, search, a)
  709. from, to = range.begin, range.end
  710. cmp = range.exclude_end? ? :< : :<=
  711. r = nil
  712. a.for "(0) trivial test" do
  713. r = Range.new(to, from, range.exclude_end?).bsearch do |x|
  714. fail "#{to}, #{from}, #{range.exclude_end?}, #{x}"
  715. end
  716. assert_nil r
  717. r = (to...to).bsearch do
  718. fail
  719. end
  720. assert_nil r
  721. end
  722. # prepare for others
  723. yielded = []
  724. r = range.bsearch do |val|
  725. yielded << val
  726. val >= search
  727. end
  728. a.for "(1) log test" do
  729. max = case from
  730. when Float then 65
  731. when Integer then Math.log(to-from+(range.exclude_end? ? 0 : 1), 2).to_i + 1
  732. end
  733. assert_operator yielded.size, :<=, max
  734. end
  735. a.for "(2) coverage test" do
  736. expect = case
  737. when search < from
  738. from
  739. when search.send(cmp, to)
  740. search
  741. else
  742. nil
  743. end
  744. assert_equal expect, r
  745. end
  746. a.for "(3) uniqueness test" do
  747. assert_nil yielded.uniq!
  748. end
  749. a.for "(4) end of range test" do
  750. case
  751. when range.exclude_end?
  752. assert_not_include yielded, to
  753. assert_not_equal r, to
  754. when search >= to
  755. assert_include yielded, to
  756. assert_equal search == to ? to : nil, r
  757. end
  758. end
  759. a.for "(5) start of range test" do
  760. if search <= from
  761. assert_include yielded, from
  762. assert_equal from, r
  763. end
  764. end
  765. a.for "(6) out of range test" do
  766. yielded.each do |val|
  767. assert_operator from, :<=, val
  768. assert_send [val, cmp, to]
  769. end
  770. end
  771. end
  772. def test_range_bsearch_for_floats
  773. ints = [-1 << 100, -123456789, -42, -1, 0, 1, 42, 123456789, 1 << 100]
  774. floats = [-Float::INFINITY, -Float::MAX, -42.0, -4.2, -Float::EPSILON, -Float::MIN, 0.0, Float::MIN, Float::EPSILON, Math::PI, 4.2, 42.0, Float::MAX, Float::INFINITY]
  775. all_assertions do |a|
  776. [ints, floats].each do |values|
  777. values.combination(2).to_a.product(values).each do |(from, to), search|
  778. check_bsearch_values(from..to, search, a)
  779. check_bsearch_values(from...to, search, a)
  780. end
  781. end
  782. end
  783. end
  784. def test_bsearch_for_bignum
  785. bignum = 2**100
  786. ary = [3, 4, 7, 9, 12]
  787. assert_equal(bignum + 0, (bignum...bignum+ary.size).bsearch {|i| ary[i - bignum] >= 2 })
  788. assert_equal(bignum + 1, (bignum...bignum+ary.size).bsearch {|i| ary[i - bignum] >= 4 })
  789. assert_equal(bignum + 2, (bignum...bignum+ary.size).bsearch {|i| ary[i - bignum] >= 6 })
  790. assert_equal(bignum + 3, (bignum...bignum+ary.size).bsearch {|i| ary[i - bignum] >= 8 })
  791. assert_equal(bignum + 4, (bignum...bignum+ary.size).bsearch {|i| ary[i - bignum] >= 10 })
  792. assert_equal(nil, (bignum...bignum+ary.size).bsearch {|i| ary[i - bignum] >= 100 })
  793. assert_equal(bignum + 0, (bignum...bignum+ary.size).bsearch {|i| true })
  794. assert_equal(nil, (bignum...bignum+ary.size).bsearch {|i| false })
  795. assert_equal(bignum * 2 + 1, (bignum...).bsearch {|i| i > bignum * 2 })
  796. assert_equal(-bignum * 2 + 1, (...-bignum).bsearch {|i| i > -bignum * 2 })
  797. assert_raise(TypeError) { ("a".."z").bsearch {} }
  798. end
  799. def test_each_no_blockarg
  800. a = "a"
  801. def a.upto(x, e, &b)
  802. super {|y| b.call(y) {|z| assert(false)}}
  803. end
  804. (a.."c").each {|x, &b| assert_nil(b)}
  805. end
  806. def test_to_a
  807. assert_equal([1,2,3,4,5], (1..5).to_a)
  808. assert_equal([1,2,3,4], (1...5).to_a)
  809. assert_raise(RangeError) { (1..).to_a }
  810. end
  811. def test_beginless_range_iteration
  812. assert_raise(TypeError) { (..1).each { } }
  813. end
  814. def test_count
  815. assert_equal(Float::INFINITY, (1..).count)
  816. end
  817. end