PageRenderTime 57ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/test/ruby/test_integer.rb

http://github.com/ruby/ruby
Ruby | 662 lines | 571 code | 80 blank | 11 comment | 10 complexity | c47982f2338ed1d17f928ac6898d8ca2 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. class TestInteger < Test::Unit::TestCase
  4. BDSIZE = 0x4000000000000000.coerce(0)[0].size
  5. def self.bdsize(x)
  6. ((x + 1) / 8 + BDSIZE) / BDSIZE * BDSIZE
  7. end
  8. def bdsize(x)
  9. self.class.bdsize(x)
  10. end
  11. FIXNUM_MIN = RbConfig::LIMITS['FIXNUM_MIN']
  12. FIXNUM_MAX = RbConfig::LIMITS['FIXNUM_MAX']
  13. def test_aref
  14. [
  15. *-16..16,
  16. *(FIXNUM_MIN-2)..(FIXNUM_MIN+2),
  17. *(FIXNUM_MAX-2)..(FIXNUM_MAX+2),
  18. ].each do |n|
  19. (-64..64).each do |idx|
  20. assert_equal((n >> idx) & 1, n[idx])
  21. end
  22. [*-66..-62, *-34..-30, *-5..5, *30..34, *62..66].each do |idx|
  23. (0..100).each do |len|
  24. assert_equal((n >> idx) & ((1 << len) - 1), n[idx, len], "#{ n }[#{ idx }, #{ len }]")
  25. end
  26. (0..100).each do |len|
  27. assert_equal((n >> idx) & ((1 << (len + 1)) - 1), n[idx..idx+len], "#{ n }[#{ idx }..#{ idx+len }]")
  28. assert_equal((n >> idx) & ((1 << len) - 1), n[idx...idx+len], "#{ n }[#{ idx }...#{ idx+len }]")
  29. end
  30. # endless
  31. assert_equal((n >> idx), n[idx..], "#{ n }[#{ idx }..]")
  32. assert_equal((n >> idx), n[idx...], "#{ n }[#{ idx }...#]")
  33. # beginless
  34. if idx >= 0 && n & ((1 << (idx + 1)) - 1) != 0
  35. assert_raise(ArgumentError, "#{ n }[..#{ idx }]") { n[..idx] }
  36. else
  37. assert_equal(0, n[..idx], "#{ n }[..#{ idx }]")
  38. end
  39. if idx >= 0 && n & ((1 << idx) - 1) != 0
  40. assert_raise(ArgumentError, "#{ n }[...#{ idx }]") { n[...idx] }
  41. else
  42. assert_equal(0, n[...idx], "#{ n }[...#{ idx }]")
  43. end
  44. end
  45. end
  46. # assert_equal(1, (1 << 0x40000000)[0x40000000], "[ruby-dev:31271]")
  47. # assert_equal(0, (-1 << 0x40000001)[0x40000000], "[ruby-dev:31271]")
  48. big_zero = 0x40000000.coerce(0)[0]
  49. assert_equal(0, (-0x40000002)[big_zero], "[ruby-dev:31271]")
  50. assert_equal(1, 0x400000001[big_zero], "[ruby-dev:31271]")
  51. end
  52. def test_pow
  53. assert_not_equal(0, begin
  54. 0**-1
  55. rescue
  56. nil
  57. end, "[ruby-dev:32084] [ruby-dev:34547]")
  58. x = EnvUtil.suppress_warning {2 ** -0x4000000000000000}
  59. assert_in_delta(0.0, (x / 2), Float::EPSILON)
  60. <<~EXPRS.each_line.with_index(__LINE__+1) do |expr, line|
  61. crash01: 111r+11**-11111161111111
  62. crash02: 1118111111111**-1111111111111111**1+1==11111
  63. crash03: -1111111**-1111*11 - -1111111** -111111111
  64. crash04: 1118111111111** -1111111111111111**1+11111111111**1 ===111
  65. crash05: 11** -111155555555555555 -55 !=5-555
  66. crash07: 1 + 111111111**-1111811111
  67. crash08: 18111111111**-1111111111111111**1 + 1111111111**-1111**1
  68. crash10: -7 - -1111111** -1111**11
  69. crash12: 1118111111111** -1111111111111111**1 + 1111 - -1111111** -1111*111111111119
  70. crash13: 1.0i - -1111111** -111111111
  71. crash14: 11111**111111111**111111 * -11111111111111111111**-111111111111
  72. crash15: ~1**1111 + -~1**~1**111
  73. crash17: 11** -1111111**1111 /11i
  74. crash18: 5555i**-5155 - -9111111**-1111**11
  75. crash19: 111111*-11111111111111111111**-1111111111111111
  76. crash20: 1111**111-11**-11111**11
  77. crash21: 11**-10111111119-1i -1r
  78. EXPRS
  79. name, expr = expr.split(':', 2)
  80. assert_ruby_status(%w"-W0", expr, name)
  81. end
  82. end
  83. def test_lshift
  84. assert_equal(0, 1 << -0x40000000)
  85. assert_equal(0, 1 << -0x40000001)
  86. assert_equal(0, 1 << -0x80000000)
  87. assert_equal(0, 1 << -0x80000001)
  88. # assert_equal(bdsize(0x80000000), (1 << 0x80000000).size)
  89. end
  90. def test_rshift
  91. # assert_equal(bdsize(0x40000001), (1 >> -0x40000001).size)
  92. assert_predicate((1 >> 0x80000000), :zero?)
  93. assert_predicate((1 >> 0xffffffff), :zero?)
  94. assert_predicate((1 >> 0x100000000), :zero?)
  95. # assert_equal((1 << 0x40000000), (1 >> -0x40000000))
  96. # assert_equal((1 << 0x40000001), (1 >> -0x40000001))
  97. end
  98. def test_Integer
  99. assert_raise(ArgumentError) {Integer("0x-1")}
  100. assert_raise(ArgumentError) {Integer("-0x-1")}
  101. assert_raise(ArgumentError) {Integer("0x 123")}
  102. assert_raise(ArgumentError) {Integer("0x 123")}
  103. assert_raise(ArgumentError) {Integer("0x0x5")}
  104. assert_raise(ArgumentError) {Integer("0x0x000000005")}
  105. assert_nothing_raised(ArgumentError) {
  106. assert_equal(1540841, "0x0x5".to_i(36))
  107. }
  108. assert_raise(ArgumentError) { Integer("--0") }
  109. assert_raise(ArgumentError) { Integer("-+0") }
  110. assert_raise(ArgumentError) { Integer("++1") }
  111. assert_raise(ArgumentError) { Integer("") }
  112. assert_raise(ArgumentError) { Integer("10 x") }
  113. assert_raise(ArgumentError) { Integer("1__2") }
  114. assert_raise(ArgumentError) { Integer("1z") }
  115. assert_raise(ArgumentError) { Integer("46116860184273__87904") }
  116. assert_raise(ArgumentError) { Integer("4611686018427387904_") }
  117. assert_raise(ArgumentError) { Integer("4611686018427387904 :") }
  118. assert_equal(0x4000000000000000, Integer("46_11_686_0184273_87904"))
  119. assert_raise(ArgumentError) { Integer("\0") }
  120. assert_nothing_raised(ArgumentError, "[ruby-core:13873]") {
  121. assert_equal(0, Integer("0 "))
  122. }
  123. assert_nothing_raised(ArgumentError, "[ruby-core:14139]") {
  124. assert_equal(0377, Integer("0_3_7_7"))
  125. }
  126. assert_raise(ArgumentError, "[ruby-core:14139]") {Integer("0__3_7_7")}
  127. assert_equal(1234, Integer(1234))
  128. assert_equal(1, Integer(1.234))
  129. # base argument
  130. assert_equal(1234, Integer("1234", 10))
  131. assert_equal(668, Integer("1234", 8))
  132. assert_equal(4660, Integer("1234", 16))
  133. assert_equal(49360, Integer("1234", 36))
  134. # decimal, not octal
  135. assert_equal(1234, Integer("01234", 10))
  136. assert_raise(ArgumentError) { Integer("0x123", 10) }
  137. assert_raise(ArgumentError) { Integer(1234, 10) }
  138. assert_raise(ArgumentError) { Integer(12.34, 10) }
  139. assert_raise(ArgumentError) { Integer(Object.new, 1) }
  140. assert_raise(ArgumentError) { Integer(1, 1, 1) }
  141. assert_equal(2 ** 50, Integer(2.0 ** 50))
  142. assert_raise(TypeError) { Integer(nil) }
  143. bug14552 = '[ruby-core:85813]'
  144. obj = Object.new
  145. def obj.to_int; "str"; end
  146. assert_raise(TypeError, bug14552) { Integer(obj) }
  147. def obj.to_i; 42; end
  148. assert_equal(42, Integer(obj), bug14552)
  149. obj = Object.new
  150. def obj.to_i; "str"; end
  151. assert_raise(TypeError) { Integer(obj) }
  152. bug6192 = '[ruby-core:43566]'
  153. assert_raise(Encoding::CompatibilityError, bug6192) {Integer("0".encode("utf-16be"))}
  154. assert_raise(Encoding::CompatibilityError, bug6192) {Integer("0".encode("utf-16le"))}
  155. assert_raise(Encoding::CompatibilityError, bug6192) {Integer("0".encode("utf-32be"))}
  156. assert_raise(Encoding::CompatibilityError, bug6192) {Integer("0".encode("utf-32le"))}
  157. assert_raise(Encoding::CompatibilityError, bug6192) {Integer("0".encode("iso-2022-jp"))}
  158. assert_raise_with_message(ArgumentError, /\u{1f4a1}/) {Integer("\u{1f4a1}")}
  159. obj = Struct.new(:s).new(%w[42 not-an-integer])
  160. def obj.to_str; s.shift; end
  161. assert_equal(42, Integer(obj, 10))
  162. assert_separately([], "#{<<-"begin;"}\n#{<<-"end;"}")
  163. begin;
  164. class Float
  165. undef to_int
  166. def to_int; raise "conversion failed"; end
  167. end
  168. assert_equal (1 << 100), Integer((1 << 100).to_f)
  169. assert_equal 1, Integer(1.0)
  170. end;
  171. end
  172. def test_Integer_with_invalid_exception
  173. assert_raise(ArgumentError) {
  174. Integer("0", exception: 1)
  175. }
  176. end
  177. def test_Integer_with_exception_keyword
  178. assert_nothing_raised(ArgumentError) {
  179. assert_equal(nil, Integer("1z", exception: false))
  180. }
  181. assert_nothing_raised(ArgumentError) {
  182. assert_equal(nil, Integer(Object.new, exception: false))
  183. }
  184. assert_nothing_raised(ArgumentError) {
  185. o = Object.new
  186. def o.to_i; 42.5; end
  187. assert_equal(nil, Integer(o, exception: false))
  188. }
  189. assert_nothing_raised(ArgumentError) {
  190. o = Object.new
  191. def o.to_i; raise; end
  192. assert_equal(nil, Integer(o, exception: false))
  193. }
  194. assert_nothing_raised(ArgumentError) {
  195. o = Object.new
  196. def o.to_int; raise; end
  197. assert_equal(nil, Integer(o, exception: false))
  198. }
  199. assert_nothing_raised(FloatDomainError) {
  200. assert_equal(nil, Integer(Float::INFINITY, exception: false))
  201. }
  202. assert_nothing_raised(FloatDomainError) {
  203. assert_equal(nil, Integer(-Float::INFINITY, exception: false))
  204. }
  205. assert_nothing_raised(FloatDomainError) {
  206. assert_equal(nil, Integer(Float::NAN, exception: false))
  207. }
  208. assert_raise(ArgumentError) {
  209. Integer("1z", exception: true)
  210. }
  211. assert_raise(TypeError) {
  212. Integer(nil, exception: true)
  213. }
  214. assert_nothing_raised(TypeError) {
  215. assert_equal(nil, Integer(nil, exception: false))
  216. }
  217. assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
  218. begin;
  219. class Integer;def method_missing(*);"";end;end
  220. assert_equal(0, Integer("0", 2))
  221. end;
  222. end
  223. def test_int_p
  224. assert_not_predicate(1.0, :integer?)
  225. assert_predicate(1, :integer?)
  226. end
  227. def test_succ
  228. assert_equal(2, 1.send(:succ))
  229. end
  230. def test_chr
  231. assert_equal("a", "a".ord.chr)
  232. assert_raise(RangeError) { (-1).chr }
  233. assert_raise(RangeError) { 0x100.chr }
  234. end
  235. def test_upto
  236. a = []
  237. 1.upto(3) {|x| a << x }
  238. assert_equal([1, 2, 3], a)
  239. a = []
  240. 1.upto(0) {|x| a << x }
  241. assert_equal([], a)
  242. y = 2**30 - 1
  243. a = []
  244. y.upto(y+2) {|x| a << x }
  245. assert_equal([y, y+1, y+2], a)
  246. end
  247. def test_downto
  248. a = []
  249. -1.downto(-3) {|x| a << x }
  250. assert_equal([-1, -2, -3], a)
  251. a = []
  252. 1.downto(2) {|x| a << x }
  253. assert_equal([], a)
  254. y = -(2**30)
  255. a = []
  256. y.downto(y-2) {|x| a << x }
  257. assert_equal([y, y-1, y-2], a)
  258. end
  259. def test_times
  260. (2**32).times do |i|
  261. break if i == 2
  262. end
  263. end
  264. def assert_int_equal(expected, result, mesg = nil)
  265. assert_kind_of(Integer, result, mesg)
  266. assert_equal(expected, result, mesg)
  267. end
  268. def assert_float_equal(expected, result, mesg = nil)
  269. assert_kind_of(Float, result, mesg)
  270. assert_equal(expected, result, mesg)
  271. end
  272. def test_round
  273. assert_int_equal(11111, 11111.round)
  274. assert_int_equal(11111, 11111.round(0))
  275. assert_int_equal(11111, 11111.round(1))
  276. assert_int_equal(11111, 11111.round(2))
  277. assert_int_equal(11110, 11111.round(-1))
  278. assert_int_equal(11100, 11111.round(-2))
  279. assert_int_equal(+200, +249.round(-2))
  280. assert_int_equal(+300, +250.round(-2))
  281. assert_int_equal(-200, -249.round(-2))
  282. assert_int_equal(+200, +249.round(-2, half: :even))
  283. assert_int_equal(+200, +250.round(-2, half: :even))
  284. assert_int_equal(+300, +349.round(-2, half: :even))
  285. assert_int_equal(+400, +350.round(-2, half: :even))
  286. assert_int_equal(+200, +249.round(-2, half: :up))
  287. assert_int_equal(+300, +250.round(-2, half: :up))
  288. assert_int_equal(+300, +349.round(-2, half: :up))
  289. assert_int_equal(+400, +350.round(-2, half: :up))
  290. assert_int_equal(+200, +249.round(-2, half: :down))
  291. assert_int_equal(+200, +250.round(-2, half: :down))
  292. assert_int_equal(+300, +349.round(-2, half: :down))
  293. assert_int_equal(+300, +350.round(-2, half: :down))
  294. assert_int_equal(-300, -250.round(-2))
  295. assert_int_equal(-200, -249.round(-2, half: :even))
  296. assert_int_equal(-200, -250.round(-2, half: :even))
  297. assert_int_equal(-300, -349.round(-2, half: :even))
  298. assert_int_equal(-400, -350.round(-2, half: :even))
  299. assert_int_equal(-200, -249.round(-2, half: :up))
  300. assert_int_equal(-300, -250.round(-2, half: :up))
  301. assert_int_equal(-300, -349.round(-2, half: :up))
  302. assert_int_equal(-400, -350.round(-2, half: :up))
  303. assert_int_equal(-200, -249.round(-2, half: :down))
  304. assert_int_equal(-200, -250.round(-2, half: :down))
  305. assert_int_equal(-300, -349.round(-2, half: :down))
  306. assert_int_equal(-300, -350.round(-2, half: :down))
  307. assert_int_equal(+30 * 10**70, (+25 * 10**70).round(-71))
  308. assert_int_equal(-30 * 10**70, (-25 * 10**70).round(-71))
  309. assert_int_equal(+20 * 10**70, (+25 * 10**70 - 1).round(-71))
  310. assert_int_equal(-20 * 10**70, (-25 * 10**70 + 1).round(-71))
  311. assert_int_equal(+40 * 10**70, (+35 * 10**70).round(-71))
  312. assert_int_equal(-40 * 10**70, (-35 * 10**70).round(-71))
  313. assert_int_equal(+30 * 10**70, (+35 * 10**70 - 1).round(-71))
  314. assert_int_equal(-30 * 10**70, (-35 * 10**70 + 1).round(-71))
  315. assert_int_equal(+20 * 10**70, (+25 * 10**70).round(-71, half: :even))
  316. assert_int_equal(-20 * 10**70, (-25 * 10**70).round(-71, half: :even))
  317. assert_int_equal(+20 * 10**70, (+25 * 10**70 - 1).round(-71, half: :even))
  318. assert_int_equal(-20 * 10**70, (-25 * 10**70 + 1).round(-71, half: :even))
  319. assert_int_equal(+40 * 10**70, (+35 * 10**70).round(-71, half: :even))
  320. assert_int_equal(-40 * 10**70, (-35 * 10**70).round(-71, half: :even))
  321. assert_int_equal(+30 * 10**70, (+35 * 10**70 - 1).round(-71, half: :even))
  322. assert_int_equal(-30 * 10**70, (-35 * 10**70 + 1).round(-71, half: :even))
  323. assert_int_equal(+30 * 10**70, (+25 * 10**70).round(-71, half: :up))
  324. assert_int_equal(-30 * 10**70, (-25 * 10**70).round(-71, half: :up))
  325. assert_int_equal(+20 * 10**70, (+25 * 10**70 - 1).round(-71, half: :up))
  326. assert_int_equal(-20 * 10**70, (-25 * 10**70 + 1).round(-71, half: :up))
  327. assert_int_equal(+40 * 10**70, (+35 * 10**70).round(-71, half: :up))
  328. assert_int_equal(-40 * 10**70, (-35 * 10**70).round(-71, half: :up))
  329. assert_int_equal(+30 * 10**70, (+35 * 10**70 - 1).round(-71, half: :up))
  330. assert_int_equal(-30 * 10**70, (-35 * 10**70 + 1).round(-71, half: :up))
  331. assert_int_equal(+20 * 10**70, (+25 * 10**70).round(-71, half: :down))
  332. assert_int_equal(-20 * 10**70, (-25 * 10**70).round(-71, half: :down))
  333. assert_int_equal(+20 * 10**70, (+25 * 10**70 - 1).round(-71, half: :down))
  334. assert_int_equal(-20 * 10**70, (-25 * 10**70 + 1).round(-71, half: :down))
  335. assert_int_equal(+30 * 10**70, (+35 * 10**70).round(-71, half: :down))
  336. assert_int_equal(-30 * 10**70, (-35 * 10**70).round(-71, half: :down))
  337. assert_int_equal(+30 * 10**70, (+35 * 10**70 - 1).round(-71, half: :down))
  338. assert_int_equal(-30 * 10**70, (-35 * 10**70 + 1).round(-71, half: :down))
  339. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1110, 1111_1111_1111_1111_1111_1111_1111_1111.round(-1))
  340. assert_int_equal(-1111_1111_1111_1111_1111_1111_1111_1110, (-1111_1111_1111_1111_1111_1111_1111_1111).round(-1))
  341. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1111, 1111_1111_1111_1111_1111_1111_1111_1111.round(1))
  342. assert_int_equal(10**400, (10**400).round(1))
  343. end
  344. def test_floor
  345. assert_int_equal(11111, 11111.floor)
  346. assert_int_equal(11111, 11111.floor(0))
  347. assert_int_equal(11111, 11111.floor(1))
  348. assert_int_equal(11111, 11111.floor(2))
  349. assert_int_equal(11110, 11110.floor(-1))
  350. assert_int_equal(11110, 11119.floor(-1))
  351. assert_int_equal(11100, 11100.floor(-2))
  352. assert_int_equal(11100, 11199.floor(-2))
  353. assert_int_equal(0, 11111.floor(-5))
  354. assert_int_equal(+200, +299.floor(-2))
  355. assert_int_equal(+300, +300.floor(-2))
  356. assert_int_equal(-300, -299.floor(-2))
  357. assert_int_equal(-300, -300.floor(-2))
  358. assert_int_equal(+20 * 10**70, (+25 * 10**70).floor(-71))
  359. assert_int_equal(-30 * 10**70, (-25 * 10**70).floor(-71))
  360. assert_int_equal(+20 * 10**70, (+25 * 10**70 - 1).floor(-71))
  361. assert_int_equal(-30 * 10**70, (-25 * 10**70 + 1).floor(-71))
  362. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1110, 1111_1111_1111_1111_1111_1111_1111_1111.floor(-1))
  363. assert_int_equal(-1111_1111_1111_1111_1111_1111_1111_1120, (-1111_1111_1111_1111_1111_1111_1111_1111).floor(-1))
  364. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1111, 1111_1111_1111_1111_1111_1111_1111_1111.floor(1))
  365. assert_int_equal(10**400, (10**400).floor(1))
  366. end
  367. def test_ceil
  368. assert_int_equal(11111, 11111.ceil)
  369. assert_int_equal(11111, 11111.ceil(0))
  370. assert_int_equal(11111, 11111.ceil(1))
  371. assert_int_equal(11111, 11111.ceil(2))
  372. assert_int_equal(11110, 11110.ceil(-1))
  373. assert_int_equal(11120, 11119.ceil(-1))
  374. assert_int_equal(11200, 11101.ceil(-2))
  375. assert_int_equal(11200, 11200.ceil(-2))
  376. assert_int_equal(100000, 11111.ceil(-5))
  377. assert_int_equal(300, 299.ceil(-2))
  378. assert_int_equal(300, 300.ceil(-2))
  379. assert_int_equal(-200, -299.ceil(-2))
  380. assert_int_equal(-300, -300.ceil(-2))
  381. assert_int_equal(+30 * 10**70, (+25 * 10**70).ceil(-71))
  382. assert_int_equal(-20 * 10**70, (-25 * 10**70).ceil(-71))
  383. assert_int_equal(+30 * 10**70, (+25 * 10**70 - 1).ceil(-71))
  384. assert_int_equal(-20 * 10**70, (-25 * 10**70 + 1).ceil(-71))
  385. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1120, 1111_1111_1111_1111_1111_1111_1111_1111.ceil(-1))
  386. assert_int_equal(-1111_1111_1111_1111_1111_1111_1111_1110, (-1111_1111_1111_1111_1111_1111_1111_1111).ceil(-1))
  387. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1111, 1111_1111_1111_1111_1111_1111_1111_1111.ceil(1))
  388. assert_int_equal(10**400, (10**400).ceil(1))
  389. end
  390. def test_truncate
  391. assert_int_equal(11111, 11111.truncate)
  392. assert_int_equal(11111, 11111.truncate(0))
  393. assert_int_equal(11111, 11111.truncate(1))
  394. assert_int_equal(11111, 11111.truncate(2))
  395. assert_int_equal(11110, 11110.truncate(-1))
  396. assert_int_equal(11110, 11119.truncate(-1))
  397. assert_int_equal(11100, 11100.truncate(-2))
  398. assert_int_equal(11100, 11199.truncate(-2))
  399. assert_int_equal(0, 11111.truncate(-5))
  400. assert_int_equal(+200, +299.truncate(-2))
  401. assert_int_equal(+300, +300.truncate(-2))
  402. assert_int_equal(-200, -299.truncate(-2))
  403. assert_int_equal(-300, -300.truncate(-2))
  404. assert_int_equal(+20 * 10**70, (+25 * 10**70).truncate(-71))
  405. assert_int_equal(-20 * 10**70, (-25 * 10**70).truncate(-71))
  406. assert_int_equal(+20 * 10**70, (+25 * 10**70 - 1).truncate(-71))
  407. assert_int_equal(-20 * 10**70, (-25 * 10**70 + 1).truncate(-71))
  408. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1110, 1111_1111_1111_1111_1111_1111_1111_1111.truncate(-1))
  409. assert_int_equal(-1111_1111_1111_1111_1111_1111_1111_1110, (-1111_1111_1111_1111_1111_1111_1111_1111).truncate(-1))
  410. assert_int_equal(1111_1111_1111_1111_1111_1111_1111_1111, 1111_1111_1111_1111_1111_1111_1111_1111.truncate(1))
  411. assert_int_equal(10**400, (10**400).truncate(1))
  412. end
  413. MimicInteger = Struct.new(:to_int)
  414. module CoercionToInt
  415. def coerce(other)
  416. [other, to_int]
  417. end
  418. end
  419. def test_bitwise_and_with_integer_mimic_object
  420. obj = MimicInteger.new(10)
  421. assert_raise(TypeError, '[ruby-core:39491]') { 3 & obj }
  422. obj.extend(CoercionToInt)
  423. assert_equal(3 & 10, 3 & obj)
  424. end
  425. def test_bitwise_or_with_integer_mimic_object
  426. obj = MimicInteger.new(10)
  427. assert_raise(TypeError, '[ruby-core:39491]') { 3 | obj }
  428. obj.extend(CoercionToInt)
  429. assert_equal(3 | 10, 3 | obj)
  430. end
  431. def test_bitwise_xor_with_integer_mimic_object
  432. obj = MimicInteger.new(10)
  433. assert_raise(TypeError, '[ruby-core:39491]') { 3 ^ obj }
  434. obj.extend(CoercionToInt)
  435. assert_equal(3 ^ 10, 3 ^ obj)
  436. end
  437. module CoercionToSelf
  438. def coerce(other)
  439. [self.class.new(other), self]
  440. end
  441. end
  442. def test_bitwise_and_with_integer_coercion
  443. obj = Struct.new(:value) do
  444. include(CoercionToSelf)
  445. def &(other)
  446. self.value & other.value
  447. end
  448. end.new(10)
  449. assert_equal(3 & 10, 3 & obj)
  450. end
  451. def test_bitwise_or_with_integer_coercion
  452. obj = Struct.new(:value) do
  453. include(CoercionToSelf)
  454. def |(other)
  455. self.value | other.value
  456. end
  457. end.new(10)
  458. assert_equal(3 | 10, 3 | obj)
  459. end
  460. def test_bitwise_xor_with_integer_coercion
  461. obj = Struct.new(:value) do
  462. include(CoercionToSelf)
  463. def ^(other)
  464. self.value ^ other.value
  465. end
  466. end.new(10)
  467. assert_equal(3 ^ 10, 3 ^ obj)
  468. end
  469. def test_bit_length
  470. assert_equal(13, (-2**12-1).bit_length)
  471. assert_equal(12, (-2**12).bit_length)
  472. assert_equal(12, (-2**12+1).bit_length)
  473. assert_equal(9, -0x101.bit_length)
  474. assert_equal(8, -0x100.bit_length)
  475. assert_equal(8, -0xff.bit_length)
  476. assert_equal(1, -2.bit_length)
  477. assert_equal(0, -1.bit_length)
  478. assert_equal(0, 0.bit_length)
  479. assert_equal(1, 1.bit_length)
  480. assert_equal(8, 0xff.bit_length)
  481. assert_equal(9, 0x100.bit_length)
  482. assert_equal(9, 0x101.bit_length)
  483. assert_equal(12, (2**12-1).bit_length)
  484. assert_equal(13, (2**12).bit_length)
  485. assert_equal(13, (2**12+1).bit_length)
  486. assert_equal(10001, (-2**10000-1).bit_length)
  487. assert_equal(10000, (-2**10000).bit_length)
  488. assert_equal(10000, (-2**10000+1).bit_length)
  489. assert_equal(10000, (2**10000-1).bit_length)
  490. assert_equal(10001, (2**10000).bit_length)
  491. assert_equal(10001, (2**10000+1).bit_length)
  492. 2.upto(1000) {|i|
  493. n = 2**i
  494. assert_equal(i+1, (-n-1).bit_length, "(#{-n-1}).bit_length")
  495. assert_equal(i, (-n).bit_length, "(#{-n}).bit_length")
  496. assert_equal(i, (-n+1).bit_length, "(#{-n+1}).bit_length")
  497. assert_equal(i, (n-1).bit_length, "#{n-1}.bit_length")
  498. assert_equal(i+1, (n).bit_length, "#{n}.bit_length")
  499. assert_equal(i+1, (n+1).bit_length, "#{n+1}.bit_length")
  500. }
  501. end
  502. def test_digits
  503. assert_equal([0], 0.digits)
  504. assert_equal([1], 1.digits)
  505. assert_equal([0, 9, 8, 7, 6, 5, 4, 3, 2, 1], 1234567890.digits)
  506. assert_equal([90, 78, 56, 34, 12], 1234567890.digits(100))
  507. assert_equal([10, 5, 6, 8, 0, 10, 8, 6, 1], 1234567890.digits(13))
  508. end
  509. def test_digits_for_negative_numbers
  510. assert_raise(Math::DomainError) { -1.digits }
  511. assert_raise(Math::DomainError) { -1234567890.digits }
  512. assert_raise(Math::DomainError) { -1234567890.digits(100) }
  513. assert_raise(Math::DomainError) { -1234567890.digits(13) }
  514. end
  515. def test_digits_for_invalid_base_numbers
  516. assert_raise(ArgumentError) { 10.digits(-1) }
  517. assert_raise(ArgumentError) { 10.digits(0) }
  518. assert_raise(ArgumentError) { 10.digits(1) }
  519. end
  520. def test_digits_for_non_integral_base_numbers
  521. assert_equal([1], 1.digits(10r))
  522. assert_equal([1], 1.digits(10.0))
  523. assert_raise(RangeError) { 10.digits(10+1i) }
  524. end
  525. def test_digits_for_non_numeric_base_argument
  526. assert_raise(TypeError) { 10.digits("10") }
  527. assert_raise(TypeError) { 10.digits("a") }
  528. class << (o = Object.new)
  529. def to_int
  530. 10
  531. end
  532. end
  533. assert_equal([0, 1], 10.digits(o))
  534. end
  535. def test_square_root
  536. assert_raise(TypeError) {Integer.sqrt("x")}
  537. assert_raise(Math::DomainError) {Integer.sqrt(-1)}
  538. assert_equal(0, Integer.sqrt(0))
  539. (1...4).each {|i| assert_equal(1, Integer.sqrt(i))}
  540. (4...9).each {|i| assert_equal(2, Integer.sqrt(i))}
  541. (9...16).each {|i| assert_equal(3, Integer.sqrt(i))}
  542. (1..40).each do |i|
  543. mesg = "10**#{i}"
  544. s = Integer.sqrt(n = 10**i)
  545. if i.even?
  546. assert_equal(10**(i/2), Integer.sqrt(n), mesg)
  547. else
  548. assert_include((s**2)...(s+1)**2, n, mesg)
  549. end
  550. end
  551. 50.step(400, 10) do |i|
  552. exact = 10**(i/2)
  553. x = 10**i
  554. assert_equal(exact, Integer.sqrt(x), "10**#{i}")
  555. assert_equal(exact, Integer.sqrt(x+1), "10**#{i}+1")
  556. assert_equal(exact-1, Integer.sqrt(x-1), "10**#{i}-1")
  557. end
  558. bug13440 = '[ruby-core:80696] [Bug #13440]'
  559. failures = []
  560. 0.step(to: 50, by: 0.05) do |i|
  561. n = (10**i).to_i
  562. root = Integer.sqrt(n)
  563. failures << n unless root*root <= n && (root+1)*(root+1) > n
  564. end
  565. assert_empty(failures, bug13440)
  566. x = 0xffff_ffff_ffff_ffff
  567. assert_equal(x, Integer.sqrt(x ** 2), "[ruby-core:95453]")
  568. end
  569. def test_fdiv
  570. assert_equal(1.0, 1.fdiv(1))
  571. assert_equal(0.5, 1.fdiv(2))
  572. end
  573. def test_obj_fdiv
  574. o = Object.new
  575. def o.coerce(x); [x, 0.5]; end
  576. assert_equal(2.0, 1.fdiv(o))
  577. o = Object.new
  578. def o.coerce(x); [self, x]; end
  579. def o.fdiv(x); 1; end
  580. assert_equal(1.0, 1.fdiv(o))
  581. end
  582. end