PageRenderTime 109ms CodeModel.GetById 13ms RepoModel.GetById 6ms app.codeStats 0ms

/test/test_prime.rb

http://github.com/ruby/ruby
Ruby | 288 lines | 241 code | 37 blank | 10 comment | 7 complexity | 390859ecd54d975a8beeb6633b6f9180 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 'prime'
  4. require 'timeout'
  5. class TestPrime < Test::Unit::TestCase
  6. # The first 100 prime numbers
  7. PRIMES = [
  8. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
  9. 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
  10. 89, 97, 101, 103, 107, 109, 113, 127, 131,
  11. 137, 139, 149, 151, 157, 163, 167, 173, 179,
  12. 181, 191, 193, 197, 199, 211, 223, 227, 229,
  13. 233, 239, 241, 251, 257, 263, 269, 271, 277,
  14. 281, 283, 293, 307, 311, 313, 317, 331, 337,
  15. 347, 349, 353, 359, 367, 373, 379, 383, 389,
  16. 397, 401, 409, 419, 421, 431, 433, 439, 443,
  17. 449, 457, 461, 463, 467, 479, 487, 491, 499,
  18. 503, 509, 521, 523, 541,
  19. ]
  20. def test_each
  21. primes = []
  22. Prime.each do |p|
  23. break if p > 541
  24. primes << p
  25. end
  26. assert_equal PRIMES, primes
  27. end
  28. def test_include?
  29. assert_equal(false, Prime.include?(nil))
  30. assert_equal(true, Prime.include?(3))
  31. assert_equal(false, Prime.include?(4))
  32. assert_equal(true, Prime.include?(Enumerable))
  33. assert_equal(false, Prime.include?(Comparable))
  34. end
  35. def test_integer_each_prime
  36. primes = []
  37. Integer.each_prime(1000) do |p|
  38. break if p > 541
  39. primes << p
  40. end
  41. assert_equal PRIMES, primes
  42. end
  43. def test_each_by_prime_number_theorem
  44. 3.upto(15) do |i|
  45. max = 2**i
  46. primes = []
  47. Prime.each do |p|
  48. break if p >= max
  49. primes << p
  50. end
  51. # Prime number theorem
  52. assert_operator primes.length, :>=, max/Math.log(max)
  53. delta = 0.05
  54. li = (2..max).step(delta).inject(0){|sum,x| sum + delta/Math.log(x)}
  55. assert_operator primes.length, :<=, li
  56. end
  57. end
  58. def test_each_without_block
  59. enum = Prime.each
  60. assert_respond_to(enum, :each)
  61. assert_kind_of(Enumerable, enum)
  62. assert_respond_to(enum, :with_index)
  63. assert_respond_to(enum, :next)
  64. assert_respond_to(enum, :succ)
  65. assert_respond_to(enum, :rewind)
  66. end
  67. def test_instance_without_block
  68. enum = Prime.instance.each
  69. assert_respond_to(enum, :each)
  70. assert_kind_of(Enumerable, enum)
  71. assert_respond_to(enum, :with_index)
  72. assert_respond_to(enum, :next)
  73. assert_respond_to(enum, :succ)
  74. assert_respond_to(enum, :rewind)
  75. end
  76. def test_new
  77. assert_raise(NoMethodError) { Prime.new }
  78. end
  79. def test_enumerator_succ
  80. enum = Prime.each
  81. assert_equal PRIMES[0, 50], 50.times.map{ enum.succ }
  82. assert_equal PRIMES[50, 50], 50.times.map{ enum.succ }
  83. enum.rewind
  84. assert_equal PRIMES[0, 100], 100.times.map{ enum.succ }
  85. end
  86. def test_enumerator_with_index
  87. enum = Prime.each
  88. last = -1
  89. enum.with_index do |p,i|
  90. break if i >= 100
  91. assert_equal last+1, i
  92. assert_equal PRIMES[i], p
  93. last = i
  94. end
  95. end
  96. def test_enumerator_with_index_with_offset
  97. enum = Prime.each
  98. last = 5-1
  99. enum.with_index(5).each do |p,i|
  100. break if i >= 100+5
  101. assert_equal last+1, i
  102. assert_equal PRIMES[i-5], p
  103. last = i
  104. end
  105. end
  106. def test_enumerator_with_object
  107. object = Object.new
  108. enum = Prime.each
  109. enum.with_object(object).each do |p, o|
  110. assert_equal object, o
  111. break
  112. end
  113. end
  114. def test_enumerator_size
  115. enum = Prime.each
  116. assert_equal Float::INFINITY, enum.size
  117. assert_equal Float::INFINITY, enum.with_object(nil).size
  118. assert_equal Float::INFINITY, enum.with_index(42).size
  119. end
  120. def test_default_instance_does_not_have_compatibility_methods
  121. assert_not_respond_to(Prime.instance, :succ)
  122. assert_not_respond_to(Prime.instance, :next)
  123. end
  124. def test_prime_each_basic_argument_checking
  125. assert_raise(ArgumentError) { Prime.prime?(1,2) }
  126. assert_raise(ArgumentError) { Prime.prime?(1.2) }
  127. end
  128. def test_prime?
  129. assert_equal Prime.prime?(1), false
  130. assert_equal Prime.prime?(2), true
  131. assert_equal Prime.prime?(4), false
  132. end
  133. class TestPseudoPrimeGenerator < Test::Unit::TestCase
  134. def test_upper_bound
  135. pseudo_prime_generator = Prime::PseudoPrimeGenerator.new(42)
  136. assert_equal pseudo_prime_generator.upper_bound, 42
  137. end
  138. def test_succ
  139. pseudo_prime_generator = Prime::PseudoPrimeGenerator.new(42)
  140. assert_raise(NotImplementedError) { pseudo_prime_generator.succ }
  141. end
  142. def test_next
  143. pseudo_prime_generator = Prime::PseudoPrimeGenerator.new(42)
  144. assert_raise(NotImplementedError) { pseudo_prime_generator.next }
  145. end
  146. def test_rewind
  147. pseudo_prime_generator = Prime::PseudoPrimeGenerator.new(42)
  148. assert_raise(NotImplementedError) { pseudo_prime_generator.rewind }
  149. end
  150. end
  151. class TestTrialDivisionGenerator < Test::Unit::TestCase
  152. # The first 100 prime numbers
  153. PRIMES = [
  154. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
  155. 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
  156. 89, 97, 101, 103, 107, 109, 113, 127, 131,
  157. 137, 139, 149, 151, 157, 163, 167, 173, 179,
  158. 181, 191, 193, 197, 199, 211, 223, 227, 229,
  159. 233, 239, 241, 251, 257, 263, 269, 271, 277,
  160. 281, 283, 293, 307, 311, 313, 317, 331, 337,
  161. 347, 349, 353, 359, 367, 373, 379, 383, 389,
  162. 397, 401, 409, 419, 421, 431, 433, 439, 443,
  163. 449, 457, 461, 463, 467, 479, 487, 491, 499,
  164. 503, 509, 521, 523, 541,
  165. ]
  166. def test_each
  167. primes = []
  168. Prime.each(nil, Prime::TrialDivisionGenerator.new) do |p|
  169. break if p > 541
  170. primes << p
  171. end
  172. assert_equal PRIMES, primes
  173. end
  174. def test_rewind
  175. generator = Prime::TrialDivisionGenerator.new
  176. assert_equal generator.next, 2
  177. assert_equal generator.next, 3
  178. generator.rewind
  179. assert_equal generator.next, 2
  180. end
  181. end
  182. class TestGenerator23 < Test::Unit::TestCase
  183. def test_rewind
  184. generator = Prime::Generator23.new
  185. assert_equal generator.next, 2
  186. assert_equal generator.next, 3
  187. generator.rewind
  188. assert_equal generator.next, 2
  189. end
  190. end
  191. class TestInteger < Test::Unit::TestCase
  192. def test_prime_division
  193. pd = PRIMES.inject(&:*).prime_division
  194. assert_equal PRIMES.map{|p| [p, 1]}, pd
  195. pd = (-PRIMES.inject(&:*)).prime_division
  196. assert_equal [-1, *PRIMES].map{|p| [p, 1]}, pd
  197. end
  198. def test_from_prime_division
  199. assert_equal PRIMES.inject(&:*), Integer.from_prime_division(PRIMES.map{|p| [p,1]})
  200. assert_equal(-PRIMES.inject(&:*), Integer.from_prime_division([[-1, 1]] + PRIMES.map{|p| [p,1]}))
  201. end
  202. def test_prime?
  203. PRIMES.each do |p|
  204. assert_predicate(p, :prime?)
  205. end
  206. composites = (0..PRIMES.last).to_a - PRIMES
  207. composites.each do |c|
  208. assert_not_predicate(c, :prime?)
  209. end
  210. # mersenne numbers
  211. assert_predicate((2**31-1), :prime?)
  212. assert_not_predicate((2**32-1), :prime?)
  213. # fermat numbers
  214. assert_predicate((2**(2**4)+1), :prime?)
  215. assert_not_predicate((2**(2**5)+1), :prime?) # Euler!
  216. # large composite
  217. assert_not_predicate(((2**13-1) * (2**17-1)), :prime?)
  218. # factorial
  219. assert_not_predicate((2...100).inject(&:*), :prime?)
  220. # negative
  221. assert_not_predicate(-1, :prime?)
  222. assert_not_predicate(-2, :prime?)
  223. assert_not_predicate(-3, :prime?)
  224. assert_not_predicate(-4, :prime?)
  225. end
  226. end
  227. def test_eratosthenes_works_fine_after_timeout
  228. sieve = Prime::EratosthenesSieve.instance
  229. sieve.send(:initialize)
  230. # simulates that Timeout.timeout interrupts Prime::EratosthenesSieve#compute_primes
  231. class << Integer
  232. alias_method :org_sqrt, :sqrt
  233. end
  234. begin
  235. def Integer.sqrt(n)
  236. sleep 10 if /compute_primes/ =~ caller.first
  237. org_sqrt(n)
  238. end
  239. assert_raise(Timeout::Error) do
  240. Timeout.timeout(0.5) { Prime.each(7*37){} }
  241. end
  242. ensure
  243. class << Integer
  244. remove_method :sqrt
  245. alias_method :sqrt, :org_sqrt
  246. remove_method :org_sqrt
  247. end
  248. end
  249. assert_not_include Prime.each(7*37).to_a, 7*37, "[ruby-dev:39465]"
  250. end
  251. end