package pl.mg6.testsupport; import android.os.Parcel; import android.os.Parcelable; import org.unitils.reflectionassert.ReflectionComparatorFactory; import java.lang.reflect.Field; public class Reparceler { public <T extends Parcelable> ReparcelingResult<T> reparcel(T original) { return reparcel(original, null); } static <T extends Parcelable> ReparcelingResult<T> reparcel(T original, String methodName) { try { T reparceled = reparcelImpl(original); boolean areEqual = ReflectionComparatorFactory.createRefectionComparator().isEqual(original, reparceled); return new ReparcelingResult<>(original, reparceled, areEqual, methodName, null); } catch (Throwable error) { return new ReparcelingResult<>(original, null, false, methodName, createError(original, error)); } } private static <T extends Parcelable> T reparcelImpl(T original) throws Throwable { Parcel parcel = Parcel.obtain(); original.writeToParcel(parcel, 0); parcel.setDataPosition(0); Field creatorField = original.getClass().getField("CREATOR"); Parcelable.Creator<T> creator = (Parcelable.Creator<T>) creatorField.get(null); return creator.createFromParcel(parcel); } private static ReparcelingError createError(Parcelable original, Throwable error) { String name = original.getClass().getSimpleName(); String message = String.format("Missing public static CREATOR field on class %s.", name); return new ReparcelingError(message, error); } }