Skip to content

Commit

Permalink
Merge pull request #6910 from pabender/testcreation
Browse files Browse the repository at this point in the history
make test classes extend from test base classes
  • Loading branch information
pabender committed May 6, 2019
2 parents 571a8c2 + d45e7d8 commit 0e99329
Show file tree
Hide file tree
Showing 17 changed files with 230 additions and 160 deletions.
48 changes: 29 additions & 19 deletions java/test/jmri/jmrix/loconet/TranspondingTagManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,30 @@

import jmri.IdTag;
import jmri.IdTagManager;
import jmri.util.JUnitUtil;
import jmri.managers.ProxyIdTagManager;
import org.junit.*;

/**
* Tests for the jmri.managers.TranspondingTagManager class.
*
* @author Matthew Harris Copyright (C) 2011
*/
public class TranspondingTagManagerTest {
public class TranspondingTagManagerTest extends jmri.managers.DefaultIdTagManagerTest {

@Test
public void testTranspondingTagCreation() {
TranspondingTagManager m = getManager();
@Override
public void testIdTagCreation() {
TranspondingTagManager m = (TranspondingTagManager)l;
TranspondingTag t = m.createNewIdTag("LD0413276BC1", "Test Tag");

Assert.assertNotNull("TranspondingTag is not null", t);
}

@Test
public void testTranspondingTagNames() {
TranspondingTagManager m = getManager();
@Override
public void testIdTagNames() {
TranspondingTagManager m = (TranspondingTagManager)l;
TranspondingTag t = m.createNewIdTag("LD0413276BC1", "Test Tag");

Assert.assertEquals("TranspondingTag system name is 'LD0413276BC1'", "LD0413276BC1", t.getSystemName());
Expand All @@ -30,8 +34,9 @@ public void testTranspondingTagNames() {
}

@Test
public void testTranspondingTagSingleRetrieval() {
TranspondingTagManager m = getManager();
@Override
public void testIdTagSingleRetrieval() {
TranspondingTagManager m = (TranspondingTagManager)l;
TranspondingTag t = (TranspondingTag) m.newIdTag("LD0413276BC1", "Test Tag");

Assert.assertNotNull("Returned TranspondingTag is not null", t);
Expand All @@ -54,8 +59,9 @@ public void testTranspondingTagSingleRetrieval() {
}

@Test
public void testTranspondingTagMultiRetrieval() {
TranspondingTagManager m = getManager();
@Override
public void testIdTagMultiRetrieval() {
TranspondingTagManager m = (TranspondingTagManager)l;
TranspondingTag t1 = (TranspondingTag) m.newIdTag("LD0413276BC1", "Test Tag 1");
TranspondingTag t2 = (TranspondingTag)m.newIdTag("LD0413275FCA", "Test Tag 2");

Expand All @@ -79,8 +85,9 @@ public void testTranspondingTagMultiRetrieval() {
}

@Test
public void testTranspondingTagProviderCreate() {
TranspondingTagManager m = getManager();
@Override
public void testIdTagProviderCreate() {
TranspondingTagManager m = (TranspondingTagManager)l;
TranspondingTag t = (TranspondingTag) m.provideIdTag("0413276BC1");

Assert.assertNotNull("TranspondingTag is not null", t);
Expand All @@ -96,8 +103,9 @@ public void testTranspondingTagProviderCreate() {
}

@Test
public void testTranspondingTagProviderGet() {
TranspondingTagManager m = getManager();
@Override
public void testIdTagProviderGet() {
TranspondingTagManager m = (TranspondingTagManager)l;
TranspondingTag t1 = (TranspondingTag)m.newIdTag("LD0413276BC1", "Test Tag 1");
TranspondingTag t2 = (TranspondingTag)m.newIdTag("LD0413275FCA", "Test Tag 2");

Expand All @@ -115,16 +123,18 @@ public void testTranspondingTagProviderGet() {
// The minimal setup for log4J
@Before
public void setUp() throws Exception {
jmri.util.JUnitUtil.setUp();
jmri.util.JUnitUtil.resetInstanceManager();
jmri.util.JUnitUtil.initInternalTurnoutManager();
jmri.util.JUnitUtil.initInternalLightManager();
jmri.util.JUnitUtil.initInternalSensorManager();
jmri.util.JUnitUtil.initIdTagManager();
JUnitUtil.setUp();
JUnitUtil.resetInstanceManager();
JUnitUtil.initInternalTurnoutManager();
JUnitUtil.initInternalLightManager();
JUnitUtil.initInternalSensorManager();
jmri.InstanceManager.setDefault(jmri.IdTagManager.class,new ProxyIdTagManager());
l = getManager();
}

@After
public void tearDown() throws Exception {
l = null;
jmri.util.JUnitUtil.tearDown();
}

Expand Down
2 changes: 1 addition & 1 deletion java/test/jmri/managers/AbstractLightMgrTestBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* @author Bob Jacobsen 2003, 2006, 2008
* @author Paul Bender Copyright (C) 2016
*/
public abstract class AbstractLightMgrTestBase extends AbstractManagerTestBase<LightManager, Light> {
public abstract class AbstractLightMgrTestBase extends AbstractProvidingManagerTestBase<LightManager, Light> {

// implementing classes must provide these abstract members:
//
Expand Down
88 changes: 1 addition & 87 deletions java/test/jmri/managers/AbstractManagerTestBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,11 @@
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import jmri.util.JUnitAppender;
import org.apache.log4j.Level;

import org.junit.Assume;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Base for the various Abstract*MgrTestBase base classes for NamedBean Manager test classes
Expand Down Expand Up @@ -125,85 +119,5 @@ public void testMakeSystemName() {
Assert.assertFalse(s.isEmpty());
}

protected Field getField(Class c, String fieldName) {
try {
return c.getDeclaredField(fieldName);
} catch (NoSuchFieldException ex) {
if (c.getSuperclass() != null)
return getField(c.getSuperclass(), fieldName);
}

// Field not found
return null;
}

@Test
public void testRegisterDuplicateSystemName() throws PropertyVetoException, NoSuchFieldException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
if (l instanceof ProvidingManager) {
ProvidingManager<E> m = (ProvidingManager<E>) l;
String s1 = l.makeSystemName("1");
String s2 = l.makeSystemName("2");
Assert.assertNotNull(s1);
Assert.assertFalse(s1.isEmpty());
Assert.assertNotNull(s2);
Assert.assertFalse(s2.isEmpty());

E e1;
E e2;

try {
e1 = m.provide(s1);
e2 = m.provide(s2);
} catch (IllegalArgumentException | NullPointerException | ArrayIndexOutOfBoundsException ex) {
// jmri.jmrix.openlcb.OlcbLightManagerTest gives a NullPointerException here.
// jmri.jmrix.openlcb.OlcbSensorManagerTest gives a ArrayIndexOutOfBoundsException here.
// Some other tests give an IllegalArgumentException here.

// If the test is unable to provide a named bean, abort this test.
JUnitAppender.clearBacklog(Level.WARN);
log.debug("Cannot provide a named bean", ex);
Assume.assumeTrue("We got no exception", false);
return;
}

// Use reflection to change the systemName of e2
// Try to find the field
Field f1 = getField(e2.getClass(), "mSystemName");
f1.setAccessible(true);
f1.set(e2, e1.getSystemName());

// Remove bean if it's already registered
if (l.getBeanBySystemName(e1.getSystemName()) != null) {
l.deregister(e1);
}
// Remove bean if it's already registered
if (l.getBeanBySystemName(e2.getSystemName()) != null) {
l.deregister(e2);
}

// Register the bean once. This should be OK.
l.register(e1);

// Register bean twice. This gives only a debug message.
l.register(e1);

String expectedMessage = "systemName is already registered: " + e1.getSystemName();
boolean hasException = false;
try {
// Register different bean with existing systemName.
// This should fail with an IllegalArgumentException.
l.register(e2);
} catch (IllegalArgumentException ex) {
hasException = true;
Assert.assertTrue("exception message is correct",
expectedMessage.equals(ex.getMessage()));
JUnitAppender.assertErrorMessage(expectedMessage);
}
Assert.assertTrue("exception is thrown", hasException);

l.deregister(e1);
}
}

private final static Logger log = LoggerFactory.getLogger(AbstractManagerTestBase.class);
//private final static Logger log = LoggerFactory.getLogger(AbstractManagerTestBase.class);
}
122 changes: 122 additions & 0 deletions java/test/jmri/managers/AbstractProvidingManagerTestBase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package jmri.managers;

import jmri.*;

import java.beans.PropertyVetoException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import jmri.util.JUnitAppender;
import org.apache.log4j.Level;

import org.junit.Assume;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Extension of AbstractManagerTestBase base for ProvidingManager test classes
* <p>
* This is not itself a test class, e.g. should not be added to a suite.
* Instead, this forms the base for test classes, including providing some
* common tests.
* <p>
*
* @author Paul Bender Copyright (C) 2019
* @param <T> the class being tested
* @param <E> the class of NamedBean handled by T
*/
public abstract class AbstractProvidingManagerTestBase<T extends ProvidingManager<E>, E extends NamedBean> extends AbstractManagerTestBase<T,E> {

@Test(expected = IllegalArgumentException.class)
public void testProvideEmpty() throws IllegalArgumentException {
ProvidingManager<E> m = l;
try {
m.provide(""); // this should throw an IllegalArugmentException.
} catch( IllegalArgumentException iae){
JUnitAppender.suppressErrorMessageStartsWith("Invalid system name for");
throw iae; // rethrow the expected exception, after suppressing the error
}
}

@Test
public void testRegisterDuplicateSystemName() throws PropertyVetoException, NoSuchFieldException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
ProvidingManager<E> m = l;
String s1 = l.makeSystemName("1");
String s2 = l.makeSystemName("2");
Assert.assertNotNull(s1);
Assert.assertFalse(s1.isEmpty());
Assert.assertNotNull(s2);
Assert.assertFalse(s2.isEmpty());

E e1;
E e2;

try {
e1 = m.provide(s1);
e2 = m.provide(s2);
} catch (IllegalArgumentException | NullPointerException | ArrayIndexOutOfBoundsException ex) {
// jmri.jmrix.openlcb.OlcbLightProvidingManagerTest gives a NullPointerException here.
// jmri.jmrix.openlcb.OlcbSensorProvidingManagerTest gives a ArrayIndexOutOfBoundsException here.
// Some other tests give an IllegalArgumentException here.

// If the test is unable to provide a named bean, abort this test.
JUnitAppender.clearBacklog(Level.WARN);
log.debug("Cannot provide a named bean", ex);
Assume.assumeTrue("We got no exception", false);
return;
}

// Use reflection to change the systemName of e2
// Try to find the field
Field f1 = getField(e2.getClass(), "mSystemName");
f1.setAccessible(true);
f1.set(e2, e1.getSystemName());

// Remove bean if it's already registered
if (l.getBeanBySystemName(e1.getSystemName()) != null) {
l.deregister(e1);
}
// Remove bean if it's already registered
if (l.getBeanBySystemName(e2.getSystemName()) != null) {
l.deregister(e2);
}

// Register the bean once. This should be OK.
l.register(e1);

// Register bean twice. This gives only a debug message.
l.register(e1);

String expectedMessage = "systemName is already registered: " + e1.getSystemName();
boolean hasException = false;
try {
// Register different bean with existing systemName.
// This should fail with an IllegalArgumentException.
l.register(e2);
} catch (IllegalArgumentException ex) {
hasException = true;
Assert.assertTrue("exception message is correct",
expectedMessage.equals(ex.getMessage()));
JUnitAppender.assertErrorMessage(expectedMessage);
}
Assert.assertTrue("exception is thrown", hasException);

l.deregister(e1);
}

protected Field getField(Class c, String fieldName) {
try {
return c.getDeclaredField(fieldName);
} catch (NoSuchFieldException ex) {
if (c.getSuperclass() != null)
return getField(c.getSuperclass(), fieldName);
}

// Field not found
return null;
}

private final static Logger log = LoggerFactory.getLogger(AbstractProvidingManagerTestBase.class);
}
2 changes: 1 addition & 1 deletion java/test/jmri/managers/AbstractReporterMgrTestBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* @author Bob Jacobsen 2003, 2006, 2008
* @author Paul Bender Copyright (C) 2016
*/
public abstract class AbstractReporterMgrTestBase extends AbstractManagerTestBase<ReporterManager, Reporter> {
public abstract class AbstractReporterMgrTestBase extends AbstractProvidingManagerTestBase<ReporterManager, Reporter> {

/**
* Max number of Reporters supported. Override to return 1 if
Expand Down
2 changes: 1 addition & 1 deletion java/test/jmri/managers/AbstractSensorMgrTestBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
* @author Bob Jacobsen 2003, 2006, 2008, 2016
* @author Paul Bender Copyright(C) 2016
*/
public abstract class AbstractSensorMgrTestBase extends AbstractManagerTestBase<SensorManager, Sensor> {
public abstract class AbstractSensorMgrTestBase extends AbstractProvidingManagerTestBase<SensorManager, Sensor> {

// implementing classes must provide these abstract members:
//
Expand Down
7 changes: 4 additions & 3 deletions java/test/jmri/managers/AbstractSignalHeadManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,23 @@
*
* @author Paul Bender Copyright (C) 2017
*/
public class AbstractSignalHeadManagerTest {
public class AbstractSignalHeadManagerTest extends AbstractManagerTestBase<jmri.SignalHeadManager,jmri.SignalHead> {

@Test
public void testCTor() {
AbstractSignalHeadManager t = new AbstractSignalHeadManager();
Assert.assertNotNull("exists",t);
Assert.assertNotNull("exists",l);
}

// The minimal setup for log4J
@Before
public void setUp() {
JUnitUtil.setUp();
l = new AbstractSignalHeadManager();
}

@After
public void tearDown() {
l = null;
JUnitUtil.tearDown();
}

Expand Down
2 changes: 1 addition & 1 deletion java/test/jmri/managers/AbstractTurnoutMgrTestBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*
* @author Bob Jacobsen
*/
public abstract class AbstractTurnoutMgrTestBase extends AbstractManagerTestBase<TurnoutManager, Turnout> {
public abstract class AbstractTurnoutMgrTestBase extends AbstractProvidingManagerTestBase<TurnoutManager, Turnout> {

// implementing classes must implement to convert integer (count) to a system name
abstract public String getSystemName(int i);
Expand Down

0 comments on commit 0e99329

Please sign in to comment.