diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
index 5474f74..e56f9c3 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
@@ -13,17 +13,13 @@
 // limitations under the License.
 package com.google.devtools.build.lib.bazel.rules;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses.EmptyRule;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.core.CoreRules;
 import com.google.devtools.build.lib.rules.objc.AppleStarlarkCommon;
-import com.google.devtools.build.lib.rules.objc.AppleToolchain;
 import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration;
 import com.google.devtools.build.lib.rules.objc.ObjcConfiguration;
 import com.google.devtools.build.lib.starlarkbuildapi.objc.AppleBootstrap;
@@ -38,15 +34,12 @@
 
   @Override
   public void init(ConfiguredRuleClassProvider.Builder builder) {
-    RepositoryName toolsRepository = checkNotNull(builder.getToolsRepository());
-
     builder.addConfigurationFragment(ObjcConfiguration.class);
     builder.addConfigurationFragment(AppleConfiguration.class);
     // j2objc shouldn't be here!
     builder.addConfigurationFragment(J2ObjcConfiguration.class);
     builder.addRuleDefinition(new EmptyRule("j2objc_library") {});
 
-    builder.addRuleDefinition(new AppleToolchain.RequiresXcodeConfigRule(toolsRepository));
     builder.addRuleDefinition(new EmptyRule("objc_import") {});
     builder.addRuleDefinition(new EmptyRule("objc_library") {});
     builder.addRuleDefinition(new EmptyRule("available_xcodes") {});
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionRule.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionRule.java
deleted file mode 100644
index 2ccebf7..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersionRule.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2015 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.apple;
-
-import static com.google.devtools.build.lib.packages.Attribute.attr;
-import static com.google.devtools.build.lib.packages.Type.STRING;
-import static com.google.devtools.build.lib.packages.Types.STRING_LIST;
-
-import com.google.devtools.build.lib.analysis.BaseRuleClasses;
-import com.google.devtools.build.lib.analysis.BaseRuleClasses.EmptyRuleConfiguredTargetFactory;
-import com.google.devtools.build.lib.analysis.RuleDefinition;
-import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.packages.RuleClass;
-
-/**
- * Rule definition for {@code xcode_version} rule.
- */
-public class XcodeVersionRule implements RuleDefinition {
-
-  static final String VERSION_ATTR_NAME = "version";
-  static final String ALIASES_ATTR_NAME = "aliases";
-  static final String DEFAULT_IOS_SDK_VERSION_ATTR_NAME = "default_ios_sdk_version";
-  static final String DEFAULT_VISIONOS_SDK_VERSION_ATTR_NAME = "default_visionos_sdk_version";
-  static final String DEFAULT_WATCHOS_SDK_VERSION_ATTR_NAME = "default_watchos_sdk_version";
-  static final String DEFAULT_TVOS_SDK_VERSION_ATTR_NAME = "default_tvos_sdk_version";
-  static final String DEFAULT_MACOS_SDK_VERSION_ATTR_NAME = "default_macos_sdk_version";
-
-  @Override
-  public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
-    return builder
-        .requiresConfigurationFragments(AppleConfiguration.class)
-        .exemptFromConstraintChecking(
-            "this rule refines configuration variables and does not build actual content")
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(version) -->
-        The official version number of a version of Xcode.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(VERSION_ATTR_NAME, STRING)
-                .mandatory()
-                .nonconfigurable("this rule determines configuration"))
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(version) -->
-        Accepted aliases for this version of Xcode.
-        If the value of the <code>xcode_version</code> build flag matches any of the given
-        alias strings, this Xcode version will be used.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(ALIASES_ATTR_NAME, STRING_LIST)
-                .nonconfigurable("this rule determines configuration"))
-
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(default_ios_sdk_version) -->
-        The iOS SDK version that is used by default when this version of Xcode is being used.
-        The <code>ios_sdk_version</code> build flag will override the value specified here.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(DEFAULT_IOS_SDK_VERSION_ATTR_NAME, STRING)
-                .nonconfigurable("this rule determines configuration"))
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(default_visionos_sdk_version) -->
-        The visionOS SDK version that is used by default when this version of Xcode is being used.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(DEFAULT_VISIONOS_SDK_VERSION_ATTR_NAME, STRING)
-                .nonconfigurable("this rule determines configuration"))
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(default_watchos_sdk_version) -->
-        The watchOS SDK version that is used by default when this version of Xcode is being used.
-        The <code>watchos_sdk_version</code> build flag will override the value specified here.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(DEFAULT_WATCHOS_SDK_VERSION_ATTR_NAME, STRING)
-                .nonconfigurable("this rule determines configuration"))
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(default_tvos_sdk_version) -->
-        The tvOS SDK version that is used by default when this version of Xcode is being used.
-        The <code>tvos_sdk_version</code> build flag will override the value specified here.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(DEFAULT_TVOS_SDK_VERSION_ATTR_NAME, STRING)
-                .nonconfigurable("this rule determines configuration"))
-        /* <!-- #BLAZE_RULE(xcode_version).ATTRIBUTE(default_macos_sdk_version) -->
-        The macOS SDK version that is used by default when this version of Xcode is being used.
-        The <code>macos_sdk_version</code> build flag will override the value specified here.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
-        .add(
-            attr(DEFAULT_MACOS_SDK_VERSION_ATTR_NAME, STRING)
-                .nonconfigurable("this rule determines configuration"))
-        .build();
-  }
-
-  @Override
-  public Metadata getMetadata() {
-    return RuleDefinition.Metadata.builder()
-        .name("xcode_version")
-        .ancestors(BaseRuleClasses.NativeBuildRule.class)
-        .factoryClass(EmptyRuleConfiguredTargetFactory.class)
-        .build();
-  }
-}
-
-/*<!-- #BLAZE_RULE (NAME = xcode_version, TYPE = OTHER, FAMILY = Objective-C) -->
-
-<p>Represents a single official Xcode version with acceptable aliases for that Xcode version.
-See the <code>xcode_config</code> rule.</p>
-
-<!-- #END_BLAZE_RULE -->*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleToolchain.java
index c6a7396..cb33164 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleToolchain.java
@@ -14,24 +14,11 @@
 
 package com.google.devtools.build.lib.rules.objc;
 
-import static com.google.devtools.build.lib.packages.Attribute.attr;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-
 import com.google.common.annotations.VisibleForTesting;
-import com.google.devtools.build.lib.analysis.RuleDefinition;
-import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
-import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform;
 import com.google.devtools.build.lib.starlarkbuildapi.apple.AppleToolchainApi;
-import java.io.Serializable;
 
 /**
  * Utility class for resolving items for the Apple toolchain (such as common tool flags, and paths).
@@ -51,9 +38,6 @@
   @VisibleForTesting
   public static final String SYSTEM_FRAMEWORK_PATH = "/System/Library/Frameworks";
 
-  /** XcodeConfig attribute name for Apple rules that take an xcode_config parameter */
-  public static final String XCODE_CONFIG_ATTR_NAME = ":xcode_config";
-
   /** Returns the platform directory inside of Xcode for a platform name. */
   public static String platformDir(String platformName) {
     return developerDir() + "/Platforms/" + platformName + ".platform";
@@ -81,17 +65,6 @@
     return platformDir + "/Developer/Library/Frameworks";
   }
 
-  /** The default label of the build-wide {@code xcode_config} configuration rule. */
-  public static LabelLateBoundDefault<AppleConfiguration> getXcodeConfigLabel(
-      RepositoryName toolsRepository) {
-    return LabelLateBoundDefault.fromTargetConfiguration(
-        AppleConfiguration.class,
-        Label.parseCanonicalUnchecked(
-            toolsRepository + AppleCommandLineOptions.DEFAULT_XCODE_VERSION_CONFIG_LABEL),
-        (Attribute.LateBoundDefault.Resolver<AppleConfiguration, Label> & Serializable)
-            (rule, attributes, appleConfig) -> appleConfig.getXcodeConfigLabel());
-  }
-
   @Override
   public boolean isImmutable() {
     return true; // immutable and Starlark-hashable
@@ -120,31 +93,4 @@
   public String platformFrameworkDirFromConfig(AppleConfiguration configuration) {
     return platformDeveloperFrameworkDir(configuration.getSingleArchPlatform());
   }
-
-  /** Base rule definition to be ancestor for rules which may require an Xcode toolchain. */
-  public static class RequiresXcodeConfigRule implements RuleDefinition {
-    private final RepositoryName toolsRepository;
-
-    public RequiresXcodeConfigRule(RepositoryName toolsRepository) {
-      this.toolsRepository = toolsRepository;
-    }
-
-    @Override
-    public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
-      return builder
-          .add(
-              attr(XCODE_CONFIG_ATTR_NAME, LABEL)
-                  .allowedRuleClasses("xcode_config")
-                  .checkConstraints()
-                  .value(getXcodeConfigLabel(toolsRepository)))
-          .build();
-    }
-    @Override
-    public Metadata getMetadata() {
-      return RuleDefinition.Metadata.builder()
-          .name("$requires_xcode_config")
-          .type(RuleClassType.ABSTRACT)
-          .build();
-    }
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
index 0173058..a7f7ff1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
@@ -27,7 +27,6 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:config/core_options",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_options",
-        "//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
         "//src/main/java/com/google/devtools/build/lib/analysis/starlark/annotations",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Interspersing.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Interspersing.java
deleted file mode 100644
index 5084d02..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/Interspersing.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.objc;
-
-import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-/**
- * Utility code for interspersing items into sequences.
- */
-public class Interspersing {
-  private Interspersing() {}
-
-  /**
-   * Inserts {@code what} before each item in {@code sequence}, returning a lazy sequence of twice
-   * the length.
-   */
-  public static <E> Iterable<E> beforeEach(final E what, Iterable<E> sequence) {
-    Preconditions.checkNotNull(what);
-    return Iterables.concat(
-        Iterables.transform(sequence, element -> ImmutableList.of(what, element)));
-  }
-
-  /**
-   * Prepends {@code what} to each string in {@code sequence}, returning a lazy sequence of the 
-   * same length.
-   */
-  public static Iterable<String>
-      prependEach(final String what, Iterable<String> sequence) {
-    Preconditions.checkNotNull(what);
-    return Iterables.transform(sequence, input -> what + input);
-  }
-
-  /**
-   * Similar to {@link #prependEach(String, Iterable)}, but also converts each item in the sequence
-   * to a string.
-   */
-  public static <E> Iterable<String>
-      prependEach(String what, Iterable<E> sequence, Function<? super E, String> toString) {
-    return prependEach(what, Iterables.transform(sequence, toString));
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Value.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Value.java
deleted file mode 100644
index 6f142f5..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/Value.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.objc;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-/**
- * Represents a type whose equality, hash code, and string representation are defined by a single
- * immutable array. This class is designed to be extended by a final class, and to pass the member
- * data to this class's constructor.
- *
- * @param <V> the base class that extends {@code Value}
- */
-// TODO(bazel-team): Replace with AutoValue once that is supported in bazel.
-public class Value<V extends Value<V>> {
-  private final Object memberData;
-
-  /**
-   * Constructs a new instance with the given member data. Generally, all member data should be
-   * reflected in final fields in the child class.
-   * @throws NullPointerException if any element in {@code memberData} is null
-   */
-  public Value(Object... memberData) {
-    Preconditions.checkArgument(memberData.length > 0);
-    this.memberData = (memberData.length == 1)
-        ? Preconditions.checkNotNull(memberData[0]) : ImmutableList.copyOf(memberData);
-  }
-
-  /**
-   * A type-safe alternative to calling {@code a.equals(b)}. When using {@code a.equals(b)},
-   * {@code b} may accidentally be a different class from {@code a}, in which case there will be no
-   * compiler warning and the result will always be false. This method requires both values to have
-   * compatible types and to be non-null.
-   */
-  public boolean equalsOther(V other) {
-    return equals(Preconditions.checkNotNull(other));
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if ((o == null) || (o.getClass() != getClass())) {
-      return false;
-    }
-    Value<?> other = (Value<?>) o;
-    return memberData.equals(other.memberData);
-  }
-
-  @Override
-  public int hashCode() {
-    return memberData.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName() + ":" + memberData.toString();
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/InterspersingTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/InterspersingTest.java
deleted file mode 100644
index fe62a0f..0000000
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/InterspersingTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.objc;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.base.Functions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Test case for the Interspersing utility. */
-@RunWith(JUnit4.class)
-public class InterspersingTest {
-  @Test
-  public void beforeEach_empty() {
-    assertThat(Interspersing.beforeEach("foo", ImmutableList.<String>of())).isEmpty();
-  }
-
-  @Test
-  public void beforeEach_isLazy() {
-    Iterable<Integer> result = Interspersing.beforeEach(1011, Iterables.cycle(1, 2, 3));
-    assertThat(Iterables.get(result, 0)).isEqualTo((Object) 1011);
-    assertThat(Iterables.get(result, 1)).isEqualTo((Object) 1);
-    assertThat(Iterables.get(result, 2)).isEqualTo((Object) 1011);
-    assertThat(Iterables.get(result, 3)).isEqualTo((Object) 2);
-  }
-
-  @Test
-  public void beforeEach_throwsForNullWhat() {
-    assertThrows(
-        NullPointerException.class, () -> Interspersing.beforeEach(null, ImmutableList.of("a")));
-  }
-
-  @Test
-  public void prependEach_empty() {
-    assertThat(Interspersing.prependEach("foo", ImmutableList.<String>of())).isEmpty();
-  }
-
-  @Test
-  public void prependEach_isLazy() {
-    Iterable<String> result = Interspersing.prependEach(
-        "#", Iterables.cycle(1, 2, 3), Functions.toStringFunction());
-    assertThat(Iterables.get(result, 0)).isEqualTo("#1");
-  }
-
-  @Test
-  public void prependEach_typicalList() {
-    Iterable<String> result = Interspersing.prependEach(
-        "*", ImmutableList.of("a", "b", "c"));
-    assertThat(result).containsExactly("*a", "*b", "*c").inOrder();
-  }
-
-  @Test
-  public void prependEach_throwsForNullWhat() {
-    assertThrows(
-        NullPointerException.class, () -> Interspersing.prependEach(null, ImmutableList.of("a")));
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
index 7a35081..39b4a35 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
@@ -1310,7 +1310,10 @@
     assertContainsSublist(
         removeConfigFragment(removeConfigFragment(compileAction.getArguments())),
         ImmutableList.copyOf(
-            Interspersing.beforeEach("-isystem", rootedIncludePaths("package/foo/bar"))));
+            Iterables.concat(
+                Iterables.transform(
+                    rootedIncludePaths("package/foo/bar"),
+                    element -> ImmutableList.of("-isystem", element)))));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ValueTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ValueTest.java
deleted file mode 100644
index ea98476..0000000
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ValueTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.objc;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Unit tests for {@class Value}.
- */
-@RunWith(JUnit4.class)
-public class ValueTest {
-  private static final class PersonName extends Value<PersonName> {
-    public PersonName(String first, String last) {
-      super(first, last);
-    }
-  }
-
-  private enum NameData {
-    JOHN_DOE, JANE_DOE, JOHN_SMITH,
-  }
-
-  private PersonName make(NameData what) {
-    switch (what) {
-      case JOHN_DOE:
-        return new PersonName("John", "Doe");
-      case JANE_DOE:
-        return new PersonName("Jane", "Doe");
-      case JOHN_SMITH:
-        return new PersonName("John", "Smith");
-      default:
-        throw new IllegalArgumentException("unknown: " + what);
-    }
-  }
-
-  @Test
-  public void nullNotAllowedInMemberData() {
-    assertThrows(NullPointerException.class, () -> new PersonName(null, "Doe"));
-  }
-
-  @Test
-  public void equality() {
-    EqualsTester tester = new EqualsTester();
-    for (NameData what : NameData.values()) {
-      tester.addEqualityGroup(make(what), make(what));
-    }
-    tester.testEquals();
-  }
-
-  @Test
-  public void testToString() {
-    assertThat(make(NameData.JOHN_DOE).toString()).contains("John");
-    assertThat(make(NameData.JOHN_DOE).toString()).contains("Doe");
-  }
-}
