Skip to content

Commit 5fd9993

Browse files
committed
📈 Generate parser benchmarks from test data
This was the primary reason for moving the response parser tests into YAML: so I could easily create a benchmark suite based on them.
1 parent 8000d94 commit 5fd9993

File tree

2 files changed

+618
-0
lines changed

2 files changed

+618
-0
lines changed

benchmarks/generate_parser_benchmarks

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/usr/bin/env ruby
2+
3+
require "yaml"
4+
require "pathname"
5+
require "net/imap"
6+
7+
path = Pathname.new(__dir__) / "../test/net/imap/fixtures/response_parser"
8+
files = path.glob("*.yml")
9+
tests = files.flat_map {|file|
10+
file.to_s
11+
.then { YAML.unsafe_load_file _1 }
12+
.fetch(:tests)
13+
.select {|test_name, test|
14+
:parser_assert_equal == test.fetch(:test_type) {
15+
test.key?(:expected) ? :parser_assert_equal : :parser_pending
16+
}
17+
}
18+
.map {|test_name, _|
19+
[
20+
file.relative_path_from(__dir__).to_s,
21+
test_name.to_s,
22+
]
23+
}
24+
}
25+
26+
init = <<RUBY
27+
require "yaml"
28+
require "net/imap"
29+
30+
def load_response(file, name)
31+
YAML.unsafe_load_file(file).dig(:tests, name, :response) \\
32+
or abort "ERRORO: missing %p fixture data in %p" % [name, file]
33+
end
34+
35+
parser = Net::IMAP::ResponseParser.new
36+
RUBY
37+
38+
prelude = <<RUBY
39+
response = load_response(%p,
40+
%p)
41+
RUBY
42+
script = "parser.parse(response)"
43+
44+
benchmarks = tests.map {|file, fixture_name|
45+
name = fixture_name.delete_prefix("test_")
46+
{name:, prelude: prelude % [file, fixture_name], script:}
47+
.transform_keys(&:to_s)
48+
}
49+
.sort_by { _1["name"] }
50+
51+
puts YAML.dump({"prelude" => init, "benchmark" => benchmarks})

0 commit comments

Comments
 (0)