12ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelpackage com.xtremelabs.robolectric.shadows;
22ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
32ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelimport com.xtremelabs.robolectric.internal.Implementation;
42ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelimport com.xtremelabs.robolectric.internal.Implements;
52ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelimport com.xtremelabs.robolectric.internal.RealObject;
62ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
72ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelimport android.util.Pair;
82ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
92ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelimport java.lang.reflect.Field;
102ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
112ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel/**
122ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel * Shadow of {@code Pair}
132ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel */
142ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel@SuppressWarnings({"UnusedDeclaration"})
152ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel@Implements(Pair.class)
162ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkelpublic class ShadowPair {
172ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    @RealObject private Pair realPair;
182ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
192ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    public void __constructor__(Object first, Object second) {
202ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        setFields(realPair, first, second);
212ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    }
222ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
232ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    @Implementation
242ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    public static <F, S> Pair<F, S> create(F f, S s) {
252ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        return new Pair<F, S>(f, s);
262ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    }
272ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
282ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    @Override @Implementation
292ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    public int hashCode() {
302ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        return realPair.first.hashCode() + realPair.second.hashCode();
312ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    }
322ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
332ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    @Override @Implementation
342ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    public boolean equals(Object o) {
352ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        if (o == this) return true;
362ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        if (!(o instanceof Pair)) return false;
372ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        final Pair other = (Pair) o;
382ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        return realPair.first.equals(other.first) && realPair.second.equals(other.second);
392ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    }
402ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
412ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    private static void setFields(Pair p, Object first, Object second) {
422ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        try {
432ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            Field f = Pair.class.getDeclaredField("first");
442ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            f.setAccessible(true);
452ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            f.set(p, first);
462ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
472ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            Field s = Pair.class.getDeclaredField("second");
482ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            s.setAccessible(true);
492ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            s.set(p, second);
502ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        } catch (NoSuchFieldException e) {
512ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            throw new RuntimeException(e);
522ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        } catch (IllegalAccessException e) {
532ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel            throw new RuntimeException(e);
542ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel        }
552ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel    }
562ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel}
572ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
582ed797adb849f96d26ffaae31d68a2a67f56f27bJan Berkel
59