571 lines
22 KiB
Java
571 lines
22 KiB
Java
package org.aplas.myshop;
|
|
|
|
import android.app.Activity;
|
|
import android.app.Dialog;
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import android.content.res.ColorStateList;
|
|
import android.content.res.Resources;
|
|
import android.graphics.drawable.ColorDrawable;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.graphics.drawable.RippleDrawable;
|
|
import android.net.Uri;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.Button;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import androidx.core.content.ContextCompat;
|
|
import androidx.fragment.app.Fragment;
|
|
|
|
import org.junit.Assert;
|
|
import org.robolectric.Shadows;
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Modifier;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertNotEquals;
|
|
import static org.junit.Assert.assertNotNull;
|
|
import static org.junit.Assert.assertNull;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.junit.Assert.fail;
|
|
|
|
public class ViewTest {
|
|
final String UNDECLARED_CODE = "APLAS-UNDECLARED";
|
|
public static final String appName = "MyShop";
|
|
|
|
protected View getViewFromActivity(String name, Activity activity) {
|
|
int id = activity.getResources().getIdentifier(name, "id", activity.getPackageName());
|
|
return (id > 0)?(View) activity.findViewById(id):null;
|
|
}
|
|
|
|
protected View getViewFromFragment(String name, Fragment fragment) {
|
|
int id = fragment.getResources().getIdentifier(name, "id", fragment.getActivity().getPackageName());
|
|
return (id > 0)?(View) fragment.getView().findViewById(id):null;
|
|
}
|
|
|
|
protected String getViewName(View view) {
|
|
return (view.getId()<0)?"":view.getResources().getResourceEntryName(view.getId());
|
|
}
|
|
|
|
protected int getRscId(String name, String type, Activity activity) {
|
|
return activity.getResources().getIdentifier(name, type, activity.getPackageName());
|
|
}
|
|
|
|
private View currView;
|
|
private boolean found;
|
|
|
|
protected void findViewFromLayout(String name, View view) {
|
|
String viewName = getViewName(view);
|
|
if (viewName.equals(name)) {
|
|
currView=view;
|
|
found=true;
|
|
} else {
|
|
if (view instanceof ViewGroup) {
|
|
int i=0;
|
|
int childCount = ((ViewGroup) view).getChildCount();
|
|
while (i<childCount && !found) {
|
|
findViewFromLayout(name,((ViewGroup) view).getChildAt(i));
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected View getViLayout(String name, View view) {
|
|
currView=null;
|
|
found=false;
|
|
//findViewFromLayout(name,view);
|
|
return currView;
|
|
}
|
|
|
|
protected View getLayoutFromResource(String rscName, Activity activity, String layoutType) {
|
|
int rscId = getRscId(rscName,"layout",activity);
|
|
Assert.assertNotEquals(rscName+".xml is not exist!!",0,rscId);
|
|
LayoutInflater li = LayoutInflater.from(activity.getApplicationContext());
|
|
View view = li.inflate(rscId, null);
|
|
Assert.assertEquals(rscName+".xml should be a "+layoutType,view.getClass().getSimpleName(),layoutType);
|
|
return view;
|
|
}
|
|
|
|
protected View getViewFromLayout(String name, View layout) {
|
|
//layout.getContext()
|
|
int id = layout.getContext().getResources().getIdentifier(name, "id", layout.getContext().getPackageName());
|
|
return (id > 0)?(View) layout.findViewById(id):null;
|
|
}
|
|
|
|
protected View getViewFromDialog(String name, Dialog layout) {
|
|
//layout.getContext()
|
|
int id = layout.getContext().getResources().getIdentifier(name, "id", layout.getContext().getPackageName());
|
|
return (id > 0)?(View) layout.findViewById(id):null;
|
|
}
|
|
|
|
protected void testClassExist(String cname) {
|
|
try {
|
|
Class.forName(cname);
|
|
} catch (Exception e) {
|
|
fail(cname+" is not exist");
|
|
}
|
|
}
|
|
|
|
protected String testViewContent(View view, String expClass, String expText) {
|
|
String viewName = testViewExist(view,expClass);
|
|
assertEquals("Text of "+expClass+" '"+viewName+"' is wrong",expText,((TextView)view).getText().toString());
|
|
return viewName;
|
|
}
|
|
|
|
protected void testViewContent(View view, String expClass, String expText, String expHint) {
|
|
String viewName = testViewContent(view,expClass,expText);
|
|
assertEquals("Hint of "+viewName+" is wrong",expHint,((TextView)view).getHint().toString());
|
|
}
|
|
|
|
protected void testViewContent(View view, String expClass, String expText, boolean expEnabled) {
|
|
String viewName = testViewContent(view,expClass,expText);
|
|
assertEquals("Enabled status "+viewName+" is wrong",expEnabled,view.isEnabled());
|
|
}
|
|
|
|
protected String testViewContent(View view, String expText) {
|
|
String viewName = getViewName(view);
|
|
assertEquals("Text of '"+viewName+"' is wrong",expText,((TextView)view).getText().toString());
|
|
return viewName;
|
|
}
|
|
|
|
protected String testViewContains(View view, String expText) {
|
|
String viewName = getViewName(view);
|
|
testItem(0,((TextView)view).getText().toString().contains(expText),
|
|
"Text of '"+viewName+"' should contain "+expText,3);
|
|
return viewName;
|
|
}
|
|
|
|
protected void testViewEnabled(View view, boolean expEnabled) {
|
|
String viewName = getViewName(view);
|
|
assertEquals("Enabled status "+viewName+" is wrong",expEnabled,view.isEnabled());
|
|
}
|
|
|
|
protected String testViewExist(View view, String expClass) {
|
|
assertNotNull(expClass+" is not found",view);
|
|
String viewName = getViewName(view);
|
|
assertEquals("View with id="+viewName+" should be a "+expClass, expClass, view.getClass().getSimpleName());
|
|
return viewName;
|
|
}
|
|
|
|
protected View testViewExist(String name, String expClass, Activity activity) {
|
|
int id = activity.getResources().getIdentifier(name, "id", activity.getPackageName());
|
|
if (id>0) {
|
|
View view = activity.findViewById(id);
|
|
String actClass = view.getClass().getSimpleName();
|
|
testItem(0,actClass.contains(expClass),
|
|
"View with id="+name+" should be a "+expClass+", not "+actClass, 3);
|
|
return view;
|
|
} else {
|
|
fail("View with id='"+name+"' is not found in "+activity.getClass().getSimpleName());
|
|
return null;
|
|
}
|
|
}
|
|
|
|
protected View testViewExist(String name, String expClass, View layout) {
|
|
int id = layout.getResources().getIdentifier(name, "id", layout.getContext().getPackageName());
|
|
if (id>0) {
|
|
View view = layout.findViewById(id);
|
|
String actClass = view.getClass().getSimpleName();
|
|
testItem(0,actClass.contains(expClass),
|
|
"View with id="+name+" should be a "+expClass+", not "+actClass, 3);
|
|
return view;
|
|
} else {
|
|
fail("View with id='"+name+"' is not found in "+layout.getClass().getSimpleName());
|
|
return null;
|
|
}
|
|
}
|
|
|
|
protected Object testFieldExist(String name, String expClass, Activity activity) {
|
|
Object field = getFieldValue(activity,name);
|
|
if (field.getClass().getSimpleName().equals("String")) {
|
|
if (((String) field).equals(UNDECLARED_CODE)) {
|
|
assertNotNull("Field " + name + " is not yet declared!!", field);
|
|
}
|
|
}
|
|
assertEquals("Field '"+name+"' should be a "+expClass, expClass, field.getClass().getSimpleName());
|
|
return field;
|
|
}
|
|
|
|
protected View testFieldViewExist(String name, String expClass, Activity activity) {
|
|
Object field = getFieldValue(activity,name);
|
|
if (field.getClass().getSimpleName().equals("String")) {
|
|
if (((String) field).equals(UNDECLARED_CODE)) {
|
|
assertNotNull("Field " + name + " is not yet declared!!", field);
|
|
}
|
|
}
|
|
assertNotNull(expClass+" '"+name+"' should be initialized with 'findViewById'",field);
|
|
assertEquals("Field '"+name+"' should be a "+expClass, expClass, field.getClass().getSimpleName());
|
|
//assertNotEquals(expClass+" '"+name+"' should be initialized with 'findViewById'",0,((View)field).getId());
|
|
return (View)field;
|
|
}
|
|
|
|
protected String testImageContent(View view, String expClass, ImageView.ScaleType scale, boolean bound) {
|
|
String viewName = testViewExist(view,expClass);
|
|
assertEquals("The scaleType in "+expClass+" with id="+viewName+" is should be "+scale.toString(),scale,((ImageView)view).getScaleType());
|
|
assertEquals("The adjustViewBounds in "+expClass+" with id="+viewName+" is should be "+bound,bound,((ImageView)view).getAdjustViewBounds());
|
|
return viewName;
|
|
}
|
|
|
|
protected int getImageResId(ImageView view) {
|
|
return Shadows.shadowOf(view.getDrawable()).getCreatedFromResId();
|
|
}
|
|
|
|
protected String testImageContent(View view, String src) {
|
|
Context context = view.getContext();
|
|
int srcId = context.getResources().getIdentifier(src, "drawable",context.getPackageName());
|
|
int actualId = getImageResId((ImageView)view);
|
|
String viewName = getViewName(view);
|
|
testItem(0,srcId==actualId,"The image source in "+view.getClass().getSimpleName()+
|
|
" with id='"+viewName+"' should be '"+src+"'.(jpg/png) in drawable resource", 3);
|
|
return viewName;
|
|
}
|
|
|
|
protected String testImageContent(View view, String expClass, String src) {
|
|
String viewName = testViewExist(view,expClass);
|
|
Context context = view.getContext();
|
|
int srcId = context.getResources().getIdentifier(src, "drawable",context.getPackageName());
|
|
int actualId = getImageResId((ImageView)view);
|
|
assertEquals("The image source in "+expClass+" with id="+viewName+" is not '"+src+"'",srcId,actualId);
|
|
return viewName;
|
|
}
|
|
|
|
protected boolean checkImageContent(View view, String src) {
|
|
Context context = view.getContext();
|
|
int srcId = context.getResources().getIdentifier(src, "drawable",context.getPackageName());
|
|
int actualId = getImageResId((ImageView)view);
|
|
return srcId==actualId;
|
|
}
|
|
|
|
protected String testImageContent(View view, String expClass, String src, ImageView.ScaleType scale, boolean bound) {
|
|
String viewName = testImageContent(view,expClass,src);
|
|
assertEquals("The scaleType in "+expClass+" with id="+viewName+" is should be "+scale.toString(),scale,((ImageView)view).getScaleType());
|
|
assertEquals("The adjustViewBounds in "+expClass+" with id="+viewName+" is should be "+bound,bound,((ImageView)view).getAdjustViewBounds());
|
|
return viewName;
|
|
}
|
|
|
|
protected String getValueOf(ArrayList<String> list) {
|
|
String str = "";
|
|
for (int i=0; i<list.size(); i++) {
|
|
str += list.get(i)+"-";
|
|
}
|
|
return str.substring(0,str.length()-1);
|
|
}
|
|
|
|
protected Uri getUriFromResource(int id, Activity main) {
|
|
Resources res = main.getResources();
|
|
return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
|
|
"://" + res.getResourcePackageName(id)
|
|
+ '/' + res.getResourceTypeName(id) + '/' + res.getResourceEntryName(id) );
|
|
}
|
|
|
|
public void testItem(Object expectVal, Object actualVal, String msg, int type) {
|
|
switch (type) {
|
|
case 1: assertEquals(msg,expectVal,actualVal);
|
|
break;
|
|
case 2: assertNotEquals(msg,expectVal,actualVal);
|
|
break;
|
|
case 3: assertTrue(msg,(boolean)actualVal);
|
|
break;
|
|
case 4: assertFalse(msg,(boolean)actualVal);
|
|
break;
|
|
case 5: assertNull(msg,actualVal);
|
|
break;
|
|
case 6: assertNotNull(msg,actualVal);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void failTest(String msg) {
|
|
fail(msg);
|
|
}
|
|
|
|
public List<String> getMethodsName(Method[] methods) {
|
|
List<String> list = new ArrayList<>();
|
|
for (int i=0; i<methods.length; i++) {
|
|
list.add(methods[i].getName());
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public double getRandomDouble(int min, int max) {
|
|
Random r = new Random();
|
|
return min + (max - min) * r.nextDouble();
|
|
}
|
|
|
|
public int getRandomInteger(int min, int max) {
|
|
Random r = new Random();
|
|
return min + r.nextInt(max - min + 1);
|
|
}
|
|
|
|
public ArrayList<String> getRandomArrayListString() {
|
|
return new ArrayList<String>();
|
|
}
|
|
|
|
/*
|
|
public Object getFieldValue(Object obj, String fieldName) throws NoSuchFieldException,IllegalAccessException {
|
|
Field f = obj.getClass().getDeclaredField(fieldName);
|
|
f.setAccessible(true);
|
|
return f.get(obj);
|
|
}
|
|
*/
|
|
|
|
public String getAccessName(int access) {
|
|
if (access== Modifier.PUBLIC) {
|
|
return "Public";
|
|
} else if (access== Modifier.PRIVATE) {
|
|
return "Private";
|
|
} else if (access== Modifier.PROTECTED) {
|
|
return "Protected";
|
|
} else if (access==17) {
|
|
return "Public Final";
|
|
} else if (access==18) {
|
|
return "Private Final";
|
|
} else {
|
|
return "No Information";
|
|
}
|
|
}
|
|
|
|
public void testField(Object obj, String fieldName, int access, Class<?> type, boolean isNull) {
|
|
Class<?> activityClass = obj.getClass();
|
|
Field f;
|
|
try {
|
|
f = activityClass.getDeclaredField(fieldName);
|
|
if (access>=0) assertEquals("Access to field \'"+fieldName+"\' must be "+getAccessName(access),access,f.getModifiers());
|
|
assertEquals("Type of field \'"+fieldName+"\' must be "+type.getSimpleName(), type, f.getType());
|
|
f.setAccessible(true);
|
|
if (isNull) {
|
|
assertNull("Field \'"+fieldName+"\' must be Null", f.get(obj));
|
|
} else {
|
|
assertNotNull("Field \'"+fieldName+"\' must be Constructed", f.get(obj));
|
|
}
|
|
} catch(Exception e) {
|
|
assertTrue("Field "+fieldName+" is not declared!!",false);
|
|
}
|
|
}
|
|
|
|
|
|
public Object getFieldObject(Object obj, String fieldname) {
|
|
try {
|
|
Field f = obj.getClass().getField(fieldname);
|
|
return f.get(obj);
|
|
} catch (Exception e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public Object getFieldValue(Object obj, String fieldName) {
|
|
Class<?> activityClass = obj.getClass();
|
|
Field f;
|
|
try {
|
|
f = activityClass.getDeclaredField(fieldName);
|
|
f.setAccessible(true);
|
|
return f.get(obj);
|
|
} catch(Exception e) {
|
|
String msg = UNDECLARED_CODE;
|
|
return msg;
|
|
}
|
|
}
|
|
|
|
public void testFieldValue(Activity activity, String fieldName, String className, Object value) {
|
|
Object field = getFieldValue(activity,fieldName);
|
|
if (field.getClass().getSimpleName().equals("String")) {
|
|
if (((String)field).equals(UNDECLARED_CODE)) {
|
|
fail("Field "+fieldName+" is not declared!!");
|
|
} else {
|
|
assertEquals("Field '"+fieldName+"' should be a "+className, className, field.getClass().getSimpleName());
|
|
assertEquals("Value of field '"+fieldName+"' must be "+value.toString(), field, value);
|
|
}
|
|
} else {
|
|
assertEquals("Field '"+fieldName+"' should be a "+className, className, field.getClass().getSimpleName());
|
|
assertEquals("Value of field '"+fieldName+"' must be "+value.toString(), field, value);
|
|
}
|
|
}
|
|
|
|
public void testMethod(Object obj, String methodName, int access, Class[] params, Class<?> returnType) {
|
|
Class<?> activityClass = obj.getClass();
|
|
Method m;
|
|
try {
|
|
m = activityClass.getDeclaredMethod(methodName,params);
|
|
if (access>=0) assertEquals("Access to field \'"+methodName+"\' must be "+getAccessName(access),m.getModifiers(),access);
|
|
assertEquals("Type of return field \'"+methodName+"\' must be "+returnType.getSimpleName(), m.getReturnType(), returnType);
|
|
} catch(Exception e) {
|
|
assertTrue("Field "+methodName+" is not declared or parameters is wrong!!",false);
|
|
}
|
|
}
|
|
|
|
public String listToString(List x) {
|
|
String res = "";
|
|
for (int i=0; i<x.size(); i++){
|
|
res += x.get(i)+";";
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public String arrayToString(Object[] x) {
|
|
String res = "";
|
|
for (int i=0; i<x.length; i++){
|
|
res += x[i]+";";
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public String getHexColor(int x) {
|
|
return ("#" + Integer.toHexString(x).substring(2)).toUpperCase();
|
|
}
|
|
|
|
public String colorArrayToString(int[] x) {
|
|
String res = "";
|
|
for (int i=0; i<x.length; i++){
|
|
res += getHexColor(x[i])+";";
|
|
}
|
|
return res;
|
|
}
|
|
|
|
protected String getRandomString(int n) {
|
|
|
|
// chose a Character random from this String
|
|
String AlphaNumericString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
+ "0123456789"
|
|
+ "abcdefghijklmnopqrstuvxyz";
|
|
|
|
// create StringBuffer size of AlphaNumericString
|
|
StringBuilder sb = new StringBuilder(n);
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
// generate a random number between
|
|
// 0 to AlphaNumericString variable length
|
|
int index
|
|
= (int)(AlphaNumericString.length()
|
|
* Math.random());
|
|
|
|
// add Character one by one in end of sb
|
|
sb.append(AlphaNumericString
|
|
.charAt(index));
|
|
}
|
|
|
|
return sb.toString();
|
|
}
|
|
|
|
public int getButtonBgColor(Button button){
|
|
int buttonColor = 0;
|
|
|
|
if (button.getBackground() instanceof ColorDrawable) {
|
|
ColorDrawable cd = (ColorDrawable) button.getBackground();
|
|
buttonColor = cd.getColor();
|
|
}
|
|
|
|
if (button.getBackground() instanceof RippleDrawable) {
|
|
RippleDrawable rippleDrawable = (RippleDrawable) button.getBackground();
|
|
Drawable.ConstantState state = rippleDrawable.getConstantState();
|
|
try {
|
|
Field colorField = state.getClass().getDeclaredField("mColor");
|
|
colorField.setAccessible(true);
|
|
ColorStateList colorStateList = (ColorStateList) colorField.get(state);
|
|
buttonColor = colorStateList.getDefaultColor();
|
|
} catch (NoSuchFieldException e) {
|
|
e.printStackTrace();
|
|
} catch (IllegalAccessException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
return buttonColor;
|
|
}
|
|
|
|
public int getBgColor(RippleDrawable drawable){
|
|
int color=0;
|
|
Drawable.ConstantState state = drawable.getConstantState();
|
|
try {
|
|
Field colorField = state.getClass().getDeclaredField("mColor");
|
|
colorField.setAccessible(true);
|
|
ColorStateList colorStateList = (ColorStateList) colorField.get(state);
|
|
color = colorStateList.getDefaultColor();
|
|
} catch (NoSuchFieldException e) {
|
|
e.printStackTrace();
|
|
} catch (IllegalAccessException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return color;
|
|
}
|
|
|
|
public String getStringResource(int id, Activity activity) {
|
|
return activity.getResources().getString(id);
|
|
}
|
|
|
|
public String getStringResource(String name, Activity activity) {
|
|
return getStringResource(getRscId(name,"string",activity),activity);
|
|
}
|
|
|
|
public int getColorResource(int id, Activity activity) {
|
|
return ContextCompat.getColor(activity, id); //activity.getResources().getColor(id,null);
|
|
}
|
|
|
|
public int getColorResource(String name, Activity activity) {
|
|
return getColorResource(getRscId(name,"color",activity),activity);
|
|
}
|
|
|
|
public int getIntResource(int id, Activity activity) {
|
|
return activity.getResources().getInteger(id);
|
|
}
|
|
|
|
public int getIntResource(String name, Activity activity) {
|
|
return getIntResource(getRscId(name,"integer",activity),activity);
|
|
}
|
|
|
|
public String[] getStringArrayResource(int id, Activity activity) {
|
|
return activity.getResources().getStringArray(id);
|
|
}
|
|
|
|
public String[] getStringArrayResource(String name, Activity activity) {
|
|
return getStringArrayResource(getRscId(name,"array",activity),activity);
|
|
}
|
|
|
|
public int[] getIntArrayResource(int id, Activity activity) {
|
|
return activity.getResources().getIntArray(id);
|
|
}
|
|
|
|
public int[] getIntArrayResource(String name, Activity activity) {
|
|
return getIntArrayResource(getRscId(name,"array",activity),activity);
|
|
}
|
|
|
|
public View getRootLayout(Activity activity) {
|
|
return ((ViewGroup)activity.getWindow().getDecorView()).getChildAt(0);
|
|
}
|
|
|
|
public String getCapitalFirstLetter(String str) {
|
|
return str.substring(0, 1).toUpperCase() + str.substring(1);
|
|
}
|
|
|
|
public Method getMethodInObject(Object obj, String methodname, Class<?>... params) {
|
|
try {
|
|
Method m = obj.getClass().getMethod(methodname, params);
|
|
return m;
|
|
} catch (Exception e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public int getColorFromDrawable(Drawable d) {
|
|
if (d.getClass().getSimpleName().equals("ColorDrawable")) {
|
|
ColorDrawable cl = (ColorDrawable) d;
|
|
return cl.getColor();
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public View getRootView(Activity activity) {
|
|
return ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
|
|
}
|
|
}
|