blob: 15e6b308c7f94b849d1ef18599ae54425dbbd908 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2017 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////
package com.puppycrawl.tools.checkstyle.api;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.ConvertUtilsBean;
import org.apache.commons.beanutils.Converter;
import org.junit.Test;
import org.powermock.reflect.Whitebox;
import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
import com.puppycrawl.tools.checkstyle.DefaultContext;
public class AutomaticBeanTest {
@Test
public void testConfigureNoSuchAttribute() {
final TestBean testBean = new TestBean();
final DefaultConfiguration conf = new DefaultConfiguration("testConf");
conf.addAttribute("NonExistent", "doesn't matter");
try {
testBean.configure(conf);
fail("Exception is expected");
}
catch (CheckstyleException ex) {
final String expected = "Property 'NonExistent' in module ";
assertNull("Exceptions cause should be null", ex.getCause());
assertTrue("Invalid exception message, should start with: " + expected,
ex.getMessage().startsWith(expected));
}
}
@Test
public void testConfigureNoSuchAttribute2() {
final TestBean testBean = new TestBean();
final DefaultConfiguration conf = new DefaultConfiguration("testConf");
conf.addAttribute("privateField", "doesn't matter");
try {
testBean.configure(conf);
fail("Exception is expected");
}
catch (CheckstyleException ex) {
final String expected = "Property 'privateField' in module ";
assertNull("Exceptions cause should be null", ex.getCause());
assertTrue("Invalid exception message, should start with: " + expected,
ex.getMessage().startsWith(expected));
}
}
@Test
public void testSetupChildFromBaseClass() throws CheckstyleException {
final TestBean testBean = new TestBean();
testBean.configure(new DefaultConfiguration("bean config"));
testBean.setupChild(null);
try {
testBean.setupChild(new DefaultConfiguration("dummy"));
fail("Exception expected");
}
catch (CheckstyleException ex) {
final String expectedMessage = "dummy is not allowed as a child in bean config. "
+ "Please review 'Parent Module' section for this Check"
+ " in web documentation if Check is standard.";
assertEquals("Invalid exception message", expectedMessage, ex.getMessage());
}
}
@Test
public void testSetupInvalidChildFromBaseClass() throws Exception {
final TestBean testBean = new TestBean();
final DefaultConfiguration parentConf = new DefaultConfiguration("parentConf");
final DefaultConfiguration childConf = new DefaultConfiguration("childConf");
final Field field = AutomaticBean.class.getDeclaredField("configuration");
field.setAccessible(true);
field.set(testBean, parentConf);
try {
testBean.setupChild(childConf);
fail("expecting checkstyle exception");
}
catch (CheckstyleException ex) {
assertEquals("expected exception", "childConf is not allowed as a "
+ "child in parentConf. Please review 'Parent Module' section "
+ "for this Check in web documentation if Check is standard.",
ex.getMessage());
}
}
@Test
public void testContextualizeInvocationTargetException() {
final TestBean testBean = new TestBean();
final DefaultContext context = new DefaultContext();
context.add("exceptionalMethod", 123.0f);
try {
testBean.contextualize(context);
fail("InvocationTargetException is expected");
}
catch (CheckstyleException ex) {
final String expected = "Cannot set property ";
assertTrue("Invalid exception cause, should be: InvocationTargetException",
ex.getCause() instanceof InvocationTargetException);
assertTrue("Invalid exception message, should start with: " + expected,
ex.getMessage().startsWith(expected));
}
}
@Test
public void testContextualizeConversionException() {
final TestBean testBean = new TestBean();
final DefaultContext context = new DefaultContext();
context.add("val", "some string");
try {
testBean.contextualize(context);
fail("InvocationTargetException is expected");
}
catch (CheckstyleException ex) {
final String expected = "illegal value ";
assertTrue("Invalid exception cause, should be: ConversionException",
ex.getCause() instanceof ConversionException);
assertTrue("Invalid exception message, should start with: " + expected,
ex.getMessage().startsWith(expected));
}
}
@Test
public void testTestBean() {
final TestBean testBean = new TestBean();
testBean.setVal(0);
testBean.setWrong("wrongVal");
testBean.assignPrivateFieldSecretly(null);
try {
testBean.setExceptionalMethod("someValue");
fail("exception expected");
}
catch (IllegalStateException ex) {
assertEquals("Invalid exception message",
"null,wrongVal,0,someValue", ex.getMessage());
}
}
@Test
public void testRegisterIntegralTypes() throws Exception {
final ConvertUtilsBeanStub convertUtilsBean = new ConvertUtilsBeanStub();
Whitebox.invokeMethod(AutomaticBean.class, "registerIntegralTypes", convertUtilsBean);
assertEquals("Number of converters registered differs from expected",
81, convertUtilsBean.getRegisterCount());
}
private static class ConvertUtilsBeanStub extends ConvertUtilsBean {
private int registerCount;
@Override
public void register(Converter converter, Class<?> clazz) {
super.register(converter, clazz);
registerCount++;
}
public int getRegisterCount() {
return registerCount;
}
}
private static class TestBean extends AutomaticBean {
private String privateField;
private String wrong;
private int val;
public void setWrong(String wrong) {
this.wrong = wrong;
}
public void setVal(int val) {
this.val = val;
}
public void assignPrivateFieldSecretly(String input) {
privateField = input;
}
public void setExceptionalMethod(String value) {
throw new IllegalStateException(privateField + "," + wrong + "," + val + "," + value);
}
@Override
protected void finishLocalSetup() throws CheckstyleException {
// No code by default
}
}
}