// Path: src/main/java/com/nikhaldimann/viewselector/attributes/AttributeAccessException.java
// public class AttributeAccessException extends RuntimeException {
// 
//     public AttributeAccessException(Exception cause) {
//         super(cause);
//     }
// 
//     public AttributeAccessException(String message, Exception cause) {
//         super(message, cause);
//     }
// 
// }
// 
// Path: src/main/java/com/nikhaldimann/viewselector/attributes/ViewAttributes.java
// public class ViewAttributes {
// 
//     private ViewAttributes() { }
// 
//     /**
//      * @return the full getter method name for a plain attribute, following conventions
//      *     used in the Android code. Prepends "get" to the attribute name and formats
//      *     it in camel-case. Recognizes boolean attributes of the format {@code isFoo} or
//      *     {@code hasFoo} and returns them unchanged.
//      */
//     public static String getGetterMethodName(String attributeName) {
//         if (isBooleanAttribute(attributeName, "is") || isBooleanAttribute(attributeName, "has")) {
//             return attributeName;
//         }
//         return "get" + attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1);
//     }
// 
//     private static boolean isBooleanAttribute(String attributeName, String prefix) {
//         return attributeName.startsWith(prefix)
//                 && attributeName.length() > prefix.length()
//                 && Character.isUpperCase(attributeName.charAt(prefix.length()));
//     }
// 
//     /**
//      * Calls the given method by name on the given view, assuming that it's a getter,
//      * i.e., it doesn't have arguments.
//      * @return the result of the method call
//      * @throws AttributeAccessException when the method doesn't exist or can't be
//      *     called for various reasons
//      */
//     public static Object callGetter(View view, String methodName) {
//         try {
//             Method method = view.getClass().getMethod(methodName);
//             return method.invoke(view);
//         } catch (SecurityException ex) {
//             throw new AttributeAccessException(ex);
//         } catch (NoSuchMethodException ex) {
//             throw new AttributeAccessException("No such attribute", ex);
//         } catch (IllegalAccessException ex) {
//             throw new AttributeAccessException(ex);
//         } catch (InvocationTargetException ex) {
//             throw new AttributeAccessException(ex);
//         }
//     }
// 
//     /**
//      * Calls the given method by name on the given view, assuming that it's a getter,
//      * i.e., it doesn't have arguments.
//      *
//      * This method normalizes all instances of CharSequences to be instances of String.
//      * This is useful because Android is using some CharSequence representations
//      * internally that don't compare well with strings (in particular as returned
//      * from TextView.getText()).
//      *
//      * @return the result of the method call
//      * @throws AttributeAccessException when the method doesn't exist or can't be
//      *     called for various reasons
//      */
//     public static Object callGetterNormalizingStrings(View view, String methodName) {
//         Object value = callGetter(view, methodName);
//         if (value instanceof CharSequence) {
//             value = value.toString();
//         }
//         return value;
//     }
// 
// }
// 
// Path: src/test-lib/src/com/nikhaldimann/viewselector/test/util/ViewSelectorAndroidTestCase.java
// public abstract class ViewSelectorAndroidTestCase extends AndroidTestCase {
// 
//     protected ViewFactory viewFactory;
// 
//     @Before
//     public void setUp() throws Exception {
//         super.setUp();
//         viewFactory = createViewFactory();
//     }
// 
//     /**
//      * @return the factory to be used for creating views in this test
//      */
//     protected abstract ViewFactory createViewFactory();
// 
//     /**
//      * Reimplementation of Android's MoreAsserts.assertContentsInOrder() because we
//      * can't use MoreAsserts in Robolectric 1.2.
//      */
//     public static void assertContentsInOrder(Iterable<?> actual, Object... expected) {
//         ArrayList<Object> actualList = new ArrayList<Object>();
//         for (Object o : actual) {
//             actualList.add(o);
//         }
//         assertEquals(Arrays.asList(expected), actualList);
//     }
// }


import org.junit.Test;
import android.text.InputType;
import android.view.View;
import android.widget.TextView;
import com.nikhaldimann.viewselector.attributes.AttributeAccessException;
import com.nikhaldimann.viewselector.attributes.ViewAttributes;
import com.nikhaldimann.viewselector.test.util.ViewSelectorAndroidTestCase;
package com.nikhaldimann.viewselector.test.abstrakt.attributes;




public abstract class AbstractViewAttributesTest extends ViewSelectorAndroidTestCase {

    @Test
    public void testGetGetterMethodName() {
// Path: src/main/java/com/nikhaldimann/viewselector/attributes/AttributeAccessException.java
// public class AttributeAccessException extends RuntimeException {
// 
//     public AttributeAccessException(Exception cause) {
//         super(cause);
//     }
// 
//     public AttributeAccessException(String message, Exception cause) {
//         super(message, cause);
//     }
// 
// }
// 
// Path: src/main/java/com/nikhaldimann/viewselector/attributes/ViewAttributes.java
// public class ViewAttributes {
// 
//     private ViewAttributes() { }
// 
//     /**
//      * @return the full getter method name for a plain attribute, following conventions
//      *     used in the Android code. Prepends "get" to the attribute name and formats
//      *     it in camel-case. Recognizes boolean attributes of the format {@code isFoo} or
//      *     {@code hasFoo} and returns them unchanged.
//      */
//     public static String getGetterMethodName(String attributeName) {
//         if (isBooleanAttribute(attributeName, "is") || isBooleanAttribute(attributeName, "has")) {
//             return attributeName;
//         }
//         return "get" + attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1);
//     }
// 
//     private static boolean isBooleanAttribute(String attributeName, String prefix) {
//         return attributeName.startsWith(prefix)
//                 && attributeName.length() > prefix.length()
//                 && Character.isUpperCase(attributeName.charAt(prefix.length()));
//     }
// 
//     /**
//      * Calls the given method by name on the given view, assuming that it's a getter,
//      * i.e., it doesn't have arguments.
//      * @return the result of the method call
//      * @throws AttributeAccessException when the method doesn't exist or can't be
//      *     called for various reasons
//      */
//     public static Object callGetter(View view, String methodName) {
//         try {
//             Method method = view.getClass().getMethod(methodName);
//             return method.invoke(view);
//         } catch (SecurityException ex) {
//             throw new AttributeAccessException(ex);
//         } catch (NoSuchMethodException ex) {
//             throw new AttributeAccessException("No such attribute", ex);
//         } catch (IllegalAccessException ex) {
//             throw new AttributeAccessException(ex);
//         } catch (InvocationTargetException ex) {
//             throw new AttributeAccessException(ex);
//         }
//     }
// 
//     /**
//      * Calls the given method by name on the given view, assuming that it's a getter,
//      * i.e., it doesn't have arguments.
//      *
//      * This method normalizes all instances of CharSequences to be instances of String.
//      * This is useful because Android is using some CharSequence representations
//      * internally that don't compare well with strings (in particular as returned
//      * from TextView.getText()).
//      *
//      * @return the result of the method call
//      * @throws AttributeAccessException when the method doesn't exist or can't be
//      *     called for various reasons
//      */
//     public static Object callGetterNormalizingStrings(View view, String methodName) {
//         Object value = callGetter(view, methodName);
//         if (value instanceof CharSequence) {
//             value = value.toString();
//         }
//         return value;
//     }
// 
// }
// 
// Path: src/test-lib/src/com/nikhaldimann/viewselector/test/util/ViewSelectorAndroidTestCase.java
// public abstract class ViewSelectorAndroidTestCase extends AndroidTestCase {
// 
//     protected ViewFactory viewFactory;
// 
//     @Before
//     public void setUp() throws Exception {
//         super.setUp();
//         viewFactory = createViewFactory();
//     }
// 
//     /**
//      * @return the factory to be used for creating views in this test
//      */
//     protected abstract ViewFactory createViewFactory();
// 
//     /**
//      * Reimplementation of Android's MoreAsserts.assertContentsInOrder() because we
//      * can't use MoreAsserts in Robolectric 1.2.
//      */
//     public static void assertContentsInOrder(Iterable<?> actual, Object... expected) {
//         ArrayList<Object> actualList = new ArrayList<Object>();
//         for (Object o : actual) {
//             actualList.add(o);
//         }
//         assertEquals(Arrays.asList(expected), actualList);
//     }
// }


// Path: src/test-lib/src/com/nikhaldimann/viewselector/test/abstrakt/attributes/AbstractViewAttributesTest.java
import org.junit.Test;
import android.text.InputType;
import android.view.View;
import android.widget.TextView;
import com.nikhaldimann.viewselector.attributes.AttributeAccessException;
import com.nikhaldimann.viewselector.attributes.ViewAttributes;
import com.nikhaldimann.viewselector.test.util.ViewSelectorAndroidTestCase;

package com.nikhaldimann.viewselector.test.abstrakt.attributes;




public abstract class AbstractViewAttributesTest extends ViewSelectorAndroidTestCase {

    @Test
    public void testGetGetterMethodName() {
        assertEquals("getText", ViewAttributes.getGetterMethodName("text"));