| #!/bin/bash |
| |
| # --- begin runfiles.bash initialization --- |
| # Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash). |
| set -euo pipefail |
| if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
| if [[ -f "$0.runfiles_manifest" ]]; then |
| export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" |
| elif [[ -f "$0.runfiles/MANIFEST" ]]; then |
| export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST" |
| elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
| export RUNFILES_DIR="$0.runfiles" |
| fi |
| fi |
| if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
| source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" |
| elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
| source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ |
| "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" |
| else |
| echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" |
| exit 1 |
| fi |
| # --- end runfiles.bash initialization --- |
| |
| die () { |
| echo "$1" 1>&2 |
| exit 1 |
| } |
| |
| [[ "$1" =~ external/* ]] && buildozer="${{1#external/}}" || buildozer="$TEST_WORKSPACE/$1" |
| buildozer="$(rlocation "$buildozer")" |
| |
| source $TEST_SRCDIR/_main/buildozer/test_common.sh |
| |
| ## TEST INPUTS |
| |
| no_deps='go_library( |
| name = "edit", |
| )' |
| |
| empty_deps='go_library( |
| name = "edit", |
| deps = [], |
| )' |
| |
| one_dep='go_library( |
| name = "edit", |
| deps = ["//buildifier:build"], |
| )' |
| |
| two_deps='go_library( |
| name = "edit", |
| deps = [ |
| ":local", |
| "//buildifier:build", |
| ], |
| )' |
| |
| two_deps_with_select='go_library( |
| name = "edit", |
| deps = [ |
| ":local", |
| "//buildifier:build", |
| ] + select({ |
| "//tools/some:condition": [ |
| "//some:value", |
| "//some/other:value", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| }), |
| )' |
| |
| quoted_deps='go_library( |
| name = "edit", |
| deps = [ |
| "//buildifier:build", |
| "//foo", |
| "//bar", |
| "\"//baz\"", |
| ], |
| )' |
| |
| ## TESTS |
| |
| function test_add_one_dep() { |
| run "$one_dep" 'add deps //foo' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| "//buildifier:build", |
| "//foo", |
| ], |
| )' |
| } |
| |
| function test_add_dep_no_deps() { |
| run "$no_deps" 'add deps //foo' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//foo"], |
| )' |
| } |
| |
| function test_add_dep_quotes() { |
| run "$no_deps" 'add deps "//foo"' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//foo"], |
| )' |
| } |
| |
| function test_add_dep_empty_deps() { |
| run "$empty_deps" 'add deps //foo' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//foo"], |
| )' |
| } |
| |
| function test_add_dep_two_deps() { |
| run "$two_deps" 'add deps :local2' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| ":local", |
| ":local2", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_add_existing_dep() { |
| in='go_library( |
| name = "edit", |
| deps = [":local"], |
| )' |
| ERROR=3 run "$in" 'add deps //pkg:local' '//pkg:edit' |
| assert_equals "$in" |
| } |
| |
| function test_add_existing_dep2() { |
| in='go_library( |
| name = "edit", |
| deps = ["//pkg:local"], |
| )' |
| ERROR=3 run "$in" 'add deps //pkg:local' '//pkg:edit' |
| assert_equals "$in" |
| } |
| |
| function test_add_shortened_dep() { |
| in='go_library( |
| name = "edit", |
| )' |
| run "$in" 'add deps //pkg:local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":local"], |
| )' |
| } |
| |
| function test_sorted_deps() { |
| in='go_library( |
| name = "edit", |
| deps = [ |
| ":c", |
| # comment that prevents buildifier reordering |
| ":x", |
| "//foo", |
| ], |
| )' |
| run "$in" 'add deps :z :a :e //last' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| ":a", |
| ":c", |
| ":e", |
| # comment that prevents buildifier reordering |
| ":x", |
| ":z", |
| "//foo", |
| "//last", |
| ], |
| )' |
| } |
| |
| function test_noshorten_labels_flag() { |
| in='go_library( |
| name = "edit", |
| )' |
| run "$in" --shorten_labels=false 'add deps //pkg:local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//pkg:local"], |
| )' |
| } |
| |
| function test_add_duplicate_label() { |
| # "build" and ":build" labels are equivalent |
| in='go_library( |
| name = "edit", |
| deps = ["build"], |
| )' |
| ERROR=3 run "$in" 'add deps :build' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["build"], |
| )' |
| } |
| |
| function test_add_duplicate_label2() { |
| # "build" and ":build" labels are equivalent |
| in='go_library( |
| name = "edit", |
| deps = [":build"], |
| )' |
| ERROR=3 run "$in" 'add deps build' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":build"], |
| )' |
| } |
| |
| function test_remove_last_dep() { |
| run "$one_dep" 'remove deps //buildifier:build' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_all_attrs() { |
| run "$one_dep" 'remove *' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_all_attrs_none() { |
| ERROR=3 run "$no_deps" 'remove *' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| )' |
| } |
| |
| function test_remove_dep() { |
| run "$two_deps" 'remove deps //buildifier:build' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":local"], |
| )' |
| } |
| |
| function test_remove_dep_outside_of_select() { |
| run "$two_deps_with_select" 'remove deps //buildifier:build' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":local"] + select({ |
| "//tools/some:condition": [ |
| "//some:value", |
| "//some/other:value", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| }), |
| )' |
| } |
| |
| function test_remove_all_deps_outside_of_select() { |
| run "$two_deps_with_select" 'remove deps //buildifier:build :local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = select({ |
| "//tools/some:condition": [ |
| "//some:value", |
| "//some/other:value", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| }), |
| )' |
| } |
| |
| function test_remove_dep_in_select() { |
| run "$two_deps_with_select" 'remove deps //some:value' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| ":local", |
| "//buildifier:build", |
| ] + select({ |
| "//tools/some:condition": ["//some/other:value"], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| }), |
| )' |
| } |
| |
| function test_remove_deps_in_select() { |
| run "$two_deps_with_select" 'remove deps //some:value //some/other:value' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| ":local", |
| "//buildifier:build", |
| ] + select({ |
| "//tools/some:condition": [], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| }), |
| )' |
| } |
| |
| function test_remove_all_deps_in_select() { |
| run "$two_deps_with_select" 'remove deps //some:value //some/other:value //yet/another:value' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| ":local", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_remove_all_deps() { |
| run "$two_deps_with_select" 'remove deps //some:value //some/other:value //yet/another:value :local //buildifier:build' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_dep_quotes() { |
| run "$two_deps" 'remove deps "//buildifier:build"' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":local"], |
| )' |
| } |
| |
| function test_remove_local_dep() { |
| run "$two_deps" 'remove deps local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_remove_two_deps() { |
| run "$two_deps" 'remove deps //buildifier:build :local' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_dep_using_long_label() { |
| run "$two_deps" 'remove deps //pkg:local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_remove_nonexistent_item() { |
| run "$two_deps" 'remove deps //foo:bar :local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_remove_item_with_comment() { |
| commented_deps='go_library( |
| name = "edit", |
| deps = [ |
| # Do not remove!!!!11111!!! |
| ":local", |
| "//buildifier:build", #fixdeps: keep |
| "//remove:me", |
| ], |
| )' |
| |
| run "$commented_deps" 'remove deps //buildifier:build //remove:me :local' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_src() { |
| in='go_library( |
| name = "edit", |
| srcs = ["file" + ".go", "other.go"], |
| )' |
| run "$in" 'remove srcs other.go' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| srcs = ["file" + ".go"], |
| )' |
| } |
| |
| function test_remove_dep_without_colon() { |
| in='go_library( |
| name = "edit", |
| deps = ["local", "//base"], |
| )' |
| run "$in" 'remove deps //pkg:local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//base"], |
| )' |
| } |
| |
| function test_remove_attribute() { |
| run "$two_deps" 'remove deps' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_concatenated_attribute() { |
| in='cc_library(name = "a", deps = ["//my/"] + ["foo"])' |
| run "$in" 'remove deps :foo' '//pkg:a' |
| assert_equals 'cc_library( |
| name = "a", |
| deps = ["//my/"], |
| )' |
| } |
| |
| function test_remove_from_all_attributes() { |
| in='java_library(name = "a", data = ["b","c"], exports = ["c"], deps = ["c","d"])' |
| run "$in" 'remove * c' '//pkg:a' |
| assert_equals 'java_library( |
| name = "a", |
| data = ["b"], |
| deps = ["d"], |
| )' |
| } |
| |
| function test_remove_from_all_rules() { |
| in='cc_library(name = "a", visibility = ["//visibility:private"]) |
| cc_library(name = "b") |
| exports_files(["a.cc"], visibility = ["//visibility:private"])' |
| run "$in" 'remove visibility' '//pkg:all' |
| assert_equals 'cc_library(name = "a") |
| |
| cc_library(name = "b") |
| |
| exports_files(["a.cc"])' |
| } |
| |
| function test_remove_package_attribute() { |
| in='package(default_visibility = ["//visibility:public"])' |
| run "$in" 'remove default_visibility' '//pkg:__pkg__' |
| [ $(wc -c < "$root/pkg/BUILD") -eq 0 ] || fail "Expected empty file" |
| } |
| |
| function test_remove_if_equal_label() { |
| in='go_library( |
| name = "edit", |
| shared_library = ":local", # Suffix comment. |
| )' |
| run "$in" 'remove_if_equal shared_library :local' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_if_equal_label_does_not_match() { |
| in='go_library( |
| name = "edit", |
| shared_library = ":local", # Suffix comment. |
| )' |
| ERROR=3 run "$in" 'remove_if_equal shared_library :global' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| shared_library = ":local", # Suffix comment. |
| )' |
| } |
| |
| function test_remove_if_equal_label_full_path() { |
| in='go_library( |
| name = "edit", |
| shared_library = ":local", # Suffix comment. |
| )' |
| run "$in" 'remove_if_equal shared_library //pkg:local' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_if_equal_ident() { |
| in='go_library( |
| name = "edit", |
| flag = True, |
| )' |
| run "$in" 'remove_if_equal flag True' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_if_equal_ident_does_not_match() { |
| in='go_library( |
| name = "edit", |
| flag = True, |
| )' |
| ERROR=3 run "$in" 'remove_if_equal flag False' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| flag = True, |
| )' |
| } |
| |
| function test_remove_if_equal_string() { |
| in='go_library( |
| name = "edit", |
| flag = "True", |
| )' |
| run "$in" 'remove_if_equal flag True' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_remove_if_equal_string_does_not_match() { |
| in='go_library( |
| name = "edit", |
| flag = "False", |
| )' |
| ERROR=3 run "$in" 'remove_if_equal flag True' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| flag = "False", |
| )' |
| } |
| |
| function test_remove_if_equal_string_attr_string() { |
| in='go_library( |
| name = "edit", |
| toolchain = "something", |
| )' |
| run "$in" 'remove_if_equal toolchain something' '//pkg:edit' |
| assert_equals 'go_library(name = "edit")' |
| } |
| |
| function test_move_last_dep() { |
| run "$one_dep" 'move deps runtime_deps //buildifier:build' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_move_dep() { |
| run "$two_deps" 'move deps runtime_deps //buildifier:build' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = ["//buildifier:build"], |
| deps = [":local"], |
| )' |
| } |
| |
| function test_move_two_deps() { |
| run "$two_deps" 'move deps runtime_deps //buildifier:build :local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = [ |
| ":local", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_move_dep_using_long_label() { |
| run "$two_deps" 'move deps runtime_deps //pkg:local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = [":local"], |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_move_dep_with_comment() { |
| local input='go_library( |
| name = "edit", |
| deps = [ |
| ":local", # needed at runtime for some obscure reason |
| "//buildifier:build", |
| ], |
| )' |
| run "$input" 'move deps runtime_deps :local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = [ |
| ":local", # needed at runtime for some obscure reason |
| ], |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_move_nonexistent_item() { |
| run "$two_deps" 'move deps runtime_deps //foo:bar :local' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = [":local"], |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_move_all_deps_to_new_attribute() { |
| run "$two_deps" 'move deps runtime_deps *' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = [ |
| ":local", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_move_all_deps_to_existing_attribute() { |
| local input='go_library( |
| name = "edit", |
| runtime_deps = [":remote"], |
| deps = [ |
| ":local", |
| "//buildifier:build", |
| ], |
| )' |
| run "$input" 'move deps runtime_deps *' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| runtime_deps = [ |
| ":local", |
| ":remote", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_rename_attribute() { |
| run "$two_deps" 'rename deps data' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| data = [ |
| ":local", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_rename_attribute_already_exist() { |
| in='cc_library( |
| name = "edit", |
| srcs = ["b.h"], |
| hdrs = ["a.h"], |
| )' |
| ERROR=2 run "$in" 'rename srcs hdrs' '//pkg:edit' |
| assert_equals "$in" |
| assert_err "attribute hdrs already exists in rule edit" |
| } |
| |
| function test_rename_attribute_does_not_exist() { |
| ERROR=2 run "$two_deps" 'rename data resources' '//pkg:edit' |
| assert_equals "$two_deps" |
| assert_err "no attribute data found in rule edit" |
| } |
| |
| function test_with_python_code() { |
| in='# test that Python code is preserved and does not crash |
| top_files = [ |
| "lgpl.txt", |
| "README", |
| ] |
| |
| boom_files = top_files |
| |
| boom_files.extend(glob(["**/*.hpp"])) |
| |
| boom_files.remove("src/math/special_functions.hpp") |
| |
| # comment for foo |
| def foo(x): |
| x += [1, 2] |
| |
| foo(boom_files)' |
| |
| run "$in" 'add default_visibility //visibility:public' '//pkg:__pkg__' |
| assert_equals "package(default_visibility = [\"//visibility:public\"]) |
| |
| $in" |
| } |
| |
| function test_replace_string_attr() { |
| in='go_library( |
| name = "edit", |
| shared_library = ":local", # Suffix comment. |
| )' |
| run "$in" 'replace shared_library :local :new' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| shared_library = ":new", # Suffix comment. |
| )' |
| } |
| |
| function test_replace_string_attr_quotes() { |
| in='go_library( |
| name = "edit", |
| shared_library = ":local", # Suffix comment. |
| )' |
| run "$in" 'replace shared_library ":local" ":new"' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| shared_library = ":new", # Suffix comment. |
| )' |
| } |
| |
| function test_replace_string_attr_no_match() { |
| in='go_library( |
| name = "edit", |
| library = ":no_match", # Suffix comment. |
| )' |
| ERROR=3 run "$in" 'replace library :local :new' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| library = ":no_match", # Suffix comment. |
| )' |
| } |
| |
| function test_replace_concatenated_lists() { |
| in='go_library( |
| name = "edit", |
| deps = [":local"] + CONSTANT, |
| )' |
| run "$in" 'replace deps :local :new' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":new"] + CONSTANT, |
| )' |
| } |
| |
| function test_replace_dep() { |
| in='go_library( |
| name = "edit", |
| deps = [ |
| # Before-comment. |
| ":local", # Suffix comment. |
| "//buildifier:build", |
| ] + select({ |
| "//tools/some:condition": [ |
| "//some:value", |
| ], |
| }), |
| )' |
| run "$in" 'replace deps :local :new' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| # Before-comment. |
| ":new", # Suffix comment. |
| "//buildifier:build", |
| ] + select({ |
| "//tools/some:condition": [ |
| "//some:value", |
| ], |
| }), |
| )' |
| } |
| |
| function test_replace_dep_select() { |
| # Replace a dep inside a select statement |
| in='go_library( |
| name = "edit", |
| deps = [":dep"] + select({ |
| "//tools/some:condition": [ |
| "//some/other:value", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| "//conditions:default": SOME_CONSTANT, |
| }), |
| )' |
| run "$in" 'replace deps //some/other:value :new' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":dep"] + select({ |
| "//tools/some:condition": [ |
| ":new", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| ], |
| "//conditions:default": SOME_CONSTANT, |
| }), |
| )' |
| } |
| |
| function test_replace_dep_using_long_label() { |
| run "$two_deps" 'replace deps //pkg:local //pkg:new' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| ":new", |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_replace_in_all_attributes() { |
| in='java_library(name = "a", data = ["b","c"], exports = ["c"], deps = ["c","d"])' |
| run "$in" 'replace * c e' '//pkg:a' |
| assert_equals 'java_library( |
| name = "a", |
| data = [ |
| "b", |
| "e", |
| ], |
| exports = ["e"], |
| deps = [ |
| "d", |
| "e", |
| ], |
| )' |
| } |
| |
| function test_substitute_dep() { |
| in='go_library( |
| name = "edit", |
| deps = [ |
| # Before-comment. |
| "//some:value", # Suffix comment. |
| "//some:value2", # Suffix comment. |
| "//buildifier:build", |
| ] |
| )' |
| run "$in" 'substitute deps //some:(.*) //new:${1}' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| # Before-comment. |
| "//new:value", # Suffix comment. |
| "//new:value2", # Suffix comment. |
| "//buildifier:build", |
| ], |
| )' |
| } |
| |
| function test_substitute_dep_select() { |
| # Replace a dep inside a select statement |
| in='go_library( |
| name = "edit", |
| deps = [":dep"] + select({ |
| "//tools/some:condition": [ |
| "//some/other:value", |
| "//some/other:value2", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| "//yet/another:value2", |
| ], |
| "//conditions:default": SOME_CONSTANT, |
| }), |
| )' |
| run "$in" 'substitute deps //some/other:(.*) :${1}' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [":dep"] + select({ |
| "//tools/some:condition": [ |
| ":value", |
| ":value2", |
| ], |
| "//tools/other:condition": [ |
| "//yet/another:value", |
| "//yet/another:value2", |
| ], |
| "//conditions:default": SOME_CONSTANT, |
| }), |
| )' |
| } |
| |
| function test_delete_rule_all() { |
| in='cc_library(name = "all") |
| cc_library(name = "b")' |
| run "$in" 'delete' '//pkg:all' |
| assert_equals 'cc_library(name = "b")' |
| } |
| |
| function test_delete_rule_star() { |
| in='cc_library(name = "all") |
| cc_library(name = "b")' |
| run "$in" 'delete' '//pkg:*' |
| [ $(wc -c < "$root/pkg/BUILD") -eq 0 ] || fail "Expected empty file" |
| } |
| |
| function test_delete_rule() { |
| in='cc_library(name = "a") |
| |
| cc_library(name = "b") |
| |
| # Comment to make sure it is preserved |
| |
| a = 42 |
| |
| cc_library(name = "c")' |
| |
| run "$in" 'delete' '//pkg:b' |
| assert_equals 'cc_library(name = "a") |
| |
| # Comment to make sure it is preserved |
| |
| a = 42 |
| |
| cc_library(name = "c")' |
| } |
| |
| function test_delete_package() { |
| in='package(default_visibility = ["//visibility:public"]) |
| |
| cc_library(name = "a")' |
| |
| run "$in" 'delete' '//pkg:__pkg__' |
| assert_equals 'cc_library(name = "a")' |
| } |
| |
| function test_delete_missing_package() { |
| in='cc_library(name = "a")' |
| ERROR=3 run "$in" 'delete' '//pkg:__pkg__' |
| assert_equals "$in" |
| } |
| |
| function test_delete_target_without_name() { |
| in='load("/path/f", "a") |
| |
| a(arg1 = "foo")' |
| |
| run "$in" 'delete' '//pkg:%a' |
| assert_equals 'load("/path/f", "a")' |
| } |
| |
| function test_delete_using_line_number() { |
| in='load("/path/f", "a") |
| |
| a(arg1 = "foo")' |
| |
| run "$in" 'delete' '//pkg:%3' |
| assert_equals 'load("/path/f", "a")' |
| } |
| |
| function test_copy() { |
| in='proto_library(name = "from", visibility = ["://foo"] + CONST) |
| |
| cc_binary(name = "to")' |
| |
| run "$in" 'copy visibility from' '//pkg:to' |
| assert_equals 'proto_library( |
| name = "from", |
| visibility = ["://foo"] + CONST, |
| ) |
| |
| cc_binary( |
| name = "to", |
| visibility = ["://foo"] + CONST, |
| )' |
| } |
| |
| function test_copy_overwrite() { |
| in='proto_library(name = "from", testonly = 1) |
| |
| cc_binary(name = "to", testonly = 2)' |
| |
| run "$in" 'copy testonly from' '//pkg:to' |
| assert_equals 'proto_library( |
| name = "from", |
| testonly = 1, |
| ) |
| |
| cc_binary( |
| name = "to", |
| testonly = 1, |
| )' |
| } |
| |
| function test_copy_no_overwrite() { |
| in='proto_library(name = "from", visibility = ["://foo"] + CONST) |
| |
| cc_binary(name = "to")' |
| |
| run "$in" 'copy_no_overwrite visibility from' '//pkg:to' |
| assert_equals 'proto_library( |
| name = "from", |
| visibility = ["://foo"] + CONST, |
| ) |
| |
| cc_binary( |
| name = "to", |
| visibility = ["://foo"] + CONST, |
| )' |
| } |
| |
| function test_copy_no_overwrite_no_overwrite() { |
| in='proto_library(name = "from", testonly = 1) |
| |
| cc_binary(name = "to", testonly = 2)' |
| |
| run "$in" 'copy_no_overwrite testonly from' '//pkg:to' |
| assert_equals 'proto_library( |
| name = "from", |
| testonly = 1, |
| ) |
| |
| cc_binary( |
| name = "to", |
| testonly = 2, |
| )' |
| } |
| |
| function test_copy_no_from_rule() { |
| in='go_binary(name = "to")' |
| ERROR=2 run "$in" 'copy visibility from' '//pkg:to' |
| assert_err "could not find rule 'from'" |
| } |
| |
| function test_copy_no_attribute() { |
| in='go_binary(name = "from") |
| |
| go_binary(name = "to")' |
| ERROR=2 run "$in" 'copy visibility from' '//pkg:to' |
| assert_err "rule 'from' does not have attribute 'visibility'" |
| } |
| |
| function test_set_kind() { |
| in='cc_library(name = "a")' |
| |
| run "$in" 'set kind java_library' '//pkg:a' |
| assert_equals 'java_library(name = "a")' |
| } |
| |
| function test_set_list() { |
| in='cc_library(name = "a")' |
| |
| run "$in" 'set copts foo' '//pkg:a' |
| assert_equals 'cc_library( |
| name = "a", |
| copts = ["foo"], |
| )' |
| } |
| |
| function test_set_list() { |
| in='cc_library(name = "a")' |
| |
| run "$in" 'set copts foo bar baz' '//pkg:a' |
| assert_equals 'cc_library( |
| name = "a", |
| copts = [ |
| "foo", |
| "bar", |
| "baz", |
| ], |
| )' |
| } |
| |
| function test_set_string() { |
| in='cc_library(name = "a")' |
| |
| run "$in" 'set name b' '//pkg:a' |
| assert_equals 'cc_library(name = "b")' |
| } |
| |
| function test_set_int() { |
| in='cc_test(name = "a")' |
| |
| run "$in" 'set shard_count 8' '//pkg:a' |
| assert_equals 'cc_test( |
| name = "a", |
| shard_count = 8, |
| )' |
| } |
| |
| function test_set_if_absent_absent() { |
| in='soy_js(name = "a")' |
| |
| run "$in" 'set_if_absent allowv1syntax 1' '//pkg:a' |
| assert_equals 'soy_js( |
| name = "a", |
| allowv1syntax = 1, |
| )' |
| } |
| |
| function test_set_if_absent_present() { |
| in='soy_js( |
| name = "a", |
| allowv1syntax = 0 |
| )' |
| |
| run "$in" 'set_if_absent allowv1syntax 1' '//pkg:a' |
| assert_equals 'soy_js( |
| name = "a", |
| allowv1syntax = 0, |
| )' |
| } |
| |
| function test_set_custom_code() { |
| in='cc_test(name = "a")' |
| |
| run "$in" 'set attr foo(a=1,b=2)' '//pkg:a' |
| assert_equals 'cc_test( |
| name = "a", |
| attr = foo( |
| a = 1, |
| b = 2, |
| ), |
| )' |
| } |
| |
| function assert_output() { |
| echo "$1" > "expected" |
| diff -u "expected" "$log" || fail "Output didn't match" |
| } |
| |
| function assert_output_any_order() { |
| echo "$1" | sort > "expected" |
| sort < "$log" > "log_sorted" |
| diff -u "expected" "log_sorted" || fail "Output didn't match" |
| } |
| |
| function test_print_all_functions() { |
| in='package(default_visibility = ["//visibility:public"]) |
| cc_test(name = "a") |
| java_binary(name = "b") |
| exports_files(["a.cc"])' |
| run "$in" 'print kind' '//pkg:all' |
| assert_output 'package |
| cc_test |
| java_binary |
| exports_files' |
| } |
| |
| function test_print_java_libraries() { |
| in='cc_test(name = "a") |
| java_library(name = "b") |
| java_library(name = "c")' |
| run "$in" 'print' '//pkg:%java_library' |
| assert_output 'b java_library |
| c java_library' |
| } |
| |
| function test_refer_to_rule_by_location() { |
| in='cc_test(name = "a") |
| java_library(name = "b") |
| java_library(name = "c")' |
| run "$in" 'print label' '//pkg:%2' |
| assert_output '//pkg:b' |
| } |
| |
| function test_refer_to_rule_by_location_no_such_rule() { |
| in='cc_test(name = "a") |
| java_library(name = "b") |
| java_library(name = "c")' |
| ERROR=2 run "$in" 'print label' '//pkg:%999' |
| assert_err "rule '%999' not found" |
| } |
| |
| function test_visibility_exported_file() { |
| in='exports_files(["a.txt", "b.txt"])' |
| run "$in" 'set visibility //foo:__pkg__' '//pkg:b.txt' |
| assert_equals 'exports_files( |
| [ |
| "a.txt", |
| "b.txt", |
| ], |
| visibility = ["//foo:__pkg__"], |
| )' |
| } |
| |
| function test_print_srcs() { |
| in='cc_test(name = "a", srcs = ["foo.cc"]) |
| java_library(name = "b") |
| java_library(name = "c", srcs = ["foo.java", "bar.java"])' |
| run "$in" 'print name kind srcs' '//pkg:*' |
| assert_output 'a cc_test [foo.cc] |
| b java_library (missing) |
| c java_library [foo.java bar.java]' |
| assert_err 'rule "//pkg:b" has no attribute "srcs"' |
| } |
| |
| function test_print_empty_list() { |
| in='package() |
| java_library(name = "b", deps = [])' |
| run "$in" 'print deps' '//pkg:b' |
| assert_output '[]' |
| } |
| |
| function test_print_label() { |
| in='package() |
| java_library(name = "b")' |
| run "$in" 'print label kind' '//pkg:*' |
| assert_output '//pkg:b java_library' |
| } |
| |
| function test_print_label_json() { |
| in='package() |
| java_library(name = "b")' |
| run --output_json "$in" 'print label kind' '//pkg:*' |
| assert_output '{"records":[{"fields":[{"text":"//pkg:b"},{"text":"java_library"}]}]}' |
| } |
| |
| function test_print_label_ellipsis() { |
| mkdir -p "ellipsis_test/foo/bar" |
| echo 'java_library(name = "test")' > "ellipsis_test/BUILD" |
| echo 'java_library(name = "foo")' > "ellipsis_test/foo/BUILD" |
| echo 'java_library(name = "foobar"); java_library(name = "bar");' > "ellipsis_test/foo/bar/BUILD" |
| |
| in='package() |
| java_library(name = "b")' |
| run "$in" 'print label' '//ellipsis_test/...:*' |
| assert_output_any_order '//ellipsis_test:test |
| //ellipsis_test/foo |
| //ellipsis_test/foo/bar:foobar |
| //ellipsis_test/foo/bar' |
| } |
| |
| function test_print_startline() { |
| in='package() |
| java_library(name = "b")' |
| run "$in" 'print startline label' '//pkg:*' |
| assert_output '2 //pkg:b' |
| } |
| |
| function test_print_endline() { |
| in='package() |
| java_library( |
| name = "b" |
| )' |
| run "$in" 'print endline label' '//pkg:*' |
| assert_output '4 //pkg:b' |
| } |
| |
| function test_print_rule() { |
| in='cc_library(name = "a") |
| |
| # Comment before |
| cc_test( |
| name = "b", |
| copts = [ |
| # comment before |
| "foo", # comment after |
| ], |
| ) |
| |
| cc_library(name = "c")' |
| run "$in" 'print rule' '//pkg:b' |
| assert_output '# Comment before |
| cc_test( |
| name = "b", |
| copts = [ |
| # comment before |
| "foo", # comment after |
| ], |
| )' |
| } |
| |
| function test_print_version() { |
| in='gendeb(name = "foobar", version = "12345")' |
| run "$in" 'print version' '//pkg:*' |
| assert_output '12345' |
| } |
| |
| function test_print_attrs() { |
| in='package() |
| cc_library( |
| name = "a", |
| srcs = ["a.cc"], |
| deps = ["//foo"], |
| )' |
| run "$in" 'print attrs' '//pkg:*' |
| assert_output '[] |
| [name srcs deps]' |
| } |
| |
| function test_new_cc_library() { |
| in='cc_test(name = "a") |
| |
| # end of file comment' |
| run "$in" 'new cc_library foo' '//pkg:__pkg__' |
| assert_equals 'cc_test(name = "a") |
| |
| cc_library(name = "foo") |
| |
| # end of file comment' |
| } |
| |
| function test_new_cc_library_after_other_libraries() { |
| in='cc_library(name = "l") |
| cc_test(name = "a")' |
| run "$in" 'new cc_library foo' '//pkg:__pkg__' |
| assert_equals 'cc_library(name = "l") |
| |
| cc_library(name = "foo") |
| |
| cc_test(name = "a")' |
| } |
| |
| function test_new_cc_library_empty_file() { |
| in='' |
| run "$in" 'new cc_library foo' '//pkg:__pkg__' |
| assert_equals 'cc_library(name = "foo")' |
| } |
| |
| function test_new_java_library() { |
| in='cc_test(name = "a")' |
| run "$in" 'new java_library foo' 'pkg/BUILD' |
| assert_equals 'cc_test(name = "a") |
| |
| java_library(name = "foo")' |
| } |
| |
| function test_new_already_exists() { |
| in='cc_test(name = "a")' |
| ERROR=2 run "$in" 'new cc_library a' '//pkg:__pkg__' |
| assert_err "rule 'a' already exists" |
| } |
| |
| function test_new_before_first() { |
| in='cc_test(name = "a")' |
| run "$in" 'new java_library foo before a' 'pkg/BUILD' |
| assert_equals 'java_library(name = "foo") |
| |
| cc_test(name = "a")' |
| } |
| |
| function test_new_before_last() { |
| in='cc_test(name = "a") |
| |
| cc_test(name = "b")' |
| run "$in" 'new java_library foo before b' 'pkg/BUILD' |
| assert_equals 'cc_test(name = "a") |
| |
| java_library(name = "foo") |
| |
| cc_test(name = "b")' |
| } |
| |
| function test_new_before_nonexistent_rule() { |
| in='cc_test(name = "a") |
| |
| cc_test(name = "b")' |
| run "$in" 'new java_library foo before bar' 'pkg/BUILD' |
| assert_equals 'cc_test(name = "a") |
| |
| cc_test(name = "b") |
| |
| java_library(name = "foo")' |
| } |
| |
| function test_new_before_already_exists() { |
| in='cc_test(name = "foo") |
| cc_test(name = "new_rule")' |
| ERROR=2 run "$in" 'new java_library new_rule before foo' 'pkg/BUILD' |
| assert_err "rule 'new_rule' already exists" |
| } |
| |
| function test_new_after_first() { |
| in='cc_test(name = "a")' |
| run "$in" 'new java_library foo after a' 'pkg/BUILD' |
| assert_equals 'cc_test(name = "a") |
| |
| java_library(name = "foo")' |
| } |
| |
| function test_new_after_last() { |
| in='cc_test(name = "a") |
| |
| cc_test(name = "b")' |
| run "$in" 'new java_library foo after b' 'pkg/BUILD' |
| assert_equals 'cc_test(name = "a") |
| |
| cc_test(name = "b") |
| |
| java_library(name = "foo")' |
| } |
| |
| function test_new_after_by_location() { |
| in=' |
| cc_test(name = "a") |
| |
| cc_test(name = "b")' |
| run "$in" 'new java_library foo after %2' 'pkg/BUILD' |
| assert_equals 'cc_test(name = "a") |
| |
| java_library(name = "foo") |
| |
| cc_test(name = "b")' |
| } |
| |
| function test_new_after_package() { |
| in=' |
| load("/foo/bar", "x", "y", "z") |
| package(default_visibility = "//visibility:public") |
| |
| cc_test(name = "a") |
| |
| cc_test(name = "b")' |
| run "$in" 'new java_library foo after __pkg__' 'pkg/BUILD' |
| assert_equals 'load("/foo/bar", "x", "y", "z") |
| |
| package(default_visibility = "//visibility:public") |
| |
| java_library(name = "foo") |
| |
| cc_test(name = "a") |
| |
| cc_test(name = "b")' |
| } |
| |
| function test_not_enough_arguments() { |
| ERROR=1 run "$one_dep" 'add foo' '//pkg:edit' |
| assert_err "Too few arguments for command 'add', expected at least 2." |
| } |
| |
| function test_too_many_arguments() { |
| ERROR=1 run "$one_dep" 'delete foo' '//pkg:edit' |
| assert_err "Too many arguments for command 'delete', expected at most 0." |
| } |
| |
| function test_package_name_missing() { |
| ERROR=2 run "$one_dep" 'add deps //dep' ':edit' |
| assert_err "file not found" |
| } |
| |
| function test_nonexistent_package_name() { |
| ERROR=2 run "$one_dep" 'add deps //dep' '//doesnt_exist:edit' |
| assert_err "file not found" |
| } |
| |
| function test_nonexistent_rule_name() { |
| ERROR=2 run "$one_dep" 'add deps //dep' '//pkg:doesnt_exist' |
| assert_err "rule 'doesnt_exist' not found" |
| } |
| |
| function test_keep_going() { |
| ERROR=2 run "$one_dep" -k 'add deps //dep' 'new cc_library edit' '//pkg:doesnt_exist' '//pkg:edit' |
| assert_err "rule 'doesnt_exist' not found" |
| assert_err "rule 'edit' already exists" |
| # Make sure the commands are in the error message. |
| assert_err "add deps //dep" |
| assert_err "new cc_library edit" |
| # Make sure the full targets are in the error message. |
| assert_err "//pkg:doesnt_exist" |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| "//buildifier:build", |
| "//dep", |
| ], |
| )' |
| } |
| |
| function test_buildifier_missing() { |
| ERROR=2 run "$one_dep" '--buildifier=doesnt_exist' 'add deps //dep' '//pkg:edit' |
| assert_err "executable file not found in \$PATH" |
| } |
| |
| function test_buildifier_return_error() { |
| ERROR=2 run "$one_dep" '--buildifier=false' 'add deps //dep' '//pkg:edit' |
| assert_err "running buildifier: exit status 1" |
| } |
| |
| function test_add_deps_to_targets_in_same_package() { |
| in='cc_library(name = "smurf") |
| cc_library(name = "smorf")' |
| run "$in" 'add deps //foo:bar' //pkg:smurf //pkg:smorf |
| assert_equals 'cc_library( |
| name = "smurf", |
| deps = ["//foo:bar"], |
| ) |
| |
| cc_library( |
| name = "smorf", |
| deps = ["//foo:bar"], |
| )' |
| } |
| |
| function test_rule_comment() { |
| in='cc_library(name = "a")' |
| run "$in" 'comment Hello' //pkg:a |
| assert_equals '# Hello |
| cc_library(name = "a")' |
| } |
| |
| function test_attribute_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = ["a.cc"], |
| )' |
| run "$in" 'comment srcs Hello\ World' //pkg:a |
| assert_equals 'cc_library( |
| name = "a", |
| srcs = ["a.cc"], # Hello World |
| )' |
| } |
| |
| function test_attribute_comment_no_eol() { |
| in='cc_library( |
| name = "a", |
| srcs = ["a.cc"], |
| )' |
| run "$in" --eol-comments=false 'comment srcs Hello\ World' //pkg:a |
| assert_equals 'cc_library( |
| name = "a", |
| # Hello World |
| srcs = ["a.cc"], |
| )' |
| } |
| |
| function test_value_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", |
| "b.cc", # Old |
| ], |
| )' |
| run "$in" 'comment srcs a.cc Hello' 'comment srcs b.cc New' //pkg:a |
| assert_equals 'cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", # Hello |
| "b.cc", # New |
| ], |
| )' |
| } |
| |
| function test_value_multiline_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", |
| "b.cc", |
| ], |
| )' |
| run "$in" 'comment srcs b.cc Just\ a\ |
| multiline\ comment' //pkg:a |
| assert_equals 'cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", |
| # Just a |
| # multiline comment |
| "b.cc", |
| ], |
| )' |
| run "$in" 'comment srcs b.cc Another\nmultiline\ comment' //pkg:a |
| assert_equals 'cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", |
| # Another |
| # multiline comment |
| "b.cc", |
| ], |
| )' |
| } |
| |
| function test_rule_print_comment() { |
| in='# Hello |
| cc_library(name = "a")' |
| run "$in" 'print_comment' //pkg:a |
| assert_output 'Hello' |
| } |
| |
| function test_rule_print_comment_with_suffix_and_after() { |
| in='# Hello Before |
| cc_library(name = "a") # Hello Suffix |
| # Hello After' |
| run "$in" 'print_comment' //pkg:a |
| assert_output 'Hello Before Hello Suffix Hello After' |
| } |
| |
| function test_attribute_print_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = ["a.cc"], # Hello World |
| )' |
| run "$in" 'print_comment srcs' //pkg:a |
| assert_output 'Hello World' |
| } |
| |
| function test_attribute_print_comment_no_eol() { |
| in='cc_library( |
| name = "a", |
| # Hello World |
| srcs = ["a.cc"], |
| )' |
| run "$in" --eol-comments=false 'print_comment srcs' //pkg:a |
| assert_output 'Hello World' |
| } |
| |
| function test_value_print_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", # World |
| "b.cc", # Hello |
| ], |
| )' |
| run "$in" 'print_comment srcs b.cc' 'print_comment srcs a.cc' //pkg:a |
| assert_output 'Hello |
| World' |
| } |
| |
| function test_value_multiline_print_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", |
| # Just a |
| # multiline comment |
| "b.cc", |
| ], |
| )' |
| run "$in" 'print_comment srcs b.cc' //pkg:a |
| assert_output 'Just a multiline comment' |
| } |
| |
| function test_value_inside_select_print_comment() { |
| in='cc_library( |
| name = "a", |
| srcs = [ |
| "a.cc", # World |
| "b.cc", # Hello |
| ] + select({ |
| "foo": [ |
| "c.cc", # hello |
| "d.cc", # world |
| ], |
| }), |
| )' |
| run "$in" 'print_comment srcs c.cc' 'print_comment srcs d.cc' //pkg:a |
| assert_output 'hello |
| world' |
| } |
| |
| # Test both absolute and relative package names |
| function test_path() { |
| mkdir -p "java/com/foo/myproject" |
| echo 'java_library(name = "foo")' > "java/com/foo/myproject/BUILD" |
| |
| $buildozer --buildifier= 'add deps a' "java/com/foo/myproject:foo" |
| cd java |
| $buildozer --buildifier= 'add deps b' "com/foo/myproject:foo" |
| cd com |
| $buildozer --buildifier= 'add deps c' "//java/com/foo/myproject:foo" |
| cd foo |
| $buildozer --buildifier= 'add deps d' "myproject:foo" |
| cd myproject |
| $buildozer --buildifier= 'add deps e' ":foo" |
| |
| # Check that all dependencies have been added |
| echo -n 'java_library(name="foo",deps=["a","b","c","d","e",],)' > expected |
| tr -d ' \n' < "BUILD" > result |
| diff -u "expected" "result" || fail "Output didn't match" |
| } |
| |
| function setup_file_test() { |
| mkdir -p "a/pkg1" |
| mkdir -p "a/pkg2" |
| cat > a/pkg1/BUILD <<EOF |
| cc_library(name = "foo") |
| cc_library(name = "bar") |
| EOF |
| cat > a/pkg2/BUILD << EOF |
| cc_library(name = "foo") |
| cc_library(name = "bar") |
| EOF |
| |
| echo -n " |
| new cc_library baz|//a/pkg1:__pkg__ |
| add deps a|//a/pkg1:baz |
| add deps a|a/pkg1:foo |
| add deps x#|a/pkg2:foo |
| # add deps y|a/pkg1:foo |
| # add deps y|a/pkg2:foo |
| |
| add deps y|a/pkg2:bar|add deps c|a/pkg1:foo |
| add deps z|a/pkg2:bar |
| add deps a|//a/pkg1:bar |
| add deps b|a/pkg1:foo" > commands |
| } |
| |
| function check_file_test() { |
| # Check that all dependencies have been added |
| cat > expected_pkg_1 <<EOF |
| cc_library( |
| name = "foo", |
| deps = [ |
| "a", |
| "b", |
| "c", |
| "y", |
| ], |
| ) |
| |
| cc_library( |
| name = "bar", |
| deps = ["a"], |
| ) |
| |
| cc_library( |
| name = "baz", |
| deps = ["a"], |
| ) |
| EOF |
| diff -u expected_pkg_1 a/pkg1/BUILD || fail "Output didn't match" |
| |
| cat > expected_pkg_2 <<EOF |
| cc_library( |
| name = "foo", |
| deps = ["x#"], |
| ) |
| |
| cc_library( |
| name = "bar", |
| deps = [ |
| "c", |
| "y", |
| "z", |
| ], |
| ) |
| EOF |
| diff -u expected_pkg_2 a/pkg2/BUILD || fail "Output didn't match" |
| } |
| |
| # Test reading commands from stdin |
| function test_file() { |
| setup_file_test |
| $buildozer --buildifier= -f - < commands |
| check_file_test |
| |
| setup_file_test |
| $buildozer --buildifier= -f commands |
| check_file_test |
| } |
| |
| # Test for selectively adding to specific rule types |
| function test_add_dep_filtered() { |
| in='go_library( |
| name = "edit", |
| deps = ["//pkg:a"], |
| )' |
| ERROR=3 run "$in" -types='cc_library' 'add deps //pkg:b' '//pkg:edit' |
| assert_equals "$in" |
| } |
| |
| function test_add_dep_unfiltered() { |
| in='cc_library( |
| name = "edit", |
| deps = ["//pkg:a"], |
| )' |
| run "$in" -types='cc_library' 'add deps //pkg:b' '//pkg:edit' |
| assert_equals 'cc_library( |
| name = "edit", |
| deps = [ |
| ":b", |
| "//pkg:a", |
| ], |
| )' |
| } |
| |
| function test_add_library_always_unfiltered() { |
| in='cc_library( |
| name = "edit", |
| deps = ["//pkg:a"], |
| )' |
| run "$in" -types='go_library' 'new cc_library a' '//pkg:__pkg__' |
| assert_equals 'cc_library( |
| name = "edit", |
| deps = ["//pkg:a"], |
| ) |
| |
| cc_library(name = "a")' |
| } |
| |
| function test_new_load_after_package() { |
| in='# Comment |
| |
| package(default_visibility = ["//visibility:public"]) |
| |
| x( |
| name="x", |
| srcs=["x.cc"], |
| )' |
| |
| run "$in" 'new_load /foo/bar x y z' '//pkg:x' |
| assert_equals '# Comment |
| |
| load("/foo/bar", "x", "y", "z") |
| |
| package(default_visibility = ["//visibility:public"]) |
| |
| x( |
| name = "x", |
| srcs = ["x.cc"], |
| )' |
| } |
| |
| |
| function test_new_load_no_package() { |
| in='x( |
| name="x", |
| srcs=["x.cc"], |
| )' |
| |
| run "$in" 'new_load /foo/bar x y z' '//pkg:x' |
| assert_equals 'load("/foo/bar", "x", "y", "z") |
| |
| x( |
| name = "x", |
| srcs = ["x.cc"], |
| )' |
| } |
| |
| |
| function test_new_load_empty_file() { |
| run '' 'new_load /foo/bar x y z' pkg/BUILD |
| assert_equals 'load("/foo/bar", "x", "y", "z")' |
| } |
| |
| function test_new_load_only_comments() { |
| in='# Just comments |
| # And more comments' |
| |
| run "$in" 'new_load /foo/bar x y z' pkg/BUILD |
| assert_equals '# Just comments |
| # And more comments |
| |
| load("/foo/bar", "x", "y", "z")' |
| } |
| |
| function test_new_load_after_workspace() { |
| in='# A comment |
| |
| workspace(name = "blah")' |
| |
| run "$in" 'new_load /foo/bar x y z' pkg/BUILD |
| assert_equals '# A comment |
| |
| workspace(name = "blah") |
| |
| load("/foo/bar", "x", "y", "z")' |
| } |
| |
| function test_new_load_existing() { |
| in='load("/foo/bar", "y") |
| ' |
| |
| run "$in" 'new_load /foo/bar z x y' pkg/BUILD |
| assert_equals 'load("/foo/bar", "x", "y", "z")' |
| } |
| |
| function test_new_load_existing_multiple() { |
| in='load("/foo/bar", "x") |
| load("/foo/bar", "y") |
| ' |
| |
| run "$in" 'new_load /foo/bar x y z' pkg/BUILD |
| assert_equals 'load("/foo/bar", "x", "y", "z")' |
| } |
| |
| function test_new_load_wrong_location() { |
| in='load("/foo/bar", "x") |
| ' |
| |
| run "$in" 'new_load /baz/bam y z' pkg/BUILD |
| assert_equals 'load("/baz/bam", "y", "z") |
| load("/foo/bar", "x")' |
| } |
| |
| function test_print_attribute_value_with_spaces() { |
| in='cc_test(name = "a", deprecation = "one two three")' |
| run "$in" 'print deprecation' '//pkg:a' |
| assert_output '"one two three"' |
| } |
| |
| function test_insert_into_variable() { |
| in='some_var = ["a"] |
| some_rule(name="r", deps=some_var)' |
| |
| run "$in" --edit-variables 'add deps b' '//pkg:r' |
| assert_equals 'some_var = [ |
| "a", |
| "b", |
| ] |
| |
| some_rule( |
| name = "r", |
| deps = some_var, |
| )' |
| } |
| |
| function test_insert_into_variable_by_adding() { |
| in='some_var = glob(["x"]) |
| some_rule(name="r", deps=some_var)' |
| |
| run "$in" --edit-variables "add deps b" '//pkg:r' |
| assert_equals 'some_var = glob(["x"]) + ["b"] |
| |
| some_rule( |
| name = "r", |
| deps = some_var, |
| )' |
| } |
| |
| function test_insert_into_same_variable_twice() { |
| in='some_var = ["a"] |
| some_rule(name="r1", deps=some_var) |
| some_rule(name="r2", deps=some_var)' |
| |
| run "$in" --edit-variables "add deps b" '//pkg:r1' '//pkg:r2' |
| assert_equals 'some_var = [ |
| "a", |
| "b", |
| ] |
| |
| some_rule( |
| name = "r1", |
| deps = some_var, |
| ) |
| |
| some_rule( |
| name = "r2", |
| deps = some_var, |
| )' |
| } |
| |
| function test_pkg_recursive_wildcard() { |
| mkdir -p foo/bar/baz |
| mkdir -p foo/abc |
| |
| cat > foo/BUILD <<EOF |
| matching_rule(name = "r1", deps = [":bar"]) |
| EOF |
| cat > foo/bar/BUILD <<EOF |
| non_matching_rule(name = "r2", deps = [":bar"]) |
| EOF |
| cat > foo/bar/baz/BUILD <<EOF |
| matching_rule(name = "r3", deps = [":bar"]) |
| EOF |
| cat > foo/abc/BUILD <<EOF |
| matching_rule(name = "r4", deps = [":bar"]) |
| EOF |
| |
| run_with_current_workspace "$buildozer --buildifier=" "add deps new_dep" "//foo/...:%matching_rule" |
| assert_no_err "rule '%matching_rule' not found" |
| |
| assert_equals 'matching_rule( |
| name = "r1", |
| deps = [ |
| "new_dep", |
| ":bar", |
| ], |
| )' foo |
| |
| assert_equals 'non_matching_rule(name = "r2", deps = [":bar"])' foo/bar |
| |
| assert_equals 'matching_rule( |
| name = "r3", |
| deps = [ |
| "new_dep", |
| ":bar", |
| ], |
| )' foo/bar/baz |
| |
| assert_equals 'matching_rule( |
| name = "r4", |
| deps = [ |
| "new_dep", |
| ":bar", |
| ], |
| )' foo/abc |
| } |
| |
| function test_add_dep_string() { |
| # Add a string without quotes, a quoted string (should be unquoted automatically) |
| # and a quoted string with quotes inside (should be unquoted just once). |
| run "$one_dep" 'add deps //foo "//bar" "\"//baz\""' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = [ |
| "\"//baz\"", |
| "//bar", |
| "//buildifier:build", |
| "//foo", |
| ], |
| )' |
| } |
| |
| function test_remove_dep_string() { |
| # Remove quoted and unquoted strings to make sure that `add` and `remove` |
| # unquote them equally |
| run "$quoted_deps" 'remove deps //foo "//bar" "\"//baz\""' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_set_config_string() { |
| run "$one_dep" 'set config "foo"' '//pkg:edit' |
| assert_equals 'go_library( |
| name = "edit", |
| config = "foo", |
| deps = ["//buildifier:build"], |
| )' |
| } |
| |
| function test_fix_unused_load() { |
| run 'load(":a.bzl", "a") |
| # TODO: refactor |
| |
| # begin loads |
| |
| load(":foo.bzl", "foo") # foo |
| load(":foobar.bzl", "foobar") # this one is actually used |
| load(":baz.bzl", "baz") # this is @unused |
| load(":bar.bzl", "bar") # bar |
| |
| # end loads |
| |
| # before |
| load(":qux.bzl", "qux") |
| # after |
| |
| foobar() |
| |
| load(":somewhere_else.bzl", "foobar") |
| |
| foobar() |
| |
| load(":somewhere_else.bzl", "foobar") |
| |
| foobar()' 'fix unusedLoads' 'pkg/BUILD' |
| assert_equals '# TODO: refactor |
| |
| # begin loads |
| |
| load(":baz.bzl", "baz") # this is @unused |
| load(":foobar.bzl", "foobar") # this one is actually used |
| |
| # end loads |
| |
| # before |
| # after |
| |
| load(":somewhere_else.bzl", "foobar") |
| |
| foobar() |
| |
| foobar() |
| |
| foobar()' |
| } |
| |
| function test_commands_with_targets() { |
| mkdir -p pkg1 |
| mkdir -p pkg2 |
| |
| cat > pkg1/BUILD <<EOF |
| rule(name = "r1", deps = [":bar"], compatible_with=["//env:a"]) |
| EOF |
| cat > pkg2/BUILD <<EOF |
| rule(name = "r2", compatible_with=["//env:a"]) |
| EOF |
| |
| cat > commands <<EOF |
| remove compatible_with //env:a|* |
| add deps :baz|* |
| EOF |
| $buildozer --buildifier= -f commands pkg1:* pkg2:* |
| assert_equals 'rule( |
| name = "r1", |
| deps = [ |
| ":bar", |
| ":baz", |
| ], |
| )' pkg1 |
| assert_equals 'rule( |
| name = "r2", |
| deps = [":baz"], |
| )' pkg2 |
| } |
| |
| function test_module_bazel() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| EOF |
| |
| $buildozer 'delete' //MODULE.bazel:%10 |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_module_bazel_segment() { |
| cat > go.MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| EOF |
| |
| cat > go.MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| EOF |
| |
| $buildozer 'delete' //go.MODULE.bazel:%10 |
| diff -u go.MODULE.bazel.expected go.MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_module_bazel_new() { |
| cat > MODULE.bazel <<EOF |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| bazel_dep(name = "rules_go") |
| EOF |
| |
| $buildozer 'new bazel_dep rules_go after gazelle' //MODULE.bazel:__pkg__ |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_use_repo_add() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo", "org_example_bar") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| EOF |
| |
| $buildozer 'use_repo_add @gazelle//:extensions.bzl go_deps org_example_bar com_example_foo' //MODULE.bazel:all |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_use_repo_add_dev() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| use_repo(go_dev_deps, "org_example_bar", "org_example_foo") |
| EOF |
| |
| $buildozer 'use_repo_add dev @gazelle//:extensions.bzl go_deps org_example_foo org_example_bar' //MODULE.bazel:all |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_use_repo_remove() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| EOF |
| |
| $buildozer 'use_repo_remove @gazelle//:extensions.bzl go_deps bar_example com_example_foo' //MODULE.bazel:all |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_use_repo_remove_dev() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| use_repo(go_dev_deps, "invalid_foo") |
| use_repo( |
| go_dev_deps, |
| # group these |
| "org_example_quz", |
| "org_example_foo", |
| "org_example_bar", |
| |
| # and these |
| "com_example_quz", |
| my_com_example_baz = "com_example_baz", |
| "com_example_bar", |
| ) |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True) |
| go_dev_deps.from_file(go_mod = "//:go_dev.mod") |
| use_repo( |
| go_dev_deps, |
| # group these |
| "org_example_foo", |
| "org_example_quz", |
| |
| # and these |
| "com_example_bar", |
| "com_example_quz", |
| ) |
| EOF |
| |
| $buildozer 'use_repo_remove dev @gazelle//:extensions.bzl go_deps com_example_baz org_example_bar invalid_foo' //MODULE.bazel:all |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_use_repo_add_isolated() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True) |
| go_isolated_deps.from_file(go_mod = "//:go_tool_deps.mod") |
| use_repo(go_isolated_deps, "com_example_foo") |
| |
| go_isolated_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True, isolate = True) |
| go_isolated_dev_deps.from_file(go_mod = "//:go_more_tool_deps.mod") |
| use_repo(go_isolated_dev_deps, "com_example_foo") |
| |
| go_more_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True) |
| go_more_isolated_deps.from_file(go_mod = "//:go_more_tool_deps.mod") |
| use_repo(go_more_isolated_deps, "com_example_foo") |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| |
| bazel_dep(name = "gazelle", version = "0.30.0") |
| |
| go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") |
| go_deps.from_file(go_mod = "//:go.mod") |
| use_repo(go_deps, "com_example_foo") |
| |
| go_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True) |
| go_isolated_deps.from_file(go_mod = "//:go_tool_deps.mod") |
| use_repo(go_isolated_deps, "com_example_foo") |
| |
| go_isolated_dev_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", dev_dependency = True, isolate = True) |
| go_isolated_dev_deps.from_file(go_mod = "//:go_more_tool_deps.mod") |
| use_repo(go_isolated_dev_deps, "com_example_foo", "org_example_bar") |
| |
| go_more_isolated_deps = use_extension("@gazelle//:extensions.bzl", "go_deps", isolate = True) |
| go_more_isolated_deps.from_file(go_mod = "//:go_more_tool_deps.mod") |
| use_repo(go_more_isolated_deps, "com_example_foo") |
| EOF |
| |
| $buildozer 'use_repo_add go_isolated_dev_deps org_example_bar com_example_foo' //MODULE.bazel:all |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| function test_format() { |
| cat > MODULE.bazel <<EOF |
| module( |
| name = "foo", version = "0.27.0", |
| ) |
| EOF |
| |
| cat > MODULE.bazel.expected <<EOF |
| module( |
| name = "foo", |
| version = "0.27.0", |
| ) |
| EOF |
| |
| $buildozer 'format' //MODULE.bazel:all |
| diff -u MODULE.bazel.expected MODULE.bazel || fail "Output didn't match" |
| } |
| |
| run_suite "buildozer tests" |