/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.legalentity;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.CREDIT_RATINGS;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.LEGAL_ENTITY;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.LEGAL_ENTITY_RED_CODE;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.RED_CODE;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.REGION;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.SECTOR;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.SHORT_NAME;
import static com.opengamma.analytics.financial.legalentity.LegalEntityTest.TICKER;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.joda.beans.impl.flexi.FlexiBean;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.opengamma.util.i18n.Country;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
import com.opengamma.util.types.ParameterizedTypeImpl;
import com.opengamma.util.types.VariantType;
/**
* Tests for the classes that extract data from an {@link LegalEntity}.
*/
@Test(groups = TestGroup.UNIT)
public class LegalEntityFilterTest {
/**
* Tests failure for a credit rating-specific request when the credit rating is null
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testNullCreditRatings() {
final LegalEntityCreditRatings filter = new LegalEntityCreditRatings();
filter.getFilteredData(new LegalEntity(null, SHORT_NAME, null, null, null));
}
/**
* Tests failure for a request based on the ratings description where the description is null.
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testRatingDescription() {
final Set<CreditRating> creditRatings = new HashSet<>();
creditRatings.add(CreditRating.of("A", "S&P", true));
final LegalEntityCreditRatings filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatingDescriptions(Collections.singleton("S&P"));
filter.getFilteredData(new LegalEntity(null, SHORT_NAME, creditRatings, null, null));
}
/**
* Tests failure for an agency rating that is not present in the legal entity.
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testUseUnavailableRating() {
final Set<CreditRating> creditRatings = new HashSet<>();
creditRatings.add(CreditRating.of("A", "S&P", true));
creditRatings.add(CreditRating.of("A", "Moody's", true));
final LegalEntityCreditRatings filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatings(Collections.singleton("Fitch"));
filter.getFilteredData(new LegalEntity(null, SHORT_NAME, creditRatings, null, null));
}
/**
* Tests failure for an agency rating description that is not present in the legal entity.
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testUseUnavailableRatingDescription() {
final Set<CreditRating> creditRatings = new HashSet<>();
creditRatings.add(CreditRating.of("A", "S&P", "Prime", true));
creditRatings.add(CreditRating.of("A", "Moody's", "Prime", true));
final LegalEntityCreditRatings filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatingDescriptions(Collections.singleton("Fitch"));
filter.getFilteredData(new LegalEntity(null, SHORT_NAME, creditRatings, null, null));
}
/**
* Tests ratings requests.
*/
@Test
public void testCreditRatings() {
LegalEntityCreditRatings filter = new LegalEntityCreditRatings();
assertEquals(CREDIT_RATINGS, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(CREDIT_RATINGS, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
final Set<CreditRating> creditRatings = new HashSet<>(CREDIT_RATINGS);
creditRatings.add(CreditRating.of("C", "Poor", "Test", false));
assertEquals(ParameterizedTypeImpl.of(Set.class, CreditRating.class), filter.getFilteredDataType());
filter = new LegalEntityCreditRatings();
filter.setUseRating(true);
Set<Pair<String, String>> expected = new HashSet<>();
expected.add(Pairs.of("Moody's", "B"));
expected.add(Pairs.of("S&P", "A"));
expected.add(Pairs.of("Test", "C"));
assertEquals(expected, filter.getFilteredData(new LegalEntity(null, SHORT_NAME, creditRatings, null, null)));
assertEquals(expected, filter.getFilteredData(new LegalEntityWithREDCode(null, SHORT_NAME, creditRatings, null, null, "")));
expected = new HashSet<>();
expected.add(Pairs.of("Moody's", "B"));
expected.add(Pairs.of("S&P", "A"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, ParameterizedTypeImpl.of(Pair.class, String.class, String.class)), filter.getFilteredDataType());
filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatings(Collections.singleton("Moody's"));
expected = new HashSet<>();
expected.add(Pairs.of("Moody's", "B"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, ParameterizedTypeImpl.of(Pair.class, String.class, String.class)), filter.getFilteredDataType());
filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatings(Collections.singleton("S&P"));
expected = new HashSet<>();
expected.add(Pairs.of("S&P", "A"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, ParameterizedTypeImpl.of(Pair.class, String.class, String.class)), filter.getFilteredDataType());
filter = new LegalEntityCreditRatings();
filter.setUseRatingDescription(true);
expected = new HashSet<>();
expected.add(Pairs.of("Moody's", "Investment Grade"));
expected.add(Pairs.of("S&P", "Prime"));
expected.add(Pairs.of("Test", "Poor"));
assertEquals(expected, filter.getFilteredData(new LegalEntity(null, SHORT_NAME, creditRatings, null, null)));
assertEquals(expected, filter.getFilteredData(new LegalEntityWithREDCode(null, SHORT_NAME, creditRatings, null, null, "")));
expected = new HashSet<>();
expected.add(Pairs.of("Moody's", "Investment Grade"));
expected.add(Pairs.of("S&P", "Prime"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, ParameterizedTypeImpl.of(Pair.class, String.class, String.class)), filter.getFilteredDataType());
filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatingDescriptions(Collections.singleton("Moody's"));
expected = new HashSet<>();
expected.add(Pairs.of("Moody's", "Investment Grade"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
filter = new LegalEntityCreditRatings();
filter.setPerAgencyRatingDescriptions(Collections.singleton("S&P"));
expected = new HashSet<>();
expected.add(Pairs.of("S&P", "Prime"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, ParameterizedTypeImpl.of(Pair.class, String.class, String.class)), filter.getFilteredDataType());
}
/**
* Tests requests for RED codes.
*/
@Test
public void testREDCode() {
LegalEntityREDCode filter = new LegalEntityREDCode();
assertEquals(RED_CODE, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(String.class, filter.getFilteredDataType());
}
/**
* Tests failure for a region-specific request when the region is null in the legal entity.
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testNullRegionInEntity() {
final LegalEntityRegion filter = new LegalEntityRegion();
filter.getFilteredData(new LegalEntity(null, SHORT_NAME, null, null, null));
}
/**
* Tests region requests.
*/
@Test
public void testRegion() {
LegalEntityRegion filter = new LegalEntityRegion();
assertEquals(REGION, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(REGION, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(Region.class, filter.getFilteredDataType());
filter = new LegalEntityRegion();
filter.setUseName(true);
assertEquals(Collections.singleton(REGION.getName()), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(Collections.singleton(REGION.getName()), filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, String.class), filter.getFilteredDataType());
filter = new LegalEntityRegion();
filter.setUseCountry(true);
assertEquals(Sets.newHashSet(Country.US, Country.CA), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(Sets.newHashSet(Country.US, Country.CA), filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, Country.class), filter.getFilteredDataType());
filter = new LegalEntityRegion();
filter.setCountries(Collections.singleton(Country.US));
assertEquals(Sets.newHashSet(Country.US), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(Sets.newHashSet(Country.US), filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, Country.class), filter.getFilteredDataType());
filter = new LegalEntityRegion();
filter.setUseCurrency(true);
assertEquals(Sets.newHashSet(Currency.CAD, Currency.USD), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(Sets.newHashSet(Currency.CAD, Currency.USD), filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, Currency.class), filter.getFilteredDataType());
filter = new LegalEntityRegion();
filter.setCurrencies(Collections.singleton(Currency.USD));
assertEquals(Sets.newHashSet(Currency.USD), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(Sets.newHashSet(Currency.USD), filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, Currency.class), filter.getFilteredDataType());
//TODO test builder chaining and currency / country pairs
}
/**
* Tests failure for empty sector classifications.
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testEmptySectorClassifications() {
final FlexiBean classifications = new FlexiBean();
classifications.put(GICSCode.NAME, GICSCode.of("1020"));
final Sector sector = Sector.of("INDUSTRIALS", classifications);
final LegalEntitySector filter = new LegalEntitySector();
filter.setClassifications(Collections.singleton(ICBCode.NAME));
filter.getFilteredData(new LegalEntity(TICKER, SHORT_NAME, CREDIT_RATINGS, sector, REGION));
}
/**
* Tests failure for a classification type that does not exist in legal entity.
*/
@Test(expectedExceptions = IllegalStateException.class)
public void testSectorNoMatchingClassification() {
final Sector sector = Sector.of("INDUSTRIALS");
final LegalEntitySector filter = new LegalEntitySector();
filter.setClassifications(Collections.singleton(GICSCode.NAME));
filter.getFilteredData(new LegalEntity(TICKER, SHORT_NAME, CREDIT_RATINGS, sector, REGION));
}
/**
* Tests sector requests.
*/
@Test
public void testSector() {
LegalEntitySector filter = new LegalEntitySector();
assertEquals(SECTOR, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(SECTOR, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(Sector.class, filter.getFilteredDataType());
filter = new LegalEntitySector();
filter.setUseSectorName(true);
assertEquals(Collections.singleton(SECTOR.getName()), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(ParameterizedTypeImpl.of(Set.class, String.class), filter.getFilteredDataType());
filter = new LegalEntitySector();
filter.setClassifications(Collections.singleton(GICSCode.NAME));
filter.setClassificationValueTypes(Collections.singleton(GICSCode.class));
assertEquals(Collections.singleton(GICSCode.of(10203040)), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(ParameterizedTypeImpl.of(Set.class, GICSCode.class), filter.getFilteredDataType());
filter = new LegalEntitySector();
filter.setClassifications(Collections.singleton(ICBCode.NAME));
filter.setClassificationValueTypes(Collections.singleton(ICBCode.class));
assertEquals(Collections.singleton(ICBCode.of("1020")), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(ParameterizedTypeImpl.of(Set.class, ICBCode.class), filter.getFilteredDataType());
filter = new LegalEntitySector();
filter.setClassifications(ImmutableSet.of(GICSCode.NAME, ICBCode.NAME));
filter.setClassificationValueTypes(ImmutableSet.of(GICSCode.class, ICBCode.class));
assertEquals(ImmutableSet.of(GICSCode.of(10203040), ICBCode.of("1020")), filter.getFilteredData(LEGAL_ENTITY));
assertEquals(ParameterizedTypeImpl.of(Set.class, VariantType.either(GICSCode.class, ICBCode.class)), filter.getFilteredDataType());
filter = new LegalEntitySector();
filter.setUseClassificationName(true);
assertTrue(filter.getFilteredData(LEGAL_ENTITY) instanceof Set);
assertTrue(((Set<?>) filter.getFilteredData(LEGAL_ENTITY)).isEmpty());
assertTrue(filter.getFilteredData(LEGAL_ENTITY_RED_CODE) instanceof Set);
assertTrue(((Set<?>) filter.getFilteredData(LEGAL_ENTITY_RED_CODE)).isEmpty());
assertEquals(ParameterizedTypeImpl.of(Set.class, Object.class), filter.getFilteredDataType());
}
/**
* Tests short name requests.
*/
@Test
public void testShortName() {
assertEquals(SHORT_NAME, new LegalEntityShortName().getFilteredData(LEGAL_ENTITY));
assertEquals(SHORT_NAME, new LegalEntityShortName().getFilteredData(LEGAL_ENTITY_RED_CODE));
}
/**
* Tests ticker requests.
*/
@Test
public void testTicker() {
assertEquals(TICKER, new LegalEntityTicker().getFilteredData(LEGAL_ENTITY));
assertEquals(TICKER, new LegalEntityTicker().getFilteredData(LEGAL_ENTITY_RED_CODE));
}
/**
* Tests combining rating and sector.
*/
@Test
public void testRatingAndSector() {
final LegalEntityCombiningFilter filter = new LegalEntityCombiningFilter();
final Set<LegalEntityFilter<LegalEntity>> underlyingFilters = new HashSet<>();
final LegalEntityCreditRatings ratingsFilter = new LegalEntityCreditRatings();
ratingsFilter.setPerAgencyRatings(Collections.singleton("S&P"));
underlyingFilters.add(ratingsFilter);
final LegalEntitySector sectorFilter = new LegalEntitySector();
sectorFilter.setUseSectorName(true);
underlyingFilters.add(sectorFilter);
underlyingFilters.add(new LegalEntityCombiningFilter());
filter.setFiltersToUse(underlyingFilters);
final Set<Object> expected = new HashSet<>();
expected.add(SECTOR.getName());
expected.add(Pairs.of("S&P", "A"));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY));
assertEquals(expected, filter.getFilteredData(LEGAL_ENTITY_RED_CODE));
assertEquals(ParameterizedTypeImpl.of(Set.class, VariantType.either(String.class, ParameterizedTypeImpl.of(Pair.class, String.class, String.class))), filter.getFilteredDataType());
}
}