@Override
  public boolean equals(@Nullable Object other) {
    if (!(other instanceof PCollectionList)) {
      return false;
    }
    PCollectionList<?> that = (PCollectionList<?>) other;
    return this.pipeline.equals(that.pipeline) && this.getAll().equals(that.getAll());
  }
@Test
  public void testEquals() {
    Pipeline p = TestPipeline.create();
    PCollection<String> first = p.apply("Meta", Create.of("foo", "bar"));
    PCollection<String> second = p.apply("Pythonic", Create.of("spam, ham"));
    PCollection<String> third = p.apply("Syntactic", Create.of("eggs", "baz"));

    EqualsTester tester = new EqualsTester();
    //    tester.addEqualityGroup(PCollectionList.empty(p), PCollectionList.empty(p));
    //    tester.addEqualityGroup(PCollectionList.of(first).and(second));
    // Constructors should all produce equivalent
    tester.addEqualityGroup(
        PCollectionList.of(first).and(second).and(third),
        PCollectionList.of(first).and(second).and(third),
        //        PCollectionList.<String>empty(p).and(first).and(second).and(third),
        //        PCollectionList.of(ImmutableList.of(first, second, third)),
        //        PCollectionList.of(first).and(ImmutableList.of(second, third)),
        PCollectionList.of(ImmutableList.of(first, second)).and(third));
    // Order is considered
    tester.addEqualityGroup(PCollectionList.of(first).and(third).and(second));
    tester.addEqualityGroup(PCollectionList.empty(TestPipeline.create()));

    tester.testEquals();
  }