PCollectionTuple implements PInput, POutput { @Override public boolean equals(@Nullable Object other) { if (!(other instanceof PCollectionTuple)) { return false; } PCollectionTuple that = (PCollectionTuple) other; return this.pipeline.equals(that.pipeline) && this.pcollectionMap.equals(that.pcollectionMap); } PCollectionTuple(Pipeline pipeline);   PCollectionTuple(Pipeline pipeline, Map<TupleTag<?>, PCollection<?>> pcollectionMap); static PCollectionTuple empty(Pipeline pipeline); static PCollectionTuple of(TupleTag<T> tag, PCollection<T> pc); static PCollectionTuple of(String tag, PCollection<T> pc); static PCollectionTuple of(
      String tag1, PCollection<T> pc1, String tag2, PCollection<T> pc2); static PCollectionTuple of(
      String tag1,
      PCollection<T> pc1,
      String tag2,
      PCollection<T> pc2,
      String tag3,
      PCollection<T> pc3); static PCollectionTuple of(
      String tag1,
      PCollection<T> pc1,
      String tag2,
      PCollection<T> pc2,
      String tag3,
      PCollection<T> pc3,
      String tag4,
      PCollection<T> pc4); static PCollectionTuple of(
      String tag1,
      PCollection<T> pc1,
      String tag2,
      PCollection<T> pc2,
      String tag3,
      PCollection<T> pc3,
      String tag4,
      PCollection<T> pc4,
      String tag5,
      PCollection<T> pc5); PCollectionTuple and(TupleTag<T> tag, PCollection<T> pc); PCollectionTuple and(String tag, PCollection<T> pc); boolean has(TupleTag<T> tag); boolean has(String tag); PCollection<T> get(TupleTag<T> tag); PCollection<T> get(String tag); Map<TupleTag<?>, PCollection<?>> getAll(); OutputT apply(PTransform<? super PCollectionTuple, OutputT> t); OutputT apply(
      String name, PTransform<? super PCollectionTuple, OutputT> t); @Internal static PCollectionTuple ofPrimitiveOutputsInternal(
      Pipeline pipeline,
      TupleTagList outputTags,
      Map<TupleTag<?>, Coder<?>> coders,
      WindowingStrategy<?, ?> windowingStrategy,
      IsBounded isBounded); @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() { TestPipeline p = TestPipeline.create(); TupleTag<Long> longTag = new TupleTag<>(); PCollection<Long> longs = p.apply(GenerateSequence.from(0)); TupleTag<String> strTag = new TupleTag<>(); PCollection<String> strs = p.apply(Create.of("foo", "bar")); EqualsTester tester = new EqualsTester(); tester.addEqualityGroup(PCollectionTuple.empty(p), PCollectionTuple.empty(p)); tester.addEqualityGroup( PCollectionTuple.of(longTag, longs).and(strTag, strs), PCollectionTuple.of(longTag, longs).and(strTag, strs)); tester.addEqualityGroup(PCollectionTuple.of(longTag, longs)); tester.addEqualityGroup(PCollectionTuple.of(strTag, strs)); TestPipeline otherPipeline = TestPipeline.create(); tester.addEqualityGroup(PCollectionTuple.empty(otherPipeline)); tester.testEquals(); }