tool/lib/minitest/unit.rb: Reproducible shuffle of test suites

... based on CRC32 of names of the test suites.

Formerly, `make test-all` randomized the order of the test suites by
using `Array#shuffle`.  It also shows `--seed N` to reproduce the order,
but it was not reproducible when a suite set is different.

This change sorts the suites by CRC32 hash of the suite names with a
salt generated by the seed.
This commit is contained in:
Yusuke Endoh 2020-06-15 13:18:56 +09:00
parent 094fb6ae0d
commit 8f99bfa26d

View File

@ -1407,7 +1407,18 @@ module MiniTest
suites = @@test_suites.keys
case self.test_order
when :random
suites.shuffle
# shuffle test suites based on CRC32 of their names
salt = "\n" + rand(1 << 32).to_s
crc_tbl = (0..255).map do |i|
(0..7).inject(i) {|c,| (c & 1 == 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1) }
end
suites = suites.sort_by do |suite|
crc32 = 0xffffffff
(suite.name + salt).bytes do |data|
crc32 = crc_tbl[(crc32 ^ data) & 0xff] ^ (crc32 >> 8)
end
crc32 ^ 0xffffffff
end
when :nosort
suites
else