// Path: liquid/src/main/java/io/lqd/sdk/model/LQUser.java
// public class LQUser extends LQModel {
// 
//     private static final long serialVersionUID = 1582937331182018907L;
//     private static final String[] RESERVED_KEYS  = {"unique_id", "identified"};
// 
//     private String mIdentifier;
//     private boolean mIdentified;
//     private HashMap<String, Object> mAttributes = new HashMap<String, Object>();
// 
//     public LQUser(String identifier) {
//         this(identifier, new HashMap<String,Object>());
//     }
// 
//     public LQUser(String identifier, boolean identified) {
//         this(identifier, new HashMap<String,Object>(), identified);
//     }
// 
//     public LQUser(String identifier, HashMap<String, Object> attributes) {
//         this(identifier, attributes, true);
//     }
// 
//     public LQUser(String identifier, HashMap<String, Object> attributes, boolean identified) {
//         mIdentifier = identifier;
//         mAttributes = attributes;
//         this.setIdentified(identified);
//         attributesCheck();
// 
//     }
// 
//     // Attributes
//     public String getIdentifier() {
//         return mIdentifier;
//     }
// 
//     public String setIdentifierForPrefs(String identifier){
//         mIdentifier = identifier;
//         return mIdentifier;
//     }
// 
//     public boolean isIdentified() {
//         return mIdentified;
//     }
// 
//     public void setIdentified(boolean mAutoIdentified) {
//         this.mIdentified = mAutoIdentified;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         return (o instanceof LQUser) && ( this.toJSON().toString().equals(((LQUser) o).toJSON().toString()));
//     }
// 
//     public void clearCustomAttributes() {
//         setAttributes(new HashMap<String, Object>());
//     }
// 
//     public HashMap<String, Object> getAttributes() {
//         return new HashMap<String, Object>(mAttributes);
//     }
// 
//     public void setAttributes(HashMap<String, Object> attributes) {
//         mAttributes = attributes;
//         attributesCheck();
//     }
// 
//     public Object setAttribute(String key, Object attribute) {
//         return mAttributes.put(key, attribute);
//     }
// 
//     public Object attributeForKey(String key) {
//         return mAttributes.get(key);
//     }
// 
//     // JSON
//     public JSONObject toJSON() {
//         JSONObject json = new JSONObject();
//         try {
//             if(mAttributes != null) {
//                 for(String key : mAttributes.keySet()) {
//                     if(mAttributes.get(key) instanceof Date) {
//                         json.put(key, LiquidTools.dateToString((Date) mAttributes.get(key)));
//                     } else {
//                         json.put(key, mAttributes.get(key));
//                     }
//                 }
//             }
//             json.put("unique_id", mIdentifier);
//             json.put("identified", mIdentified);
//             return json;
//         } catch (JSONException e) {
//             LQLog.error("LQUser toJSON: " + e.getMessage());
//         }
//         return null;
//     }
// 
// 
// 
//     public static LQModel fromJSON(JSONObject jsonObject) {
//         try {
//             String unique_id = jsonObject.getString("unique_id");
//             boolean identified = jsonObject.getBoolean("identified");
//             HashMap<String, Object> attrs = attributesFromJSON(jsonObject, RESERVED_KEYS);
//             return new LQUser(unique_id, attrs, identified);
//         } catch (JSONException e) {
//             LQLog.infoVerbose("New user, identifying now...");
//             return new LQUser(LQModel.newIdentifier(), false);
//         }
//     }
// 
//     protected void attributesCheck() {
//         if(mAttributes == null) {
//             mAttributes = new HashMap<String, Object>();
//         }
//     }
// 
//     @Override
//     public void save(Context context, String path) {
//         super.save(context, path + ".user");
//     }
// 
//     public static LQUser load(Context context, String path) {
//         return (LQUser) fromJSON(retriveFromFile(context, path));
//     }
// 
// }


import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.lang.reflect.Field;
import java.util.HashMap;
import io.lqd.sdk.model.LQUser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
        lqd.resetUser();
        assertNotEquals("new_id", lqd.getUserIdentifier()); //resets the user id
    }

    @Test
    public void testResetUserAnonymous() {
        String id = lqd.getUserIdentifier();
        lqd.resetUser();
        assertEquals(id, lqd.getUserIdentifier());
    }


    @Test
    public void testnewSessionAfterReset() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
        Field f = Liquid.class.getDeclaredField("mCurrentSession");
        f.setAccessible(true);
        lqd.softReset();
        assertNotNull(f.get(lqd));
    }

    // public void setUserAttributes(final Map<String, Object> attributes)

    @Test
    public void testSetAttributes() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
        HashMap<String, Object> attrs = new HashMap<>();
        attrs.put("key", 1);
        attrs.put("key_2", "value");
        lqd.setUserAttributes(attrs);
        Field f = Liquid.class.getDeclaredField("mCurrentUser");
        f.setAccessible(true);
// Path: liquid/src/main/java/io/lqd/sdk/model/LQUser.java
// public class LQUser extends LQModel {
// 
//     private static final long serialVersionUID = 1582937331182018907L;
//     private static final String[] RESERVED_KEYS  = {"unique_id", "identified"};
// 
//     private String mIdentifier;
//     private boolean mIdentified;
//     private HashMap<String, Object> mAttributes = new HashMap<String, Object>();
// 
//     public LQUser(String identifier) {
//         this(identifier, new HashMap<String,Object>());
//     }
// 
//     public LQUser(String identifier, boolean identified) {
//         this(identifier, new HashMap<String,Object>(), identified);
//     }
// 
//     public LQUser(String identifier, HashMap<String, Object> attributes) {
//         this(identifier, attributes, true);
//     }
// 
//     public LQUser(String identifier, HashMap<String, Object> attributes, boolean identified) {
//         mIdentifier = identifier;
//         mAttributes = attributes;
//         this.setIdentified(identified);
//         attributesCheck();
// 
//     }
// 
//     // Attributes
//     public String getIdentifier() {
//         return mIdentifier;
//     }
// 
//     public String setIdentifierForPrefs(String identifier){
//         mIdentifier = identifier;
//         return mIdentifier;
//     }
// 
//     public boolean isIdentified() {
//         return mIdentified;
//     }
// 
//     public void setIdentified(boolean mAutoIdentified) {
//         this.mIdentified = mAutoIdentified;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         return (o instanceof LQUser) && ( this.toJSON().toString().equals(((LQUser) o).toJSON().toString()));
//     }
// 
//     public void clearCustomAttributes() {
//         setAttributes(new HashMap<String, Object>());
//     }
// 
//     public HashMap<String, Object> getAttributes() {
//         return new HashMap<String, Object>(mAttributes);
//     }
// 
//     public void setAttributes(HashMap<String, Object> attributes) {
//         mAttributes = attributes;
//         attributesCheck();
//     }
// 
//     public Object setAttribute(String key, Object attribute) {
//         return mAttributes.put(key, attribute);
//     }
// 
//     public Object attributeForKey(String key) {
//         return mAttributes.get(key);
//     }
// 
//     // JSON
//     public JSONObject toJSON() {
//         JSONObject json = new JSONObject();
//         try {
//             if(mAttributes != null) {
//                 for(String key : mAttributes.keySet()) {
//                     if(mAttributes.get(key) instanceof Date) {
//                         json.put(key, LiquidTools.dateToString((Date) mAttributes.get(key)));
//                     } else {
//                         json.put(key, mAttributes.get(key));
//                     }
//                 }
//             }
//             json.put("unique_id", mIdentifier);
//             json.put("identified", mIdentified);
//             return json;
//         } catch (JSONException e) {
//             LQLog.error("LQUser toJSON: " + e.getMessage());
//         }
//         return null;
//     }
// 
// 
// 
//     public static LQModel fromJSON(JSONObject jsonObject) {
//         try {
//             String unique_id = jsonObject.getString("unique_id");
//             boolean identified = jsonObject.getBoolean("identified");
//             HashMap<String, Object> attrs = attributesFromJSON(jsonObject, RESERVED_KEYS);
//             return new LQUser(unique_id, attrs, identified);
//         } catch (JSONException e) {
//             LQLog.infoVerbose("New user, identifying now...");
//             return new LQUser(LQModel.newIdentifier(), false);
//         }
//     }
// 
//     protected void attributesCheck() {
//         if(mAttributes == null) {
//             mAttributes = new HashMap<String, Object>();
//         }
//     }
// 
//     @Override
//     public void save(Context context, String path) {
//         super.save(context, path + ".user");
//     }
// 
//     public static LQUser load(Context context, String path) {
//         return (LQUser) fromJSON(retriveFromFile(context, path));
//     }
// 
// }


// Path: liquid/src/test/java/io/lqd/sdk/LiquidTest.java
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.lang.reflect.Field;
import java.util.HashMap;
import io.lqd.sdk.model.LQUser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;

        lqd.resetUser();
        assertNotEquals("new_id", lqd.getUserIdentifier()); //resets the user id
    }

    @Test
    public void testResetUserAnonymous() {
        String id = lqd.getUserIdentifier();
        lqd.resetUser();
        assertEquals(id, lqd.getUserIdentifier());
    }


    @Test
    public void testnewSessionAfterReset() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
        Field f = Liquid.class.getDeclaredField("mCurrentSession");
        f.setAccessible(true);
        lqd.softReset();
        assertNotNull(f.get(lqd));
    }

    // public void setUserAttributes(final Map<String, Object> attributes)

    @Test
    public void testSetAttributes() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
        HashMap<String, Object> attrs = new HashMap<>();
        attrs.put("key", 1);
        attrs.put("key_2", "value");
        lqd.setUserAttributes(attrs);
        Field f = Liquid.class.getDeclaredField("mCurrentUser");
        f.setAccessible(true);
        LQUser user = ((LQUser) f.get(lqd));