/activesupport/test/core_ext/enumerable_test.rb

https://github.com/kuroda/rails · Ruby · 136 lines · 110 code · 26 blank · 0 comment · 1 complexity · e8d215275add59c14ca4889f1aed6a61 MD5 · raw file

  1. require 'abstract_unit'
  2. require 'active_support/core_ext/array'
  3. require 'active_support/core_ext/enumerable'
  4. Payment = Struct.new(:price)
  5. class SummablePayment < Payment
  6. def +(p) self.class.new(price + p.price) end
  7. end
  8. class EnumerableTests < Test::Unit::TestCase
  9. Enumerator = [].each.class
  10. class GenericEnumerable
  11. include Enumerable
  12. def initialize(values = [1, 2, 3])
  13. @values = values
  14. end
  15. def each
  16. @values.each{|v| yield v}
  17. end
  18. end
  19. def test_group_by
  20. names = %w(marcel sam david jeremy)
  21. klass = Struct.new(:name)
  22. objects = (1..50).inject([]) do |people,|
  23. p = klass.new
  24. p.name = names.sort_by { rand }.first
  25. people << p
  26. end
  27. enum = GenericEnumerable.new(objects)
  28. grouped = enum.group_by { |object| object.name }
  29. grouped.each do |name, group|
  30. assert group.all? { |person| person.name == name }
  31. end
  32. assert_equal objects.uniq.map(&:name), grouped.keys
  33. assert({}.merge(grouped), "Could not convert ActiveSupport::OrderedHash into Hash")
  34. assert_equal Enumerator, enum.group_by.class
  35. assert_equal grouped, enum.group_by.each(&:name)
  36. end
  37. def test_sums
  38. enum = GenericEnumerable.new([5, 15, 10])
  39. assert_equal 30, enum.sum
  40. assert_equal 60, enum.sum { |i| i * 2}
  41. enum = GenericEnumerable.new(%w(a b c))
  42. assert_equal 'abc', enum.sum
  43. assert_equal 'aabbcc', enum.sum { |i| i * 2 }
  44. payments = GenericEnumerable.new([ Payment.new(5), Payment.new(15), Payment.new(10) ])
  45. assert_equal 30, payments.sum(&:price)
  46. assert_equal 60, payments.sum { |p| p.price * 2 }
  47. payments = GenericEnumerable.new([ SummablePayment.new(5), SummablePayment.new(15) ])
  48. assert_equal SummablePayment.new(20), payments.sum
  49. assert_equal SummablePayment.new(20), payments.sum { |p| p }
  50. end
  51. def test_nil_sums
  52. expected_raise = TypeError
  53. assert_raise(expected_raise) { GenericEnumerable.new([5, 15, nil]).sum }
  54. payments = GenericEnumerable.new([ Payment.new(5), Payment.new(15), Payment.new(10), Payment.new(nil) ])
  55. assert_raise(expected_raise) { payments.sum(&:price) }
  56. assert_equal 60, payments.sum { |p| p.price.to_i * 2 }
  57. end
  58. def test_empty_sums
  59. assert_equal 0, GenericEnumerable.new([]).sum
  60. assert_equal 0, GenericEnumerable.new([]).sum { |i| i + 10 }
  61. assert_equal Payment.new(0), GenericEnumerable.new([]).sum(Payment.new(0))
  62. end
  63. def test_range_sums
  64. assert_equal 20, (1..4).sum { |i| i * 2 }
  65. assert_equal 10, (1..4).sum
  66. assert_equal 10, (1..4.5).sum
  67. assert_equal 6, (1...4).sum
  68. assert_equal 'abc', ('a'..'c').sum
  69. end
  70. def test_each_with_object
  71. enum = GenericEnumerable.new(%w(foo bar))
  72. result = enum.each_with_object({}) { |str, hsh| hsh[str] = str.upcase }
  73. assert_equal({'foo' => 'FOO', 'bar' => 'BAR'}, result)
  74. assert_equal Enumerator, enum.each_with_object({}).class
  75. result2 = enum.each_with_object({}).each{|str, hsh| hsh[str] = str.upcase}
  76. assert_equal result, result2
  77. end
  78. def test_index_by
  79. payments = GenericEnumerable.new([ Payment.new(5), Payment.new(15), Payment.new(10) ])
  80. assert_equal({ 5 => Payment.new(5), 15 => Payment.new(15), 10 => Payment.new(10) },
  81. payments.index_by { |p| p.price })
  82. assert_equal Enumerator, payments.index_by.class
  83. assert_equal({ 5 => Payment.new(5), 15 => Payment.new(15), 10 => Payment.new(10) },
  84. payments.index_by.each { |p| p.price })
  85. end
  86. def test_many
  87. assert_equal false, GenericEnumerable.new([] ).many?
  88. assert_equal false, GenericEnumerable.new([ 1 ] ).many?
  89. assert_equal true, GenericEnumerable.new([ 1, 2 ] ).many?
  90. assert_equal false, GenericEnumerable.new([] ).many? {|x| x > 1 }
  91. assert_equal false, GenericEnumerable.new([ 2 ] ).many? {|x| x > 1 }
  92. assert_equal false, GenericEnumerable.new([ 1, 2 ] ).many? {|x| x > 1 }
  93. assert_equal true, GenericEnumerable.new([ 1, 2, 2 ]).many? {|x| x > 1 }
  94. end
  95. def test_many_iterates_only_on_what_is_needed
  96. infinity = 1.0/0.0
  97. very_long_enum = 0..infinity
  98. assert_equal true, very_long_enum.many?
  99. assert_equal true, very_long_enum.many?{|x| x > 100}
  100. end
  101. def test_exclude?
  102. assert_equal true, GenericEnumerable.new([ 1 ]).exclude?(2)
  103. assert_equal false, GenericEnumerable.new([ 1 ]).exclude?(1)
  104. end
  105. def test_pluck_single_method
  106. person = Struct.new(:name)
  107. people = [ person.new("David"), person.new("Jamie") ]
  108. assert_equal [ "David", "Jamie" ], people.pluck(:name)
  109. end
  110. end