Skip to content

Instantly share code, notes, and snippets.

@erszcz
Last active May 3, 2023 14:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erszcz/4d43a77464c87a514e71eecf2811af63 to your computer and use it in GitHub Desktop.
Save erszcz/4d43a77464c87a514e71eecf2811af63 to your computer and use it in GitHub Desktop.
Comparison of Erlang type checkers: Dialyzer, ETC, and Gradualizer
*.beam
*.erltypes

Comparison of Erlang type checkers: Dialyzer, ETC, and Gradualizer

Dialyzer is a static analysis tool that identifies software discrepancies, such as definite type errors, code that has become dead or unreachable because of programming error, and unnecessary tests, in single Erlang modules or entire (sets of) applications. It was developerd by Kostis Sagonas and is now maintained by the OTP team.

ETC is a type checker described in "Bidirectional typing for Erlang" by Nithin Rajendrakumar and Annette Bieniusa. It's the result of a short academic project into higher-rank polymorphism enabled bidirectional type checking of Erlang code.

Gradualizer is a gradual type checker for Erlang and, thanks to Gradient, also for Elixir. The project is experimental, but has decent coverage of the Erlang and Elixir syntax.

The assumption of this comparison is to show that Gradualizer, while still experimental, is already useful in practice thanks to:

  • good enough Erlang syntax coverage; as it turned out it's definitely better then ETC, though there are some language constructs which lead to incorrect reports

  • better performance than Dialyzer (significantly shorter run times on the same files, no PLT build/check time); in fact, thanks to ErlangLS, Gradualizer can be used real-time in the background of a programmer's editor

  • easily understandable error messages

This gist compares Dialyzer, ETC, and Gradualizer functionality on the tests accumulated over time in Gradualizer's repository. Thanks go to the volunteers who dedicated their time and effort to build the test harness.

The setup:

The Elixir script used to generate the TSV results file is also available in this gist.

The tests are grouped into four categories:

  • "should pass" tests - we know Gradualizer should pass when run on these
  • "should fail" tests - we know Gradualizer should NOT pass when run on these, i.e. it should detect and report type errors
  • "known problems which should pass" - as the name implies, code examples which should not lead to warnings or crashes of Gradualizer
  • "known problems which should fail" - negative of the above, i.e. code examples with known issues, which should be detected by Gradualizer, but are not yet (or Gradualizer crashes on them)

The results are summed up in the attached TSV file.

Dialyzer is quite mature, very stable, and even known by the slogan that "it's never wrong". ETC and Gradualizer, on the other hand, are still considered experimental.

One interesting example of a polymorphic function that is a Gradualizer false negative (it does not raise an error though it should), but does not type check with ETC is:

$ cat t3.erl
-module(t3).

-export([p/2]).

-spec p(A, A) -> A.
p(A, B) -> A + B.

-spec test() -> integer().
test() ->
    p(1, 3.2).
We are running with:
erlang 24.0.5 /Users/erszcz/.tool-versions
gradualizer tests 0.1.3-253-g1d159ea
Dialyzer version v4.4.1
ETC git 677c763
Gradualizer v0.1.3-249-g51a8029
make: `.dialyzer_plt' is up to date.
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/unary_plus.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_type_in_pattern_body.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/refine_comparison.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/negate_none.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/operator_pattern_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_field_valid_update.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/qlc_test.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/recursive_types_passing.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_infer_pass.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/int.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/alias_in_pattern.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/covariant_map_keys_pass.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/opaque.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_expr.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/catch_expr_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions2.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_literal_pattern.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/minus.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/send_pass.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bc_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/listsspecs.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/nested_pattern_match.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/minimised_gradualizer_fmt.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/messaging_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_refinement.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/flow.erl
dialyzer failed
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/iodata.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_block.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/named_fun_pass.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/underscore.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_with_ty_vars.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any_pattern.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple_union_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/shortcut_ops_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_variable.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/try.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/cyclic_otp_specs.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/factorial.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/issue131.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_spec.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_function_head.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_list_match_in_head_exhaustive.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_pattern.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/operator_subtypes.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_cons.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_wildcard_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/imported.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_string.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/return_fun.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_creation.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/ann_types.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/andalso_any.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/remote_types.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case_of_record_with_user_defined.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bitstring.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/sets_set.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_bind_reuse.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bool.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_case.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/records.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/variable_binding_leaks.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_refinement_pass.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_update_with_record_field.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_unreachable_clause_regression.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/if_expr.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_capture.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_subtyping.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/preludes.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/lc.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_var.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_with_user_defined.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonexhaustive_record_pattern.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_info.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_vars_term.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/var_fun.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple_union_pat.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_types.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_lc.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/guard.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_record.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/block_scope.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/named_fun_infer_pass.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_update1.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/other_module.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/annotated_types.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/variable_binding.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/float.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_pattern.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_with_any_pass.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/stuff_as_top.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bounded_funs.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/var.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_decl.erl
dialyzer ok
etc ok
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_exhaustiveness_checking.erl
dialyzer failed
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_as_argument_update.erl
dialyzer ok
etc failed
gradualizer ok
/Users/erszcz/work/erszcz/gradualizer/test/should_pass/scope.erl
dialyzer failed
etc ok
gradualizer ok
Test type Dialyzer Dialyzer time ETC ETC time Gradualizer Gradualizer time Test file
should_pass ok 2.1728620000000003 failed 0.522015 ok 0.35247 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/alias_in_pattern.erl
should_pass failed 2.1471280000000004 failed 0.5304030000000001 ok 0.386712 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/andalso_any.erl
should_pass ok 2.144272 failed 0.5369160000000001 ok 0.404757 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/ann_types.erl
should_pass ok 2.347749 failed 0.52111 ok 0.39305900000000005 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/annotated_types.erl
should_pass ok 2.291432 ok 0.708824 ok 0.422502 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/any.erl
should_pass ok 2.142457 failed 0.6163930000000001 ok 0.356204 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/any_pattern.erl
should_pass ok 2.405382 failed 0.5854239999999999 ok 0.516189 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bc_pass.erl
should_pass failed 2.296153 failed 0.542123 ok 0.51774 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_exhaustiveness_checking.erl
should_pass ok 2.273377 failed 0.568988 ok 0.39250799999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_literal_pattern.erl
should_pass ok 2.2132460000000003 failed 0.558588 ok 0.39554199999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bitstring.erl
should_pass ok 2.2970520000000003 failed 0.517497 ok 0.37348000000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/block_scope.erl
should_pass ok 2.135116 failed 0.571346 ok 0.379675 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bool.erl
should_pass ok 2.087323 failed 0.539793 ok 0.383042 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bounded_funs.erl
should_pass ok 2.5554430000000004 ok 0.5856509999999999 ok 0.377771 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/case.erl
should_pass ok 2.343427 failed 0.5676530000000001 ok 0.392864 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/case_of_record_with_user_defined.erl
should_pass ok 2.290299 failed 0.7961459999999999 ok 0.491223 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/catch_expr_pass.erl
should_pass ok 2.4217310000000003 ok 0.9557960000000001 ok 0.428919 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/covariant_map_keys_pass.erl
should_pass ok 2.739052 ok 0.6511079999999999 ok 0.426818 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/cyclic_otp_specs.erl
should_pass ok 2.260674 ok 0.6016509999999999 ok 0.373633 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/factorial.erl
should_pass ok 2.452221 ok 0.554198 ok 0.422482 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/float.erl
should_pass failed 2.2217779999999996 ok 0.570975 ok 0.37493099999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/flow.erl
should_pass ok 2.224173 failed 0.549451 ok 0.364665 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_capture.erl
should_pass ok 2.201082 ok 0.546353 ok 0.371776 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_spec.erl
should_pass ok 2.237612 failed 0.535789 ok 0.369719 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/guard.erl
should_pass ok 2.167004 ok 0.5845549999999999 ok 0.36921 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/if_expr.erl
should_pass ok 2.2335700000000003 ok 0.560621 ok 0.43697699999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/imported.erl
should_pass ok 2.274956 ok 0.589567 ok 0.385279 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/int.erl
should_pass ok 2.181734 failed 0.592822 ok 0.38558800000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_pass.erl
should_pass ok 2.268139 ok 0.66791 ok 0.383986 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_with_any_pass.erl
should_pass failed 2.2167890000000003 failed 0.54657 ok 0.3907 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/iodata.erl
should_pass ok 2.2114520000000004 ok 0.581876 ok 0.432231 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/issue131.erl
should_pass ok 2.265731 failed 0.628765 ok 0.37042200000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/lc.erl
should_pass ok 2.210063 failed 0.5443300000000001 ok 0.388287 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list.erl
should_pass ok 2.174247 ok 0.550347 ok 0.37243400000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions.erl
should_pass ok 2.251181 ok 0.843902 ok 0.507206 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions2.erl
should_pass ok 2.23723 ok 0.54386 ok 0.368726 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_unreachable_clause_regression.erl
should_pass ok 2.186464 ok 0.5979829999999999 ok 0.396349 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_infer_pass.erl
should_pass ok 2.329297 failed 0.555651 ok 0.42482 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/listsspecs.erl
should_pass ok 2.21149 ok 0.591106 ok 0.374328 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map.erl
should_pass ok 2.1862880000000002 failed 0.568838 ok 0.39225099999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_as_argument_update.erl
should_pass ok 2.324193 ok 0.594255 ok 0.38084500000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_creation.erl
should_pass ok 2.197091 failed 0.604367 ok 0.38207 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_field_valid_update.erl
should_pass ok 2.172213 ok 0.551369 ok 0.391305 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_expr.erl
should_pass ok 2.226379 failed 0.5930789999999999 ok 0.37068799999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_subtyping.erl
should_pass ok 2.2078290000000003 failed 0.5412809999999999 ok 0.435803 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_pattern.erl
should_pass ok 2.2332669999999997 failed 0.542458 ok 0.380876 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_update1.erl
should_pass ok 2.231406 failed 0.552183 ok 0.390153 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_update_with_record_field.erl
should_pass ok 2.2074879999999997 failed 0.570213 ok 0.427143 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/messaging_pass.erl
should_pass ok 2.305843 failed 5.06906 ok 0.461764 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/minimised_gradualizer_fmt.erl
should_pass ok 2.3066649999999997 failed 0.589668 ok 0.37774599999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/minus.erl
should_pass failed 2.2029050000000003 failed 0.543154 ok 0.379943 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/named_fun_infer_pass.erl
should_pass failed 2.279719 failed 0.666139 ok 0.5147390000000001 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/named_fun_pass.erl
should_pass failed 2.28803 failed 0.6506839999999999 ok 0.395103 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/negate_none.erl
should_pass ok 2.187498 failed 0.553197 ok 0.388464 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nested_pattern_match.erl
should_pass ok 2.211475 ok 0.5745990000000001 ok 0.378722 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_cons.erl
should_pass ok 2.232449 failed 5.405099 ok 0.471983 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_list_match_in_head_exhaustive.erl
should_pass ok 2.156027 failed 0.5807100000000001 ok 0.370296 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_string.erl
should_pass ok 2.174508 ok 0.55026 ok 0.385256 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonexhaustive_record_pattern.erl
should_pass ok 2.172633 failed 0.546059 ok 0.404264 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/opaque.erl
should_pass ok 2.219252 failed 0.5354829999999999 ok 0.364829 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/operator_pattern_pass.erl
should_pass ok 2.1495900000000003 failed 0.595192 ok 0.39378199999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/operator_subtypes.erl
should_pass ok 2.149925 ok 0.5836749999999999 ok 0.38257100000000005 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/other_module.erl
should_pass ok 2.153581 failed 0.538265 ok 0.375328 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_bind_reuse.erl
should_pass ok 2.117374 failed 0.535518 ok 0.365769 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_record.erl
should_pass ok 2.1703780000000004 ok 0.5414629999999999 ok 0.361307 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_with_ty_vars.erl
should_pass ok 2.193194 ok 0.665334 ok 0.377365 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/preludes.erl
should_pass ok 2.163865 ok 0.706784 ok 0.51336 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/qlc_test.erl
should_pass ok 2.16369 failed 0.53142 ok 0.359199 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_info.erl
should_pass ok 2.13355 failed 0.5941420000000001 ok 0.381456 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_refinement.erl
should_pass ok 2.1867669999999997 failed 0.661523 ok 0.518169 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_var.erl
should_pass ok 2.265842 failed 0.549346 ok 0.36984500000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_wildcard_pass.erl
should_pass ok 2.134098 failed 0.53391 ok 0.415987 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_with_user_defined.erl
should_pass failed 2.2036599999999997 failed 1.885551 ok 1.0010270000000001 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/records.erl
should_pass failed 5.048206 failed 5.142523 ok 1.119684 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/recursive_types_passing.erl
should_pass failed 5.062854000000001 ok 1.706524 ok 0.850971 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/refine_comparison.erl
should_pass failed 5.047317 failed 1.3025229999999999 ok 0.818917 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/remote_types.erl
should_pass failed 5.055791 failed 0.899098 ok 0.36800099999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/return_fun.erl
should_pass failed 2.318644 ok 0.591896 ok 0.411516 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/scope.erl
should_pass ok 2.57994 ok 0.651068 ok 0.44859899999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/send_pass.erl
should_pass ok 2.709877 ok 0.7277899999999999 ok 0.467324 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/sets_set.erl
should_pass ok 3.046493 failed 0.805179 ok 0.37429 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/shortcut_ops_pass.erl
should_pass ok 2.3562629999999998 failed 0.541781 ok 0.398186 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/stuff_as_top.erl
should_pass ok 2.167458 failed 0.5332060000000001 ok 0.368589 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/try.erl
should_pass ok 2.203917 ok 0.552271 ok 0.366084 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple.erl
should_pass ok 2.161018 failed 0.594664 ok 0.41874 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple_union_pass.erl
should_pass ok 2.17392 ok 0.631078 ok 0.372953 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple_union_pat.erl
should_pass ok 2.18427 ok 0.586012 ok 0.368459 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_decl.erl
should_pass ok 2.1735569999999997 failed 0.534929 ok 0.378892 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_pattern.erl
should_pass ok 2.258321 failed 0.536952 ok 0.369236 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_refinement_pass.erl
should_pass ok 2.197446 failed 0.538304 ok 0.387002 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_variable.erl
should_pass ok 2.159163 ok 0.5817599999999999 ok 0.361977 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_vars_term.erl
should_pass ok 2.228461 failed 0.567603 ok 0.35512299999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/unary_plus.erl
should_pass ok 2.1871590000000003 ok 0.637004 ok 0.363224 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/underscore.erl
should_pass ok 2.1441909999999997 failed 0.634747 ok 0.36731 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_type_in_pattern_body.erl
should_pass ok 2.211368 ok 0.545231 ok 0.367716 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_types.erl
should_pass ok 2.1465799999999997 ok 0.573894 ok 0.40817899999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/var.erl
should_pass ok 2.176243 failed 0.5336799999999999 ok 0.39367 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/var_fun.erl
should_pass ok 2.194433 ok 0.584033 ok 0.428168 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_block.erl
should_pass ok 2.255094 failed 0.773343 ok 0.363013 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_case.erl
should_pass ok 2.156975 failed 0.580922 ok 0.49728 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_function_head.erl
should_pass ok 2.1917579999999997 failed 0.598641 ok 0.378256 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_lc.erl
should_pass ok 2.207212 failed 0.5330320000000001 ok 0.364451 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/variable_binding.erl
should_pass ok 2.213079 failed 0.540953 ok 0.383346 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/variable_binding_leaks.erl
known_problems_should_pass ok 2.3035010000000002 ok 0.684192 failed 0.454914 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/arith_op_arg_types.erl
known_problems_should_pass ok 2.578541 failed 0.572879 failed 0.436047 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/binary_exhaustiveness_checking_should_pass.erl
known_problems_should_pass ok 2.218109 failed 0.563952 failed 0.414037 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/error_in_guard.erl
known_problems_should_pass ok 2.164091 ok 0.662124 failed 0.44937099999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/fun_subtyping.erl
known_problems_should_pass ok 2.323484 failed 0.576783 failed 0.436983 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/generator_var_shadow.erl
known_problems_should_pass ok 2.189139 ok 0.547698 failed 0.40268099999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/intersection.erl
known_problems_should_pass ok 2.1207759999999998 ok 0.587533 failed 0.470119 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/intersection_with_any.erl
known_problems_should_pass failed 2.220545 failed 0.533963 failed 0.42512900000000003 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/list_tail.erl
known_problems_should_pass ok 2.1848919999999996 ok 0.5438010000000001 failed 0.433798 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/map_union.erl
known_problems_should_pass ok 2.1207759999999998 failed 0.53358 failed 0.45176799999999995 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/map_update2.erl
known_problems_should_pass ok 2.217793 failed 5.279777 failed 0.43758600000000003 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/recursive_types.erl
known_problems_should_pass ok 2.156819 ok 0.605952 failed 0.429387 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/refine_bound_var_on_mismatch.erl
known_problems_should_pass ok 2.170855 ok 0.536205 failed 0.41966000000000003 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/refine_list_tail.erl
known_problems_should_pass ok 2.174945 failed 0.659633 failed 0.5628540000000001 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/refine_mismatch_using_guard_bifs.erl
known_problems_should_pass ok 2.217272 ok 0.639846 failed 0.40393599999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/rigid_type_variables_pass.erl
known_problems_should_pass ok 2.137826 ok 0.549843 failed 0.42208999999999997 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/type_vars.erl
should_fail ok 2.215155 failed 0.516463 failed 0.444357 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/annotated_types_fail.erl
should_fail failed 2.174714 failed 0.558791 failed 0.43798000000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/arg.erl
should_fail failed 2.1544540000000003 failed 0.5411050000000001 failed 0.415987 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/arith_op_fail.erl
should_fail failed 2.1954740000000004 failed 0.6791 failed 0.449098 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/arity_mismatch.erl
should_fail failed 2.288793 failed 0.607394 failed 0.542234 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/bc_fail.erl
should_fail failed 2.392293 failed 0.5996119999999999 failed 0.449464 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/bin_expression.erl
should_fail failed 2.398999 failed 0.5356920000000001 failed 0.46649799999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/bin_type_error.erl
should_fail ok 2.267625 failed 0.5530940000000001 failed 0.459286 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/branch.erl
should_fail ok 2.147742 failed 0.562952 failed 0.439125 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/branch2.erl
should_fail failed 2.219951 failed 0.50617 failed 0.417286 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/call.erl
should_fail ok 2.087107 failed 0.519131 failed 0.39957 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/case_pattern.erl
should_fail ok 2.093885 failed 0.508171 failed 0.420344 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/case_pattern2.erl
should_fail ok 2.160567 failed 0.568905 failed 0.404194 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/catch_expr_fail.erl
should_fail failed 2.168551 failed 0.50703 failed 0.397955 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/cons.erl
should_fail ok 2.1070349999999998 ok 0.53151 failed 0.408178 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/covariant_map_keys_fail.erl
should_fail ok 2.184543 ok 0.518644 failed 0.43924599999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/cyclic_type_vars.erl
should_fail failed 2.287906 ok 0.700819 failed 0.543664 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/depth.erl
should_fail ok 3.0630230000000003 failed 0.639141 failed 0.398053 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive.erl
should_fail ok 2.185428 failed 0.5740460000000001 failed 0.399519 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_float.erl
should_fail ok 2.1701460000000004 failed 0.57677 failed 0.403283 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_list_variants.erl
should_fail ok 2.210753 ok 0.559138 failed 0.40910399999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_refinable_map_variants.erl
should_fail ok 2.17407 failed 0.52206 failed 0.432242 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_remote_user_type.erl
should_fail ok 2.199148 failed 0.60435 failed 0.450133 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_string_variants.erl
should_fail ok 2.297665 ok 0.552779 failed 0.42012900000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_type.erl
should_fail ok 2.181028 failed 0.514715 failed 0.435867 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_user_type.erl
should_fail ok 2.199822 failed 0.550001 failed 0.401295 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustiveness_check_toggling.erl
should_fail failed 2.262013 failed 0.548824 failed 0.438808 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/generator.erl
should_fail ok 2.217767 failed 0.557946 failed 0.454159 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/guard_fail.erl
should_fail ok 2.211904 failed 0.637836 failed 0.38264600000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/imported_undef.erl
should_fail failed 2.21661 failed 0.55475 failed 0.41714 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/infer_enabled.erl
should_fail failed 2.22975 failed 0.628067 failed 0.391994 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/intersection_check.erl
should_fail failed 2.229944 failed 0.546396 failed 0.39996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/intersection_infer.erl
should_fail ok 2.127906 ok 0.637145 failed 0.41370999999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/intersection_with_any_fail.erl
should_fail failed 2.168786 failed 0.572763 failed 0.414829 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/iodata_fail.erl
should_fail failed 2.1576619999999997 failed 0.563117 failed 0.40839299999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/lambda_not_fun.erl
should_fail failed 2.316651 failed 0.5506559999999999 failed 0.452316 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/lc_not_list.erl
should_fail failed 2.2478119999999997 failed 0.583683 failed 0.415387 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/list_infer_fail.erl
should_fail failed 2.1947840000000003 failed 0.550883 failed 0.43529399999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/list_op.erl
should_fail failed 2.218973 failed 0.550218 failed 0.418257 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/list_union_fail.erl
should_fail failed 2.267811 failed 0.582004 failed 0.418281 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/literal_char.erl
should_fail failed 2.279833 failed 0.5424479999999999 failed 0.400531 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/literal_patterns.erl
should_fail failed 2.187373 failed 0.5609299999999999 failed 0.433764 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/logic_op.erl
should_fail failed 2.328666 ok 0.5977509999999999 failed 0.64454 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_entry.erl
should_fail ok 2.255701 ok 0.5860890000000001 failed 0.442937 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_fail.erl
should_fail failed 2.283055 failed 0.549951 failed 0.416879 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_failing_expr.erl
should_fail failed 2.32904 failed 0.538138 failed 0.41857900000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_failing_subtyping.erl
should_fail failed 2.244029 failed 0.535087 failed 0.419447 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_field_invalid_update.erl
should_fail failed 2.746099 failed 0.5406340000000001 failed 0.435468 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_literal.erl
should_fail failed 2.25075 failed 0.535244 failed 0.462411 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_pattern_fail.erl
should_fail failed 2.224863 failed 0.567502 failed 0.419084 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_type_error.erl
should_fail failed 2.2020999999999997 failed 0.545485 failed 0.41333499999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/match.erl
should_fail failed 2.218141 failed 0.557142 failed 0.431871 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/messaging_fail.erl
should_fail failed 2.2299879999999996 failed 0.569357 failed 0.428356 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/named_fun_fail.erl
should_fail failed 2.2075489999999998 failed 0.678129 failed 0.435529 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/named_fun_infer_fail.erl
should_fail failed 2.3523 failed 0.573611 failed 0.444682 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/nil.erl
should_fail ok 2.175152 ok 0.60256 failed 0.419728 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/no_idempotent_xor.erl
should_fail ok 2.159614 failed 5.329006000000001 failed 0.421582 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/nonempty_list_match_in_head_nonexhaustive.erl
should_fail failed 2.1988600000000003 failed 0.548507 failed 0.41425799999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/nonempty_string_fail.erl
should_fail ok 2.149286 failed 0.5758840000000001 failed 0.44217399999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/opaque_fail.erl
should_fail failed 2.262833 failed 0.591518 failed 0.40098 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/operator_pattern_fail.erl
should_fail ok 2.192509 failed 0.5539080000000001 failed 0.43145999999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/pattern.erl
should_fail failed 2.1931149999999997 failed 0.5400349999999999 failed 0.428086 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/pattern_record_fail.erl
should_fail failed 2.2994380000000003 failed 0.543766 failed 0.423762 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/pp_intersection.erl
should_fail failed 2.217039 failed 0.584185 failed 0.41409500000000005 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record.erl
should_fail ok 2.269213 failed 0.595074 failed 0.43987400000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_exhaustive.erl
should_fail failed 2.219126 failed 0.572318 failed 0.430782 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_field.erl
should_fail failed 2.2135 failed 0.5938049999999999 failed 0.419755 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_index.erl
should_fail failed 2.192364 failed 0.687206 failed 0.414865 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_info_fail.erl
should_fail failed 2.146666 failed 0.535005 failed 0.428723 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_refinement_fail.erl
should_fail failed 2.1898139999999997 failed 0.544544 failed 0.47066199999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_update.erl
should_fail failed 2.191128 failed 0.577388 failed 3.433659 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_wildcard_fail.erl
should_fail ok 2.1389630000000004 failed 5.270807 failed 0.408171 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/recursive_types_failing.erl
should_fail failed 2.2281350000000004 failed 0.555744 failed 0.416374 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/rel_op.erl
should_fail ok 2.151151 failed 0.58008 failed 0.449496 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/return_fun_fail.erl
should_fail ok 2.155817 ok 0.626676 failed 0.434485 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/send_fail.erl
should_fail ok 2.209139 failed 0.567567 failed 0.418184 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/shortcut_ops_fail.erl
should_fail failed 2.200316 failed 0.546253 failed 0.441805 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/string_literal.erl
should_fail ok 2.179788 ok 0.554562 failed 0.40275 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_arg.erl
should_fail failed 2.264114 failed 0.57298 failed 0.42374599999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_fail.erl
should_fail ok 2.5966370000000003 failed 0.543826 failed 0.42381 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_pattern.erl
should_fail ok 2.576635 ok 0.619287 failed 0.42762900000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_refinement.erl
should_fail failed 2.622536 ok 0.552793 failed 0.44151799999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/type_refinement_fail.erl
should_fail failed 2.211598 failed 0.5984619999999999 failed 0.410716 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/unary_op.erl
should_fail failed 2.1785590000000004 failed 0.538215 failed 0.401307 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/unary_plus_fail.erl
should_fail ok 2.235842 failed 0.540676 failed 0.428068 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/union_with_any.erl
should_fail ok 2.1789099999999997 ok 0.564472 failed 0.42018 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/unreachable_after_refinement.erl
known_problems_should_fail failed 2.202705 failed 0.7364930000000001 ok 0.498446 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/arith_op.erl
known_problems_should_fail ok 2.397971 ok 0.628682 ok 0.363502 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/exhaustive_argumentwise.erl
known_problems_should_fail ok 2.2605410000000004 ok 0.596179 ok 0.392474 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/exhaustive_map_variants.erl
known_problems_should_fail ok 2.179127 ok 0.5552480000000001 ok 0.384406 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/exhaustive_remote_map_variants.erl
known_problems_should_fail ok 2.247953 ok 0.554584 ok 0.386686 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/guard_should_fail.erl
known_problems_should_fail ok 2.14887 failed 0.545846 ok 0.375004 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/infer_any_pattern.erl
known_problems_should_fail failed 2.239696 failed 0.543658 ok 0.36871699999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/intersection_with_any_should_fail.erl
known_problems_should_fail failed 2.221572 failed 0.5789489999999999 ok 0.381476 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/lambda_wrong_args.erl
known_problems_should_fail ok 2.174138 ok 0.560202 ok 0.35896100000000003 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/refine_ty_vars.erl
known_problems_should_fail ok 2.1710760000000002 failed 0.528821 ok 0.36072899999999997 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/rigid_type_variables_fail.erl
known_problems_should_fail ok 2.144168 failed 0.612648 ok 0.482442 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/sample.erl
Opts: %{
dialyzer: "dialyzer",
dialyzer_plt: "/Users/erszcz/work/erszcz/gradualizer/.dialyzer_plt",
etc: "/Users/erszcz/work/vrnithinkumar/ETC/etc",
gradualizer: "/Users/erszcz/work/erszcz/gradualizer/bin/gradualizer",
gradualizer_dir: "/Users/erszcz/work/erszcz/gradualizer",
timeout: "5"
}
Meta: %{
dialyzer_version: "Dialyzer version v4.4.1\n",
erlang_version: "erlang 24.0.5 /Users/erszcz/.tool-versions\n",
etc_version: "677c763\n",
gradualizer_tests: "0.1.3-253-g748cbf8\n",
gradualizer_version: "Gradualizer v0.1.3-253-g748cbf8\n"
}
Test type Dialyzer ETC Gradualizer Dialyzer time ETC time Gradualizer time Test file
should_pass ok failed ok 2.1023519999999998 0.667276 0.370988 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/alias_in_pattern.erl
should_pass failed failed ok 2.172917 0.579222 0.370547 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/andalso_any.erl
should_pass ok failed ok 2.164819 0.645948 0.367528 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/ann_types.erl
should_pass ok failed ok 2.1192469999999997 0.509058 0.38575099999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/annotated_types.erl
should_pass ok ok ok 2.128984 0.569714 0.36506299999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/any.erl
should_pass ok failed ok 2.1190189999999998 0.521856 0.356186 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/any_pattern.erl
should_pass ok failed ok 2.192218 0.556057 0.41377800000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bc_pass.erl
should_pass failed failed ok 2.2091640000000003 0.54463 0.36658999999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_exhaustiveness_checking.erl
should_pass ok failed ok 2.169344 0.5372279999999999 0.364356 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_literal_pattern.erl
should_pass ok failed ok 2.1503699999999997 0.556012 0.391735 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bitstring.erl
should_pass ok failed ok 2.143873 0.542037 0.444963 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/block_scope.erl
should_pass ok failed ok 2.147815 0.5419919999999999 0.38354000000000005 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bool.erl
should_pass ok failed ok 2.185212 0.54301 0.375585 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/bounded_funs.erl
should_pass ok ok ok 2.215909 0.614385 0.355828 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/case.erl
should_pass ok failed ok 2.165235 0.553769 0.358696 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/case_of_record_with_user_defined.erl
should_pass ok failed ok 2.105221 0.5544049999999999 0.351492 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/catch_expr_pass.erl
should_pass ok ok ok 2.110645 0.533869 0.36146 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/covariant_map_keys_pass.erl
should_pass ok ok ok 2.216069 0.534667 0.376111 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/cyclic_otp_specs.erl
should_pass ok ok ok 2.1539200000000003 0.5894790000000001 0.451692 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/factorial.erl
should_pass ok ok ok 2.209889 0.5189539999999999 2.908937 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/float.erl
should_pass failed ok ok 2.213283 0.5500259999999999 0.371604 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/flow.erl
should_pass ok failed ok 2.1941930000000003 0.533968 0.36723300000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_capture.erl
should_pass ok ok ok 2.1619099999999998 0.5612240000000001 0.40939 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_spec.erl
should_pass ok failed ok 2.213728 0.550353 0.364056 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/guard.erl
should_pass ok ok ok 2.200145 0.57729 0.366244 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/if_expr.erl
should_pass ok ok ok 2.1583180000000004 0.5299020000000001 0.365774 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/imported.erl
should_pass ok ok ok 2.5844180000000003 0.5492250000000001 0.364993 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/int.erl
should_pass ok failed ok 2.209573 3.594363 0.351982 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_pass.erl
should_pass ok ok ok 2.1082449999999997 0.560314 0.36450099999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_with_any_pass.erl
should_pass failed failed ok 2.1120349999999997 0.517544 0.42670800000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/iodata.erl
should_pass ok ok ok 2.098425 0.628749 0.49684100000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/issue131.erl
should_pass ok failed ok 2.108574 0.520277 0.35125 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/lc.erl
should_pass ok failed ok 2.0505720000000003 0.5177820000000001 0.369152 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list.erl
should_pass ok ok ok 2.108369 0.520336 0.36743000000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions.erl
should_pass ok ok ok 2.080773 0.616696 0.382913 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions2.erl
should_pass ok ok ok 2.064029 0.5292899999999999 0.376395 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_unreachable_clause_regression.erl
should_pass ok ok ok 2.204776 0.562209 0.362902 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_infer_pass.erl
should_pass ok failed ok 2.2360059999999997 0.653643 0.418173 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/listsspecs.erl
should_pass ok ok ok 2.216444 0.544971 0.37679 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map.erl
should_pass ok failed ok 2.202191 0.543669 0.37242899999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_as_argument_update.erl
should_pass ok ok ok 2.207866 0.5567179999999999 0.37885399999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_creation.erl
should_pass ok failed ok 2.229593 0.553717 0.378894 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_field_valid_update.erl
should_pass ok ok ok 2.15132 0.613623 0.387899 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_expr.erl
should_pass ok failed ok 2.207959 0.522229 0.376141 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_subtyping.erl
should_pass ok failed ok 2.214956 0.5525639999999999 0.386958 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_pattern.erl
should_pass ok failed ok 2.226715 0.522299 0.36307999999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_update1.erl
should_pass ok failed ok 2.139829 0.532295 0.371002 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_update_with_record_field.erl
should_pass ok failed ok 2.248103 0.577264 0.40590699999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/messaging_pass.erl
should_pass ok failed ok 2.305961 5.072796 0.454882 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/minimised_gradualizer_fmt.erl
should_pass ok failed ok 2.348145 0.514218 0.366947 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/minus.erl
should_pass failed failed ok 2.2002800000000002 0.5600080000000001 0.39837700000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/named_fun_infer_pass.erl
should_pass failed failed ok 2.344679 0.518069 0.368318 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/named_fun_pass.erl
should_pass failed failed ok 2.161235 0.588669 0.39605399999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/negate_none.erl
should_pass ok failed ok 2.212511 0.537275 0.377594 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nested_pattern_match.erl
should_pass ok ok ok 2.2012600000000004 0.589539 0.38258 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_cons.erl
should_pass ok failed ok 2.2462959999999996 5.427987 0.40967000000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_list_match_in_head_exhaustive.erl
should_pass ok failed ok 2.243865 0.664827 0.366457 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonempty_string.erl
should_pass ok ok ok 2.17585 0.536575 0.389374 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/nonexhaustive_record_pattern.erl
should_pass ok failed ok 2.193558 0.604187 0.375364 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/opaque.erl
should_pass ok failed ok 2.1921280000000003 0.529447 0.362682 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/operator_pattern_pass.erl
should_pass ok failed ok 2.2029720000000004 0.5196660000000001 0.441267 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/operator_subtypes.erl
should_pass ok ok ok 2.119308 0.5291509999999999 0.363451 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/other_module.erl
should_pass ok failed ok 2.158827 0.527632 0.376747 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_bind_reuse.erl
should_pass ok failed ok 2.177084 0.5372060000000001 0.358237 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_record.erl
should_pass ok ok ok 2.145107 0.541928 0.375555 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/pattern_with_ty_vars.erl
should_pass ok ok ok 2.2478409999999998 0.595407 0.388581 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/preludes.erl
should_pass ok ok ok 2.195303 0.791627 0.659082 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/qlc_test.erl
should_pass ok failed ok 2.0803380000000002 0.525062 0.353628 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_info.erl
should_pass ok failed ok 2.176881 0.5704539999999999 0.375984 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_refinement.erl
should_pass ok failed ok 2.1312640000000003 0.532256 0.395959 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_var.erl
should_pass ok failed ok 2.146016 0.556534 0.375539 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_wildcard_pass.erl
should_pass ok failed ok 2.2481970000000002 0.5268550000000001 0.35891300000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/record_with_user_defined.erl
should_pass failed failed ok 2.169705 0.6485460000000001 0.365128 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/records.erl
should_pass ok failed ok 2.1892530000000003 5.180802 0.37511 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/recursive_types_passing.erl
should_pass ok ok ok 2.157279 0.55249 0.396049 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/refine_comparison.erl
should_pass ok failed ok 2.176308 0.555739 0.375167 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/remote_types.erl
should_pass failed failed ok 2.292103 0.5250119999999999 0.36192799999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/return_fun.erl
should_pass failed ok ok 2.232453 0.587394 0.371593 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/scope.erl
should_pass ok ok ok 2.224261 0.573769 0.382062 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/send_pass.erl
should_pass ok ok ok 2.196349 0.585203 0.365905 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/sets_set.erl
should_pass ok failed ok 2.1743159999999997 0.536697 0.35645699999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/shortcut_ops_pass.erl
should_pass ok failed ok 2.205452 0.517122 0.36866699999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/stuff_as_top.erl
should_pass ok failed ok 2.144099 0.560217 0.381408 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/try.erl
should_pass ok ok ok 2.158553 0.645754 0.43057999999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple.erl
should_pass ok ok ok 2.3156060000000003 0.543929 0.368205 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple_union_pass.erl
should_pass ok ok ok 2.229075 0.546906 0.365512 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/tuple_union_pat.erl
should_pass ok ok ok 2.152137 0.549015 0.353305 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_decl.erl
should_pass ok failed ok 2.173024 0.534787 0.37089999999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_pattern.erl
should_pass ok failed ok 2.085384 0.600086 0.37683999999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_refinement_pass.erl
should_pass ok failed ok 2.2232510000000003 0.569626 0.419383 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_variable.erl
should_pass ok ok ok 2.336425 0.623451 0.374594 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/type_vars_term.erl
should_pass ok failed ok 2.193549 0.529107 0.372776 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/unary_plus.erl
should_pass ok ok ok 2.20735 0.528786 0.361134 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/underscore.erl
should_pass ok failed ok 2.166687 0.54918 0.410618 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_type_in_pattern_body.erl
should_pass ok ok ok 2.211157 0.573246 0.38144900000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_types.erl
should_pass ok ok ok 2.206655 0.5473 0.374161 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/var.erl
should_pass ok failed ok 2.1827379999999996 0.552707 0.384967 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/var_fun.erl
should_pass ok ok ok 2.1815949999999997 0.538586 0.35748 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_block.erl
should_pass ok failed ok 2.132629 0.607835 0.38081200000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_case.erl
should_pass ok failed ok 2.415279 0.534918 0.365592 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_function_head.erl
should_pass ok failed ok 2.2107040000000002 0.523693 0.378942 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/varbind_in_lc.erl
should_pass ok failed ok 2.179503 0.541573 0.405755 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/variable_binding.erl
should_pass ok failed ok 2.1635790000000004 0.568016 0.444256 /Users/erszcz/work/erszcz/gradualizer/test/should_pass/variable_binding_leaks.erl
known_problems_should_pass ok ok failed 2.14688 0.662713 0.407089 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/arith_op_arg_types.erl
known_problems_should_pass ok failed failed 2.135306 0.5428160000000001 0.431633 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/binary_exhaustiveness_checking_should_pass.erl
known_problems_should_pass ok failed failed 2.1854180000000003 0.544295 0.43071499999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/error_in_guard.erl
known_problems_should_pass ok ok failed 2.172539 0.5701090000000001 0.415993 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/fun_subtyping.erl
known_problems_should_pass ok failed failed 2.132565 0.536667 0.45064299999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/generator_var_shadow.erl
known_problems_should_pass ok ok failed 2.165305 0.560269 0.40089600000000003 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/intersection.erl
known_problems_should_pass ok ok failed 2.130099 0.620866 0.469521 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/intersection_with_any.erl
known_problems_should_pass failed failed failed 2.225821 0.5791069999999999 0.43027 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/list_tail.erl
known_problems_should_pass ok ok failed 2.192967 0.554626 0.441697 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/map_union.erl
known_problems_should_pass ok failed failed 2.226856 0.54224 0.470039 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/map_update2.erl
known_problems_should_pass ok failed failed 2.1419859999999997 5.269116 0.40965300000000004 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/recursive_types.erl
known_problems_should_pass ok ok failed 2.127604 0.564134 0.41239499999999996 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/refine_bound_var_on_mismatch.erl
known_problems_should_pass ok ok failed 2.303847 0.546749 0.424676 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/refine_list_tail.erl
known_problems_should_pass ok failed failed 2.157496 0.5280750000000001 0.481427 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/refine_mismatch_using_guard_bifs.erl
known_problems_should_pass ok ok failed 2.204705 0.610734 0.383729 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/rigid_type_variables_pass.erl
known_problems_should_pass ok ok failed 2.0852199999999996 0.5263519999999999 0.400406 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_pass/type_vars.erl
should_fail ok failed failed 2.1179609999999998 0.48875 0.422469 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/annotated_types_fail.erl
should_fail failed failed failed 2.1863330000000003 0.726803 0.7586839999999999 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/arg.erl
should_fail failed failed failed 2.15178 0.5246609999999999 0.424389 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/arith_op_fail.erl
should_fail failed failed failed 2.1557049999999998 0.526095 0.388235 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/arity_mismatch.erl
should_fail failed failed failed 2.125791 0.5720660000000001 0.434433 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/bc_fail.erl
should_fail failed failed failed 2.141679 0.51405 0.40956400000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/bin_expression.erl
should_fail failed failed failed 2.1123879999999997 0.567345 0.417264 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/bin_type_error.erl
should_fail ok failed failed 2.085681 0.729075 0.41754 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/branch.erl
should_fail ok failed failed 2.149651 0.719264 0.453164 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/branch2.erl
should_fail failed failed failed 2.167747 0.5680230000000001 0.44105900000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/call.erl
should_fail ok failed failed 2.1363890000000003 0.542055 0.419191 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/case_pattern.erl
should_fail ok failed failed 2.365058 0.550705 0.899165 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/case_pattern2.erl
should_fail ok failed failed 2.169173 0.588115 0.426971 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/catch_expr_fail.erl
should_fail failed failed failed 2.2096590000000003 0.5344829999999999 0.419236 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/cons.erl
should_fail ok ok failed 2.216726 0.685408 0.418731 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/covariant_map_keys_fail.erl
should_fail ok ok failed 2.1726889999999996 0.55755 0.47176 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/cyclic_type_vars.erl
should_fail failed ok failed 2.202913 0.543098 0.426618 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/depth.erl
should_fail ok failed failed 2.191991 0.541668 0.408231 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive.erl
should_fail ok failed failed 2.1927119999999998 0.518221 0.390517 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_float.erl
should_fail ok failed failed 2.170652 0.6306900000000001 0.38018599999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_list_variants.erl
should_fail ok ok failed 2.2113359999999997 0.66599 0.533573 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_refinable_map_variants.erl
should_fail ok failed failed 2.455037 0.5357970000000001 0.403755 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_remote_user_type.erl
should_fail ok failed failed 2.18477 0.561834 0.384884 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_string_variants.erl
should_fail ok ok failed 2.143087 0.5602469999999999 0.398637 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_type.erl
should_fail ok failed failed 2.23261 0.495273 0.4117 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive_user_type.erl
should_fail ok failed failed 2.1500100000000004 0.547626 0.40940699999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustiveness_check_toggling.erl
should_fail failed failed failed 2.2431579999999998 0.6064080000000001 0.430077 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/generator.erl
should_fail ok failed failed 2.166364 0.5192060000000001 0.433194 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/guard_fail.erl
should_fail ok failed failed 2.200278 0.562774 0.381261 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/imported_undef.erl
should_fail failed failed failed 2.1470920000000002 0.5253089999999999 0.389803 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/infer_enabled.erl
should_fail failed failed failed 2.200295 0.572264 0.41258 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/intersection_check.erl
should_fail failed failed failed 2.263314 0.529383 0.397392 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/intersection_infer.erl
should_fail ok ok failed 2.1358270000000004 0.536296 0.425499 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/intersection_with_any_fail.erl
should_fail failed failed failed 2.217908 0.534018 0.423635 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/iodata_fail.erl
should_fail failed failed failed 2.182897 0.5950489999999999 0.416128 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/lambda_not_fun.erl
should_fail failed failed failed 2.2224250000000003 0.5411309999999999 0.408659 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/lc_not_list.erl
should_fail failed failed failed 2.265666 0.529512 0.40794400000000003 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/list_infer_fail.erl
should_fail failed failed failed 2.173118 0.6328550000000001 0.47188 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/list_op.erl
should_fail failed failed failed 2.205028 0.571245 0.402669 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/list_union_fail.erl
should_fail failed failed failed 2.231048 0.708963 0.43115800000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/literal_char.erl
should_fail failed failed failed 2.228467 0.530025 0.411648 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/literal_patterns.erl
should_fail failed failed failed 2.247271 0.538965 0.466528 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/logic_op.erl
should_fail failed ok failed 2.243658 0.5663060000000001 0.418196 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_entry.erl
should_fail ok ok failed 2.134516 0.569865 0.416966 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_fail.erl
should_fail failed failed failed 2.298145 0.557399 0.454155 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_failing_expr.erl
should_fail failed failed failed 2.7209470000000002 0.55353 0.408629 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_failing_subtyping.erl
should_fail failed failed failed 2.20163 0.542042 0.429838 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_field_invalid_update.erl
should_fail failed failed failed 2.2347829999999997 0.546504 0.413331 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_literal.erl
should_fail failed failed failed 2.257904 0.535828 0.428579 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_pattern_fail.erl
should_fail failed failed failed 2.194775 0.53518 0.419147 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/map_type_error.erl
should_fail failed failed failed 2.202697 0.535599 0.433935 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/match.erl
should_fail failed failed failed 2.187201 0.621582 0.43437400000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/messaging_fail.erl
should_fail failed failed failed 2.168871 0.5933010000000001 0.442478 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/named_fun_fail.erl
should_fail failed failed failed 2.289535 0.532165 0.430745 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/named_fun_infer_fail.erl
should_fail failed failed failed 2.219415 0.592175 0.42107 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/nil.erl
should_fail ok ok failed 2.176626 0.532632 0.436788 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/no_idempotent_xor.erl
should_fail ok failed failed 2.1820019999999998 5.286082 0.565727 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/nonempty_list_match_in_head_nonexhaustive.erl
should_fail failed failed failed 2.306194 0.5553250000000001 0.41844099999999995 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/nonempty_string_fail.erl
should_fail ok failed failed 2.177775 0.539879 0.488422 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/opaque_fail.erl
should_fail failed failed failed 2.246907 0.5123390000000001 0.38753699999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/operator_pattern_fail.erl
should_fail ok failed failed 2.101608 0.557233 0.447505 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/pattern.erl
should_fail failed failed failed 2.242556 0.51194 0.427481 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/pattern_record_fail.erl
should_fail failed failed failed 2.284256 0.595015 0.43218 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/pp_intersection.erl
should_fail failed failed failed 2.1814630000000004 0.5434650000000001 0.40927199999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record.erl
should_fail ok failed failed 2.1182890000000003 0.512251 0.438226 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_exhaustive.erl
should_fail failed failed failed 2.1239850000000002 0.566258 0.45881099999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_field.erl
should_fail failed failed failed 2.186299 0.5588099999999999 0.410921 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_index.erl
should_fail failed failed failed 2.238489 0.567491 0.42530399999999996 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_info_fail.erl
should_fail failed failed failed 2.106574 0.566307 0.42325599999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_refinement_fail.erl
should_fail failed failed failed 2.221943 0.5983419999999999 0.421084 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_update.erl
should_fail failed failed failed 2.243195 0.586865 0.40346 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/record_wildcard_fail.erl
should_fail ok failed failed 2.1398029999999997 5.276288999999999 0.395137 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/recursive_types_failing.erl
should_fail failed failed failed 2.234092 0.532566 0.409401 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/rel_op.erl
should_fail ok failed failed 2.247797 0.67976 0.5651649999999999 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/return_fun_fail.erl
should_fail ok ok failed 2.174471 0.5533170000000001 0.411048 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/send_fail.erl
should_fail ok failed failed 2.253307 0.558351 0.454199 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/shortcut_ops_fail.erl
should_fail failed failed failed 2.209993 0.654224 0.464786 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/string_literal.erl
should_fail ok ok failed 2.1704830000000004 0.636409 0.412223 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_arg.erl
should_fail failed failed failed 2.271601 0.530308 0.41598599999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_fail.erl
should_fail ok failed failed 2.2250140000000003 0.5540539999999999 0.40013 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_pattern.erl
should_fail ok ok failed 2.2175610000000003 0.701075 0.424054 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/tuple_union_refinement.erl
should_fail failed ok failed 2.266069 0.535096 0.461942 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/type_refinement_fail.erl
should_fail failed failed failed 2.202736 0.544292 0.39549900000000004 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/unary_op.erl
should_fail failed failed failed 2.169597 0.5405220000000001 0.381866 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/unary_plus_fail.erl
should_fail ok failed failed 2.046201 0.664115 0.39744799999999997 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/union_with_any.erl
should_fail ok ok failed 2.052703 0.526091 0.361796 /Users/erszcz/work/erszcz/gradualizer/test/should_fail/unreachable_after_refinement.erl
known_problems_should_fail failed failed ok 2.121584 0.5038360000000001 0.3461 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/arith_op.erl
known_problems_should_fail ok ok ok 2.048318 0.520281 0.365544 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/exhaustive_argumentwise.erl
known_problems_should_fail ok ok ok 2.091062 0.519891 0.37341399999999997 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/exhaustive_map_variants.erl
known_problems_should_fail ok ok ok 2.255367 0.59889 0.39869 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/exhaustive_remote_map_variants.erl
known_problems_should_fail ok ok ok 2.196618 0.589433 0.41174700000000003 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/guard_should_fail.erl
known_problems_should_fail ok failed ok 2.525398 0.599693 0.393837 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/infer_any_pattern.erl
known_problems_should_fail failed failed ok 2.2372579999999997 0.6010890000000001 0.5528930000000001 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/intersection_with_any_should_fail.erl
known_problems_should_fail failed failed ok 2.1031779999999998 0.5135299999999999 0.372418 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/lambda_wrong_args.erl
known_problems_should_fail ok ok ok 2.116897 0.526751 0.36005200000000004 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/refine_ty_vars.erl
known_problems_should_fail ok failed ok 2.070613 0.509566 0.361644 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/rigid_type_variables_fail.erl
known_problems_should_fail ok failed ok 2.093053 0.511826 0.34629000000000004 /Users/erszcz/work/erszcz/gradualizer/test/known_problems/should_fail/sample.erl
#!/usr/bin/env elixir
# Options
gradualizer_dir = "/Users/erszcz/work/erszcz/gradualizer"
opts = %{
## Where to look for Gradualizer tests?
gradualizer_dir: gradualizer_dir,
## How many seconds can each tool run on a single file?
timeout: 5 |> to_string(),
## Please note ETC should be modified to properly return the error code to the shell.
## See https://github.com/erszcz/ETC/commit/677c763d93fae7fdc326cd9e028c0f59f1803037
etc: "/Users/erszcz/work/vrnithinkumar/ETC/etc",
dialyzer: "dialyzer",
dialyzer_plt: Path.join(gradualizer_dir, ".dialyzer_plt"),
gradualizer: Path.join(gradualizer_dir, "bin/gradualizer"),
}
# Non-options
tests = %{
## debug only
#should_pass: [
# "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/unary_plus.erl",
# "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/user_type_in_pattern_body.erl"
#],
should_pass: Path.wildcard("#{gradualizer_dir}/test/should_pass/*.erl"),
known_problems_should_pass: Path.wildcard("#{gradualizer_dir}/test/known_problems/should_pass/*.erl"),
should_fail: Path.wildcard("#{gradualizer_dir}/test/should_fail/*.erl"),
known_problems_should_fail: Path.wildcard("#{gradualizer_dir}/test/known_problems/should_fail/*.erl")
}
meta = %{
erlang_version: System.cmd("asdf", ["current", "erlang"]) |> elem(0),
gradualizer_tests: System.cmd("git", ["describe", "--tags"], cd: gradualizer_dir) |> elem(0),
dialyzer_version: System.cmd(opts.dialyzer, ["--version"]) |> elem(0),
etc_version: System.cmd("git", ["describe", "--tags", "--always"], cd: Path.dirname(opts.etc)) |> elem(0),
gradualizer_version: System.cmd(opts.gradualizer, ["--version"]) |> elem(0)
}
IO.inspect(opts, label: "Opts")
IO.inspect(meta, label: "Meta")
#IO.inspect(tests, label: "Tests")
# Let's roll
timeout_args = ["-s", "KILL", opts.timeout]
dialyzer_args = [opts.dialyzer, "--plt", opts.dialyzer_plt]
etc_args = [opts.etc]
gradualizer_args = [opts.gradualizer, "-pa", Path.join(opts.gradualizer_dir, "test_data"), "--"]
check_one = fn args ->
cmd = fn -> System.cmd("timeout", timeout_args ++ args, stderr_to_stdout: true) end
case :timer.tc(cmd) do
{micros, {_, 0}} -> {:ok, micros / 1000.0 / 1000.0}
{micros, _} -> {:failed, micros / 1000.0 / 1000.0}
end
end
headers = {"Test type", "Dialyzer", "ETC", "Gradualizer", "Dialyzer time", "ETC time", "Gradualizer time", "Test file"}
check = fn test_type, file ->
IO.puts file
{dialyzer_res, dialyzer_time} = check_one.(dialyzer_args ++ [file])
{etc_res, etc_time} = check_one.(etc_args ++ [file])
{gradualizer_res, gradualizer_time} = check_one.(gradualizer_args ++ [file])
{test_type, dialyzer_res, etc_res, gradualizer_res, dialyzer_time, etc_time, gradualizer_time, file}
end
results_should_pass = for file <- tests.should_pass do
check.(:should_pass, file)
end
results_known_problems_should_pass = for file <- tests.known_problems_should_pass do
check.(:known_problems_should_pass, file)
end
results_should_fail = for file <- tests.should_fail do
check.(:should_fail, file)
end
results_known_problems_should_fail = for file <- tests.known_problems_should_fail do
check.(:known_problems_should_fail, file)
end
results = (
results_should_pass
++ results_known_problems_should_pass
++ results_should_fail
++ results_known_problems_should_fail
)
#IO.inspect(headers, label: "Headers")
#IO.inspect(results, label: "results", limit: :infinity)
IO.puts "TSV starts here"
headers |> Tuple.to_list() |> Enum.intersperse("\t") |> IO.puts()
for row <- results do
row
|> Tuple.to_list()
|> Enum.map(&to_string/1)
|> Enum.intersperse("\t")
|> IO.puts()
end

Dialyzer, ETC, and Gradualizer 2

Mix.install([
  {:csv, "~> 2.4"},
  {:httpotion, "~> 3.1.0"},
  {:kino_vega_lite, "~> 0.1.1"}
])

Let's get the test data

tsv_url =
  "https://gist.githubusercontent.com/erszcz/4d43a77464c87a514e71eecf2811af63/raw/bf8d18cfd236e82bba794c169b57f1f284475ddd/check.2022-07-13_170833.tsv"

response = HTTPotion.get(tsv_url)
tab = 0x09

{:ok, stream} =
  response.body
  |> StringIO.open()

tsv =
  stream
  |> IO.binstream(:line)
  |> CSV.decode!(separator: tab)
  |> Enum.into([])
  |> Enum.drop(1)
headers = [
  :type,
  :dialyzer,
  :etc,
  :gradualizer,
  :dialyzer_seconds,
  :etc_seconds,
  :gradualizer_seconds,
  :file
]

# series by header
by_header =
  tsv
  |> Enum.zip()
  |> Enum.map(&Tuple.to_list/1)

by_header = Enum.zip(headers, by_header) |> Enum.into(%{})
by_test_type = tsv |> Enum.group_by(&List.first/1)

tool_to_index = %{
  dialyzer: 1,
  etc: 2,
  gradualizer: 3
}

extract_tool = fn row, tool ->
  case Enum.at(row, tool_to_index[tool]) do
    "ok" -> [tool |> to_string() |> String.capitalize()]
    _ -> []
  end
end

map_test_type_series_to_tools = fn series ->
  series
  |> Enum.flat_map(fn row ->
    [
      ["All tests"],
      extract_tool.(row, :dialyzer),
      extract_tool.(row, :etc),
      extract_tool.(row, :gradualizer)
    ]
    |> Enum.concat()
  end)
end

by_test_type = %{
  "known_problems_should_fail" =>
    map_test_type_series_to_tools.(by_test_type["known_problems_should_fail"]),
  "known_problems_should_pass" =>
    map_test_type_series_to_tools.(by_test_type["known_problems_should_pass"]),
  "should_fail" => map_test_type_series_to_tools.(by_test_type["should_fail"]),
  "should_pass" => map_test_type_series_to_tools.(by_test_type["should_pass"])
}
# Sanity check!
[n_should_pass, n_known_problems_should_pass, n_should_fail, n_known_problems_should_fail] = [
  by_test_type["should_pass"] |> Enum.filter(fn e -> e == "All tests" end) |> length,
  by_test_type["known_problems_should_pass"]
  |> Enum.filter(fn e -> e == "All tests" end)
  |> length,
  by_test_type["should_fail"] |> Enum.filter(fn e -> e == "All tests" end) |> length,
  by_test_type["known_problems_should_fail"]
  |> Enum.filter(fn e -> e == "All tests" end)
  |> length
]

[103, 16, 86, 11] = [
  n_should_pass,
  n_known_problems_should_pass,
  n_should_fail,
  n_known_problems_should_fail
]

Analysis and comparison

Tests that should pass

This chart depicts the number of tests which should pass, i.e. should type check. After all, we do not want our type checkers to raise warnings about valid code.

Given we're considering code that's assumed to be valid, none of the type checkers should report warnings here. Cross-checking these tests with different type checkers allows to find bugs in tests or the type checkers themselves.

Dialyzer reports only a few errors. Gradualizer, as expected, reports none. ETC fares quite poorly, passing only 1/3 of the tests, which suggests it might not cover the complete Erlang syntax.

Higher is better.

{should_pass_xs, should_pass_ys} =
  by_test_type["should_pass"]
  |> Enum.group_by(fn e -> e end)
  |> Enum.map(fn {type, v} -> {type, length(v)} end)
  |> Enum.unzip()

should_pass = %{
  "Tool" => should_pass_xs,
  "Tests passed" => should_pass_ys
}
VegaLite.new(width: 300, height: 300)
|> VegaLite.data_from_values(should_pass, only: ["Tool", "Tests passed"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "Tool")
|> VegaLite.encode_field(:y, "Tests passed", type: :quantitative)
|> VegaLite.encode_field(:color, "Tool")

Known problems: tests that should pass, but do not

This chart depicts the number of tests which should pass, i.e. should type check, yet raise Gradualizer errors. In other words, these are the false positives - invalid or misleading reports about non-issues.

Dialyzer reports only a single false positive and is a clear winner here! This confirms the slogan that Dialyzer is never wrong. ETC reports some of the errors, but not all of them. Gradualizer, as expected, reports errors for all of the tests.

Lower is better.

{known_problems_should_pass_xs, known_problems_should_pass_ys} =
  by_test_type["known_problems_should_pass"]
  |> Enum.group_by(fn e -> e end)
  |> Enum.map(fn {type, v} -> {type, n_known_problems_should_pass - length(v)} end)
  |> Enum.unzip()

known_problems_should_pass = %{
  "Tool" => known_problems_should_pass_xs ++ ["Gradualizer"],
  "Errors detected" =>
    [n_known_problems_should_pass] ++
      Enum.drop(known_problems_should_pass_ys, 1) ++ [n_known_problems_should_pass]
}
VegaLite.new(width: 300, height: 300)
|> VegaLite.data_from_values(known_problems_should_pass, only: ["Tool", "Errors detected"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "Tool")
|> VegaLite.encode_field(:y, "Errors detected", type: :quantitative)
|> VegaLite.encode_field(:color, "Tool")

Tests which should fail

This chart depicts the number of tests which should fail, i.e. should not type check. These tests check that the warnings we want to see in our buggy code are actually generated.

Dialyzer seems to be somewhat permissive. ETC reports the majority of errors. Gradualizer properly reports all the errors.

Higher is better.

{should_fail_xs, should_fail_ys} =
  by_test_type["should_fail"]
  |> Enum.group_by(fn e -> e end)
  |> Enum.map(fn {type, v} -> {type, n_should_fail - length(v)} end)
  |> Enum.unzip()

should_fail = %{
  "Tool" => should_fail_xs ++ ["Gradualizer"],
  "Errors detected" => [n_should_fail] ++ Enum.drop(should_fail_ys, 1) ++ [n_should_fail]
}
VegaLite.new(width: 300, height: 300)
|> VegaLite.data_from_values(should_fail, only: ["Tool", "Errors detected"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "Tool")
|> VegaLite.encode_field(:y, "Errors detected", type: :quantitative)
|> VegaLite.encode_field(:color, "Tool")

Known problems: tests that should fail, but do not

This chart depicts the number of tests which should fail, i.e. should not type check, but are known to type check with Gradualizer. In other words, these are the errors that considered type checkers cannot find. We have to rely on tests, code review, or other techniques to find them.

Dialyzer detects some of the errors in these examples, ETC seems to detect even more. Gradualizer doesn't detect any of them, but the examples are crafted against this type checker, so it's expected.

Higher is better.

{known_problems_should_fail_xs, known_problems_should_fail_ys} =
  by_test_type["known_problems_should_fail"]
  |> Enum.group_by(fn e -> e end)
  |> Enum.map(fn {type, v} -> {type, n_known_problems_should_fail - length(v)} end)
  |> Enum.unzip()

known_problems_should_fail = %{
  "Tool" => known_problems_should_fail_xs,
  "Errors detected" =>
    [n_known_problems_should_fail] ++ Enum.drop(known_problems_should_fail_ys, 1)
}
VegaLite.new(width: 300, height: 300)
|> VegaLite.data_from_values(known_problems_should_fail, only: ["Tool", "Errors detected"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "Tool")
|> VegaLite.encode_field(:y, "Errors detected", type: :quantitative)
|> VegaLite.encode_field(:color, "Tool")

Some examples

should_pass/andalso_any.erl

Described at josefs/Gradualizer#429 (comment). Seems to be a soundness error in Gradualizer!

should_pass/binary_exhaustiveness_checking.erl

Dialyzer warns about an unexported function. Gradualizer type checks functions no matter if they're exported or not. Dialyzer warning goes away after we export l/1.

Fixed for Dialyzer with josefs/Gradualizer#430.

should_pass/flow.erl

Dialyzer sees no other local call sites than bar(apa), therefore infers the argument type of bar/1 to be just apa, which in turn means that the second clause of bar/1 is redudant. This leads to a valid warning.

Adding -export([bar/1]) at the top makes Dialyzer accept the code.

Gradualizer does not warn either with or without the extra export attribute.

Fixed for Dialyzer with josefs/Gradualizer#431.

should_pass/iodata.erl

Dialyzer detects an improper list creation, which is not an error for Gradualizer (but maybe it should?) - passing --infer to Gradualizer doesn't change the outcome.

should_pass/named_fun_infer_pass.erl

Dialyzer infers that 0 in F(Atoms, 0) is not a list of integers. Gradualizer does not.

should_pass/named_fun_pass.erl

Dialyzer fails due to arity mismatch. Gradualizer does so only with --infer. Dialyzer is inferring more aggressively.

should_pass/negate_none.erl

Dialyzer returns "no local return" from foo/0. Gradualizer is silent.

should_pass/records.erl

Dialyzer reported unexported local functions which would never be called. Gradualizer did not, but the Erlang compiler would, so it's not a big deal.

should_pass/return_fun.erl

One of the few cases in should_pass tests where Dialyzer actually detects errors, whereas Gradualizer does not.

-spec return_fun_no_spec() -> integer().
return_fun_no_spec() -> fun no_spec/0.

no_spec() -> ok.

Dialyzer:

return_fun.erl:28:2: Invalid type specification for function return_fun:return_fun_no_spec/0.
The success typing is
          () -> fun(() -> 'ok')

ETC:

test/should_pass/return_fun.erl: error in parse transform

Gradualizer: no error!

Let's remember that by default Gradualizer doesn't infer types of functions with no specs.

Gradualizer with --infer:

return_fun.erl:29:25: The fun expression is expected to have type integer()
but it has type fun(() -> any())

Dialyzer seems to infer more types by default. However, if we ask Gradualizer to try a bit harder, it's even with Dialyzer on this one. The file is too complex for ETC to process - it crashes :(

should_pass/scope.erl

Another one of the few cases in should_pass tests where Dialyzer detects errors, but Gradualizer does not.

f(X) ->
    case g(X) of
        true -> A = 5,
                B = 7;
        false -> B = 6
    end,
    B.

g(_X) ->
    true.

Dialyzer:

scope.erl:9:9: The pattern 'false' can never match the type 'true'

ETC: ok

Gradualizer: ok

Another example showing that Dialyzer type inference is quite aggressive and quite accurate! It knows that g/1 can never return anything else than true, so the latter clause of the case expression enclosing the g(X) call is redundant. In this case the entire case expression is redundant and B will always be 7.

It's interesting to note that Gradualizer cannot detect the error even if we modify the code as follows:

TODO: create a bug report about it!

-spec f(any()) -> atom().
f(X) ->
    case g(X) of
        true -> A = 5,
                B = 7;
        false -> B = 6
    end,
    B.

-spec g(any()) -> true.
g(_X) ->
    true.

known_problems/should_pass/list_tail.erl

The only false positive raised by Dialyzer, which is known for never being wrong. Is it a Dialyzer bug?

atom_tail() ->
    [ 1 | list_to_atom("banana") ].

Dialyzer:

list_tail.erl:7:5: Cons will produce an improper list since its 2nd argument is atom()

ETC:

unify failed with types [integer] :=: atom

Gradualizer:

list_tail.erl:7: The expression of type atom() is not a list type

Apparently, all the type checkers agree. It definitely is not a Dialyzer bug. Maybe the test should be moved from known_problems/should_pass to should_fail?

known_problems/should_pass/arith_op_arg_types.erl

Gradualizer is wrong about integer type inference in presence of arithmetic operations. Dialyzer is fine with it.

known_problems/should_pass/binary_exhaustiveness_checking_should_pass.erl

Gradualizer cannot tell that <<_:24>> is a subtype of <<_:_*8>>.

should_fail/annotated_types_fail.erl

Gradualizer provides type annotation/assertion macros which can be used to provide extra type information by the programmer. Gradualizer correctly finds types discrepancies between specs and annotations.

Dialyzer does not understand the annotation macros and does not have enough info to find type errors. Dialyzer is more permissive.

should_fail/branch.erl

Given the code:

-spec c(boolean()) -> integer().
c(X) ->
    X.

Dialyzer (with no extra flags) does not detect type mismatch. With -Wspecdiffs or -Woverspecs it reports:

branch.erl:5:2: Type specification branch:c
          (boolean()) -> integer() is a subtype of the success typing: branch:c
          (_) -> any()

The report is correct. Arguably, though, it's a bit hard to understand.

Gradualizer reports:

The variable is expected to have type integer() but it has type false | true

should_fail/branch2.erl

Given the code:

-spec c(boolean()) -> integer().
c(true) ->
    1;
c(false) ->
    apa.

Dialyzer (with no options) does not detect type mismatch. With -Wspecdiffs it reports:

branch2.erl:5:2: The success typing for branch2:c/1 implies that the function might also return
          'apa' but the specification return is
          integer()

Which is expected.

Gradualizer by default reports:

The atom is expected to have type integer() but it has type apa:

    1;
c(false) ->
    apa.
    ^^^

should_fail/case_pattern.erl

Given the code:

-spec f(integer(), atom()) -> ok.
f(X, Y) ->
    case Y of
        X -> ok
    end.

Dialyzer (with no options) cannot figure out that the pattern (matching integers) will never match an atom. With -Wspecdiffs a misleading warning is printed:

case_pattern.erl:4:2: Type specification case_pattern:f
          (integer(), atom()) -> 'ok' is a subtype of the success typing: case_pattern:f
          (_, _) -> 'ok'

The warning suggests that our spec is too specific, whereas in practice its explicitness enables the type checker to figure out that the case expression will never match.

Gradualizer reports:

The variable is expected to have type atom() but it has type integer():

f(X, Y) ->
    case Y of
        X -> ok
        ^

At runtime, the code fails with:

2> case_pattern:f(3, a).
** exception error: no case clause matching a
     in function  case_pattern:f/2 (test/should_fail/case_pattern.erl, line 6)

So Gradualizer detects an actual bug that Dialyzer does not.

should_fail/case_pattern2.erl

Given the code:

-spec f(integer(), atom()) -> ok.
f(X, Y) ->
    case {X, Y} of
        {Z, Z} -> ok
    end.

Dialyzer (with no options) cannot figure out that the pattern will never match the expression as X and Y are of different types. With -Wspecdiffs it suggests the spec is too strict:

case_pattern2.erl:4:2: Type specification case_pattern2:f
          (integer(), atom()) -> 'ok' is a subtype of the success typing: case_pattern2:f
          (_, _) -> 'ok'

Gradualizer reports that:

The variable is expected to have type atom() but it has type integer():

f(X, Y) ->
    case {X, Y} of
        {Z, Z} -> ok
            ^

So Gradualizer prevents the runtime error:

2> case_pattern2:f(3, a).
** exception error: no case clause matching {3,a}
     in function  case_pattern2:f/2 (test/should_fail/case_pattern2.erl, line 6)

should_fail/covariant_map_keys_fail.erl

Given the code:

-spec good(#{ good := A }) -> A.
good(#{ good := X }) -> X.

-spec not_good(#{good | bad := A}) -> A.
not_good(M) -> good(M). %% This call should fail

-spec kaboom() -> integer().
kaboom() -> not_good(#{ bad => 0 }).

Dialyzer (with no options) does not detect any errors. With -Wspecdiffs it reports:

covariant_map_keys_fail.erl:6:2: Type specification covariant_map_keys_fail:good
          (#{'good' := A}) -> A is a subtype of the success typing: covariant_map_keys_fail:good
          (#{'good' := _, _ => _}) -> any()
covariant_map_keys_fail.erl:9:2: Type specification covariant_map_keys_fail:not_good
          (#{'good' | 'bad' := A}) -> A is a supertype of the success typing: covariant_map_keys_fail:not_good
          (#{'good' := _}) -> any()
covariant_map_keys_fail.erl:12:2: The specification for covariant_map_keys_fail:kaboom/0 states that the function might also return
          integer() but the inferred return is
          none()

Dialyzer suggests the information we pass in good/1 spec is redundant. It hints at an error in not_good/1, but is not explicit about it. It correctly detects an error in kaboom/0.

Gradualizer reports:

The variable is expected to have type #{good := A} but it has type #{bad | good := A}

-spec not_good(#{good | bad := A}) -> A.
not_good(M) -> good(M).
                    ^

Gradualizer does not detect the error in kaboom/0, but it does detect the more local error in not_good/1. If we fix the error in not_good/1, the error in kaboom/0 will automatically be fixed, too.

However, Gradualizer, even with the --infer flag, does not infer the type of #{ bad => 0 } expression passed into not_good/1 as an argument. This is now tracked as josefs/Gradualizer#432.

Interestingly, if we modify the code to:

-spec kaboom() -> integer().
kaboom() ->
    M = #{ bad => 0 },
    not_good(M).

Gradualizer is able to report also this error:

The variable is expected to have type #{good | bad := A} but it has type #{bad => 0}

kaboom() ->
    M = #{ bad => 0 },
    not_good(M).
             ^

The runtime error Gradualizer protects from is:

2> covariant_map_keys_fail:not_good(#{bad => 0}).
** exception error: no function clause matching covariant_map_keys_fail:good(#{bad => 0}) (test/should_fail/covariant_map_keys_fail.erl, line 7)

should_fail/cyclic_type_vars.erl

Given the code:

-spec foo(A) -> B when
    A :: true | B,
    B :: [A].

Gradualizer reports a cyclic dependency between type variables A and B. Dialyzer does not.

should_fail/exhaustive.erl

Dialyzer (with no options) does not fail type checking the file. With -Wspecdiffs it hints at spec and implementation mismatches, but with not clear indications which are wrong.

Gradualizer assumes the specs to be right and therefore returns explicit exhaustiveness failures:

/Users/erszcz/work/erszcz/gradualizer/test/should_fail/exhaustive.erl:48:1: Nonexhaustive patterns: 0

It becomes even more apparent when we add an example of a nonexhaustive case expression inside a function body:

-spec integer_2(integer()) -> {}.
integer_2(I) ->
    case I of
        0 -> {}
    end.

Gradualizer reports the exact line:

should_fail/exhaustive.erl:53:9: Nonexhaustive patterns: -1

Whereas Dialyzer (with -Wspecdiffs) only reports a hint that our passed in type is wider than the implementation expects:

exhaustive.erl:50:2: Type specification exhaustive:integer_2
          (integer()) -> {} is a supertype of the success typing: exhaustive:integer_2
          (0) -> {}

should_fail/exhaustive_float.erl

Given the code:

-type t() :: {int, integer()}
           | {float, float()}.

-spec ef(t()) -> ok.
ef(T) ->
    case T of
        {int, _} -> ok
    end.

Dialyzer (with no options) does not report any errors. With -Wspecdiffs it reports the following hint, which suggests that we might be missing some clauses:

exhaustive_float.erl:8:2: Type specification exhaustive_float:ef
          (t()) -> 'ok' is not equal to the success typing: exhaustive_float:ef
          ({'int', _}) -> 'ok'

Gradualizer reports a definite error:

should_fail/exhaustive_float.erl:11:9: Nonexhaustive patterns: {float, -1.0}

should_fail/exhaustive_list_variants.erl

Given the code:

-type list_variant_t() :: {non_list, integer()}
                        | {list, [integer()]}.

-spec list_variant_omitted(list_variant_t()) -> ok.
list_variant_omitted(T) ->
    case T of
        {non_list, _} -> ok
    end.

Dialyzer (with no options) does not report any errors. With -Wspecdiffs it reports the following hint, which suggests that we might be missing some clauses:

exhaustive_list_variants.erl:8:2: Type specification exhaustive_list_variants:list_variant_omitted
          (list_variant_t()) -> 'ok' is not equal to the success typing: exhaustive_list_variants:list_variant_omitted
          ({'non_list', _}) -> 'ok'

Gradualizer reports a definite error:

should_fail/exhaustive_list_variants.erl:11:9: Nonexhaustive patterns: {list, []}

known_problems/should_fail/arith_op.erl

Given the code:

-spec int_error(any(), float()) -> integer().
int_error(X, Y) ->
    A = X div Y,
    A.

Dialyzer reports a concrete error:

Invalid type specification for function arith_op:int_error/2. The success typing is
          (integer(), integer()) -> integer()

Gradualizer does not report anything.

known_problems/should_fail/exhaustive_argumentwise.erl

Given the code:

-type t() :: ala | ola.

-spec f(t(), any()) -> ok.
f(ala, _) -> ok.

By default none of the typecheckers can tell that f/2 is a partial function.

Dialyzer with -Wspecdiffs reports a warning that the success typing is narrower then the spec:

exhaustive_argumentwise.erl:7:2: Type specification exhaustive_argumentwise:f
          (t(), any()) -> 'ok' is a supertype of the success typing: exhaustive_argumentwise:f
          ('ala', _) -> 'ok'

Examples from "Bidirectional Typing for Erlang" by Nithin Rajendrakumar and Annette Bieniusa

1. Polymorphic list lookup

-spec lookup(T1, [{T1, T2}]) -> (none | T2).
lookup(_, []) -> none;
lookup(K, [{K, V}|_]) -> V;
lookup(K, [_|KVs])-> lookup(K, KVs).

find() ->
    "s" = lookup(0, [{0, 1}]).

By default, Dialyzer and Gradualizer do not report any errors. Dialyzer with -Wspecdiffs reports a misleading warning:

bdtfe1.erl:9:2: Type specification bdtfe1:lookup
          (T1, [{T1, T2}]) -> 'none' | T2 is a subtype of the success typing: bdtfe1:lookup
          (_, maybe_improper_list()) -> any()

The warning suggests that the spec is narrower than the actual implementation can handle. In practice, though, Dialyzer ignores the extra information we provide in the spec, which is crucial to identifying the bug in find/0.

ETC reports a unification error:

union-unify failed with types [char] :=: (atom|?`A)

ETC reports that a list of characters cannot be unified with a union of atom (none) and a type variable.

Gradualizer still lacks a constraint solver, so it cannot find the polymorphic type error.

2. Partial function 1/2

-spec foo(integer()) -> {}.
foo(1) -> true;
foo(42) -> {}.

-spec foo2(integer()) -> {}.
foo2(1) -> {};
foo2(42) -> {}.

In the code above the original example from the paper is copied twice, the latter copy having one type error fixed (the mismatch between true and {}) - this is to verify if our type checkers can find none, one, or both of the errors.

Dialyzer (with no options) reports nothing. With -Wspecdiffs it reports:

bdtfe3_should_fail.erl:8:2: The success typing for bdtfe3_should_fail:foo/1 implies that the function might also return
          'true' but the specification return is
          {}
bdtfe3_should_fail.erl:12:2: Type specification bdtfe3_should_fail:foo2
          (integer()) -> {} is a supertype of the success typing: bdtfe3_should_fail:foo2
          (1 | 42) -> {}

So Dialyzer can detect both the return type mismatch against the spec and that the function is partial.

ETC reports a unification failure of boolean and tuple:

unify failed with types boolean :=: tuple

Interestingly, if we comment out the first definition, ETC still fails on the second one with a unification failure of tuple and {}:

unify failed with types {} :=: tuple

Gradualizer with no extra options reports both a type mismatch and that the function is partial:

/Users/erszcz/work/vrnithinkumar/ETC/bdtfe3_should_fail.erl: The atom on line 9 at column 11 is expected to have type {} but it has type true

-spec foo(integer()) -> {}.
foo(1) -> true;
          ^^^^

/Users/erszcz/work/vrnithinkumar/ETC/bdtfe3_should_fail.erl: Nonexhaustive patterns on line 13 at column 1
Example values which are not covered:
	0

Partial function 2/2

It's also interesting to consider the behaviour of the type checkers when we apply some changes:

-spec foo3(integer()) -> {}.
foo3(1) -> {};
foo3(42) -> {};
foo3(_) -> erlang:error(intentionally_partial).

The style above is somewhat more defensive than just "letting it crash". However, its explicitness makes it easier to understand that the function is partial on purpose, not by omission.

Dialyzer (with no options) reports nothing. With -Wspecdiffs it still reports that the spec is wider than the success typing:

bdtfe3_should_pass.erl:8:2: Type specification bdtfe3_should_pass:foo3
          (integer()) -> {} is a supertype of the success typing: bdtfe3_should_pass:foo3
          (1 | 42) -> {}

So with Dialyzer there's no point in using the more expressive style.

Interestingly, ETC can't unify the example:

unify failed with types {} :=: tuple

Gradualizer reports no warnings or errors. The explicit style pays off with a quick and successful type check.

3. Rank-2 polymorphism

Erlang spec syntax allows for higher-ranked polymorphism. Let's see how the type checkers cope with that.

-spec poly_2(fun((A) -> A)) -> {integer(), boolean()}.
poly_2(F) -> {F(42), F(false)}.

The above code is correct and type checks with Dialyzer, Gradualizer, and ETC. Dialyzer with -Wspecdiffs reports that the spec is narrower than the success typing. It's a symptom of Dialyzer ignoring the extra type information provided in the spec and assuming that the implementation is the source of truth, not the spec.

-spec poly_fail(fun((A) -> A), boolean(), integer()) -> {boolean(), integer()}.
poly_fail(F, B, I) -> {F(I), F(B)}.

The above code is not correct.

Dialyzer (with no options) does not report any errors. With -Wspecdiffs it reports the usual warning about the spec being narrower than the success typing. However, there's no mention of the actual return value and spec return type mismatch.

ETC reports a unification failure:

unify failed with types integer :=: boolean

Gradualizer does not report any errors.

Working on Gradualizer

graph TD;
  A("Run Gradualizer on some code")-->B{Errors reported?};
  B -- yes --> I
  I(Verify the code with review and/or tests) --> C{Errors actually present?};
  B -- no  --> F{Errors should be reported?};
  F -- yes - we've found a false-negative --> E;
  F -- no  --> G(Good job writing bug-free code!);
  C -- yes --> D(Fix your bugs!);
  C -- no - we've found a false-positive --> E(Send a PR with a test/known_problems case!);
  E --> H(Ideally, send a PR with a fix!);

Dialyzer, ETC, and Gradualizer

Mix.install([
  {:csv, "~> 2.4"},
  {:httpotion, "~> 3.1.0"},
  {:kino_vega_lite, "~> 0.1.1"}
])
Resolving Hex dependencies...
Dependency resolution completed:
New:
  csv 2.4.1
  httpotion 3.1.3 RETIRED!
    (deprecated) Not really maintained, please check out Tesla
  ibrowse 4.4.0
  kino 0.6.2
  kino_vega_lite 0.1.2
  parallel_stream 1.0.6
  table 0.1.2
  vega_lite 0.1.5
* Getting csv (Hex package)
* Getting httpotion (Hex package)
* Getting kino_vega_lite (Hex package)
* Getting kino (Hex package)
* Getting table (Hex package)
* Getting vega_lite (Hex package)
* Getting ibrowse (Hex package)
* Getting parallel_stream (Hex package)
warning: found quoted keyword "coveralls" but the quotes are not required. Note that keywords are always atoms, even when quoted. Similar to atoms, keywords made exclusively of ASCII letters, numbers, and underscores do not require quotes
  /home/livebook/.cache/mix/installs/elixir-1.13.2-erts-12.1.5/0c6de7f4a5cd2891c7da35ab89014321/deps/parallel_stream/mix.exs:17:30

==> parallel_stream
Compiling 11 files (.ex)
warning: Stream.chunk/4 is deprecated. Use Stream.chunk_every/4 instead
  lib/parallel_stream/producer.ex:16: ParallelStream.Producer.build!/4

Generated parallel_stream app
==> table
Compiling 5 files (.ex)
Generated table app
==> kino
Compiling 28 files (.ex)
Generated kino app
==> vega_lite
Compiling 5 files (.ex)
Generated vega_lite app
==> csv
Compiling 10 files (.ex)
Generated csv app
==> kino_vega_lite
Compiling 4 files (.ex)
Generated kino_vega_lite app
===> Analyzing applications...
===> Compiling ibrowse
==> httpotion
Compiling 1 file (.ex)
Generated httpotion app
:ok

Section

tsv_url =
  "https://gist.githubusercontent.com/erszcz/4d43a77464c87a514e71eecf2811af63/raw/bf8d18cfd236e82bba794c169b57f1f284475ddd/check.2022-07-13_170833.tsv"

response = HTTPotion.get(tsv_url)

08:05:19.634 [warn]  Description: 'Authenticity is not established by certificate path validation'
     Reason: 'Option {verify, verify_peer} and cacertfile/cacerts is missing'


%HTTPotion.Response{
  body: "Test type\tDialyzer\tETC\tGradualizer\tDialyzer time\tETC time\tGradualizer time\tTest file\nshould_pass\tok\tfailed\tok\t2.1023519999999998\t0.667276\t0.370988\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/alias_in_pattern.erl\nshould_pass\tfailed\tfailed\tok\t2.172917\t0.579222\t0.370547\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/andalso_any.erl\nshould_pass\tok\tfailed\tok\t2.164819\t0.645948\t0.367528\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/ann_types.erl\nshould_pass\tok\tfailed\tok\t2.1192469999999997\t0.509058\t0.38575099999999996\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/annotated_types.erl\nshould_pass\tok\tok\tok\t2.128984\t0.569714\t0.36506299999999997\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any.erl\nshould_pass\tok\tfailed\tok\t2.1190189999999998\t0.521856\t0.356186\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any_pattern.erl\nshould_pass\tok\tfailed\tok\t2.192218\t0.556057\t0.41377800000000003\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bc_pass.erl\nshould_pass\tfailed\tfailed\tok\t2.2091640000000003\t0.54463\t0.36658999999999997\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_exhaustiveness_checking.erl\nshould_pass\tok\tfailed\tok\t2.169344\t0.5372279999999999\t0.364356\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_literal_pattern.erl\nshould_pass\tok\tfailed\tok\t2.1503699999999997\t0.556012\t0.391735\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bitstring.erl\nshould_pass\tok\tfailed\tok\t2.143873\t0.542037\t0.444963\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/block_scope.erl\nshould_pass\tok\tfailed\tok\t2.147815\t0.5419919999999999\t0.38354000000000005\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bool.erl\nshould_pass\tok\tfailed\tok\t2.185212\t0.54301\t0.375585\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bounded_funs.erl\nshould_pass\tok\tok\tok\t2.215909\t0.614385\t0.355828\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case.erl\nshould_pass\tok\tfailed\tok\t2.165235\t0.553769\t0.358696\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case_of_record_with_user_defined.erl\nshould_pass\tok\tfailed\tok\t2.105221\t0.5544049999999999\t0.351492\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/catch_expr_pass.erl\nshould_pass\tok\tok\tok\t2.110645\t0.533869\t0.36146\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/covariant_map_keys_pass.erl\nshould_pass\tok\tok\tok\t2.216069\t0.534667\t0.376111\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/cyclic_otp_specs.erl\nshould_pass\tok\tok\tok\t2.1539200000000003\t0.5894790000000001\t0.451692\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/factorial.erl\nshould_pass\tok\tok\tok\t2.209889\t0.5189539999999999\t2.908937\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/float.erl\nshould_pass\tfailed\tok\tok\t2.213283\t0.5500259999999999\t0.371604\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/flow.erl\nshould_pass\tok\tfailed\tok\t2.1941930000000003\t0.533968\t0.36723300000000003\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_capture.erl\nshould_pass\tok\tok\tok\t2.1619099999999998\t0.5612240000000001\t0.40939\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_spec.erl\nshould_pass\tok\tfailed\tok\t2.213728\t0.550353\t0.364056\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/guard.erl\nshould_pass\tok\tok\tok\t2.200145\t0.57729\t0.366244\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/if_expr.erl\nshould_pass\tok\tok\tok\t2.1583180000000004\t0.5299020000000001\t0.365774\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/imported.erl\nshould_pass\tok\tok\tok\t2.5844180000000003\t0.5492250000000001\t0.364993\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/int.erl\nshould_pass\tok\tfailed\tok\t2.209573\t3.594363\t0.351982\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_pass.erl\nshould_pass\tok\tok\tok\t2.1082449999999997\t0.560314\t0.36450099999999996\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_with_any_pass.erl\nshould_pass\tfailed\tfailed\tok\t2.1120349999999997\t0.517544\t0.42670800000000003\t/Users/erszcz/work/erszcz/gradualizer/test/should_pass/iodata.erl\nshould_pass\tok\tok\tok\t2.098425\t0" <> ...,
  headers: %HTTPotion.Headers{
    hdrs: %{
      "accept-ranges" => "bytes",
      "access-control-allow-origin" => "*",
      "cache-control" => "max-age=300",
      "connection" => "keep-alive",
      "content-length" => "30450",
      "content-security-policy" => "default-src 'none'; style-src 'unsafe-inline'; sandbox",
      "content-type" => "text/plain; charset=utf-8",
      "date" => "Thu, 14 Jul 2022 08:05:19 GMT",
      "etag" => "\"7103fd5e30c607d70733f99ac2c2a2d0e9118e3acd4fd9853b1c2ea87ec2da8d\"",
      "expires" => "Thu, 14 Jul 2022 08:10:19 GMT",
      "source-age" => "0",
      "strict-transport-security" => "max-age=31536000",
      "vary" => "Authorization,Accept-Encoding,Origin",
      "via" => "1.1 varnish",
      "x-cache" => "MISS",
      "x-cache-hits" => "0",
      "x-content-type-options" => "nosniff",
      "x-fastly-request-id" => "e97b6078f4c9040f100ea20d621ca62d3e1a7c11",
      "x-frame-options" => "deny",
      "x-github-request-id" => "E434:6AC9:2FB79E:3362A4:62CFCE3F",
      "x-served-by" => "cache-fra19153-FRA",
      "x-timer" => "S1657785920.646440,VS0,VE153",
      "x-xss-protection" => "1; mode=block"
    }
  },
  status_code: 200
}
tab = 0x09

{:ok, stream} =
  response.body
  |> StringIO.open()

tsv =
  stream
  |> IO.binstream(:line)
  |> CSV.decode!(separator: tab)
  |> Enum.into([])
  |> Enum.drop(1)
[
  ["should_pass", "ok", "failed", "ok", "2.1023519999999998", "0.667276", "0.370988",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/alias_in_pattern.erl"],
  ["should_pass", "failed", "failed", "ok", "2.172917", "0.579222", "0.370547",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/andalso_any.erl"],
  ["should_pass", "ok", "failed", "ok", "2.164819", "0.645948", "0.367528",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/ann_types.erl"],
  ["should_pass", "ok", "failed", "ok", "2.1192469999999997", "0.509058", "0.38575099999999996",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/annotated_types.erl"],
  ["should_pass", "ok", "ok", "ok", "2.128984", "0.569714", "0.36506299999999997",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any.erl"],
  ["should_pass", "ok", "failed", "ok", "2.1190189999999998", "0.521856", "0.356186",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any_pattern.erl"],
  ["should_pass", "ok", "failed", "ok", "2.192218", "0.556057", "0.41377800000000003",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bc_pass.erl"],
  ["should_pass", "failed", "failed", "ok", "2.2091640000000003", "0.54463", "0.36658999999999997",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_exhaustiveness_checking.erl"],
  ["should_pass", "ok", "failed", "ok", "2.169344", "0.5372279999999999", "0.364356",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_literal_pattern.erl"],
  ["should_pass", "ok", "failed", "ok", "2.1503699999999997", "0.556012", "0.391735",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bitstring.erl"],
  ["should_pass", "ok", "failed", "ok", "2.143873", "0.542037", "0.444963",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/block_scope.erl"],
  ["should_pass", "ok", "failed", "ok", "2.147815", "0.5419919999999999", "0.38354000000000005",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bool.erl"],
  ["should_pass", "ok", "failed", "ok", "2.185212", "0.54301", "0.375585",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bounded_funs.erl"],
  ["should_pass", "ok", "ok", "ok", "2.215909", "0.614385", "0.355828",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case.erl"],
  ["should_pass", "ok", "failed", "ok", "2.165235", "0.553769", "0.358696",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case_of_record_with_user_defined.erl"],
  ["should_pass", "ok", "failed", "ok", "2.105221", "0.5544049999999999", "0.351492",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/catch_expr_pass.erl"],
  ["should_pass", "ok", "ok", "ok", "2.110645", "0.533869", "0.36146",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/covariant_map_keys_pass.erl"],
  ["should_pass", "ok", "ok", "ok", "2.216069", "0.534667", "0.376111",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/cyclic_otp_specs.erl"],
  ["should_pass", "ok", "ok", "ok", "2.1539200000000003", "0.5894790000000001", "0.451692",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/factorial.erl"],
  ["should_pass", "ok", "ok", "ok", "2.209889", "0.5189539999999999", "2.908937",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/float.erl"],
  ["should_pass", "failed", "ok", "ok", "2.213283", "0.5500259999999999", "0.371604",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/flow.erl"],
  ["should_pass", "ok", "failed", "ok", "2.1941930000000003", "0.533968", "0.36723300000000003",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_capture.erl"],
  ["should_pass", "ok", "ok", "ok", "2.1619099999999998", "0.5612240000000001", "0.40939",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_spec.erl"],
  ["should_pass", "ok", "failed", "ok", "2.213728", "0.550353", "0.364056",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/guard.erl"],
  ["should_pass", "ok", "ok", "ok", "2.200145", "0.57729", "0.366244",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/if_expr.erl"],
  ["should_pass", "ok", "ok", "ok", "2.1583180000000004", "0.5299020000000001", "0.365774",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/imported.erl"],
  ["should_pass", "ok", "ok", "ok", "2.5844180000000003", "0.5492250000000001", "0.364993",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/int.erl"],
  ["should_pass", "ok", "failed", "ok", "2.209573", "3.594363", "0.351982",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_pass.erl"],
  ["should_pass", "ok", "ok", "ok", "2.1082449999999997", "0.560314", "0.36450099999999996",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_with_any_pass.erl"],
  ["should_pass", "failed", "failed", "ok", "2.1120349999999997", "0.517544", "0.42670800000000003",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/iodata.erl"],
  ["should_pass", "ok", "ok", "ok", "2.098425", "0.628749", "0.49684100000000003",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/issue131.erl"],
  ["should_pass", "ok", "failed", "ok", "2.108574", "0.520277", "0.35125",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/lc.erl"],
  ["should_pass", "ok", "failed", "ok", "2.0505720000000003", "0.5177820000000001", "0.369152",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list.erl"],
  ["should_pass", "ok", "ok", "ok", "2.108369", "0.520336", "0.36743000000000003",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions.erl"],
  ["should_pass", "ok", "ok", "ok", "2.080773", "0.616696", "0.382913",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions2.erl"],
  ["should_pass", "ok", "ok", "ok", "2.064029", "0.5292899999999999", "0.376395",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_unreachable_clause_regression.erl"],
  ["should_pass", "ok", "ok", "ok", "2.204776", "0.562209", "0.362902",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_infer_pass.erl"],
  ["should_pass", "ok", "failed", "ok", "2.2360059999999997", "0.653643", "0.418173",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/listsspecs.erl"],
  ["should_pass", "ok", "ok", "ok", "2.216444", "0.544971", "0.37679",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map.erl"],
  ["should_pass", "ok", "failed", "ok", "2.202191", "0.543669", "0.37242899999999995",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_as_argument_update.erl"],
  ["should_pass", "ok", "ok", "ok", "2.207866", "0.5567179999999999", "0.37885399999999997",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_creation.erl"],
  ["should_pass", "ok", "failed", "ok", "2.229593", "0.553717", "0.378894",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_field_valid_update.erl"],
  ["should_pass", "ok", "ok", "ok", "2.15132", "0.613623", "0.387899", ...],
  ["should_pass", "ok", "failed", "ok", "2.207959", "0.522229", ...],
  ["should_pass", "ok", "failed", "ok", "2.214956", ...],
  ["should_pass", "ok", "failed", "ok", ...],
  ["should_pass", "ok", "failed", ...],
  ["should_pass", "ok", ...],
  ["should_pass", ...],
  [...],
  ...
]
headers = [
  :type,
  :dialyzer,
  :etc,
  :gradualizer,
  :dialyzer_seconds,
  :etc_seconds,
  :gradualizer_seconds,
  :file
]

# series by header
by_header =
  tsv
  |> Enum.zip()
  |> Enum.map(&Tuple.to_list/1)

by_header = Enum.zip(headers, by_header) |> Enum.into(%{})
%{
  dialyzer: ["ok", "failed", "ok", "ok", "ok", "ok", "ok", "failed", "ok", "ok", "ok", "ok", "ok",
   "ok", "ok", "ok", "ok", "ok", "ok", "ok", "failed", "ok", "ok", "ok", "ok", "ok", "ok", "ok",
   "ok", "failed", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok",
   "ok", "ok", "ok", "ok", "ok", "ok", ...],
  dialyzer_seconds: ["2.1023519999999998", "2.172917", "2.164819", "2.1192469999999997", "2.128984",
   "2.1190189999999998", "2.192218", "2.2091640000000003", "2.169344", "2.1503699999999997",
   "2.143873", "2.147815", "2.185212", "2.215909", "2.165235", "2.105221", "2.110645", "2.216069",
   "2.1539200000000003", "2.209889", "2.213283", "2.1941930000000003", "2.1619099999999998",
   "2.213728", "2.200145", "2.1583180000000004", "2.5844180000000003", "2.209573",
   "2.1082449999999997", "2.1120349999999997", "2.098425", "2.108574", "2.0505720000000003",
   "2.108369", "2.080773", "2.064029", "2.204776", "2.2360059999999997", "2.216444", "2.202191",
   "2.207866", "2.229593", "2.15132", "2.207959", "2.214956", "2.226715", "2.139829", "2.248103",
   ...],
  etc: ["failed", "failed", "failed", "failed", "ok", "failed", "failed", "failed", "failed",
   "failed", "failed", "failed", "failed", "ok", "failed", "failed", "ok", "ok", "ok", "ok", "ok",
   "failed", "ok", "failed", "ok", "ok", "ok", "failed", "ok", "failed", "ok", "failed", "failed",
   "ok", "ok", "ok", "ok", "failed", "ok", "failed", "ok", "failed", "ok", "failed", "failed",
   "failed", "failed", ...],
  etc_seconds: ["0.667276", "0.579222", "0.645948", "0.509058", "0.569714", "0.521856", "0.556057",
   "0.54463", "0.5372279999999999", "0.556012", "0.542037", "0.5419919999999999", "0.54301",
   "0.614385", "0.553769", "0.5544049999999999", "0.533869", "0.534667", "0.5894790000000001",
   "0.5189539999999999", "0.5500259999999999", "0.533968", "0.5612240000000001", "0.550353",
   "0.57729", "0.5299020000000001", "0.5492250000000001", "3.594363", "0.560314", "0.517544",
   "0.628749", "0.520277", "0.5177820000000001", "0.520336", "0.616696", "0.5292899999999999",
   "0.562209", "0.653643", "0.544971", "0.543669", "0.5567179999999999", "0.553717", "0.613623",
   "0.522229", "0.5525639999999999", "0.522299", ...],
  file: ["/Users/erszcz/work/erszcz/gradualizer/test/should_pass/alias_in_pattern.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/andalso_any.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/ann_types.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/annotated_types.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/any_pattern.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bc_pass.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_exhaustiveness_checking.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/binary_literal_pattern.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bitstring.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/block_scope.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bool.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/bounded_funs.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/case_of_record_with_user_defined.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/catch_expr_pass.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/covariant_map_keys_pass.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/cyclic_otp_specs.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/factorial.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/float.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/flow.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_capture.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/fun_spec.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/guard.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/if_expr.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/imported.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/int.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_pass.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/intersection_with_any_pass.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/iodata.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/issue131.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/lc.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_regressions2.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_exhaustiveness_checking_unreachable_clause_regression.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/list_infer_pass.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/listsspecs.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_as_argument_update.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_creation.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_field_valid_update.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_expr.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_passing_subtyping.erl",
   "/Users/erszcz/work/erszcz/gradualizer/test/should_pass/map_pattern.erl", ...],
  gradualizer: ["ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok",
   "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok",
   "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", "ok", ...],
  gradualizer_seconds: ["0.370988", "0.370547", "0.367528", "0.38575099999999996",
   "0.36506299999999997", "0.356186", "0.41377800000000003", "0.36658999999999997", "0.364356",
   "0.391735", "0.444963", "0.38354000000000005", "0.375585", "0.355828", "0.358696", "0.351492",
   "0.36146", "0.376111", "0.451692", "2.908937", "0.371604", "0.36723300000000003", "0.40939",
   "0.364056", "0.366244", "0.365774", "0.364993", "0.351982", "0.36450099999999996",
   "0.42670800000000003", "0.49684100000000003", "0.35125", "0.369152", "0.36743000000000003",
   "0.382913", "0.376395", "0.362902", "0.418173", "0.37679", "0.37242899999999995",
   "0.37885399999999997", "0.378894", "0.387899", ...],
  type: ["should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass",
   "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass",
   "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass",
   "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass",
   "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass",
   "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass",
   "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", "should_pass", ...]
}
by_test_type = tsv |> Enum.group_by(&List.first/1)

tool_to_index = %{
  dialyzer: 1,
  etc: 2,
  gradualizer: 3
}

extract_tool = fn row, tool ->
  case Enum.at(row, tool_to_index[tool]) do
    "ok" -> [tool |> to_string()]
    _ -> []
  end
end

map_test_type_series_to_tools = fn series ->
  series
  |> Enum.flat_map(fn row ->
    [
      ["all tests"],
      extract_tool.(row, :dialyzer),
      extract_tool.(row, :etc),
      extract_tool.(row, :gradualizer)
    ]
    |> Enum.concat()
  end)
end

by_test_type = %{
  "known_problems_should_fail" =>
    map_test_type_series_to_tools.(by_test_type["known_problems_should_fail"]),
  "known_problems_should_pass" =>
    map_test_type_series_to_tools.(by_test_type["known_problems_should_pass"]),
  "should_fail" => map_test_type_series_to_tools.(by_test_type["should_fail"]),
  "should_pass" => map_test_type_series_to_tools.(by_test_type["should_pass"])
}
%{
  "known_problems_should_fail" => ["all tests", "gradualizer", "all tests", "dialyzer", "etc",
   "gradualizer", "all tests", "dialyzer", "etc", "gradualizer", "all tests", "dialyzer", "etc",
   "gradualizer", "all tests", "dialyzer", "etc", "gradualizer", "all tests", "dialyzer",
   "gradualizer", "all tests", "gradualizer", "all tests", "gradualizer", "all tests", "dialyzer",
   "etc", "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests", "dialyzer",
   "gradualizer"],
  "known_problems_should_pass" => ["all tests", "dialyzer", "etc", "all tests", "dialyzer",
   "all tests", "dialyzer", "all tests", "dialyzer", "etc", "all tests", "dialyzer", "all tests",
   "dialyzer", "etc", "all tests", "dialyzer", "etc", "all tests", "all tests", "dialyzer", "etc",
   "all tests", "dialyzer", "all tests", "dialyzer", "all tests", "dialyzer", "etc", "all tests",
   "dialyzer", "etc", "all tests", "dialyzer", "all tests", "dialyzer", "etc", "all tests",
   "dialyzer", "etc"],
  "should_fail" => ["all tests", "dialyzer", "all tests", "all tests", "all tests", "all tests",
   "all tests", "all tests", "all tests", "dialyzer", "all tests", "dialyzer", "all tests",
   "all tests", "dialyzer", "all tests", "dialyzer", "all tests", "dialyzer", "all tests",
   "all tests", "dialyzer", "etc", "all tests", "dialyzer", "etc", "all tests", "etc", "all tests",
   "dialyzer", "all tests", "dialyzer", "all tests", "dialyzer", "all tests", "dialyzer", "etc",
   "all tests", "dialyzer", "all tests", "dialyzer", "all tests", "dialyzer", "etc", "all tests",
   "dialyzer", "all tests", ...],
  "should_pass" => ["all tests", "dialyzer", "gradualizer", "all tests", "gradualizer", "all tests",
   "dialyzer", "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests", "dialyzer",
   "etc", "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests", "dialyzer",
   "gradualizer", "all tests", "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests",
   "dialyzer", "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests", "dialyzer",
   "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests", "dialyzer", "etc",
   "gradualizer", "all tests", "dialyzer", "gradualizer", "all tests", ...]
}
# Sanity check!
[103, 16, 86, 11] = [
  by_test_type["should_pass"] |> Enum.filter(fn e -> e == "all tests" end) |> length,
  by_test_type["known_problems_should_pass"]
  |> Enum.filter(fn e -> e == "all tests" end)
  |> length,
  by_test_type["should_fail"] |> Enum.filter(fn e -> e == "all tests" end) |> length,
  by_test_type["known_problems_should_fail"]
  |> Enum.filter(fn e -> e == "all tests" end)
  |> length
]
[103, 16, 86, 11]
VegaLite.new()
|> VegaLite.data_from_values(by_test_type, only: ["should_pass"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "should_pass")
|> VegaLite.encode(:y, aggregate: :count)
|> VegaLite.encode_field(:color, "should_pass")
{"$schema":"https://vega.github.io/schema/vega-lite/v5.json","data":{"values":[{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"etc"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"},{"should_pass":"all tests"},{"should_pass":"dialyzer"},{"should_pass":"gradualizer"}]},"encoding":{"color":{"field":"should_pass"},"x":{"field":"should_pass"},"y":{"aggregate":"count"}},"mark":"bar"}
VegaLite.new()
|> VegaLite.data_from_values(by_test_type, only: ["known_problems_should_pass"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "known_problems_should_pass")
|> VegaLite.encode(:y, aggregate: :count)
|> VegaLite.encode_field(:color, "known_problems_should_pass")
{"$schema":"https://vega.github.io/schema/vega-lite/v5.json","data":{"values":[{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"etc"},{"known_problems_should_pass":"all tests"},{"known_problems_should_pass":"dialyzer"},{"known_problems_should_pass":"all tests"}]},"encoding":{"color":{"field":"known_problems_should_pass"},"x":{"field":"known_problems_should_pass"},"y":{"aggregate":"count"}},"mark":"bar"}
VegaLite.new()
|> VegaLite.data_from_values(by_test_type, only: ["should_fail"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "should_fail")
|> VegaLite.encode(:y, aggregate: :count)
|> VegaLite.encode_field(:color, "should_fail")
{"$schema":"https://vega.github.io/schema/vega-lite/v5.json","data":{"values":[{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"etc"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"etc"},{"should_fail":"all tests"},{"should_fail":"etc"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"},{"should_fail":"dialyzer"},{"should_fail":"all tests"}]},"encoding":{"color":{"field":"should_fail"},"x":{"field":"should_fail"},"y":{"aggregate":"count"}},"mark":"bar"}
VegaLite.new()
|> VegaLite.data_from_values(by_test_type, only: ["known_problems_should_fail"])
|> VegaLite.mark(:bar)
|> VegaLite.encode_field(:x, "known_problems_should_fail")
|> VegaLite.encode(:y, aggregate: :count)
|> VegaLite.encode_field(:color, "known_problems_should_fail")
{"$schema":"https://vega.github.io/schema/vega-lite/v5.json","data":{"values":[{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"etc"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"etc"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"etc"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"etc"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"etc"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"gradualizer"},{"known_problems_should_fail":"all tests"},{"known_problems_should_fail":"dialyzer"},{"known_problems_should_fail":"gradualizer"}]},"encoding":{"color":{"field":"known_problems_should_fail"},"x":{"field":"known_problems_should_fail"},"y":{"aggregate":"count"}},"mark":"bar"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment