From 796248d55cd38e358f17b6f99c0efe2f77852b24 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Tue, 2 May 2017 16:34:45 -0400 Subject: [PATCH 01/13] Initial --- src/main/java/Reflector.java | 52 ++++++++++++++++++++++++++++++++ src/test/java/ReflectorTest.java | 38 +++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/main/java/Reflector.java create mode 100644 src/test/java/ReflectorTest.java diff --git a/src/main/java/Reflector.java b/src/main/java/Reflector.java new file mode 100644 index 0000000..0fb7af3 --- /dev/null +++ b/src/main/java/Reflector.java @@ -0,0 +1,52 @@ +import javax.sound.midi.SysexMessage; +import java.util.List; + +/** + * Created by cameronsima on 5/2/17. + */ +public class Reflector { + + public boolean classImplementsInterface(Object object, String interfaceName) { + + + try { + + Class intface = Class.forName(interfaceName); + return (intface.isAssignableFrom(object.getClass())); + } catch (ClassNotFoundException e) { + System.out.println("error"); + return false; + } + + } + + public boolean classImplementsInterface(String objectName, String interfaceName) { + + try { + Class obj = Class.forName(objectName); + Class intface = Class.forName(interfaceName); + return obj.getClass().isInstance(intface.getClass()); + } catch (ClassNotFoundException e) { + return false; + } + + } + + /* public boolean classImplementsInterface(Class clASS, String InterfaceName) { + + }*/ + + /* public String listAllMembers(Object object) { + + } + + public String getClassHierarchy(Object object) { + + } + + public List instantiateClassHierarchy(Object object) { + + }*/ + + +} diff --git a/src/test/java/ReflectorTest.java b/src/test/java/ReflectorTest.java new file mode 100644 index 0000000..f63b77e --- /dev/null +++ b/src/test/java/ReflectorTest.java @@ -0,0 +1,38 @@ +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; + + +/** + * Created by cameronsima on 5/2/17. + */ +public class ReflectorTest { + + @Test + public void testClassImplementsInterfaceObject() { + + Reflector reflector = new Reflector(); + ArrayList arrayList= new ArrayList<>(); + + Assert.assertEquals(true, reflector.classImplementsInterface(arrayList, "List")); + } + + @Test + public void testClassImplementsInterfaceString() { + + Reflector reflector = new Reflector(); + ArrayList arrayList = new ArrayList<>(); + Assert.assertEquals(true, reflector.classImplementsInterface("ArrayList", "List")); + + } +/* + @Test + public void testClassImplementsInterfaceClass() { + + Reflector reflector = new Reflector(); + ArrayList arrayList= new ArrayList<>(); + Assert.assertEquals(true, reflector.classImplementsInterface(Class.forName("List"), "List")); + }*/ + +} From 6514a0d748a05d41ef9498b471d2b6ad7b2eafb1 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Tue, 2 May 2017 17:14:47 -0400 Subject: [PATCH 02/13] classImplementsInterface method tested and complete --- .idea/compiler.xml | 16 + .idea/libraries/Maven__junit_junit_4_11.xml | 13 + .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 + .idea/misc.xml | 13 + .idea/modules.xml | 8 + .idea/uiDesigner.xml | 124 +++ .idea/vcs.xml | 6 + .idea/workspace.xml | 901 ++++++++++++++++++ TypeInformation.iml | 17 + pom.xml | 34 + src/main/java/Reflector.java | 23 +- src/test/java/ReflectorTest.java | 33 +- 12 files changed, 1184 insertions(+), 17 deletions(-) create mode 100644 .idea/compiler.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_11.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 TypeInformation.iml create mode 100644 pom.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..d47badd --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_11.xml b/.idea/libraries/Maven__junit_junit_4_11.xml new file mode 100644 index 0000000..f33320d --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..baffb29 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1ee38f5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..cafda27 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,901 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + true + + + + DIRECTORY + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + 1493751767576 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + TypeInformation + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TypeInformation.iml b/TypeInformation.iml new file mode 100644 index 0000000..132c515 --- /dev/null +++ b/TypeInformation.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..86af8ca --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + sima.cameron.TypeInformation + TypeInformation + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + + + + + + junit + junit + 4.11 + + + + + \ No newline at end of file diff --git a/src/main/java/Reflector.java b/src/main/java/Reflector.java index 0fb7af3..7e7f4f9 100644 --- a/src/main/java/Reflector.java +++ b/src/main/java/Reflector.java @@ -10,11 +10,11 @@ public boolean classImplementsInterface(Object object, String interfaceName) { try { - Class intface = Class.forName(interfaceName); - return (intface.isAssignableFrom(object.getClass())); + + return intface.isAssignableFrom(object.getClass()); } catch (ClassNotFoundException e) { - System.out.println("error"); + System.out.println(e); return false; } @@ -23,18 +23,27 @@ public boolean classImplementsInterface(Object object, String interfaceName) { public boolean classImplementsInterface(String objectName, String interfaceName) { try { - Class obj = Class.forName(objectName); + Class object = Class.forName(objectName); Class intface = Class.forName(interfaceName); - return obj.getClass().isInstance(intface.getClass()); + return intface.isAssignableFrom(object); } catch (ClassNotFoundException e) { + System.out.println(e); return false; } } - /* public boolean classImplementsInterface(Class clASS, String InterfaceName) { + public boolean classImplementsInterface(Class clASS, String interfaceName) { - }*/ + try { + Class intface = Class.forName(interfaceName); + return intface.isAssignableFrom(clASS); + } catch (ClassNotFoundException e){ + System.out.println(e); + return false; + } + + } /* public String listAllMembers(Object object) { diff --git a/src/test/java/ReflectorTest.java b/src/test/java/ReflectorTest.java index f63b77e..b0fbec1 100644 --- a/src/test/java/ReflectorTest.java +++ b/src/test/java/ReflectorTest.java @@ -1,4 +1,5 @@ import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import java.util.ArrayList; @@ -9,30 +10,42 @@ */ public class ReflectorTest { + private Reflector reflector; + private Class cls; + + + @Before + public void setUp() { + + reflector = new Reflector(); + try { + cls = Class.forName("java.util.List"); + } catch (ClassNotFoundException e) { + System.out.println(e); + } + + + } + @Test public void testClassImplementsInterfaceObject() { - Reflector reflector = new Reflector(); ArrayList arrayList= new ArrayList<>(); - Assert.assertEquals(true, reflector.classImplementsInterface(arrayList, "List")); + Assert.assertTrue(reflector.classImplementsInterface(arrayList, "java.util.List")); } @Test public void testClassImplementsInterfaceString() { - Reflector reflector = new Reflector(); - ArrayList arrayList = new ArrayList<>(); - Assert.assertEquals(true, reflector.classImplementsInterface("ArrayList", "List")); + Assert.assertTrue(reflector.classImplementsInterface("java.util.ArrayList", "java.util.List")); } -/* @Test public void testClassImplementsInterfaceClass() { - Reflector reflector = new Reflector(); - ArrayList arrayList= new ArrayList<>(); - Assert.assertEquals(true, reflector.classImplementsInterface(Class.forName("List"), "List")); - }*/ + + Assert.assertTrue(reflector.classImplementsInterface(cls, "java.util.List")); + } } From 60c05b630ac4f6592cc374767333d58695db309f Mon Sep 17 00:00:00 2001 From: cameronsima Date: Wed, 3 May 2017 12:24:25 -0400 Subject: [PATCH 03/13] Up to getClassHierarchy() complete and tested --- src/main/java/Reflector.java | 78 ++++++++++++- src/test/java/ReflectorTest.java | 136 ++++++++++++++++++++++- src/test/resources/IntegerAllMembers.txt | 86 ++++++++++++++ 3 files changed, 297 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/IntegerAllMembers.txt diff --git a/src/main/java/Reflector.java b/src/main/java/Reflector.java index 7e7f4f9..ee492cd 100644 --- a/src/main/java/Reflector.java +++ b/src/main/java/Reflector.java @@ -1,4 +1,7 @@ import javax.sound.midi.SysexMessage; +import java.lang.reflect.*; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -44,16 +47,87 @@ public boolean classImplementsInterface(Class clASS, String interfaceName) { } } + public String listAllMembers(Object object) { - /* public String listAllMembers(Object object) { + ArrayList classes = getClassArray(object); + StringBuilder sb = new StringBuilder(); + + for (Class cls : classes) { + System.out.println(cls); + sb.append(getClassMembers(cls)); + } + + return sb.toString(); + + } + + public String getClassMembers(Class cls) { + StringBuilder sb = new StringBuilder(); + + for (Field field : cls.getDeclaredFields()) { + sb.append(field + "\n"); + } + for (Constructor constructor : cls.getConstructors()) { + sb.append(constructor + "\n"); + } + + for (Method method : cls.getDeclaredMethods()) { + sb.append(method + "\n"); + } + + String result = sb.toString(); + return result; + } + + private ArrayList getClassArray(Object object) { + + Class cls = object.getClass(); + ArrayList classes = new ArrayList<>(); + + while(cls != null) { + classes.add(cls); + cls = cls.getSuperclass(); + } + Collections.reverse(classes); + return classes; } public String getClassHierarchy(Object object) { + ArrayList classes = getClassArray(object); + return buildHierarchyString(classes); + } - public List instantiateClassHierarchy(Object object) { + private String buildHierarchyString(ArrayList classes) { + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i Date: Wed, 3 May 2017 13:01:51 -0400 Subject: [PATCH 04/13] getInstancesFromHierarchy() complete and testefd --- src/main/java/Reflector.java | 36 +++++++++++++------------------- src/test/java/ReflectorTest.java | 25 ++++++++++++++++------ 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/main/java/Reflector.java b/src/main/java/Reflector.java index ee492cd..50049b3 100644 --- a/src/main/java/Reflector.java +++ b/src/main/java/Reflector.java @@ -11,7 +11,6 @@ public class Reflector { public boolean classImplementsInterface(Object object, String interfaceName) { - try { Class intface = Class.forName(interfaceName); @@ -20,7 +19,6 @@ public boolean classImplementsInterface(Object object, String interfaceName) { System.out.println(e); return false; } - } public boolean classImplementsInterface(String objectName, String interfaceName) { @@ -33,7 +31,6 @@ public boolean classImplementsInterface(String objectName, String interfaceName) System.out.println(e); return false; } - } public boolean classImplementsInterface(Class clASS, String interfaceName) { @@ -45,8 +42,8 @@ public boolean classImplementsInterface(Class clASS, String interfaceName) { System.out.println(e); return false; } - } + public String listAllMembers(Object object) { ArrayList classes = getClassArray(object); @@ -56,9 +53,7 @@ public String listAllMembers(Object object) { System.out.println(cls); sb.append(getClassMembers(cls)); } - return sb.toString(); - } public String getClassMembers(Class cls) { @@ -90,14 +85,12 @@ private ArrayList getClassArray(Object object) { } Collections.reverse(classes); return classes; - } public String getClassHierarchy(Object object) { ArrayList classes = getClassArray(object); return buildHierarchyString(classes); - } private String buildHierarchyString(ArrayList classes) { @@ -112,24 +105,23 @@ private String buildHierarchyString(ArrayList classes) { } sb.append(tabs + classes.get(i) + "\n"); } - return sb.toString(); - } + public List instantiateClassHierarchy(Object object) { + ArrayList classes = getClassArray(object); + ArrayList instances = new ArrayList<>(); - - - - - - - -/* public List instantiateClassHierarchy(Object object) { - - }*/ - - + for (Class cls : classes) { + try { + instances.add(cls.newInstance()); + } catch (Exception e) { + System.out.println(e); + System.out.println(cls + " can't be instantiated."); + } + } + return instances; + } } diff --git a/src/test/java/ReflectorTest.java b/src/test/java/ReflectorTest.java index c6e2c4d..533728a 100644 --- a/src/test/java/ReflectorTest.java +++ b/src/test/java/ReflectorTest.java @@ -165,21 +165,34 @@ public void testGetClassHierarchy() { } -/* @Test - public void testGetInstancesFromHierarchy() { - + @Test + public void testGetInstancesFromHierarchy_arraysAreEqual() { Integer i = new Integer(1); Object obj = new Object(); + // Only Object can be instantiated in hierarchy Integer > Number > Object List list = new ArrayList(); - list.add(i); list.add(obj); + Object[] expectedArr = new Object[list.size()]; - Assert.assert(list, reflector.instantiateClassHierarchy(i)); + List result = reflector.instantiateClassHierarchy(i); + Object[] resultArr = new Object[result.size()]; + Assert.assertArrayEquals(expectedArr, resultArr); - }*/ + } + @Test + public void testGetInstancesFromHierarchy_classesAreUnique() { + Integer i = new Integer(1); + List result = reflector.instantiateClassHierarchy(i); + // confirm each list item is an instance of a different class + Class cls = null; + for (Object o : result) { + Assert.assertTrue((o.getClass() != cls)); + cls = o.getClass(); + } + } } From 41b0ea3a030c3d052a29381ca3a73ec2e492a89f Mon Sep 17 00:00:00 2001 From: cameronsima Date: Wed, 3 May 2017 14:20:32 -0400 Subject: [PATCH 05/13] clarified method names --- .../cameron/reflector}/Reflector.java | 11 ++-- .../java/sima/cameron/unitcorn/Result.java | 21 +++++++ .../cameron/unitcorn/UnitCornTestRunner.java | 61 +++++++++++++++++++ src/test/java/ReflectorTest.java | 2 +- 4 files changed, 89 insertions(+), 6 deletions(-) rename src/main/java/{ => sima/cameron/reflector}/Reflector.java (91%) create mode 100644 src/main/java/sima/cameron/unitcorn/Result.java create mode 100644 src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java diff --git a/src/main/java/Reflector.java b/src/main/java/sima/cameron/reflector/Reflector.java similarity index 91% rename from src/main/java/Reflector.java rename to src/main/java/sima/cameron/reflector/Reflector.java index 50049b3..d17089e 100644 --- a/src/main/java/Reflector.java +++ b/src/main/java/sima/cameron/reflector/Reflector.java @@ -1,4 +1,5 @@ -import javax.sound.midi.SysexMessage; +package sima.cameron.reflector; + import java.lang.reflect.*; import java.util.ArrayList; import java.util.Collections; @@ -46,7 +47,7 @@ public boolean classImplementsInterface(Class clASS, String interfaceName) { public String listAllMembers(Object object) { - ArrayList classes = getClassArray(object); + ArrayList classes = getSuperClassArray(object); StringBuilder sb = new StringBuilder(); for (Class cls : classes) { @@ -74,7 +75,7 @@ public String getClassMembers(Class cls) { return result; } - private ArrayList getClassArray(Object object) { + private ArrayList getSuperClassArray(Object object) { Class cls = object.getClass(); ArrayList classes = new ArrayList<>(); @@ -89,7 +90,7 @@ private ArrayList getClassArray(Object object) { public String getClassHierarchy(Object object) { - ArrayList classes = getClassArray(object); + ArrayList classes = getSuperClassArray(object); return buildHierarchyString(classes); } @@ -111,7 +112,7 @@ private String buildHierarchyString(ArrayList classes) { public List instantiateClassHierarchy(Object object) { - ArrayList classes = getClassArray(object); + ArrayList classes = getSuperClassArray(object); ArrayList instances = new ArrayList<>(); for (Class cls : classes) { diff --git a/src/main/java/sima/cameron/unitcorn/Result.java b/src/main/java/sima/cameron/unitcorn/Result.java new file mode 100644 index 0000000..c151d5a --- /dev/null +++ b/src/main/java/sima/cameron/unitcorn/Result.java @@ -0,0 +1,21 @@ +package sima.cameron.unitcorn; + +import java.lang.reflect.Method; + +/** + * Created by cameronsima on 5/3/17. + */ +public class Result { + + private Method method; + + public Result(Method method) { + this.method = method; + } + + public Method getMethod() { + return method; + } + + +} diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java new file mode 100644 index 0000000..5e50572 --- /dev/null +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -0,0 +1,61 @@ +package sima.cameron.unitcorn; + +import java.lang.reflect.Method; +import java.util.ArrayList; + +/** + * Created by cameronsima on 5/3/17. + */ +public class UnitCornTestRunner { + + public Result runTest(Class c, String methodName) { + + Method[] methods = c.getMethods(); + + for (Method method : methods) { + if (methods.toString().equals(methodName)) { + Result result = new Result(method); + return result; + } + } + } + + public Result runTest(Method method) { + Result result = new Result(method); + return result; + } + + public String runTests(Class c) { + + Method[] methods = c.getMethods(); + ArrayList testMethods = getTestMethods(methods); + ArrayList results = new ArrayList<>(); + + for (Method method : testMethods) { + Result result = runTest(method); + results.add(result); + } + + + + } + + private ArrayList getTestMethods(Method[] methods) { + ArrayList testMethods = new ArrayList<>(); + + for (Method method : methods) { + if (method.isAnnotationPresent(getClass("org.junit.Test"))) { + testMethods.add(method); + } + } + return testMethods; + } + + private Class getClass(String className) { + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + return null; + } + } +} diff --git a/src/test/java/ReflectorTest.java b/src/test/java/ReflectorTest.java index 533728a..028262f 100644 --- a/src/test/java/ReflectorTest.java +++ b/src/test/java/ReflectorTest.java @@ -1,8 +1,8 @@ import com.google.common.io.CharStreams; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; +import sima.cameron.reflector.Reflector; import java.io.FileReader; import java.io.IOException; From 668aeb4bb507bc1c68e7729c9e9c0a8d60ae1059 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Wed, 3 May 2017 17:23:48 -0400 Subject: [PATCH 06/13] starting unitcorn --- .../java/sima/cameron/unitcorn/Result.java | 10 +++--- .../cameron/unitcorn/UnitCornTestRunner.java | 35 ++++++++++++++----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/main/java/sima/cameron/unitcorn/Result.java b/src/main/java/sima/cameron/unitcorn/Result.java index c151d5a..a6ab4e8 100644 --- a/src/main/java/sima/cameron/unitcorn/Result.java +++ b/src/main/java/sima/cameron/unitcorn/Result.java @@ -7,14 +7,14 @@ */ public class Result { - private Method method; + private Object object; - public Result(Method method) { - this.method = method; + public Result(Object object) { + this.object = object; } - public Method getMethod() { - return method; + public Object getMethod() { + return object; } diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index 5e50572..b7c762c 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -1,5 +1,6 @@ package sima.cameron.unitcorn; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -20,24 +21,27 @@ public Result runTest(Class c, String methodName) { } } - public Result runTest(Method method) { - Result result = new Result(method); - return result; + public Result runTest(Method method) throws InvocationTargetException, IllegalAccessException { + Object obj = getClassInstance(method); + + + Result resultObj = new Result(method.invoke(obj)); + + + + return resultObj; } public String runTests(Class c) { + StringBuilder sb = new StringBuilder(); + Method[] methods = c.getMethods(); ArrayList testMethods = getTestMethods(methods); - ArrayList results = new ArrayList<>(); for (Method method : testMethods) { - Result result = runTest(method); - results.add(result); + sb.append(runTest(method)); } - - - } private ArrayList getTestMethods(Method[] methods) { @@ -58,4 +62,17 @@ private Class getClass(String className) { return null; } } + + private Object getClassInstance(Method method) { + try { + return method.getClass().newInstance(); + } catch (InstantiationException e) { + return null; + + } catch (IllegalAccessException e) { + return null; + } + } + + } From 2c2efae138d4bb67570ea4c643bd0cdbafbafcac Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 14:54:52 -0400 Subject: [PATCH 07/13] unitcorn runTest() completed and tests pas --- .../java/sima/cameron/unitcorn/Result.java | 20 +++-- .../cameron/unitcorn/UnitCornTestRunner.java | 77 ++++++++++--------- src/test/java/ReflectorTest.java | 1 - .../java/UnitCornTestRunnerTestTests.java | 21 +++++ src/test/java/UnitCornTests.java | 75 ++++++++++++++++++ 5 files changed, 151 insertions(+), 43 deletions(-) create mode 100644 src/test/java/UnitCornTestRunnerTestTests.java create mode 100644 src/test/java/UnitCornTests.java diff --git a/src/main/java/sima/cameron/unitcorn/Result.java b/src/main/java/sima/cameron/unitcorn/Result.java index a6ab4e8..10a5793 100644 --- a/src/main/java/sima/cameron/unitcorn/Result.java +++ b/src/main/java/sima/cameron/unitcorn/Result.java @@ -7,15 +7,25 @@ */ public class Result { - private Object object; + private Object error; - public Result(Object object) { - this.object = object; + public Result() { + error = null; } - public Object getMethod() { - return object; + public void setError(Object object) { + this.error = object; } + public String getResult() { + String resultString; + if (error != null) { + resultString = "Test failed with error: " + error.toString(); + } else { + resultString = "Test passed"; + } + return resultString; + } + } diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index b7c762c..cac4e1a 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -1,8 +1,11 @@ package sima.cameron.unitcorn; +import org.junit.Test; + import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; /** * Created by cameronsima on 5/3/17. @@ -11,68 +14,68 @@ public class UnitCornTestRunner { public Result runTest(Class c, String methodName) { - Method[] methods = c.getMethods(); + Method method = getMethod(c, methodName); + Object obj = getClassInstance(c); + Result result = new Result(); + try { + method.invoke(obj); + } catch (Exception e) { + result.setError(e.getCause()); + } + return result; + } + private Method getMethod(Class c, String methodName) { + Method[] methods = c.getMethods(); for (Method method : methods) { - if (methods.toString().equals(methodName)) { - Result result = new Result(method); - return result; + if (method.toString().equals(methodName)) { + return method; } } + return null; } - public Result runTest(Method method) throws InvocationTargetException, IllegalAccessException { - Object obj = getClassInstance(method); - - - Result resultObj = new Result(method.invoke(obj)); - + private Object getClassInstance(Class c) { + try { + Object o = c.newInstance(); + return o; + } catch (InstantiationException e) { + System.out.println("Can't instantiate"); + } catch (IllegalAccessException e) { + System.out.println(e); + } + return null; + } +/* public Result runTest(Method method) throws InvocationTargetException, IllegalAccessException { + Object obj = getClassInstance(method); + return new Result(method.invoke(obj)); - return resultObj; - } + }*/ public String runTests(Class c) { StringBuilder sb = new StringBuilder(); - Method[] methods = c.getMethods(); + Method[] methods = c.getDeclaredMethods(); + ArrayList testMethods = getTestMethods(methods); for (Method method : testMethods) { - sb.append(runTest(method)); + Result result = runTest(c, method.toString()); + sb.append(result.getResult() + "\n"); } + return sb.toString(); } - private ArrayList getTestMethods(Method[] methods) { + public ArrayList getTestMethods(Method[] methods) { ArrayList testMethods = new ArrayList<>(); for (Method method : methods) { - if (method.isAnnotationPresent(getClass("org.junit.Test"))) { + if (method.isAnnotationPresent(Test.class)) { testMethods.add(method); } } return testMethods; } - - private Class getClass(String className) { - try { - return Class.forName(className); - } catch (ClassNotFoundException e) { - return null; - } - } - - private Object getClassInstance(Method method) { - try { - return method.getClass().newInstance(); - } catch (InstantiationException e) { - return null; - - } catch (IllegalAccessException e) { - return null; - } - } - - } diff --git a/src/test/java/ReflectorTest.java b/src/test/java/ReflectorTest.java index 028262f..849337d 100644 --- a/src/test/java/ReflectorTest.java +++ b/src/test/java/ReflectorTest.java @@ -36,7 +36,6 @@ public void setUp() { public void testClassImplementsInterfaceObject() { ArrayList arrayList= new ArrayList<>(); - Assert.assertTrue(reflector.classImplementsInterface(arrayList, "java.util.List")); } diff --git a/src/test/java/UnitCornTestRunnerTestTests.java b/src/test/java/UnitCornTestRunnerTestTests.java new file mode 100644 index 0000000..2122892 --- /dev/null +++ b/src/test/java/UnitCornTestRunnerTestTests.java @@ -0,0 +1,21 @@ +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by cameronsima on 5/4/17. + */ +public class UnitCornTestRunnerTestTests { + + @Test + public void testThatPasses() { + + int i = 5; + + Assert.assertEquals(i, i); + } + @Test + public void testThatFails() { + + Assert.assertTrue(false); + } +} diff --git a/src/test/java/UnitCornTests.java b/src/test/java/UnitCornTests.java new file mode 100644 index 0000000..9ac92cf --- /dev/null +++ b/src/test/java/UnitCornTests.java @@ -0,0 +1,75 @@ +import jdk.management.cmm.SystemResourcePressureMXBean; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import sima.cameron.unitcorn.Result; +import sima.cameron.unitcorn.UnitCornTestRunner; + +import static java.lang.Class.forName; + +/** + * Created by cameronsima on 5/4/17. + */ +public class UnitCornTests { + + private Class cls; + private Class testTestsClass; + + @Before + public void setup() { + + try { + cls = Class.forName("ReflectorTest"); + // System.out.println("CLass: " + cls.toString()); + } catch (ClassNotFoundException e) { + System.out.println("Class not found"); + } + + try { + testTestsClass = Class.forName("UnitCornTestRunnerTestTests"); + } catch (ClassNotFoundException e) { + System.out.println("Test Class not found"); + } + + } + + @Test + public void testRunTest_withFailingTest() { + + UnitCornTestRunner utr = new UnitCornTestRunner(); + + Result result = utr.runTest(testTestsClass,"public void UnitCornTestRunnerTestTests.testThatFails()"); + String expectedValue = "Test failed with error: java.lang.AssertionError"; + String actualValue = result.getResult(); + + Assert.assertEquals(expectedValue, actualValue); + + } + + @Test + public void testRunTest_withPassingTest() { + + UnitCornTestRunner utr = new UnitCornTestRunner(); + + Result result = utr.runTest(testTestsClass,"public void UnitCornTestRunnerTestTests.testThatPasses()"); + String expectedValue = "Test passed"; + String actualValue = result.getResult(); + + Assert.assertEquals(expectedValue, actualValue); + + } + + @Test + public void testRunTests() { + + UnitCornTestRunner utr = new UnitCornTestRunner(); + + String expectedValue = "Test failed with error: java.lang.AssertionError\n" + + "Test passed\n"; + String actualValue = utr.runTests(testTestsClass); + + Assert.assertEquals(expectedValue, actualValue); + + + } +} From 80852a2461c11009d873e057962374e0944fefa4 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 14:57:02 -0400 Subject: [PATCH 08/13] runTests() completed and tests running --- src/test/java/UnitCornTests.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/UnitCornTests.java b/src/test/java/UnitCornTests.java index 9ac92cf..87f9343 100644 --- a/src/test/java/UnitCornTests.java +++ b/src/test/java/UnitCornTests.java @@ -64,8 +64,9 @@ public void testRunTests() { UnitCornTestRunner utr = new UnitCornTestRunner(); - String expectedValue = "Test failed with error: java.lang.AssertionError\n" + - "Test passed\n"; + String expectedValue = "Test passed\n" + + "Test failed with error: java.lang.AssertionError\n" + ; String actualValue = utr.runTests(testTestsClass); Assert.assertEquals(expectedValue, actualValue); From 1520049277df8eed74586f2fcb61d08618efa0c9 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 15:10:31 -0400 Subject: [PATCH 09/13] refactoring --- .../cameron/unitcorn/UnitCornTestRunner.java | 22 ++++++++++--------- src/test/java/UnitCornTests.java | 5 +---- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index cac4e1a..bbcada7 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -17,14 +17,11 @@ public Result runTest(Class c, String methodName) { Method method = getMethod(c, methodName); Object obj = getClassInstance(c); Result result = new Result(); - try { - method.invoke(obj); - } catch (Exception e) { - result.setError(e.getCause()); - } + Throwable err = catchError(method, obj); + result.setError(err); return result; } - + private Method getMethod(Class c, String methodName) { Method[] methods = c.getMethods(); for (Method method : methods) { @@ -47,11 +44,16 @@ private Object getClassInstance(Class c) { return null; } -/* public Result runTest(Method method) throws InvocationTargetException, IllegalAccessException { - Object obj = getClassInstance(method); - return new Result(method.invoke(obj)); + private Throwable catchError(Method method, Object obj) { + try { + method.invoke(obj); + } catch (Exception e) { - }*/ + // unwrap InvocationTargetException to get to underlying error, if it exists + return e.getCause(); + } + return null; + } public String runTests(Class c) { diff --git a/src/test/java/UnitCornTests.java b/src/test/java/UnitCornTests.java index 87f9343..562459e 100644 --- a/src/test/java/UnitCornTests.java +++ b/src/test/java/UnitCornTests.java @@ -5,8 +5,6 @@ import sima.cameron.unitcorn.Result; import sima.cameron.unitcorn.UnitCornTestRunner; -import static java.lang.Class.forName; - /** * Created by cameronsima on 5/4/17. */ @@ -65,8 +63,7 @@ public void testRunTests() { UnitCornTestRunner utr = new UnitCornTestRunner(); String expectedValue = "Test passed\n" + - "Test failed with error: java.lang.AssertionError\n" - ; + "Test failed with error: java.lang.AssertionError\n"; String actualValue = utr.runTests(testTestsClass); Assert.assertEquals(expectedValue, actualValue); From 215ffa7b988be2af9e431258fdecbd47e33154f0 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 16:41:31 -0400 Subject: [PATCH 10/13] @Before and @After methods handled --- .../java/sima/cameron/unitcorn/Result.java | 1 + .../cameron/unitcorn/UnitCornTestRunner.java | 44 ++++++++++++++++--- .../java/UnitCornTestRunnerTestTests.java | 12 +++++ src/test/java/UnitCornTests.java | 2 - 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/main/java/sima/cameron/unitcorn/Result.java b/src/main/java/sima/cameron/unitcorn/Result.java index 10a5793..d7da55e 100644 --- a/src/main/java/sima/cameron/unitcorn/Result.java +++ b/src/main/java/sima/cameron/unitcorn/Result.java @@ -19,6 +19,7 @@ public void setError(Object object) { public String getResult() { + String resultString; if (error != null) { resultString = "Test failed with error: " + error.toString(); diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index bbcada7..d6c81c9 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -1,7 +1,10 @@ package sima.cameron.unitcorn; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -21,7 +24,7 @@ public Result runTest(Class c, String methodName) { result.setError(err); return result; } - + private Method getMethod(Class c, String methodName) { Method[] methods = c.getMethods(); for (Method method : methods) { @@ -61,23 +64,50 @@ public String runTests(Class c) { Method[] methods = c.getDeclaredMethods(); - ArrayList testMethods = getTestMethods(methods); + ArrayList testMethods = getAnnotatedMethods(methods, Test.class); for (Method method : testMethods) { + + runBeforeMethods(methods, c); + Result result = runTest(c, method.toString()); + + runAfterMethods(methods, c); + sb.append(result.getResult() + "\n"); } return sb.toString(); } - public ArrayList getTestMethods(Method[] methods) { - ArrayList testMethods = new ArrayList<>(); + private void runBeforeMethods(Method[] methods, Class c) { + ArrayList beforeMethods = getAnnotatedMethods(methods, Before.class); + Method[] resultArr = beforeMethods.toArray(new Method[beforeMethods.size()]); + runMethods(resultArr, c); + } + + private void runAfterMethods(Method[] methods, Class c) { + ArrayList afterMethods = getAnnotatedMethods(methods, After.class); + Method[] resultArr = afterMethods.toArray(new Method[afterMethods.size()]); + runMethods(resultArr, c); + } + private void runMethods(Method[] methods, Class c) { for (Method method : methods) { - if (method.isAnnotationPresent(Test.class)) { - testMethods.add(method); + Object obj = getClassInstance(c); + Throwable err = catchError(method, obj); + System.out.println(err); + } + } + + public ArrayList getAnnotatedMethods(Method[] methods, Class annotationClass) { + ArrayList methodsArr = new ArrayList<>(); + + for (Method method : methods) { + if (method.isAnnotationPresent(annotationClass)) { + methodsArr.add(method); } } - return testMethods; + return methodsArr; } + } diff --git a/src/test/java/UnitCornTestRunnerTestTests.java b/src/test/java/UnitCornTestRunnerTestTests.java index 2122892..b6d7933 100644 --- a/src/test/java/UnitCornTestRunnerTestTests.java +++ b/src/test/java/UnitCornTestRunnerTestTests.java @@ -1,4 +1,6 @@ +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; /** @@ -6,6 +8,16 @@ */ public class UnitCornTestRunnerTestTests { + @Before + public void setUp() { + System.out.println("Setting up. . ."); + } + + @After + public void tearDown() { + System.out.println("Tearing down. . ."); + } + @Test public void testThatPasses() { diff --git a/src/test/java/UnitCornTests.java b/src/test/java/UnitCornTests.java index 562459e..3b8dde7 100644 --- a/src/test/java/UnitCornTests.java +++ b/src/test/java/UnitCornTests.java @@ -67,7 +67,5 @@ public void testRunTests() { String actualValue = utr.runTests(testTestsClass); Assert.assertEquals(expectedValue, actualValue); - - } } From 59334145efadab0f35c1508aeaa0d293069c54ec Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 16:45:06 -0400 Subject: [PATCH 11/13] cleaned up formatting --- .../java/sima/cameron/unitcorn/UnitCornTestRunner.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index d6c81c9..a66e46f 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -67,13 +67,9 @@ public String runTests(Class c) { ArrayList testMethods = getAnnotatedMethods(methods, Test.class); for (Method method : testMethods) { - runBeforeMethods(methods, c); - Result result = runTest(c, method.toString()); - runAfterMethods(methods, c); - sb.append(result.getResult() + "\n"); } return sb.toString(); @@ -95,7 +91,10 @@ private void runMethods(Method[] methods, Class c) { for (Method method : methods) { Object obj = getClassInstance(c); Throwable err = catchError(method, obj); - System.out.println(err); + if (err != null){ + System.out.println(err); + } + } } From 253ff03fa9912c53bfe37fd42bcde63a9e35c5a4 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 16:48:24 -0400 Subject: [PATCH 12/13] cleaned up formatting --- src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index a66e46f..4b197d6 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -61,9 +61,7 @@ private Throwable catchError(Method method, Object obj) { public String runTests(Class c) { StringBuilder sb = new StringBuilder(); - Method[] methods = c.getDeclaredMethods(); - ArrayList testMethods = getAnnotatedMethods(methods, Test.class); for (Method method : testMethods) { From 15123a83253fbee7462b2fdb5ba5074fd87be5d8 Mon Sep 17 00:00:00 2001 From: cameronsima Date: Thu, 4 May 2017 16:50:25 -0400 Subject: [PATCH 13/13] cleaned up formatting --- src/main/java/sima/cameron/unitcorn/Result.java | 2 -- src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java | 2 -- src/test/java/UnitCornTests.java | 3 --- 3 files changed, 7 deletions(-) diff --git a/src/main/java/sima/cameron/unitcorn/Result.java b/src/main/java/sima/cameron/unitcorn/Result.java index d7da55e..9f7a04a 100644 --- a/src/main/java/sima/cameron/unitcorn/Result.java +++ b/src/main/java/sima/cameron/unitcorn/Result.java @@ -17,7 +17,6 @@ public void setError(Object object) { this.error = object; } - public String getResult() { String resultString; @@ -28,5 +27,4 @@ public String getResult() { } return resultString; } - } diff --git a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java index 4b197d6..0e5e6bf 100644 --- a/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java +++ b/src/main/java/sima/cameron/unitcorn/UnitCornTestRunner.java @@ -92,7 +92,6 @@ private void runMethods(Method[] methods, Class c) { if (err != null){ System.out.println(err); } - } } @@ -106,5 +105,4 @@ public ArrayList getAnnotatedMethods(Method[] methods, Class annotationC } return methodsArr; } - } diff --git a/src/test/java/UnitCornTests.java b/src/test/java/UnitCornTests.java index 3b8dde7..ecf5ac8 100644 --- a/src/test/java/UnitCornTests.java +++ b/src/test/java/UnitCornTests.java @@ -28,7 +28,6 @@ public void setup() { } catch (ClassNotFoundException e) { System.out.println("Test Class not found"); } - } @Test @@ -41,7 +40,6 @@ public void testRunTest_withFailingTest() { String actualValue = result.getResult(); Assert.assertEquals(expectedValue, actualValue); - } @Test @@ -54,7 +52,6 @@ public void testRunTest_withPassingTest() { String actualValue = result.getResult(); Assert.assertEquals(expectedValue, actualValue); - } @Test