// Path: src/main/java/org/apache/hadoop/mrunit/types/Pair.java
// public class Pair<S, T> implements Comparable<Pair<S, T>> {
// 
//   private final S first;
//   private final T second;
// 
//   public Pair(final S car, final T cdr) {
//     first = car;
//     second = cdr;
//   }
// 
//   public S getFirst() { return first; }
//   public T getSecond() { return second; }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (null == o) {
//       return false;
//     } else if (o instanceof Pair) {
//       Pair<S, T> p = (Pair<S, T>) o;
//       if (first == null && second == null) {
//         return p.first == null && p.second == null;
//       } else if (first == null) {
//         return p.first == null && second.equals(p.second);
//       } else if (second == null) {
//         return p.second == null && first.equals(p.first);
//       } else {
//         return first.equals(p.first) && second.equals(p.second);
//       }
//     } else {
//       return false;
//     }
//   }
// 
//   @Override
//   public int hashCode() {
//     int code = 0;
// 
//     if (null != first) {
//       code += first.hashCode();
//     }
// 
//     if (null != second) {
//       code += second.hashCode() << 1;
//     }
// 
//     return code;
//   }
// 
//   @Override
//   public int compareTo(Pair<S, T> p) {
//     if (null == p) {
//       return 1;
//     }
// 
//     Comparable<S> firstCompare = (Comparable<S>) first;
// 
//     int firstResult = firstCompare.compareTo(p.first);
//     if (firstResult == 0) {
//       Comparable<T> secondCompare = (Comparable<T>) second;
//       return secondCompare.compareTo(p.second);
//     } else {
//       return firstResult;
//     }
//   }
// 
//   // TODO: Can this be made static? Same with SecondElemComparator?
//   public class FirstElemComparator implements Comparator<Pair<S, T>> {
//     public FirstElemComparator() {
//     }
// 
//     public int compare(Pair<S, T> p1, Pair<S, T> p2) {
//       Comparable<S> cS = (Comparable<S>) p1.first;
//       return cS.compareTo(p2.first);
//     }
//   }
// 
//   public class SecondElemComparator implements Comparator<Pair<S, T>> {
//     public SecondElemComparator() {
//     }
// 
//     public int compare(Pair<S, T> p1, Pair<S, T> p2) {
//       Comparable<T> cT = (Comparable<T>) p1.second;
//       return cT.compareTo(p2.second);
//     }
//   }
// 
//   @Override
//   public String toString() {
//     String firstString = "null";
//     String secondString = "null";
// 
//     if (null != first) {
//       firstString = first.toString();
//     }
// 
//     if (null != second) {
//       secondString = second.toString();
//     }
// 
//     return "(" + firstString + ", " + secondString + ")";
//   }
// }


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.DataInputBuffer;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.serializer.Deserializer;
import org.apache.hadoop.io.serializer.SerializationFactory;
import org.apache.hadoop.io.serializer.Serializer;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mrunit.types.Pair;
    }

    Class klazz = obj.getClass();
    Object out = null;
    Serializer s = serializationFactory.getSerializer(klazz);
    Deserializer ds = serializationFactory.getDeserializer(klazz);

    try {
      s.open(outBuffer);
      ds.open(inBuffer);

      outBuffer.reset();
      s.serialize(obj);

      byte [] data = outBuffer.getData();
      int len = outBuffer.getLength();
      inBuffer.reset(data, len);

      out = ds.deserialize(out);

      return out;
    } finally {
      try {
        s.close();
      } catch (IOException ioe) {
        // ignore this; we're closing.
      }

      try {
        ds.close();
// Path: src/main/java/org/apache/hadoop/mrunit/types/Pair.java
// public class Pair<S, T> implements Comparable<Pair<S, T>> {
// 
//   private final S first;
//   private final T second;
// 
//   public Pair(final S car, final T cdr) {
//     first = car;
//     second = cdr;
//   }
// 
//   public S getFirst() { return first; }
//   public T getSecond() { return second; }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (null == o) {
//       return false;
//     } else if (o instanceof Pair) {
//       Pair<S, T> p = (Pair<S, T>) o;
//       if (first == null && second == null) {
//         return p.first == null && p.second == null;
//       } else if (first == null) {
//         return p.first == null && second.equals(p.second);
//       } else if (second == null) {
//         return p.second == null && first.equals(p.first);
//       } else {
//         return first.equals(p.first) && second.equals(p.second);
//       }
//     } else {
//       return false;
//     }
//   }
// 
//   @Override
//   public int hashCode() {
//     int code = 0;
// 
//     if (null != first) {
//       code += first.hashCode();
//     }
// 
//     if (null != second) {
//       code += second.hashCode() << 1;
//     }
// 
//     return code;
//   }
// 
//   @Override
//   public int compareTo(Pair<S, T> p) {
//     if (null == p) {
//       return 1;
//     }
// 
//     Comparable<S> firstCompare = (Comparable<S>) first;
// 
//     int firstResult = firstCompare.compareTo(p.first);
//     if (firstResult == 0) {
//       Comparable<T> secondCompare = (Comparable<T>) second;
//       return secondCompare.compareTo(p.second);
//     } else {
//       return firstResult;
//     }
//   }
// 
//   // TODO: Can this be made static? Same with SecondElemComparator?
//   public class FirstElemComparator implements Comparator<Pair<S, T>> {
//     public FirstElemComparator() {
//     }
// 
//     public int compare(Pair<S, T> p1, Pair<S, T> p2) {
//       Comparable<S> cS = (Comparable<S>) p1.first;
//       return cS.compareTo(p2.first);
//     }
//   }
// 
//   public class SecondElemComparator implements Comparator<Pair<S, T>> {
//     public SecondElemComparator() {
//     }
// 
//     public int compare(Pair<S, T> p1, Pair<S, T> p2) {
//       Comparable<T> cT = (Comparable<T>) p1.second;
//       return cT.compareTo(p2.second);
//     }
//   }
// 
//   @Override
//   public String toString() {
//     String firstString = "null";
//     String secondString = "null";
// 
//     if (null != first) {
//       firstString = first.toString();
//     }
// 
//     if (null != second) {
//       secondString = second.toString();
//     }
// 
//     return "(" + firstString + ", " + secondString + ")";
//   }
// }


// Path: src/main/java/org/apache/hadoop/mrunit/mock/MockOutputCollector.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.DataInputBuffer;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.serializer.Deserializer;
import org.apache.hadoop.io.serializer.SerializationFactory;
import org.apache.hadoop.io.serializer.Serializer;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mrunit.types.Pair;

    }

    Class klazz = obj.getClass();
    Object out = null;
    Serializer s = serializationFactory.getSerializer(klazz);
    Deserializer ds = serializationFactory.getDeserializer(klazz);

    try {
      s.open(outBuffer);
      ds.open(inBuffer);

      outBuffer.reset();
      s.serialize(obj);

      byte [] data = outBuffer.getData();
      int len = outBuffer.getLength();
      inBuffer.reset(data, len);

      out = ds.deserialize(out);

      return out;
    } finally {
      try {
        s.close();
      } catch (IOException ioe) {
        // ignore this; we're closing.
      }

      try {
        ds.close();
      } catch (IOException ioe) {