[atunit commit] r34 - in trunk: src/atunit src/atunit/core src/atunit/spi src/atunit/spi/exception src/atunit/spi...

0 views
Skip to first unread message

codesite...@google.com

unread,
Feb 11, 2008, 1:46:14 PM2/11/08
to atunit...@googlegroups.com
Author: logan.johnson
Date: Mon Feb 11 10:45:00 2008
New Revision: 34

Added:
trunk/src/atunit/Plugins.java (contents, props changed)
trunk/src/atunit/core/CoreTestFixture.java (contents, props changed)
trunk/src/atunit/core/NoUnitException.java (contents, props changed)
trunk/src/atunit/core/PluginUtils.java (contents, props changed)
trunk/src/atunit/core/TestClassUtils.java (contents, props changed)
trunk/src/atunit/core/TooManyUnitsException.java (contents, props changed)
trunk/src/atunit/spi/
trunk/src/atunit/spi/exception/
trunk/src/atunit/spi/exception/AtUnitPluginException.java
(contents, props changed)
trunk/src/atunit/spi/exception/IncompatiblePluginsException.java
(contents, props changed)
trunk/src/atunit/spi/exception/InvalidTestException.java
(contents, props changed)
trunk/src/atunit/spi/model/
trunk/src/atunit/spi/model/TestClass.java (contents, props changed)
trunk/src/atunit/spi/model/TestFixture.java (contents, props changed)
trunk/src/atunit/spi/model/TestFixtureEvent.java (contents, props changed)
trunk/src/atunit/spi/model/TestInstanceEvent.java (contents, props changed)
trunk/src/atunit/spi/plugin/
trunk/src/atunit/spi/plugin/AtUnitPlugin.java (contents, props changed)
trunk/src/atunit/spi/plugin/AtUnitPluginAdapter.java (contents,
props changed)
trunk/src/atunit/spi/plugin/ContainerPlugin.java (contents, props changed)
trunk/test/atunit/core/CoreTestFixtureTests.java (contents, props changed)
trunk/test/atunit/core/PluginUtilsTests.java (contents, props changed)
trunk/test/atunit/core/TestClassUtilsTests.java (contents, props changed)
Modified:
trunk/test/atunit/guice/GuiceContainerTests.java

Log:
added an SPI and other work toward a more generic plugin system

Added: trunk/src/atunit/Plugins.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/Plugins.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,47 @@
+/**
+ * Copyright (C) 2007 Logan Johnson
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package atunit;
+
+import java.lang.annotation.*;
+
+import atunit.spi.plugin.AtUnitPlugin;
+
+/**
+ * Specifies a list of {@link AtUnitPlugin} implementations to use.
+ *
+ * Note that you specify multiple plugin classes by using an array.
This is uncommon, so here's an example of the syntax:
+ *
+ * <code>
+ * @Plugins( { @FirstPlugin.class, SecondPlugin.class } )
+ * public class MyTest {
+ * // ...
+ * }
+ * </code>
+ *
+ * @author Logan Johnson &lt;logan....@gmail.com&gt;
+ *
+ * @see AtUnitPlugin
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Inherited
+public @interface Plugins {
+
+ Class<? extends AtUnitPlugin>[] value();
+
+}

Added: trunk/src/atunit/core/CoreTestFixture.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/core/CoreTestFixture.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,76 @@
+package atunit.core;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import atunit.spi.exception.InvalidTestException;
+import atunit.spi.model.TestFixture;
+import atunit.spi.plugin.AtUnitPlugin;
+import atunit.spi.plugin.ContainerPlugin;
+
+public class CoreTestFixture implements TestFixture {
+
+ final private Class<?> testClass;
+ final private Map<Field,Object> fields;
+ final private Set<Field> mockFields;
+ final private Set<Field> stubFields;
+ final private Field unitField;
+ final private Class<? extends ContainerPlugin> containerClass;
+ final private List<Class<? extends AtUnitPlugin>> pluginClasses;
+
+ public CoreTestFixture(Class<?> testClass) throws
InvalidTestException {
+ this.testClass = testClass;
+
+ fields = Maps.newHashMap();
+ for ( Field field : TestClassUtils.getFields(testClass)) {
+ fields.put(field, null);
+ }
+ mockFields = TestClassUtils.getMockFields(fields.keySet());
+ stubFields = TestClassUtils.getStubFields(fields.keySet());
+ unitField = TestClassUtils.getUnitField(fields.keySet());
+ containerClass = PluginUtils.getContainerPluginClass(testClass);
+ pluginClasses = PluginUtils.getPluginClasses(testClass);
+ }
+
+ public Object getValue(Field field) {
+ return fields.get(field);
+ }
+
+ public void setValue(Field field, Object value) {
+ fields.put(field, value);
+ }
+
+ public Set<Field> getFields() {
+ return Sets.immutableSet(fields.keySet());
+ }
+
+ public Class<?> getTestClass() {
+ return testClass;
+ }
+
+ public Set<Field> getMockFields() {
+ return mockFields;
+ }
+
+ public Set<Field> getStubFields() {
+ return stubFields;
+ }
+
+ public Field getUnitField() {
+ return unitField;
+ }
+
+ public Class<? extends ContainerPlugin> getContainerPluginClass() {
+ return containerClass;
+ }
+
+ public List<Class<? extends AtUnitPlugin>> getPluginClasses() {
+ return pluginClasses;
+ }
+
+}

Added: trunk/src/atunit/core/NoUnitException.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/core/NoUnitException.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,33 @@
+/**
+ * Copyright (C) 2007 Logan Johnson
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package atunit.core;
+
+import atunit.Unit;
+import atunit.spi.exception.InvalidTestException;
+
+/**
+ * Thrown when the test has no field annotated with {@link Unit}.
+ *
+ * @author Logan Johnson &lt;logan....@gmail.com&gt;
+ *
+ */
+@SuppressWarnings("serial")
+public class NoUnitException extends InvalidTestException {
+ public NoUnitException() {
+ super("Every AtUnit test must have exactly one field annotated with @Unit");
+ }
+}
\ No newline at end of file

Added: trunk/src/atunit/core/PluginUtils.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/core/PluginUtils.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,59 @@
+package atunit.core;
+
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import atunit.Plugins;
+import atunit.spi.exception.IncompatiblePluginsException;
+import atunit.spi.plugin.AtUnitPlugin;
+import atunit.spi.plugin.ContainerPlugin;
+
+public class PluginUtils {
+
+
+ /**
+ * Gets the single ContainerPlugin specified in the Plugins
annotation's list.
+ * @return the ContainerPlugin's class, or null if none is specified.
+ * @throws IncompatiblePluginsException if multiple ContainerPlugins
are specified in the annotation.
+ */
+ @SuppressWarnings("unchecked")
+ public static Class<? extends ContainerPlugin>
getContainerPluginClass(Class<?> testClass) throws
IncompatiblePluginsException {
+ Set<Class<? extends ContainerPlugin>> containers = Sets.newHashSet();
+
+ for ( Class<?> plugin : getPluginClasses(testClass)) {
+ if ( ContainerPlugin.class.isAssignableFrom(plugin) ) {
+ Class<? extends ContainerPlugin> container = (Class<? extends ContainerPlugin>)plugin;
+ containers.add(container);
+ }
+ }
+
+ Class<? extends ContainerPlugin>[] containersArray = new Class[0];
+
+ switch(containers.size()) {
+ case 0: return null;
+ case 1: return Iterables.getOnlyElement(containers);
+ default: throw new IncompatiblePluginsException(containers.toArray(containersArray));
+ }
+ }
+
+ /**
+ * Gets all plugins specified by the Plugins annotation. Any
duplicates are consolidated.
+ */
+ public static List<Class<? extends AtUnitPlugin>>
getPluginClasses(Class<?> testClass) {
+ Plugins anno = testClass.getAnnotation(Plugins.class);
+ if ( anno != null ) {
+ // whack any duplicates
+ Set<Class<? extends AtUnitPlugin>> plugins = Sets.newLinkedHashSet(anno.value());
+ return Lists.immutableList(plugins);
+ } else {
+ return Lists.immutableList();
+ }
+
+ }
+
+
+}

Added: trunk/src/atunit/core/TestClassUtils.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/core/TestClassUtils.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,139 @@
+package atunit.core;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+
+import atunit.Mock;
+import atunit.Stub;
+import atunit.Unit;
+import atunit.easymock.EasyMockFramework;
+import atunit.guice.GuiceContainer;
+import atunit.jmock.JMockFramework;
+import atunit.spring.SpringContainer;
+
+final public class TestClassUtils {
+
+ /**
+ * Gets the old-style MockFramework class for the given test class by
checking for a MockFramework or MockFrameworkClass annotation.
+ *
+ * @throws IncompatibleAnnotationException if both MockFramework and
MockFrameworkClass are present.
+ */
+ public static Class<? extends MockFramework>
getMockFrameworkClass(Class<?> testClass) throws
IncompatibleAnnotationException {
+ Class<? extends MockFramework> mockFrameworkClass = NoMockFramework.class;
+
+ atunit.MockFramework mockFrameworkAnno = testClass.getAnnotation(atunit.MockFramework.class);
+ atunit.MockFrameworkClass mockFrameworkClassAnno = testClass.getAnnotation(atunit.MockFrameworkClass.class);
+
+ if ( mockFrameworkAnno != null && mockFrameworkClassAnno != null )
+ throw new
IncompatibleAnnotationException(atunit.MockFramework.class, atunit.MockFrameworkClass.class);
+
+ if ( mockFrameworkAnno != null ) {
+ switch ( mockFrameworkAnno.value() ) {
+ case EASYMOCK: return EasyMockFramework.class;
+ case JMOCK: return JMockFramework.class;
+ }
+ }
+
+ if ( mockFrameworkClassAnno != null ) {
+ mockFrameworkClass = mockFrameworkClassAnno.value();
+ }
+
+ return mockFrameworkClass;
+ }
+
+ /**
+ * Gets all fields (declared and inherited) on the given class.
+ */
+ public static Set<Field> getFields(Class<?> testClass) {
+ Set<Field> fields = Sets.newHashSet(testClass.getDeclaredFields());
+ Class<?> c = testClass;
+ while ( (c = c.getSuperclass()) != null ) {
+ for ( Field f : c.getDeclaredFields() ) {
+ if ( !Modifier.isStatic(f.getModifiers())
+ && !Modifier.isPrivate(f.getModifiers())
+ ) {
+ fields.add(f);
+ }
+ }
+ }
+ return Sets.immutableSet(fields);
+ }
+
+ /**
+ * Gets the one and only field in the set annotated with Unit.
+ * @throws NoUnitException if no field is annotated with Unit.
+ * @throws TooManyUnitsException if more than one field is annotated
with Unit.
+ */
+ public static Field getUnitField(Set<Field> fields) throws
NoUnitException, TooManyUnitsException {
+ Field unitField = null;
+ for ( Field field : fields ) {
+ for ( Annotation anno : field.getAnnotations() ) {
+ if ( Unit.class.isAssignableFrom(anno.annotationType())) {
+ if ( unitField != null ) throw new TooManyUnitsException("Already
had field " + unitField + " when I found field " + field);
+ unitField = field;
+ }
+ }
+ }
+ if ( unitField == null ) throw new NoUnitException();
+ return unitField;
+ }
+
+ /**
+ * Gets the old-style Container class for the given test class by
looking for a Container or ContainerClass annotation.
+ *
+ * @throws IncompatibleAnnotationException if both Container and
ContainerClass annotations are present.
+ */
+ public static Class<? extends Container> getContainerClass(Class<?>
testClass) throws IncompatibleAnnotationException {
+
+ atunit.Container containerAnno = testClass.getAnnotation(atunit.Container.class);
+ atunit.ContainerClass containerClassAnno = testClass.getAnnotation(atunit.ContainerClass.class);
+
+ if ( containerAnno != null && containerClassAnno != null )
+ throw new IncompatibleAnnotationException(atunit.Container.class, atunit.ContainerClass.class);
+
+ if ( containerAnno != null ) {
+ switch ( containerAnno.value() ) {
+ case GUICE: return GuiceContainer.class;
+ case SPRING: return SpringContainer.class;
+ }
+ }
+
+ if ( containerClassAnno != null ) {
+ return containerClassAnno.value();
+ }
+
+ return NoContainer.class;
+ }
+
+
+ /**
+ * Gets all fields annotated with Mock.
+ */
+ public static Set<Field> getMockFields(Set<Field> fields) {
+ Set<Field> mocks = Sets.newHashSet();
+ for ( Field field : fields ) {
+ if ( field.getAnnotation(Mock.class) != null ) {
+ mocks.add(field);
+ }
+ }
+ return Sets.immutableSet(mocks);
+ }
+
+ /**
+ * Gets all fields annotated with Stub
+ */
+ public static Set<Field> getStubFields(Set<Field> fields) {
+ Set<Field> stubs = Sets.newHashSet();
+ for ( Field field : fields ) {
+ if ( field.getAnnotation(Stub.class) != null ) {
+ stubs.add(field);
+ }
+ }
+ return Sets.immutableSet(stubs);
+ }
+
+}

Added: trunk/src/atunit/core/TooManyUnitsException.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/core/TooManyUnitsException.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,33 @@
+/**
+ * Copyright (C) 2007 Logan Johnson
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package atunit.core;
+
+import atunit.Unit;
+import atunit.spi.exception.InvalidTestException;
+
+/**
+ * Thrown when a test has more than one field annotated with {@link Unit}.
+ *
+ * @author Logan Johnson &lt;logan....@gmail.com&gt;
+ *
+ */
+@SuppressWarnings("serial")
+public class TooManyUnitsException extends InvalidTestException {
+ public TooManyUnitsException(String msg) {
+ super(msg);
+ }
+}
\ No newline at end of file

Added: trunk/src/atunit/spi/exception/AtUnitPluginException.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/exception/AtUnitPluginException.java Mon Feb
11 10:45:00 2008
@@ -0,0 +1,23 @@
+package atunit.spi.exception;
+
+/**
+ * Indicates a problem within the plugin, not related to the test itself.
+ *
+ * @author Logan Johnson &lt;logan....@gmail.com&gt;
+ */
+public class AtUnitPluginException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public AtUnitPluginException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public AtUnitPluginException(String message) {
+ super(message);
+ }
+
+ public AtUnitPluginException(Throwable cause) {
+ super(cause);
+ }
+
+}

Added: trunk/src/atunit/spi/exception/IncompatiblePluginsException.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/exception/IncompatiblePluginsException.java
Mon Feb 11 10:45:00 2008
@@ -0,0 +1,27 @@
+package atunit.spi.exception;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.base.Join;
+
+import atunit.spi.plugin.AtUnitPlugin;
+
+public class IncompatiblePluginsException extends InvalidTestException {
+
+ private static final long serialVersionUID = 1L;
+
+ public IncompatiblePluginsException(Class<? extends AtUnitPlugin>...
classes ) {
+ super(join(classes) + " are incompatible");
+ }
+
+ private static String join(Class<?>[] classes) {
+ int s = classes.length;
+ if ( s < 2 ) {
+ throw new IllegalArgumentException("Must specify at least two
incompatible plugin classes");
+ }
+
+ List<Class<?>> list = Arrays.asList(classes);
+ return Join.join(", ", list.subList(0, list.size()-1)) + (s >
2 ? "," : "") + " and " + list.get(list.size()-1);
+ }
+}

Added: trunk/src/atunit/spi/exception/InvalidTestException.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/exception/InvalidTestException.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,16 @@
+package atunit.spi.exception;
+
+public abstract class InvalidTestException extends Exception {
+
+ public InvalidTestException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public InvalidTestException(Throwable cause) {
+ super(cause);
+ }
+
+ public InvalidTestException(String msg) {
+ super(msg);
+ }
+}

Added: trunk/src/atunit/spi/model/TestClass.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/model/TestClass.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,13 @@
+package atunit.spi.model;
+
+import java.lang.reflect.Field;
+import java.util.Set;
+
+public interface TestClass {
+ Class<?> getTestClass();
+ Field getUnitField();
+ Set<Field> getFields();
+ Set<Field> getMockFields();
+ Set<Field> getStubFields();
+
+}

Added: trunk/src/atunit/spi/model/TestFixture.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/model/TestFixture.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,8 @@
+package atunit.spi.model;
+
+import java.lang.reflect.Field;
+
+public interface TestFixture extends TestClass {
+ Object getValue(Field field);
+ void setValue(Field field, Object value);
+}

Added: trunk/src/atunit/spi/model/TestFixtureEvent.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/model/TestFixtureEvent.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,13 @@
+package atunit.spi.model;
+
+
+public interface TestFixtureEvent {
+
+ public static enum Stage {
+ BEFORE_INSTANTIATION
+ }
+
+ public Stage getStage();
+ public TestFixture getTestFixture();
+
+}

Added: trunk/src/atunit/spi/model/TestInstanceEvent.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/model/TestInstanceEvent.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,17 @@
+package atunit.spi.model;
+
+
+public interface TestInstanceEvent {
+
+ public static enum Stage {
+ BETWEEN_INSTANTIATION_AND_BEFORES,
+ BETWEEN_BEFORES_AND_TEST_METHOD,
+ BETWEEN_TEST_METHOD_AND_AFTERS,
+ AFTER_AFTERS
+ }
+
+ public Stage getStage();
+ public Object getTestInstance();
+ public TestFixture getTestFixture();
+
+}

Added: trunk/src/atunit/spi/plugin/AtUnitPlugin.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/plugin/AtUnitPlugin.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,13 @@
+package atunit.spi.plugin;
+
+import atunit.spi.exception.AtUnitPluginException;
+import atunit.spi.exception.InvalidTestException;
+import atunit.spi.model.TestClass;
+import atunit.spi.model.TestFixtureEvent;
+import atunit.spi.model.TestInstanceEvent;
+
+public interface AtUnitPlugin {
+ void validateTestClass(TestClass testClass) throws
InvalidTestException, AtUnitPluginException;
+ void handleTestFixtureEvent(TestFixtureEvent event) throws
InvalidTestException, AtUnitPluginException;
+ void handleTestInstanceEvent(TestInstanceEvent event) throws
InvalidTestException, AtUnitPluginException;
+}

Added: trunk/src/atunit/spi/plugin/AtUnitPluginAdapter.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/plugin/AtUnitPluginAdapter.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,20 @@
+package atunit.spi.plugin;
+
+import atunit.spi.exception.AtUnitPluginException;
+import atunit.spi.exception.InvalidTestException;
+import atunit.spi.model.TestClass;
+import atunit.spi.model.TestFixtureEvent;
+import atunit.spi.model.TestInstanceEvent;
+
+public abstract class AtUnitPluginAdapter implements AtUnitPlugin {
+
+ public void validateTestClass(TestClass testClass) throws
InvalidTestException, AtUnitPluginException {
+ }
+
+ public void handleTestFixtureEvent(TestFixtureEvent event) throws
InvalidTestException, AtUnitPluginException {
+ }
+
+ public void handleTestInstanceEvent(TestInstanceEvent event) throws
InvalidTestException, AtUnitPluginException {
+ }
+
+}

Added: trunk/src/atunit/spi/plugin/ContainerPlugin.java
==============================================================================
--- (empty file)
+++ trunk/src/atunit/spi/plugin/ContainerPlugin.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,7 @@
+package atunit.spi.plugin;
+
+import atunit.spi.model.TestFixture;
+
+public interface ContainerPlugin extends AtUnitPlugin {
+ Object instantiate(TestFixture testClass) throws Exception;
+}

Added: trunk/test/atunit/core/CoreTestFixtureTests.java
==============================================================================
--- (empty file)
+++ trunk/test/atunit/core/CoreTestFixtureTests.java Mon Feb 11
10:45:00 2008
@@ -0,0 +1,53 @@
+package atunit.core;
+
+import static org.junit.Assert.*;
+
+import java.lang.reflect.Field;
+import java.util.Set;
+
+import org.junit.Test;
+
+import com.google.common.collect.Sets;
+
+import atunit.Mock;
+import atunit.Plugins;
+import atunit.Stub;
+import atunit.Unit;
+import atunit.core.PluginUtilsTests.*;
+
+public class CoreTestFixtureTests {
+
+ @Test
+ public void tConstructor() throws Exception {
+ Class<?> testClass = TestClasses.Good.class;
+ CoreTestFixture fixture = new CoreTestFixture(testClass);
+
+ assertEquals(testClass, fixture.getTestClass());
+ assertEquals(DummyContainerPlugin.class, fixture.getContainerPluginClass());
+ assertEquals(testClass.getDeclaredField("unit"), fixture.getUnitField());
+
+ Set<Field> expectedMocks = Sets.newHashSet(testClass.getDeclaredField("mock1"),
+ testClass.getDeclaredField("mock2"));
+ assertEquals(expectedMocks, fixture.getMockFields());
+
+ Set<Field> expectedStubs = Sets.newHashSet(testClass.getDeclaredField("stub1"),
+ testClass.getDeclaredField("stub2"));
+ assertEquals(expectedStubs, fixture.getStubFields());
+
+ Set<Field> expectedFields = Sets.newHashSet(testClass.getDeclaredFields());
+ assertEquals(expectedFields, fixture.getFields());
+ }
+
+ protected static class TestClasses {
+
+ @Plugins({DummyPlugin1.class, DummyPlugin2.class, DummyContainerPlugin.class})
+ public static class Good {
+ @Unit String unit;
+ @Mock String mock1;
+ @Mock Integer mock2;
+ @Stub String stub1;
+ @Stub Integer stub2;
+ }
+ }
+
+}

Added: trunk/test/atunit/core/PluginUtilsTests.java
==============================================================================
--- (empty file)
+++ trunk/test/atunit/core/PluginUtilsTests.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,78 @@
+package atunit.core;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+import atunit.Plugins;
+import atunit.Unit;
+import atunit.spi.exception.IncompatiblePluginsException;
+import atunit.spi.model.TestFixture;
+import atunit.spi.plugin.AtUnitPlugin;
+import atunit.spi.plugin.AtUnitPluginAdapter;
+import atunit.spi.plugin.ContainerPlugin;
+
+public class PluginUtilsTests {
+
+ @Test
+ public void tGetPluginClasses() throws Exception {
+ List<Class<? extends AtUnitPlugin>> expectedPlugins = Lists.newArrayList();
+ expectedPlugins.add(DummyPlugin1.class);
+ expectedPlugins.add(DummyPlugin2.class);
+ expectedPlugins.add(DummyContainerPlugin.class);
+ List<Class<? extends AtUnitPlugin>> plugins = PluginUtils.getPluginClasses(TestClasses.TestWithPlugins.class);
+
+ assertEquals(expectedPlugins, plugins);
+ }
+
+ @Test
+ public void tGetContainerPluginClass() throws Exception {
+ Class<? extends ContainerPlugin> plugin = PluginUtils.getContainerPluginClass(TestClasses.TestWithPlugins.class);
+ assertEquals(DummyContainerPlugin.class, plugin);
+
+ assertNull(PluginUtils.getContainerPluginClass(TestClasses.NoContainer.class));
+ }
+
+ @Test(expected=IncompatiblePluginsException.class)
+ public void tGetContainerPluginTooMany() throws Exception {
+ PluginUtils.getContainerPluginClass(TestClasses.TooManyContainers.class);
+ }
+
+
+ protected static class DummyPlugin1 extends AtUnitPluginAdapter {
+ }
+ protected static class DummyPlugin2 extends AtUnitPluginAdapter {
+ }
+
+ protected static class DummyContainerPlugin extends
AtUnitPluginAdapter implements ContainerPlugin {
+ public Object instantiate(TestFixture testClass) throws Exception {
+ return null;
+ }
+ }
+
+ protected static class DummyContainerPlugin2 extends
DummyContainerPlugin {
+ }
+
+ protected static class TestClasses {
+
+ @Plugins({DummyPlugin1.class,DummyPlugin2.class,DummyContainerPlugin.class})
+ public static class TestWithPlugins {
+ @SuppressWarnings("unused")
+ @Unit private String unitField;
+ }
+
+ @Plugins({DummyPlugin1.class,DummyPlugin2.class})
+ public static class NoContainer {
+ }
+
+
@Plugins({DummyPlugin1.class,DummyPlugin2.class,DummyContainerPlugin.class, DummyContainerPlugin2.class})
+ public static class TooManyContainers {
+ }
+
+ }
+
+}

Added: trunk/test/atunit/core/TestClassUtilsTests.java
==============================================================================
--- (empty file)
+++ trunk/test/atunit/core/TestClassUtilsTests.java Mon Feb 11 10:45:00 2008
@@ -0,0 +1,181 @@
+package atunit.core;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+import atunit.Container;
+import atunit.ContainerClass;
+import atunit.Mock;
+import atunit.MockFramework;
+import atunit.MockFrameworkClass;
+import atunit.Plugins;
+import atunit.Stub;
+import atunit.Unit;
+import atunit.core.TestClassUtilsTests.TestClasses.Child;
+import atunit.easymock.EasyMockFramework;
+import atunit.guice.GuiceContainer;
+import atunit.spi.plugin.AtUnitPlugin;
+import atunit.spi.plugin.AtUnitPluginAdapter;
+
+import static atunit.core.TestClassUtils.*;
+import static org.junit.Assert.*;
+
+public class TestClassUtilsTests {
+
+ @Test
+ public void tGetContainerClass() throws Exception {
+ assertEquals(NoContainer.class, getContainerClass(TestClasses.Unannotated.class));
+ assertEquals(DummyContainer.class, getContainerClass(TestClasses.ClassAnnotations.class));
+ assertEquals(GuiceContainer.class, getContainerClass(TestClasses.OptionAnnotations.class));
+ }
+
+ @Test(expected=IncompatibleAnnotationException.class)
+ public void tGetContainerIncompatibleAnnotations() throws Exception {
+ getContainerClass(TestClasses.IncompatibleContainerAnnotations.class);
+ }
+
+ @Test
+ public void tGetMockFrameworkClass() throws Exception {
+ assertEquals(NoMockFramework.class, getMockFrameworkClass(TestClasses.Unannotated.class));
+ assertEquals(DummyMockFramework.class, getMockFrameworkClass(TestClasses.ClassAnnotations.class));
+ assertEquals(EasyMockFramework.class, getMockFrameworkClass(TestClasses.OptionAnnotations.class));
+ }
+
+ @Test(expected=IncompatibleAnnotationException.class)
+ public void tGetMockFrameworkIncompatibleAnnotations() throws
Exception {
+ getMockFrameworkClass(TestClasses.IncompatibleMockFrameworkAnnotations.class);
+ }
+
+ @Test
+ public void tGetFields() throws Exception {
+ Set<Field> fields = getFields(Child.class);
+
+ Set<Field> expectedFields = Sets.newHashSet();
+ expectedFields.add(TestClasses.Parent.class.getDeclaredField("parentField1"));
+ expectedFields.add(TestClasses.Parent.class.getDeclaredField("parentField2"));
+ expectedFields.addAll(Arrays.asList(TestClasses.Child.class.getDeclaredFields()));
+
+ assertEquals(expectedFields.size(), fields.size());
+ assertTrue(fields.containsAll(expectedFields));
+
+ }
+
+ @Test
+ public void tGetUnitField() throws Exception {
+ Set<Field> fields = Sets.newHashSet(TestClasses.Child.class.getDeclaredFields());
+ assertEquals(TestClasses.Child.class.getDeclaredField("unitField"), getUnitField(fields));
+ }
+
+ @Test(expected=NoUnitException.class)
+ public void tGetUnitFieldNoUnits() throws Exception {
+ Set<Field> fields = Sets.newHashSet(TestClasses.Child.class.getDeclaredFields());
+ fields.remove(TestClasses.Child.class.getDeclaredField("unitField"));
+ getUnitField(fields);
+ }
+
+ @Test(expected=TooManyUnitsException.class)
+ public void tGetUnitFieldTooManyUnits() throws Exception {
+ getUnitField(getFields(TestClasses.TooManyUnits.class));
+ }
+
+ @Test
+ public void tGetMockFields() throws Exception {
+ Set<Field> expectedMocks = Sets.newHashSet();
+ expectedMocks.add(TestClasses.TestWithMocks.class.getDeclaredField("mockField1"));
+ expectedMocks.add(TestClasses.TestWithMocks.class.getDeclaredField("mockField2"));
+
+ Set<Field> mocks = getMockFields(Sets.newHashSet(TestClasses.TestWithMocks.class.getDeclaredFields()));
+ assertEquals(expectedMocks.size(), mocks.size());
+ assertTrue(mocks.containsAll(expectedMocks));
+ }
+
+ @Test
+ public void tGetStubFields() throws Exception {
+ Set<Field> expectedStubs = Sets.newHashSet();
+ expectedStubs.add(TestClasses.TestWithMocks.class.getDeclaredField("stubField1"));
+ expectedStubs.add(TestClasses.TestWithMocks.class.getDeclaredField("stubField2"));
+
+ Set<Field> mocks = getStubFields(Sets.newHashSet(TestClasses.TestWithMocks.class.getDeclaredFields()));
+ assertEquals(expectedStubs.size(), mocks.size());
+ assertTrue(mocks.containsAll(expectedStubs));
+ }
+
+ protected static class DummyContainer implements
atunit.core.Container {
+ public Object createTest(Class<?> testClass,
+ Map<Field, Object> fieldValues) throws Exception {
+ return null;
+ }
+ }
+
+ protected static class DummyMockFramework implements
atunit.core.MockFramework {
+ public Map<Field, Object> getValues(Field[] fields) throws Exception {
+ return null;
+ }
+ }
+
+ protected static class TestClasses {
+
+ public static class Unannotated {
+ }
+
+ @ContainerClass(DummyContainer.class)
+ @MockFrameworkClass(DummyMockFramework.class)
+ public static class ClassAnnotations { }
+
+ @Container(Container.Option.GUICE)
+ @MockFramework(MockFramework.Option.EASYMOCK)
+ public static class OptionAnnotations { }
+
+ @ContainerClass(DummyContainer.class)
+ @Container(Container.Option.GUICE)
+ public static class IncompatibleContainerAnnotations { }
+
+
+ @MockFrameworkClass(DummyMockFramework.class)
+ @MockFramework(MockFramework.Option.EASYMOCK)
+ public static class IncompatibleMockFrameworkAnnotations { }
+
+
+ @SuppressWarnings("unused")
+ public static class Parent {
+ protected String parentField1;
+ public Integer parentField2;
+ private String parentField3;
+ }
+
+ @SuppressWarnings("unused")
+ public static class Child extends Parent {
+ private String childField1;
+ protected Integer childField2;
+ @Unit private String unitField;
+ }
+
+ @SuppressWarnings("unused")
+ public static class TooManyUnits {
+ @Unit private String unit1;
+ @Unit private String unit2;
+ private Integer nonUnit;
+ }
+
+ @SuppressWarnings("unused")
+ public static class TestWithMocks {
+ @Unit private String unitField;
+ @Mock private String mockField1;
+ @Mock private String mockField2;
+ @Stub private String stubField1;
+ @Stub private String stubField2;
+ private String someOtherField;
+ }
+
+ }
+
+
+}

Modified: trunk/test/atunit/guice/GuiceContainerTests.java
==============================================================================
--- trunk/test/atunit/guice/GuiceContainerTests.java (original)
+++ trunk/test/atunit/guice/GuiceContainerTests.java Mon Feb 11
10:45:00 2008
@@ -59,7 +59,9 @@
assertEquals(3, df.field3.intValue());
}

- public static class Inheritance extends ExampleGuiceTest {}
+ protected static class Inheritance extends ExampleGuiceTest {
+ public Inheritance() {}
+ }

protected static class DuplicateFields {
@Inject public String field1;

Reply all
Reply to author
Forward
0 new messages