/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.util.beancompare; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import org.joda.beans.Bean; import org.joda.beans.MetaProperty; import org.joda.beans.impl.flexi.FlexiBean; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.UniqueId; import com.opengamma.util.test.TestGroup; /** * */ @Test(groups = TestGroup.UNIT) public class BeanCompareTest { private static final String UNIQUE_ID = "uniqueId"; private static final String EXTERNAL_ID_BUNDLE = "externalIdBundle"; private static final String NAME = "name"; @Test @SuppressWarnings("deprecation") public void equalIgnoring() { UniqueId uid1 = UniqueId.of("uid", "123"); UniqueId uid2 = UniqueId.of("uid", "124"); ExternalIdBundle eid1 = ExternalIdBundle.of(ExternalId.of("eid1", "321")); ExternalIdBundle eid2 = ExternalIdBundle.of(ExternalId.of("eid1", "321")); Bean bean1 = createBean(uid1, eid1, "name1"); Bean bean2 = createBean(uid2, eid2, "name1"); assertFalse(BeanCompare.equalIgnoring(bean1, bean2)); assertTrue(BeanCompare.equalIgnoring(bean1, bean2, bean1.metaBean().metaProperty(UNIQUE_ID))); } @Test public void propertyComparators_same() { UniqueId uid1 = UniqueId.of("uid", "123"); UniqueId uid2 = UniqueId.of("uid", "123"); ExternalIdBundle eid1 = ExternalIdBundle.of(ExternalId.of("eid1", "321")); ExternalIdBundle eid2 = ExternalIdBundle.of(ExternalId.of("eid1", "321")); Bean bean1 = createBean(uid1, eid1, "name1"); Bean bean2 = createBean(uid2, eid2, "name1"); BeanCompare beanCompare = new BeanCompare(); List<BeanDifference<?>> diff = beanCompare.compare(bean1, bean2); assertTrue(diff.isEmpty()); } @Test public void propertyComparators_different() { UniqueId uid1 = UniqueId.of("uid", "123"); UniqueId uid2 = UniqueId.of("uid", "123"); ExternalIdBundle eid1 = ExternalIdBundle.of(ExternalId.of("eid1", "321")); ExternalIdBundle eid2 = ExternalIdBundle.of(ExternalId.of("eid2", "abc")); Bean bean1 = createBean(uid1, eid1, "name1"); Bean bean2 = createBean(uid2, eid2, "name1"); BeanCompare beanCompare = new BeanCompare(); List<BeanDifference<?>> diff = beanCompare.compare(bean1, bean2); assertFalse(diff.isEmpty()); } @Test public void propertyComparators_ignoreDifferences() { Comparator<Object> alwaysEqualComparator = new Comparator<Object>() { @Override public int compare(Object notUsed1, Object notUsed2) { return 0; } }; UniqueId uid1 = UniqueId.of("uid", "123"); UniqueId uid2 = UniqueId.of("uid", "321"); ExternalIdBundle eid1 = ExternalIdBundle.of(ExternalId.of("eid1", "321")); ExternalIdBundle eid2 = ExternalIdBundle.of(ExternalId.of("eid2", "abc")); Bean bean1 = createBean(uid1, eid1, "name1"); Bean bean2 = createBean(uid2, eid2, "name1"); MetaProperty<Object> uniqueIdMeta = bean1.property(UNIQUE_ID).metaProperty(); MetaProperty<Object> externalIdMeta = bean1.property(EXTERNAL_ID_BUNDLE).metaProperty(); Map<MetaProperty<?>, Comparator<Object>> comparators = ImmutableMap.<MetaProperty<?>, Comparator<Object>>of( uniqueIdMeta, alwaysEqualComparator, externalIdMeta, alwaysEqualComparator); BeanCompare beanCompare = new BeanCompare(comparators, Collections.<Class<?>, Comparator<Object>>emptyMap()); // same despite different IDs List<BeanDifference<?>> diff = beanCompare.compare(bean1, bean2); assertTrue(diff.toString(), diff.isEmpty()); } private static Bean createBean(UniqueId uniqueId, ExternalIdBundle idBundle, String name) { FlexiBean bean = new FlexiBean(); bean.propertyDefine(UNIQUE_ID, UniqueId.class); bean.propertyDefine(EXTERNAL_ID_BUNDLE, ExternalIdBundle.class); bean.propertyDefine(NAME, String.class); bean.propertySet(UNIQUE_ID, uniqueId); bean.propertySet(EXTERNAL_ID_BUNDLE, idBundle); bean.propertySet(NAME, name); return bean; } }