PCollectionList implements PInput, POutput { @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()); } PCollectionList(Pipeline pipeline);   PCollectionList(Pipeline pipeline, List<TaggedPValue> values); static PCollectionList<T> empty(Pipeline pipeline); static PCollectionList<T> of(PCollection<T> pc); static PCollectionList<T> of(Iterable<PCollection<T>> pcs); PCollectionList<T> and(PCollection<T> pc); PCollectionList<T> and(Iterable<PCollection<T>> pcs); int size(); PCollection<T> get(int index); List<PCollection<T>> getAll(); OutputT apply(PTransform<PCollectionList<T>, OutputT> t); OutputT apply(
      String name, PTransform<PCollectionList<T>, OutputT> t); @Override Pipeline getPipeline(); @Override Map<TupleTag<?>, PValue> expand(); @Override void finishSpecifyingOutput(
      String transformName, PInput input, PTransform<?, ?> transform); @Override boolean equals(@Nullable Object other); @Override int hashCode();  }
@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.of(first).and(second).and(third), PCollectionList.of(first).and(second).and(third), PCollectionList.of(ImmutableList.of(first, second)).and(third)); tester.addEqualityGroup(PCollectionList.of(first).and(third).and(second)); tester.addEqualityGroup(PCollectionList.empty(TestPipeline.create())); tester.testEquals(); }