Migrate the rest of the Xcode tests from Bazel core (Java) to Starlark (except those that can't be migrated because they use experimental flags).

PiperOrigin-RevId: 630133992
(cherry picked from commit d5a60a61d05cb1bfaaf690a5bec532f278421202)
diff --git a/test/BUILD b/test/BUILD
index 623a81f..b8ca1d1 100644
--- a/test/BUILD
+++ b/test/BUILD
@@ -62,6 +62,7 @@
         "//lib:xcode_support",
         "//xcode:available_xcodes",
         "//xcode:xcode_config",
+        "//xcode:xcode_config_alias",
         "//xcode:xcode_version",
         "@bazel_skylib//lib:unittest",
     ],
diff --git a/test/test_helpers.bzl b/test/test_helpers.bzl
index 7917ffe..201a988 100644
--- a/test/test_helpers.bzl
+++ b/test/test_helpers.bzl
@@ -14,6 +14,8 @@
 
 """Common Starlark helpers used by apple_support tests."""
 
+load("@bazel_skylib//lib:unittest.bzl", "analysistest")
+
 visibility(["//test/..."])
 
 # Common tags used for all test fixtures to ensure that they don't build unless
@@ -22,6 +24,26 @@
     "manual",
 ]
 
+def find_action(env, mnemonic):
+    """Finds the first action with the given mnemonic in the target under test.
+
+    This generates an analysis test failure if no action was found.
+
+    Args:
+        env: The analysis test environment.
+        mnemonic: The mnemonic to find.
+
+    Returns:
+        The first action matching the mnemonic, or `None` if none was found.
+    """
+    actions = analysistest.target_actions(env)
+    for action in actions:
+        if action.mnemonic == mnemonic:
+            return action
+
+    analysistest.fail(env, "No '{}' action found".format(mnemonic))
+    return None
+
 def make_unique_namer(*, prefix, index):
     """Returns a function used to generate unique names in a package.
 
diff --git a/test/xcode_config_test.bzl b/test/xcode_config_test.bzl
index 1aa28ec..5f3da8c 100644
--- a/test/xcode_config_test.bzl
+++ b/test/xcode_config_test.bzl
@@ -17,13 +17,73 @@
 load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
 load("//xcode:available_xcodes.bzl", "available_xcodes")
 load("//xcode:xcode_config.bzl", "xcode_config")
+load("//xcode:xcode_config_alias.bzl", "xcode_config_alias")
 load("//xcode:xcode_version.bzl", "xcode_version")
-load(":test_helpers.bzl", "FIXTURE_TAGS", "make_all_tests")
+load(":test_helpers.bzl", "FIXTURE_TAGS", "find_action", "make_all_tests")
 
 visibility("private")
 
 # ------------------------------------------------------------------------------
 
+def _version_retriever_impl(ctx):
+    xcode_properties = ctx.attr.dep[apple_common.XcodeProperties]
+    version = xcode_properties.xcode_version
+    return [config_common.FeatureFlagInfo(value = version)]
+
+version_retriever = rule(
+    implementation = _version_retriever_impl,
+    attrs = {"dep": attr.label()},
+)
+
+def _provider_grabber_impl(ctx):
+    return [ctx.attr._xcode_dep[apple_common.XcodeVersionConfig]]
+
+provider_grabber = rule(
+    implementation = _provider_grabber_impl,
+    attrs = {
+        "_xcode_dep": attr.label(
+            default = configuration_field(
+                fragment = "apple",
+                name = "xcode_config_label",
+            ),
+        ),
+    },
+    fragments = ["apple"],
+)
+
+def _provider_grabber_aspect_impl(_target, ctx):
+    return [ctx.attr._xcode_dep[apple_common.XcodeVersionConfig]]
+
+provider_grabber_aspect = aspect(
+    implementation = _provider_grabber_aspect_impl,
+    attrs = {
+        "_xcode_dep": attr.label(
+            default = configuration_field(
+                fragment = "apple",
+                name = "xcode_config_label",
+            ),
+        ),
+    },
+    fragments = ["apple"],
+)
+
+def _provider_grabber_with_aspect_impl(ctx):
+    return [ctx.attr.deps[0][apple_common.XcodeVersionConfig]]
+
+provider_grabber_with_aspect = rule(
+    implementation = _provider_grabber_with_aspect_impl,
+    attrs = {
+        "deps": attr.label_list(
+            mandatory = True,
+            allow_files = True,
+            aspects = [provider_grabber_aspect],
+        ),
+    },
+    fragments = ["apple"],
+)
+
+# ------------------------------------------------------------------------------
+
 def _mutual_and_explicit_xcodes_fails(namer):
     xcode_config(
         name = namer("foo"),
@@ -555,12 +615,1558 @@
 
 # ------------------------------------------------------------------------------
 
+def _apple_common_xcode_version_config_constructor_fails_on_bad_input(namer):
+    _apple_common_xcode_version_config_fails_on_bad_input_rule(
+        name = namer("test"),
+        tags = FIXTURE_TAGS,
+    )
+
+    _apple_common_xcode_version_config_constructor_fails_on_bad_input_test(
+        name = "apple_common_xcode_version_config_constructor_fails_on_bad_input",
+        target_under_test = namer("test"),
+        # TODO: Remove once we test with Bazel 8+
+        tags = ["manual"],
+    )
+    return ["apple_common_xcode_version_config_constructor_fails_on_bad_input"]
+
+def _apple_common_xcode_version_config_fails_on_bad_input_rule_impl(_ctx):
+    return [
+        apple_common.XcodeVersionConfig(
+            ios_sdk_version = "not a valid dotted version",
+            ios_minimum_os_version = "1.2",
+            watchos_sdk_version = "1.3",
+            watchos_minimum_os_version = "1.4",
+            tvos_sdk_version = "1.5",
+            tvos_minimum_os_version = "1.6",
+            macos_sdk_version = "1.7",
+            macos_minimum_os_version = "1.8",
+            visionos_sdk_version = "1.9",
+            visionos_minimum_os_version = "1.10",
+            xcode_version = "1.11",
+            availability = "UNKNOWN",
+            xcode_version_flag = "0.0",
+            include_xcode_execution_info = False,
+        ),
+    ]
+
+_apple_common_xcode_version_config_fails_on_bad_input_rule = rule(
+    _apple_common_xcode_version_config_fails_on_bad_input_rule_impl,
+)
+
+def _apple_common_xcode_version_config_constructor_fails_on_bad_input_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "Dotted version components must all start with the form")
+    asserts.expect_failure(env, "got 'not a valid dotted version'")
+    return analysistest.end(env)
+
+_apple_common_xcode_version_config_constructor_fails_on_bad_input_test = analysistest.make(
+    _apple_common_xcode_version_config_constructor_fails_on_bad_input_test_impl,
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _apple_common_xcode_version_config_constructor(namer):
+    _apple_common_xcode_version_config_rule(
+        name = namer("test"),
+        tags = FIXTURE_TAGS,
+    )
+
+    _apple_common_xcode_version_config_constructor_test(
+        name = "apple_common_xcode_version_config_constructor",
+        target_under_test = namer("test"),
+        # TODO: Remove once we test with Bazel 8+
+        tags = ["manual"],
+    )
+    return ["apple_common_xcode_version_config_constructor"]
+
+def _apple_common_xcode_version_config_rule_impl(_ctx):
+    return [
+        apple_common.XcodeVersionConfig(
+            ios_sdk_version = "1.1",
+            ios_minimum_os_version = "1.2",
+            watchos_sdk_version = "1.3",
+            watchos_minimum_os_version = "1.4",
+            tvos_sdk_version = "1.5",
+            tvos_minimum_os_version = "1.6",
+            macos_sdk_version = "1.7",
+            macos_minimum_os_version = "1.8",
+            visionos_sdk_version = "1.9",
+            visionos_minimum_os_version = "1.10",
+            xcode_version = "1.11",
+            availability = "UNKNOWN",
+            xcode_version_flag = "0.0",
+            include_xcode_execution_info = False,
+        ),
+    ]
+
+_apple_common_xcode_version_config_rule = rule(
+    _apple_common_xcode_version_config_rule_impl,
+)
+
+def _apple_common_xcode_version_config_constructor_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "1.1", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.ios_device)))
+    asserts.equals(env, "1.1", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.ios_simulator)))
+    asserts.equals(env, "1.2", str(xcode_version_info.minimum_os_for_platform_type(apple_common.platform_type.ios)))
+    asserts.equals(env, "1.2", str(xcode_version_info.minimum_os_for_platform_type(apple_common.platform_type.catalyst)))
+    asserts.equals(env, "1.3", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.watchos_device)))
+    asserts.equals(env, "1.3", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.watchos_simulator)))
+    asserts.equals(env, "1.4", str(xcode_version_info.minimum_os_for_platform_type(apple_common.platform_type.watchos)))
+    asserts.equals(env, "1.5", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.tvos_device)))
+    asserts.equals(env, "1.5", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.tvos_simulator)))
+    asserts.equals(env, "1.6", str(xcode_version_info.minimum_os_for_platform_type(apple_common.platform_type.tvos)))
+    asserts.equals(env, "1.7", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.macos)))
+    asserts.equals(env, "1.7", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.catalyst)))
+    asserts.equals(env, "1.8", str(xcode_version_info.minimum_os_for_platform_type(apple_common.platform_type.macos)))
+    asserts.equals(env, "1.9", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.visionos_device)))
+    asserts.equals(env, "1.9", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.visionos_simulator)))
+    asserts.equals(env, "1.10", str(xcode_version_info.minimum_os_for_platform_type(apple_common.platform_type.visionos)))
+    asserts.equals(env, "1.11", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.equals(env, {
+        "requires-darwin": "",
+        "supports-xcode-requirements-set": "",
+    }, xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_apple_common_xcode_version_config_constructor_test = analysistest.make(
+    _apple_common_xcode_version_config_constructor_test_impl,
+)
+
+# ------------------------------------------------------------------------------
+
+def _config_alias_config_setting(namer):
+    version_retriever(
+        name = namer("flag_propagator"),
+        dep = namer(":alias"),
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_config(
+        name = "config_alias_config_setting__config",
+        default = namer(":version512"),
+        versions = [
+            namer(":version512"),
+            namer(":version64"),
+            namer(":version12"),
+        ],
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_config_alias(
+        name = namer("alias"),
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version64"),
+        aliases = [
+            "6.0",
+            "six",
+            "6",
+        ],
+        version = "6.4",
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version12"),
+        version = "12",
+        tags = FIXTURE_TAGS,
+    )
+
+    native.config_setting(
+        name = namer("xcode_5_1_2"),
+        flag_values = {namer(":flag_propagator"): "5.1.2"},
+    )
+
+    native.config_setting(
+        name = namer("xcode_6_4"),
+        flag_values = {namer(":flag_propagator"): "6.4"},
+    )
+
+    native.genrule(
+        name = namer("gen"),
+        srcs = [],
+        outs = [namer("out")],
+        cmd = select({
+            namer(":xcode_5_1_2"): "5.1.2",
+            namer(":xcode_6_4"): "6.4",
+            "//conditions:default": "none",
+        }),
+        tags = FIXTURE_TAGS,
+    )
+
+    _config_alias_config_setting_no_flag_test(
+        name = "config_alias_config_setting_no_flag",
+        target_under_test = namer("gen"),
+    )
+    _config_alias_config_setting_6_4_test(
+        name = "config_alias_config_setting_6_4",
+        target_under_test = namer("gen"),
+    )
+    _config_alias_config_setting_6_test(
+        name = "config_alias_config_setting_6",
+        target_under_test = namer("gen"),
+    )
+    _config_alias_config_setting_12_test(
+        name = "config_alias_config_setting_12",
+        target_under_test = namer("gen"),
+    )
+    return [
+        "config_alias_config_setting_no_flag",
+        "config_alias_config_setting_6_4",
+        "config_alias_config_setting_6",
+        "config_alias_config_setting_12",
+    ]
+
+def _config_alias_config_setting_no_flag_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.true(env, find_action(env, "Genrule").argv[-1].endswith("5.1.2"))
+    return analysistest.end(env)
+
+_config_alias_config_setting_no_flag_test = analysistest.make(
+    _config_alias_config_setting_no_flag_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:config_alias_config_setting__config",
+        )),
+    },
+)
+
+def _config_alias_config_setting_6_4_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.true(env, find_action(env, "Genrule").argv[-1].endswith("6.4"))
+    return analysistest.end(env)
+
+_config_alias_config_setting_6_4_test = analysistest.make(
+    _config_alias_config_setting_6_4_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:config_alias_config_setting__config",
+        )),
+        "//command_line_option:xcode_version": "6.4",
+    },
+)
+
+_config_alias_config_setting_6_test = analysistest.make(
+    _config_alias_config_setting_6_4_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:config_alias_config_setting__config",
+        )),
+        "//command_line_option:xcode_version": "6",
+    },
+)
+
+def _config_alias_config_setting_12_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.true(env, find_action(env, "Genrule").argv[-1].endswith("none"))
+    return analysistest.end(env)
+
+_config_alias_config_setting_12_test = analysistest.make(
+    _config_alias_config_setting_12_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:config_alias_config_setting__config",
+        )),
+        "//command_line_option:xcode_version": "12",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _default_version_config_setting(namer):
+    version_retriever(
+        name = namer("flag_propagator"),
+        dep = namer(":alias"),
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_config_alias(
+        name = namer("alias"),
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_config(
+        name = "default_version_config_setting__foo",
+        default = namer(":version512"),
+        versions = [
+            namer(":version512"),
+            namer(":version64"),
+        ],
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version64"),
+        aliases = [
+            "6.0",
+            "foo",
+            "6",
+        ],
+        version = "6.4",
+        tags = FIXTURE_TAGS,
+    )
+
+    native.config_setting(
+        name = namer("xcode_5_1_2"),
+        flag_values = {namer(":flag_propagator"): "5.1.2"},
+    )
+
+    native.config_setting(
+        name = namer("xcode_6_4"),
+        flag_values = {namer(":flag_propagator"): "6.4"},
+    )
+
+    native.genrule(
+        name = namer("gen"),
+        srcs = [],
+        outs = [namer("out")],
+        cmd = select({
+            namer(":xcode_5_1_2"): "5.1.2",
+            namer(":xcode_6_4"): "6.4",
+            "//conditions:default": "none",
+        }),
+        tags = FIXTURE_TAGS,
+    )
+
+    _default_version_config_setting_no_flag_test(
+        name = "default_version_config_setting_no_flag",
+        target_under_test = namer("gen"),
+    )
+    _default_version_config_setting_6_4_test(
+        name = "default_version_config_setting_6_4",
+        target_under_test = namer("gen"),
+    )
+    return [
+        "default_version_config_setting_no_flag",
+        "default_version_config_setting_6_4",
+    ]
+
+def _default_version_config_setting_no_flag_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.true(env, find_action(env, "Genrule").argv[-1].endswith("5.1.2"))
+    return analysistest.end(env)
+
+_default_version_config_setting_no_flag_test = analysistest.make(
+    _default_version_config_setting_no_flag_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:default_version_config_setting__foo",
+        )),
+    },
+)
+
+def _default_version_config_setting_6_4_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.true(env, find_action(env, "Genrule").argv[-1].endswith("6.4"))
+    return analysistest.end(env)
+
+_default_version_config_setting_6_4_test = analysistest.make(
+    _default_version_config_setting_6_4_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:default_version_config_setting__foo",
+        )),
+        "//command_line_option:xcode_version": "6.4",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _valid_version(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "valid_version__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True),
+        ],
+    )
+
+    _valid_version_test(
+        name = "valid_version",
+        target_under_test = "valid_version__foo",
+    )
+    return ["valid_version"]
+
+def _valid_version_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_valid_version_test = analysistest.make(
+    _valid_version_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version": "5.1.2",
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:valid_version__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _valid_alias_dotted_version(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "valid_alias_dotted_version__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5"]),
+        ],
+    )
+
+    _valid_alias_dotted_version_test(
+        name = "valid_alias_dotted_version",
+        target_under_test = "valid_alias_dotted_version__foo",
+    )
+    return ["valid_alias_dotted_version"]
+
+def _valid_alias_dotted_version_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_valid_alias_dotted_version_test = analysistest.make(
+    _valid_alias_dotted_version_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version": "5",
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:valid_alias_dotted_version__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _valid_alias_nonnumerical(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "valid_alias_nonnumerical__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["valid_version"]),
+        ],
+    )
+
+    _valid_alias_nonnumerical_test(
+        name = "valid_alias_nonnumerical",
+        target_under_test = "valid_alias_nonnumerical__foo",
+    )
+    return ["valid_alias_nonnumerical"]
+
+def _valid_alias_nonnumerical_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_valid_alias_nonnumerical_test = analysistest.make(
+    _valid_alias_nonnumerical_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version": "valid_version",
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:valid_alias_nonnumerical__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _invalid_xcode_specified(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "invalid_xcode_specified__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True),
+            struct(name = "version84", version = "8.4"),
+        ],
+    )
+
+    _invalid_xcode_specified_test(
+        name = "invalid_xcode_specified",
+        target_under_test = "invalid_xcode_specified__foo",
+        # TODO: Remove once we test with Bazel 8+
+        tags = ["manual"],
+    )
+    return ["invalid_xcode_specified"]
+
+def _invalid_xcode_specified_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "--xcode_version=6 specified, but '6' is not an available Xcode version. If you believe you have '6' installed")
+    return analysistest.end(env)
+
+_invalid_xcode_specified_test = analysistest.make(
+    _invalid_xcode_specified_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version": "6",
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:invalid_xcode_specified__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _requires_default(namer):
+    xcode_config(
+        name = "requires_default__foo",
+        versions = [namer(":version512")],
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        version = "5.1.2",
+    )
+
+    _requires_default_test(
+        name = "requires_default",
+        target_under_test = "requires_default__foo",
+    )
+    return ["requires_default"]
+
+def _requires_default_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "default version must be specified")
+    return analysistest.end(env)
+
+_requires_default_test = analysistest.make(
+    _requires_default_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version": "6",
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:requires_default__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _duplicate_aliases_defined_version(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "duplicate_aliases_defined_version__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5"]),
+            struct(name = "version5", version = "5.0", aliases = ["5"]),
+        ],
+    )
+
+    _duplicate_aliases_defined_version_test(
+        name = "duplicate_aliases_defined_version",
+        target_under_test = "duplicate_aliases_defined_version__foo",
+    )
+    return ["duplicate_aliases_defined_version"]
+
+def _duplicate_aliases_defined_version_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "'5' is registered to multiple labels")
+    asserts.expect_failure(env, "__version512")
+    asserts.expect_failure(env, "__version5")
+    return analysistest.end(env)
+
+_duplicate_aliases_defined_version_test = analysistest.make(
+    _duplicate_aliases_defined_version_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:duplicate_aliases_defined_version__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _duplicate_aliases_within_available_xcodes(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "duplicate_aliases_within_available_xcodes__foo",
+        remote_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5"]),
+            struct(name = "version5", version = "5.0", aliases = ["5"]),
+        ],
+        local_versions = [
+            struct(name = "version5", version = "5.0", is_default = True, aliases = ["5"]),
+        ],
+    )
+
+    _duplicate_aliases_within_available_xcodes_test(
+        name = "duplicate_aliases_within_available_xcodes",
+        target_under_test = "duplicate_aliases_within_available_xcodes__foo",
+    )
+    return ["duplicate_aliases_within_available_xcodes"]
+
+def _duplicate_aliases_within_available_xcodes_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "'5' is registered to multiple labels")
+    asserts.expect_failure(env, "__version512")
+    asserts.expect_failure(env, "__version5")
+    return analysistest.end(env)
+
+_duplicate_aliases_within_available_xcodes_test = analysistest.make(
+    _duplicate_aliases_within_available_xcodes_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:duplicate_aliases_within_available_xcodes__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _version_aliased_to_itself(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "version_aliased_to_itself__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5.1.2"]),
+        ],
+    )
+
+    _version_aliased_to_itself_test(
+        name = "version_aliased_to_itself",
+        target_under_test = "version_aliased_to_itself__foo",
+    )
+    return ["version_aliased_to_itself"]
+
+def _version_aliased_to_itself_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_version_aliased_to_itself_test = analysistest.make(
+    _version_aliased_to_itself_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:version_aliased_to_itself__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _duplicate_version_numbers(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "duplicate_version_numbers__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True),
+            struct(name = "version5", version = "5.1.2", aliases = ["5"]),
+        ],
+    )
+
+    _duplicate_version_numbers_test(
+        name = "duplicate_version_numbers",
+        target_under_test = "duplicate_version_numbers__foo",
+    )
+    return ["duplicate_version_numbers"]
+
+def _duplicate_version_numbers_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "'5.1.2' is registered to multiple labels")
+    asserts.expect_failure(env, "__version512")
+    asserts.expect_failure(env, "__version5")
+    return analysistest.end(env)
+
+_duplicate_version_numbers_test = analysistest.make(
+    _duplicate_version_numbers_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:duplicate_version_numbers__foo",
+        )),
+        "//command_line_option:xcode_version": "5",
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _version_conflicts_with_alias(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "version_conflicts_with_alias__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True),
+            struct(name = "version5", version = "5.0", aliases = ["5.1.2"]),
+        ],
+    )
+
+    _version_conflicts_with_alias_test(
+        name = "version_conflicts_with_alias",
+        target_under_test = "version_conflicts_with_alias__foo",
+    )
+    return ["version_conflicts_with_alias"]
+
+def _version_conflicts_with_alias_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "'5.1.2' is registered to multiple labels")
+    asserts.expect_failure(env, "__version512")
+    asserts.expect_failure(env, "__version5")
+    return analysistest.end(env)
+
+_version_conflicts_with_alias_test = analysistest.make(
+    _version_conflicts_with_alias_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:version_conflicts_with_alias__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _default_ios_sdk_version(namer):
+    xcode_config(
+        name = "default_ios_sdk_version__foo",
+        default = namer(":version512"),
+        versions = [
+            namer(":version512"),
+            namer(":version64"),
+        ],
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        default_ios_sdk_version = "7.1",
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version64"),
+        aliases = [
+            "6.0",
+            "foo",
+            "6",
+        ],
+        default_ios_sdk_version = "43.0",
+        version = "6.4",
+        tags = FIXTURE_TAGS,
+    )
+
+    _default_ios_sdk_version_test(
+        name = "default_ios_sdk_version",
+        target_under_test = "default_ios_sdk_version__foo",
+    )
+    return ["default_ios_sdk_version"]
+
+def _default_ios_sdk_version_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "7.1", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.ios_simulator)))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_default_ios_sdk_version_test = analysistest.make(
+    _default_ios_sdk_version_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:default_ios_sdk_version__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _default_sdk_versions(namer):
+    xcode_config(
+        name = "default_sdk_versions__foo",
+        default = namer(":version512"),
+        versions = [
+            namer(":version512"),
+            namer(":version64"),
+        ],
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        default_ios_sdk_version = "101",
+        default_macos_sdk_version = "104",
+        default_tvos_sdk_version = "103",
+        default_visionos_sdk_version = "105",
+        default_watchos_sdk_version = "102",
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version64"),
+        aliases = [
+            "6.0",
+            "foo",
+            "6",
+        ],
+        default_ios_sdk_version = "43.0",
+        version = "6.4",
+        tags = FIXTURE_TAGS,
+    )
+
+    _default_sdk_versions_test(
+        name = "default_sdk_versions",
+        target_under_test = "default_sdk_versions__foo",
+    )
+    return ["default_sdk_versions"]
+
+def _default_sdk_versions_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "101", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.ios_simulator)))
+    asserts.equals(env, "102", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.watchos_simulator)))
+    asserts.equals(env, "103", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.tvos_simulator)))
+    asserts.equals(env, "104", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.macos)))
+    asserts.equals(env, "105", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.visionos_simulator)))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_default_sdk_versions_test = analysistest.make(
+    _default_sdk_versions_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:default_sdk_versions__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _default_sdk_versions_selected_xcode(namer):
+    xcode_config(
+        name = "default_sdk_versions_selected_xcode__foo",
+        default = namer(":version512"),
+        versions = [
+            namer(":version512"),
+            namer(":version64"),
+        ],
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        default_ios_sdk_version = "7.1",
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version64"),
+        aliases = [
+            "6.0",
+            "foo",
+            "6",
+        ],
+        default_ios_sdk_version = "43",
+        default_macos_sdk_version = "46",
+        default_tvos_sdk_version = "45",
+        default_visionos_sdk_version = "47",
+        default_watchos_sdk_version = "44",
+        version = "6.4",
+        tags = FIXTURE_TAGS,
+    )
+
+    _default_sdk_versions_selected_xcode_test(
+        name = "default_sdk_versions_selected_xcode",
+        target_under_test = "default_sdk_versions_selected_xcode__foo",
+    )
+    return ["default_sdk_versions_selected_xcode"]
+
+def _default_sdk_versions_selected_xcode_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "6.4", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "43", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.ios_simulator)))
+    asserts.equals(env, "44", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.watchos_simulator)))
+    asserts.equals(env, "45", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.tvos_simulator)))
+    asserts.equals(env, "46", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.macos)))
+    asserts.equals(env, "47", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.visionos_simulator)))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_default_sdk_versions_selected_xcode_test = analysistest.make(
+    _default_sdk_versions_selected_xcode_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:default_sdk_versions_selected_xcode__foo",
+        )),
+        "//command_line_option:xcode_version": "6",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _override_default_sdk_versions(namer):
+    xcode_config(
+        name = "override_default_sdk_versions__foo",
+        default = namer(":version512"),
+        versions = [
+            namer(":version512"),
+            namer(":version64"),
+        ],
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+        ],
+        default_ios_sdk_version = "7.1",
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version64"),
+        aliases = [
+            "6.0",
+            "foo",
+            "6",
+        ],
+        default_ios_sdk_version = "101",
+        default_macos_sdk_version = "104",
+        default_tvos_sdk_version = "103",
+        default_visionos_sdk_version = "105",
+        default_watchos_sdk_version = "102",
+        version = "6.4",
+        tags = FIXTURE_TAGS,
+    )
+
+    _override_default_sdk_versions_test(
+        name = "override_default_sdk_versions",
+        target_under_test = "override_default_sdk_versions__foo",
+    )
+    return ["override_default_sdk_versions"]
+
+def _override_default_sdk_versions_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "6.4", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "15.3", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.ios_simulator)))
+    asserts.equals(env, "15.4", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.watchos_simulator)))
+    asserts.equals(env, "15.5", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.tvos_simulator)))
+    asserts.equals(env, "15.6", str(xcode_version_info.sdk_version_for_platform(apple_common.platform.macos)))
+    asserts.equals(env, "unknown", xcode_version_info.availability())
+    asserts.true(env, "requires-darwin" in xcode_version_info.execution_info())
+    asserts.true(env, "supports-xcode-requirements-set" in xcode_version_info.execution_info())
+
+    return analysistest.end(env)
+
+_override_default_sdk_versions_test = analysistest.make(
+    _override_default_sdk_versions_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:override_default_sdk_versions__foo",
+        )),
+        "//command_line_option:xcode_version": "6",
+        "//command_line_option:ios_sdk_version": "15.3",
+        "//command_line_option:watchos_sdk_version": "15.4",
+        "//command_line_option:tvos_sdk_version": "15.5",
+        "//command_line_option:macos_sdk_version": "15.6",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _default_without_version(namer):
+    xcode_config(
+        name = "default_without_version__foo",
+        default = namer(":version512"),
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+            "5.1.2",
+        ],
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+
+    _default_without_version_test(
+        name = "default_without_version",
+        target_under_test = "default_without_version__foo",
+    )
+    return ["default_without_version"]
+
+def _default_without_version_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "default label")
+    asserts.expect_failure(env, "must be contained in versions attribute")
+    return analysistest.end(env)
+
+_default_without_version_test = analysistest.make(
+    _default_without_version_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:default_without_version__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _version_does_not_contain_default(namer):
+    xcode_config(
+        name = "version_does_not_contain_default__foo",
+        default = namer(":version512"),
+        versions = [namer(":version6")],
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version512"),
+        aliases = [
+            "5",
+            "5.1",
+            "5.1.2",
+        ],
+        version = "5.1.2",
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version6"),
+        version = "6.0",
+        tags = FIXTURE_TAGS,
+    )
+
+    _version_does_not_contain_default_test(
+        name = "version_does_not_contain_default",
+        target_under_test = "version_does_not_contain_default__foo",
+    )
+    return ["version_does_not_contain_default"]
+
+def _version_does_not_contain_default_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "must be contained in versions attribute")
+    return analysistest.end(env)
+
+_version_does_not_contain_default_test = analysistest.make(
+    _version_does_not_contain_default_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:version_does_not_contain_default__foo",
+        )),
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _configuration_field_for_rule(namer):
+    # Verifies that the `--xcode_version_config` configuration value can be
+    # accessed via the `configuration_field()`.
+    xcode_config(
+        name = "configuration_field_for_rule__config1",
+        default = namer(":version1"),
+        versions = [namer(":version1")],
+        tags = FIXTURE_TAGS,
+    )
+    xcode_config(
+        name = "configuration_field_for_rule__config2",
+        default = namer(":version2"),
+        versions = [namer(":version2")],
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version1"),
+        version = "1.0",
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version2"),
+        version = "2.0",
+        tags = FIXTURE_TAGS,
+    )
+
+    provider_grabber(
+        name = namer("provider_grabber"),
+        tags = FIXTURE_TAGS,
+    )
+
+    _configuration_field_for_rule_1_test(
+        name = "configuration_field_for_rule_1",
+        target_under_test = namer("provider_grabber"),
+    )
+    _configuration_field_for_rule_2_test(
+        name = "configuration_field_for_rule_2",
+        target_under_test = namer("provider_grabber"),
+    )
+    return [
+        "configuration_field_for_rule_1",
+        "configuration_field_for_rule_2",
+    ]
+
+def _configuration_field_for_rule_1_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "1.0", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_configuration_field_for_rule_1_test = analysistest.make(
+    _configuration_field_for_rule_1_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:configuration_field_for_rule__config1",
+        )),
+    },
+)
+
+def _configuration_field_for_rule_2_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "2.0", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_configuration_field_for_rule_2_test = analysistest.make(
+    _configuration_field_for_rule_2_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:configuration_field_for_rule__config2",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _configuration_field_for_aspect(namer):
+    # Verifies that the `--xcode_version_config` configuration value can be
+    # accessed via the `configuration_field()`.
+    xcode_config(
+        name = "configuration_field_for_aspect__config1",
+        default = namer(":version1"),
+        versions = [namer(":version1")],
+        tags = FIXTURE_TAGS,
+    )
+    xcode_config(
+        name = "configuration_field_for_aspect__config2",
+        default = namer(":version2"),
+        versions = [namer(":version2")],
+        tags = FIXTURE_TAGS,
+    )
+
+    xcode_version(
+        name = namer("version1"),
+        version = "1.0",
+        tags = FIXTURE_TAGS,
+    )
+    xcode_version(
+        name = namer("version2"),
+        version = "2.0",
+        tags = FIXTURE_TAGS,
+    )
+
+    native.filegroup(
+        name = namer("dummy"),
+        tags = FIXTURE_TAGS,
+    )
+    provider_grabber_with_aspect(
+        name = namer("provider_grabber"),
+        deps = [namer("dummy")],
+        tags = FIXTURE_TAGS,
+    )
+
+    _configuration_field_for_aspect_1_test(
+        name = "configuration_field_for_aspect_1",
+        target_under_test = namer("provider_grabber"),
+    )
+    _configuration_field_for_aspect_2_test(
+        name = "configuration_field_for_aspect_2",
+        target_under_test = namer("provider_grabber"),
+    )
+    return [
+        "configuration_field_for_aspect_1",
+        "configuration_field_for_aspect_2",
+    ]
+
+def _configuration_field_for_aspect_1_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "1.0", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_configuration_field_for_aspect_1_test = analysistest.make(
+    _configuration_field_for_aspect_1_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:configuration_field_for_aspect__config1",
+        )),
+    },
+)
+
+def _configuration_field_for_aspect_2_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "2.0", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_configuration_field_for_aspect_2_test = analysistest.make(
+    _configuration_field_for_aspect_2_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:configuration_field_for_aspect__config2",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _explicit_xcodes_mode_no_flag(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "explicit_xcodes_mode_no_flag__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5", "5.1"]),
+            struct(name = "version64", version = "6.4", aliases = ["6.0", "foo", "6"]),
+        ],
+    )
+
+    _explicit_xcodes_mode_no_flag_test(
+        name = "explicit_xcodes_mode_no_flag",
+        target_under_test = "explicit_xcodes_mode_no_flag__foo",
+    )
+    return ["explicit_xcodes_mode_no_flag"]
+
+def _explicit_xcodes_mode_no_flag_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_explicit_xcodes_mode_no_flag_test = analysistest.make(
+    _explicit_xcodes_mode_no_flag_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:explicit_xcodes_mode_no_flag__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _explicit_xcodes_mode_with_flag(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "explicit_xcodes_mode_with_flag__foo",
+        explicit_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5", "5.1"]),
+            struct(name = "version64", version = "6.4", aliases = ["6.0", "foo", "6"]),
+        ],
+    )
+
+    _explicit_xcodes_mode_with_flag_test(
+        name = "explicit_xcodes_mode_with_flag",
+        target_under_test = "explicit_xcodes_mode_with_flag__foo",
+    )
+    return ["explicit_xcodes_mode_with_flag"]
+
+def _explicit_xcodes_mode_with_flag_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "6.4", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_explicit_xcodes_mode_with_flag_test = analysistest.make(
+    _explicit_xcodes_mode_with_flag_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:explicit_xcodes_mode_with_flag__foo",
+        )),
+        "//command_line_option:xcode_version": "6.4",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _available_xcodes_mode_no_flag(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "available_xcodes_mode_no_flag__foo",
+        remote_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5", "5.1"]),
+            struct(name = "version84", version = "8.4"),
+        ],
+        local_versions = [
+            struct(name = "version84", version = "8.4", is_default = True),
+        ],
+    )
+
+    _available_xcodes_mode_no_flag_test(
+        name = "available_xcodes_mode_no_flag",
+        target_under_test = "available_xcodes_mode_no_flag__foo",
+    )
+    return ["available_xcodes_mode_no_flag"]
+
+def _available_xcodes_mode_no_flag_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "8.4", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_available_xcodes_mode_no_flag_test = analysistest.make(
+    _available_xcodes_mode_no_flag_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:available_xcodes_mode_no_flag__foo",
+        )),
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _available_xcodes_mode_different_alias(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "available_xcodes_mode_different_alias__foo",
+        remote_versions = [
+            struct(name = "version5", version = "5.1", is_default = True, aliases = ["5"]),
+        ],
+        local_versions = [
+            struct(name = "version5.1.2", version = "5.1.2", is_default = True, aliases = ["5"]),
+        ],
+    )
+
+    _available_xcodes_mode_different_alias_test(
+        name = "available_xcodes_mode_different_alias",
+        target_under_test = "available_xcodes_mode_different_alias__foo",
+    )
+    return ["available_xcodes_mode_different_alias"]
+
+def _available_xcodes_mode_different_alias_test_impl(ctx):
+    env = analysistest.begin(ctx)
+    asserts.expect_failure(env, "Xcode version 5 was selected")
+    asserts.expect_failure(env, "This corresponds to local Xcode version 5.1.2")
+    return analysistest.end(env)
+
+_available_xcodes_mode_different_alias_test = analysistest.make(
+    _available_xcodes_mode_different_alias_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:available_xcodes_mode_different_alias__foo",
+        )),
+        "//command_line_option:xcode_version": "5",
+    },
+    expect_failure = True,
+)
+
+# ------------------------------------------------------------------------------
+
+def _available_xcodes_mode_different_alias_fully_specified(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "available_xcodes_mode_different_alias_fully_specified__foo",
+        remote_versions = [
+            struct(name = "version5", version = "5.1", is_default = True, aliases = ["5"]),
+        ],
+        local_versions = [
+            struct(name = "version5.1.2", version = "5.1.2", is_default = True, aliases = ["5"]),
+        ],
+    )
+
+    _available_xcodes_mode_different_alias_fully_specified_test(
+        name = "available_xcodes_mode_different_alias_fully_specified",
+        target_under_test = "available_xcodes_mode_different_alias_fully_specified__foo",
+    )
+    return ["available_xcodes_mode_different_alias_fully_specified"]
+
+def _available_xcodes_mode_different_alias_fully_specified_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+    asserts.equals(env, "local", xcode_version_info.availability())
+
+    return analysistest.end(env)
+
+_available_xcodes_mode_different_alias_fully_specified_test = analysistest.make(
+    _available_xcodes_mode_different_alias_fully_specified_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:available_xcodes_mode_different_alias_fully_specified__foo",
+        )),
+        "//command_line_option:xcode_version": "5.1.2",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
+def _available_xcodes_mode_with_flag(namer):
+    _make_xcode_fixtures(
+        namer = namer,
+        xcode_config_name = "available_xcodes_mode_with_flag__foo",
+        remote_versions = [
+            struct(name = "version512", version = "5.1.2", is_default = True, aliases = ["5", "5.1"]),
+            struct(name = "version84", version = "8.4"),
+        ],
+        local_versions = [
+            struct(name = "version84", version = "8.4", is_default = True),
+        ],
+    )
+
+    _available_xcodes_mode_with_flag_test(
+        name = "available_xcodes_mode_with_flag",
+        target_under_test = "available_xcodes_mode_with_flag__foo",
+    )
+    return ["available_xcodes_mode_with_flag"]
+
+def _available_xcodes_mode_with_flag_test_impl(ctx):
+    env = analysistest.begin(ctx)
+
+    target_under_test = analysistest.target_under_test(env)
+    xcode_version_info = target_under_test[apple_common.XcodeVersionConfig]
+
+    asserts.equals(env, "5.1.2", str(xcode_version_info.xcode_version()))
+
+    return analysistest.end(env)
+
+_available_xcodes_mode_with_flag_test = analysistest.make(
+    _available_xcodes_mode_with_flag_test_impl,
+    config_settings = {
+        "//command_line_option:xcode_version_config": str(Label(
+            "//test:available_xcodes_mode_with_flag__foo",
+        )),
+        "//command_line_option:xcode_version": "5.1.2",
+    },
+)
+
+# ------------------------------------------------------------------------------
+
 def _make_xcode_fixtures(
         *,
         namer,
         xcode_config_name,
         remote_versions = [],
-        local_versions = []):
+        local_versions = [],
+        explicit_versions = []):
     """Helper function to splat out fixtures used by multiple tests."""
     all_versions = {}
 
@@ -582,6 +2188,15 @@
                 fail("Only one local version may be the default")
             local_default_label = version_name
 
+    explicit_default_label = None
+    for version_info in explicit_versions:
+        version_name = version_info.name
+        all_versions[version_name] = version_info
+        if getattr(version_info, "is_default", False):
+            if explicit_default_label:
+                fail("Only one explicit version may be the default")
+            explicit_default_label = version_name
+
     for version_name, version in all_versions.items():
         xcode_version(
             name = namer(version.name),
@@ -609,8 +2224,19 @@
             name = xcode_config_name,
             local_versions = namer("local"),
             remote_versions = namer("remote"),
+            tags = FIXTURE_TAGS,
         )
 
+    if explicit_versions:
+        xcode_config(
+            name = xcode_config_name,
+            default = namer(explicit_default_label),
+            versions = [namer(version.name) for version in explicit_versions],
+            tags = FIXTURE_TAGS,
+        )
+
+# ------------------------------------------------------------------------------
+
 def xcode_config_test(name):
     make_all_tests(
         name = name,
@@ -626,6 +2252,34 @@
             _prefer_local_default_if_no_mutual_no_flag_different_full_version,
             _choose_newest_mutual_xcode,
             _invalid_xcode_from_mutual_throws,
+            _apple_common_xcode_version_config_constructor,
+            _apple_common_xcode_version_config_constructor_fails_on_bad_input,
+            _config_alias_config_setting,
+            _default_version_config_setting,
+            _valid_version,
+            _valid_alias_dotted_version,
+            _valid_alias_nonnumerical,
+            _invalid_xcode_specified,
+            _requires_default,
+            _duplicate_aliases_defined_version,
+            _duplicate_aliases_within_available_xcodes,
+            _version_aliased_to_itself,
+            _duplicate_version_numbers,
+            _version_conflicts_with_alias,
+            _default_ios_sdk_version,
+            _default_sdk_versions,
+            _default_sdk_versions_selected_xcode,
+            _override_default_sdk_versions,
+            _default_without_version,
+            _version_does_not_contain_default,
+            _configuration_field_for_rule,
+            _configuration_field_for_aspect,
+            _explicit_xcodes_mode_no_flag,
+            _explicit_xcodes_mode_with_flag,
+            _available_xcodes_mode_no_flag,
+            _available_xcodes_mode_different_alias,
+            _available_xcodes_mode_different_alias_fully_specified,
+            _available_xcodes_mode_with_flag,
         ],
         # TODO: Remove once we test with Bazel 8+
         tags = ["manual"],
@@ -639,3 +2293,6 @@
     # *   testPreferMutualXcodeFalseOverridesMutual
     # *   testLocalDefaultCanBeMutuallyAvailable
     # *   testPreferLocalDefaultOverDifferentBuild
+    # *   testXcodeWithExtensionMatchingRemote
+    # *   testXcodeVersionWithExtensionMatchingRemoteAndLocal
+    # *   testXcodeVersionWithNoExtension