/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.model.dto;
import org.candlepin.model.Content;
import org.candlepin.model.ProductContent;
import org.candlepin.util.Util;
import static org.junit.Assert.*;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.lang.reflect.Method;
import java.util.Collection;
/**
* Test suite for the ProductContentData class
*/
@RunWith(JUnitParamsRunner.class)
public class ProductContentDataTest {
@Test
public void testGetSetContent() {
ProductContentData dto = new ProductContentData();
ContentData input = new ContentData("id", "name", "type", "label", "vendor");
ContentData output = dto.getContent();
assertNull(output);
ProductContentData output2 = dto.setContent(input);
assertSame(output2, dto);
output = dto.getContent();
assertEquals(input, output);
}
@Test
public void testGetSetEnabled() {
ProductContentData dto = new ProductContentData();
Boolean input = Boolean.TRUE;
Boolean output = dto.isEnabled();
assertNull(output);
ProductContentData output2 = dto.setEnabled(input);
assertSame(output2, dto);
output = dto.isEnabled();
assertEquals(input, output);
}
protected Object[][] getValuesForEqualityAndReplication() {
ContentData input1 = new ContentData("id1", "name1", "type1", "label1", "vendor1");
ContentData input2 = new ContentData("id2", "name2", "type2", "label2", "vendor2");
return new Object[][] {
new Object[] { "Content", input1, input2 },
new Object[] { "Enabled", Boolean.TRUE, Boolean.FALSE }
};
}
protected Method[] getAccessorAndMutator(String methodSuffix, Class mutatorInputClass)
throws Exception {
Method accessor = null;
Method mutator = null;
try {
accessor = ProductContentData.class.getDeclaredMethod("get" + methodSuffix, null);
}
catch (NoSuchMethodException e) {
accessor = ProductContentData.class.getDeclaredMethod("is" + methodSuffix, null);
}
try {
mutator = ProductContentData.class.getDeclaredMethod("set" + methodSuffix, mutatorInputClass);
}
catch (NoSuchMethodException e) {
if (!Collection.class.isAssignableFrom(mutatorInputClass)) {
throw e;
}
mutator = ProductContentData.class.getDeclaredMethod("set" + methodSuffix, Collection.class);
}
return new Method[] { accessor, mutator };
}
@Test
public void testBaseEquality() {
ProductContentData lhs = new ProductContentData();
ProductContentData rhs = new ProductContentData();
assertFalse(lhs.equals(null));
assertTrue(lhs.equals(lhs));
assertTrue(rhs.equals(rhs));
assertTrue(lhs.equals(rhs));
assertTrue(rhs.equals(lhs));
}
@Test
@Parameters(method = "getValuesForEqualityAndReplication")
public void testEquality(String valueName, Object value1, Object value2) throws Exception {
Method[] methods = this.getAccessorAndMutator(valueName, value1.getClass());
Method accessor = methods[0];
Method mutator = methods[1];
ProductContentData lhs = new ProductContentData();
ProductContentData rhs = new ProductContentData();
mutator.invoke(lhs, value1);
mutator.invoke(rhs, value1);
assertEquals(accessor.invoke(lhs), accessor.invoke(rhs));
assertTrue(lhs.equals(rhs));
assertTrue(rhs.equals(lhs));
assertTrue(lhs.equals(lhs));
assertTrue(rhs.equals(rhs));
assertEquals(lhs.hashCode(), rhs.hashCode());
mutator.invoke(rhs, value2);
assertNotEquals(accessor.invoke(lhs), accessor.invoke(rhs));
assertFalse(lhs.equals(rhs));
assertFalse(rhs.equals(lhs));
assertTrue(lhs.equals(lhs));
assertTrue(rhs.equals(rhs));
}
@Test
@Parameters(method = "getValuesForEqualityAndReplication")
public void testClone(String valueName, Object value1, Object value2) throws Exception {
Method[] methods = this.getAccessorAndMutator(valueName, value1.getClass());
Method accessor = methods[0];
Method mutator = methods[1];
ProductContentData base = new ProductContentData();
mutator.invoke(base, value1);
ProductContentData clone = (ProductContentData) base.clone();
assertEquals(accessor.invoke(base, null), accessor.invoke(clone, null));
assertEquals(base, clone);
assertEquals(base.hashCode(), clone.hashCode());
}
@Test
@Parameters(method = "getValuesForEqualityAndReplication")
public void testPopulateWithDTO(String valueName, Object value1, Object value2) throws Exception {
Method[] methods = this.getAccessorAndMutator(valueName, value1.getClass());
Method accessor = methods[0];
Method mutator = methods[1];
ProductContentData base = new ProductContentData();
ProductContentData source = new ProductContentData();
mutator.invoke(source, value1);
base.populate(source);
// Verify only the specified field was set
for (Method method : ProductContentData.class.getDeclaredMethods()) {
if (method.getName().matches("^(get|is)\\w+")) {
Object output = method.invoke(base, null);
if (method.getName().equals(accessor.getName())) {
if (value1 instanceof Collection) {
assertTrue(output instanceof Collection);
assertTrue(Util.collectionsAreEqual((Collection) value1, (Collection) output));
}
else {
assertEquals(value1, output);
}
}
else {
assertNull(output);
}
}
}
}
@Test
public void testPopulateWithEntityContent() {
Content contentEntity = new Content("id1", "name1", "type1", "label1", "vendor1");
ContentData contentDTO = contentEntity.toDTO();
ProductContentData base = new ProductContentData();
ProductContent source = new ProductContent();
source.setContent(contentEntity);
base.populate(source);
assertEquals(contentDTO, base.getContent());
// This will always be set after a populate
assertFalse(base.isEnabled());
}
@Test
public void testPopulateWithEntityEnabled() {
ProductContentData base = new ProductContentData();
ProductContent source = new ProductContent();
source.setEnabled(true);
base.populate(source);
assertNull(base.getContent());
assertTrue(base.isEnabled());
}
}