Add `Array#sample` test
And simplify tests for `Array#shuffle` and `Array#shuffle!`.
@@ -39,28 +39,20 @@ assert("return class of Kernel.rand") do
end
assert("Array#shuffle") do
- ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- orig = ary.dup
+ orig = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ ary = orig.dup
shuffled = ary.shuffle
assert_equal(orig, ary)
assert_not_equal(ary, shuffled)
- assert_equal(ary.size, shuffled.size)
- shuffled.each do |x|
- assert_include(ary, x)
- ary.delete(x)
- end
+ assert_equal(orig, shuffled.sort)
end
assert('Array#shuffle!') do
- ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- orig = ary.dup
+ orig = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ ary = orig.dup
assert_same(ary, ary.shuffle!)
assert_not_equal(orig, ary)
- assert_equal(orig.size, ary.size)
- ary.each do |x|
- assert_include(orig, x)
- orig.delete(x)
- end
+ assert_equal(orig, ary.sort)
end
assert("Array#shuffle(random)") do
@@ -94,3 +86,37 @@ assert('Array#shuffle!(random)') do
assert_equal(ary1, ary2)
assert_not_equal(ary1, ary3)
end
+
+assert('Array#sample') do
+ 100.times do
+ assert_include([0, 1, 2], [2, 1, 0].sample)
+ [2, 1, 0].sample(2).each { |sample| assert_include([0, 1, 2], sample) }
+ h = {}
+ (1..10).to_a.sample(7).each do |sample|
+ assert_not_include(h, sample)
+ h[sample] = true
+ end
+ end
+
+ assert_nil([].sample)
+ assert_equal([], [].sample(1))
+ assert_equal([], [2, 1].sample(0))
+ assert_raise(TypeError) { [2, 1].sample(true) }
+ assert_raise(ArgumentError) { [2, 1].sample(-1) }
+end
+
+assert('Array#sample(random)') do
+ assert_raise(TypeError) do
+ # this will cause an exception due to the wrong argument
+ [1, 2].sample(2, "Not a Random instance")
+ end
+
+ # verify that the same seed causes the same results
+ ary = (1..10).to_a
+ srand(15)
+ samples1 = ary.sample(4)
+ samples2 = ary.sample(4, Random.new(15))
+ samples3 = ary.sample(4, Random.new(16))
+ assert_equal(samples1, samples2)
+ assert_not_equal(samples1, samples3)
+end
