// Path: storebox-harness/src/androidTest/java/net/orange_box/storebox/harness/base/PreferencesTestCase.java
// public abstract class PreferencesTestCase<T> extends InstrumentationTestCase {
// 
//     protected T uut;
//     private SharedPreferences prefs;
// 
//     protected abstract Class<T> getInterface();
//     
//     @Override
//     protected void setUp() throws Exception {
//         super.setUp();
// 
//         uut = StoreBox.create(
//                 getInstrumentation().getTargetContext(),
//                 getInterface());
// 
//         prefs = PreferenceManager.getDefaultSharedPreferences(
//                 getInstrumentation().getTargetContext());
//     }
// 
//     @SuppressLint("CommitPrefEdits")
//     @Override
//     protected void tearDown() throws Exception {
//         uut = null;
// 
//         // we are saving to the actual preferences so let's clear them
//         prefs.edit().clear().commit();
//         prefs = null;
//         
//         super.tearDown();
//     }
// }
// 
// Path: storebox-harness/src/main/java/net/orange_box/storebox/harness/interfaces/changes/ChangeListenersInterface.java
// public interface ChangeListenersInterface {
//     
//     @KeyByString("key_int")
//     void setInt(int value);
//     
//     @KeyByString("key_int")
//     @RegisterChangeListenerMethod
//     void registerIntChangeListener(
//             OnPreferenceValueChangedListener<Integer> listener);
// 
//     @KeyByString("key_int")
//     @RegisterChangeListenerMethod
//     void registerIntChangeListenerVarArgs(
//             OnPreferenceValueChangedListener<Integer>... listeners);
// 
//     @KeyByString("key_int")
//     @UnregisterChangeListenerMethod
//     void unregisterIntChangeListener(
//             OnPreferenceValueChangedListener<Integer> listener);
// 
//     @KeyByString("key_int")
//     @UnregisterChangeListenerMethod
//     void unregisterIntChangeListenerVarArgs(
//             OnPreferenceValueChangedListener<Integer>... listeners);
//     
// 
//     @KeyByString("key_custom_class")
//     @TypeAdapter(CustomClassTypeAdapter.class)
//     void setCustomClass(CustomClass value);
// 
//     @KeyByString("key_custom_class")
//     @RegisterChangeListenerMethod
//     @TypeAdapter(CustomClassTypeAdapter.class)
//     void registerCustomClassChangeListener(
//             OnPreferenceValueChangedListener<CustomClass> listener);
// 
//     @KeyByString("key_custom_class")
//     @UnregisterChangeListenerMethod
//     @TypeAdapter(CustomClassTypeAdapter.class)
//     void unregisterCustomClassChangeListener(
//             OnPreferenceValueChangedListener<CustomClass> listener);
// }
// 
// Path: storebox-harness/src/main/java/net/orange_box/storebox/harness/types/CustomClass.java
// public class CustomClass {
//     
//     private int hashCode;
//     
//     private final String one;
//     private final String two;
//     
//     public CustomClass() {
//         this("", "");
//     }
//     
//     public CustomClass(String one, String two) {
//         this.one = one;
//         this.two = two;
//     }
//     
//     public String getOne() {
//         return one;
//     }
//     
//     public String getTwo() {
//         return two;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o == null || !(o instanceof CustomClass)) {
//             return false;
//         }
//         
//         final CustomClass other = (CustomClass) o;
//         return (one.equals(other.one) && two.equals(other.two));
//     }
// 
//     @Override
//     public int hashCode() {
//         if (hashCode == 0) {
//             hashCode = Arrays.hashCode(new String[] {one, two});
//         }
//         
//         return hashCode;
//     }
// }
// 
// Path: storebox-lib/src/main/java/net/orange_box/storebox/listeners/OnPreferenceValueChangedListener.java
// public interface OnPreferenceValueChangedListener<T> {
//     
//     void onChanged(T newValue);
// }


import android.test.UiThreadTest;
import android.test.suitebuilder.annotation.SmallTest;
import net.orange_box.storebox.harness.base.PreferencesTestCase;
import net.orange_box.storebox.harness.interfaces.changes.ChangeListenersInterface;
import net.orange_box.storebox.harness.types.CustomClass;
import net.orange_box.storebox.listeners.OnPreferenceValueChangedListener;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
    
    @UiThreadTest
    @SmallTest
    public void testIntUnregisteredVarArgs() {
        final AtomicInteger count = new AtomicInteger(2);
        final OnPreferenceValueChangedListener<Integer> one =
                new OnPreferenceValueChangedListener<Integer>() {
                    @Override
                    public void onChanged(Integer newValue) {
                        count.decrementAndGet();
                    }
                };
        final OnPreferenceValueChangedListener<Integer> two =
                new OnPreferenceValueChangedListener<Integer>() {
                    @Override
                    public void onChanged(Integer newValue) {
                        count.decrementAndGet();
                    }
                };

        uut.registerIntChangeListenerVarArgs(one, two);
        uut.unregisterIntChangeListenerVarArgs(one, two);
        uut.setInt(1);

        assertEquals(2, count.get());
    }
    
    @UiThreadTest
    @SmallTest
    public void testCustomClassChanged() {
// Path: storebox-harness/src/androidTest/java/net/orange_box/storebox/harness/base/PreferencesTestCase.java
// public abstract class PreferencesTestCase<T> extends InstrumentationTestCase {
// 
//     protected T uut;
//     private SharedPreferences prefs;
// 
//     protected abstract Class<T> getInterface();
//     
//     @Override
//     protected void setUp() throws Exception {
//         super.setUp();
// 
//         uut = StoreBox.create(
//                 getInstrumentation().getTargetContext(),
//                 getInterface());
// 
//         prefs = PreferenceManager.getDefaultSharedPreferences(
//                 getInstrumentation().getTargetContext());
//     }
// 
//     @SuppressLint("CommitPrefEdits")
//     @Override
//     protected void tearDown() throws Exception {
//         uut = null;
// 
//         // we are saving to the actual preferences so let's clear them
//         prefs.edit().clear().commit();
//         prefs = null;
//         
//         super.tearDown();
//     }
// }
// 
// Path: storebox-harness/src/main/java/net/orange_box/storebox/harness/interfaces/changes/ChangeListenersInterface.java
// public interface ChangeListenersInterface {
//     
//     @KeyByString("key_int")
//     void setInt(int value);
//     
//     @KeyByString("key_int")
//     @RegisterChangeListenerMethod
//     void registerIntChangeListener(
//             OnPreferenceValueChangedListener<Integer> listener);
// 
//     @KeyByString("key_int")
//     @RegisterChangeListenerMethod
//     void registerIntChangeListenerVarArgs(
//             OnPreferenceValueChangedListener<Integer>... listeners);
// 
//     @KeyByString("key_int")
//     @UnregisterChangeListenerMethod
//     void unregisterIntChangeListener(
//             OnPreferenceValueChangedListener<Integer> listener);
// 
//     @KeyByString("key_int")
//     @UnregisterChangeListenerMethod
//     void unregisterIntChangeListenerVarArgs(
//             OnPreferenceValueChangedListener<Integer>... listeners);
//     
// 
//     @KeyByString("key_custom_class")
//     @TypeAdapter(CustomClassTypeAdapter.class)
//     void setCustomClass(CustomClass value);
// 
//     @KeyByString("key_custom_class")
//     @RegisterChangeListenerMethod
//     @TypeAdapter(CustomClassTypeAdapter.class)
//     void registerCustomClassChangeListener(
//             OnPreferenceValueChangedListener<CustomClass> listener);
// 
//     @KeyByString("key_custom_class")
//     @UnregisterChangeListenerMethod
//     @TypeAdapter(CustomClassTypeAdapter.class)
//     void unregisterCustomClassChangeListener(
//             OnPreferenceValueChangedListener<CustomClass> listener);
// }
// 
// Path: storebox-harness/src/main/java/net/orange_box/storebox/harness/types/CustomClass.java
// public class CustomClass {
//     
//     private int hashCode;
//     
//     private final String one;
//     private final String two;
//     
//     public CustomClass() {
//         this("", "");
//     }
//     
//     public CustomClass(String one, String two) {
//         this.one = one;
//         this.two = two;
//     }
//     
//     public String getOne() {
//         return one;
//     }
//     
//     public String getTwo() {
//         return two;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o == null || !(o instanceof CustomClass)) {
//             return false;
//         }
//         
//         final CustomClass other = (CustomClass) o;
//         return (one.equals(other.one) && two.equals(other.two));
//     }
// 
//     @Override
//     public int hashCode() {
//         if (hashCode == 0) {
//             hashCode = Arrays.hashCode(new String[] {one, two});
//         }
//         
//         return hashCode;
//     }
// }
// 
// Path: storebox-lib/src/main/java/net/orange_box/storebox/listeners/OnPreferenceValueChangedListener.java
// public interface OnPreferenceValueChangedListener<T> {
//     
//     void onChanged(T newValue);
// }


// Path: storebox-harness/src/androidTest/java/net/orange_box/storebox/harness/changes/ChangesListenersTestCase.java
import android.test.UiThreadTest;
import android.test.suitebuilder.annotation.SmallTest;
import net.orange_box.storebox.harness.base.PreferencesTestCase;
import net.orange_box.storebox.harness.interfaces.changes.ChangeListenersInterface;
import net.orange_box.storebox.harness.types.CustomClass;
import net.orange_box.storebox.listeners.OnPreferenceValueChangedListener;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

    
    @UiThreadTest
    @SmallTest
    public void testIntUnregisteredVarArgs() {
        final AtomicInteger count = new AtomicInteger(2);
        final OnPreferenceValueChangedListener<Integer> one =
                new OnPreferenceValueChangedListener<Integer>() {
                    @Override
                    public void onChanged(Integer newValue) {
                        count.decrementAndGet();
                    }
                };
        final OnPreferenceValueChangedListener<Integer> two =
                new OnPreferenceValueChangedListener<Integer>() {
                    @Override
                    public void onChanged(Integer newValue) {
                        count.decrementAndGet();
                    }
                };

        uut.registerIntChangeListenerVarArgs(one, two);
        uut.unregisterIntChangeListenerVarArgs(one, two);
        uut.setInt(1);

        assertEquals(2, count.get());
    }
    
    @UiThreadTest
    @SmallTest
    public void testCustomClassChanged() {
        final AtomicReference<CustomClass> value = new AtomicReference<>();