"""Unittest to verify properties of clippy rules""" load("@bazel_skylib//lib:unittest.bzl", "analysistest") load("//rust:defs.bzl", "rust_clippy_aspect") load("//test/unit:common.bzl", "assert_argv_contains", "assert_list_contains_adjacent_elements") def _find_clippy_action(actions): for action in actions: if action.mnemonic == "Clippy": return action fail("Failed to find Clippy action") def _clippy_aspect_action_has_flag_impl(ctx, flags): env = analysistest.begin(ctx) target = analysistest.target_under_test(env) clippy_action = _find_clippy_action(target.actions) # Ensure each flag is present in the clippy action for flag in flags: assert_argv_contains( env, clippy_action, flag, ) clippy_checks = target[OutputGroupInfo].clippy_checks.to_list() if len(clippy_checks) != 1: fail("clippy_checks is only expected to contain 1 file") # Ensure the arguments to generate the marker file are present in # the clippy action assert_list_contains_adjacent_elements( env, clippy_action.argv, [ "--touch-file", clippy_checks[0].path, ], ) return analysistest.end(env) def _binary_clippy_aspect_action_has_warnings_flag_test_impl(ctx): return _clippy_aspect_action_has_flag_impl( ctx, ["-Dwarnings"], ) def _library_clippy_aspect_action_has_warnings_flag_test_impl(ctx): return _clippy_aspect_action_has_flag_impl( ctx, ["-Dwarnings"], ) def _test_clippy_aspect_action_has_warnings_flag_test_impl(ctx): return _clippy_aspect_action_has_flag_impl( ctx, [ "-Dwarnings", "--test", ], ) _CLIPPY_EXPLICIT_FLAGS = [ "-Dwarnings", "-A", "clippy::needless_return", ] _CLIPPY_INDIVIDUALLY_ADDED_EXPLICIT_FLAGS = [ "-A", "clippy::new_without_default", "-A", "clippy::needless_range_loop", ] def _clippy_aspect_with_explicit_flags_test_impl(ctx): return _clippy_aspect_action_has_flag_impl( ctx, _CLIPPY_EXPLICIT_FLAGS + _CLIPPY_INDIVIDUALLY_ADDED_EXPLICIT_FLAGS, ) def make_clippy_aspect_unittest(impl, **kwargs): return analysistest.make( impl, extra_target_under_test_aspects = [rust_clippy_aspect], **kwargs ) binary_clippy_aspect_action_has_warnings_flag_test = make_clippy_aspect_unittest(_binary_clippy_aspect_action_has_warnings_flag_test_impl) library_clippy_aspect_action_has_warnings_flag_test = make_clippy_aspect_unittest(_library_clippy_aspect_action_has_warnings_flag_test_impl) test_clippy_aspect_action_has_warnings_flag_test = make_clippy_aspect_unittest(_test_clippy_aspect_action_has_warnings_flag_test_impl) clippy_aspect_with_explicit_flags_test = make_clippy_aspect_unittest( _clippy_aspect_with_explicit_flags_test_impl, config_settings = { str(Label("//:clippy_flag")): _CLIPPY_INDIVIDUALLY_ADDED_EXPLICIT_FLAGS, str(Label("//:clippy_flags")): _CLIPPY_EXPLICIT_FLAGS, }, ) def clippy_test_suite(name): """Entry-point macro called from the BUILD file. Args: name (str): Name of the macro. """ binary_clippy_aspect_action_has_warnings_flag_test( name = "binary_clippy_aspect_action_has_warnings_flag_test", target_under_test = Label("//test/clippy:ok_binary"), ) library_clippy_aspect_action_has_warnings_flag_test( name = "library_clippy_aspect_action_has_warnings_flag_test", target_under_test = Label("//test/clippy:ok_library"), ) test_clippy_aspect_action_has_warnings_flag_test( name = "test_clippy_aspect_action_has_warnings_flag_test", target_under_test = Label("//test/clippy:ok_test"), ) clippy_aspect_with_explicit_flags_test( name = "binary_clippy_aspect_with_explicit_flags_test", target_under_test = Label("//test/clippy:ok_binary"), ) clippy_aspect_with_explicit_flags_test( name = "library_clippy_aspect_with_explicit_flags_test", target_under_test = Label("//test/clippy:ok_library"), ) clippy_aspect_with_explicit_flags_test( name = "test_clippy_aspect_with_explicit_flags_test", target_under_test = Label("//test/clippy:ok_test"), ) native.test_suite( name = name, tests = [ ":binary_clippy_aspect_action_has_warnings_flag_test", ":library_clippy_aspect_action_has_warnings_flag_test", ":test_clippy_aspect_action_has_warnings_flag_test", ":binary_clippy_aspect_with_explicit_flags_test", ":library_clippy_aspect_with_explicit_flags_test", ":test_clippy_aspect_with_explicit_flags_test", ], )