summaryrefslogtreecommitdiff
path: root/tool/lib
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2020-06-15 13:18:56 +0900
committerYusuke Endoh <mame@ruby-lang.org>2020-06-15 13:56:01 +0900
commit8f99bfa26d0bd99089f0f38af3666a89e8432265 (patch)
treef3e553f22ce324b4c4e7d7d6fa591fe3880a9bd7 /tool/lib
parent094fb6ae0d1df90751a3d0a5c90f97cd96550f16 (diff)
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.
Diffstat (limited to 'tool/lib')
-rw-r--r--tool/lib/minitest/unit.rb13
1 files changed, 12 insertions, 1 deletions
diff --git a/tool/lib/minitest/unit.rb b/tool/lib/minitest/unit.rb
index 707dcfbf4f..8c2a970349 100644
--- a/tool/lib/minitest/unit.rb
+++ b/tool/lib/minitest/unit.rb
@@ -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