/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.target;
import static org.testng.Assert.assertEquals;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.target.resolver.AbstractIdentifierResolver;
import com.opengamma.engine.target.resolver.PrimitiveResolver;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdentifiable;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.test.TestGroup;
/**
* Tests the {@link DefaultComputationTargetSpecificationResolver} class.
*/
@Test(groups = TestGroup.UNIT)
public class DefaultComputationTargetSpecificationResolverTest {
private static class Foo implements UniqueIdentifiable {
@Override
public UniqueId getUniqueId() {
throw new IllegalStateException();
}
}
private static class Bar implements UniqueIdentifiable {
@Override
public UniqueId getUniqueId() {
throw new IllegalStateException();
}
}
private final VersionCorrection VC = VersionCorrection.of(Instant.now(), Instant.now());
private final DefaultComputationTargetSpecificationResolver RESOLVER = new DefaultComputationTargetSpecificationResolver();
private final ComputationTargetSpecification SPECIFICATION_NULL = ComputationTargetSpecification.NULL;
private final ComputationTargetSpecification SPECIFICATION_PRIMITIVE_VERSIONED = ComputationTargetSpecification.of(UniqueId.of("ExternalId-Test", "X", "V"));
private final ComputationTargetSpecification SPECIFICATION_PRIMITIVE_LATEST = ComputationTargetSpecification.of(UniqueId.of("ExternalId-Test", "X"));
private final ComputationTargetSpecification SPECIFICATION_FOO_VERSIONED = new ComputationTargetSpecification(ComputationTargetType.of(Foo.class), UniqueId.of("Foo", "Bar", "V"));
private final ComputationTargetSpecification SPECIFICATION_FOO_LATEST = new ComputationTargetSpecification(ComputationTargetType.of(Foo.class), UniqueId.of("Foo", "Bar"));
private final ComputationTargetSpecification SPECIFICATION_BAR_LATEST = new ComputationTargetSpecification(ComputationTargetType.of(Bar.class), UniqueId.of("Bar", "Foo"));
private final ComputationTargetSpecification SPECIFICATION_FOO_BAD = new ComputationTargetSpecification(ComputationTargetType.of(Foo.class), UniqueId.of("Foo", "Cow"));
private final ComputationTargetSpecification SPECIFICATION_FOO_OR_BAR = new ComputationTargetSpecification(ComputationTargetType.of(Foo.class).or(ComputationTargetType.of(Bar.class)), UniqueId.of(
"Foo", "Bar"));
private final ComputationTargetSpecification SPECIFICATION_FOO_OR_BAR_BAD = new ComputationTargetSpecification(ComputationTargetType.of(Foo.class).or(ComputationTargetType.of(Bar.class)),
UniqueId.of("Foo", "Cow"));
private final ComputationTargetSpecification SPECIFICATION_FOO_OR_BAR_VERSIONED = new ComputationTargetSpecification(ComputationTargetType.of(Foo.class).or(ComputationTargetType.of(Bar.class)),
UniqueId.of("Foo", "Bar", "V"));
private final ComputationTargetRequirement REQUIREMENT_PRIMITIVE = new ComputationTargetRequirement(ComputationTargetType.PRIMITIVE, ExternalIdBundle.of(ExternalId.of("Test", "X")));
private final ComputationTargetRequirement REQUIREMENT_FOO_VALID = new ComputationTargetRequirement(ComputationTargetType.of(Foo.class), ExternalIdBundle.of(ExternalId.of("Test", "B")));
private final ComputationTargetRequirement REQUIREMENT_FOO_INVALID = new ComputationTargetRequirement(ComputationTargetType.of(Foo.class), ExternalIdBundle.of(ExternalId.of("Test", "C")));
private final ComputationTargetRequirement REQUIREMENT_FOO_OR_BAR = new ComputationTargetRequirement(ComputationTargetType.of(Foo.class).or(ComputationTargetType.of(Bar.class)), ExternalId.of(
"Test", "B"));
private final ComputationTargetRequirement REQUIREMENT_FOO_OR_BAR_BAD = new ComputationTargetRequirement(ComputationTargetType.of(Foo.class).or(ComputationTargetType.of(Bar.class)), ExternalId.of(
"Test", "C"));
public DefaultComputationTargetSpecificationResolverTest() {
RESOLVER.addResolver(ComputationTargetType.of(Foo.class), new AbstractIdentifierResolver() {
@Override
public UniqueId resolveExternalId(final ExternalIdBundle identifiers, final VersionCorrection versionCorrection) {
assertEquals(versionCorrection, VC);
if (identifiers.contains(ExternalId.of("Test", "B"))) {
return SPECIFICATION_FOO_VERSIONED.getUniqueId();
} else {
return null;
}
}
@Override
public UniqueId resolveObjectId(final ObjectId identifier, final VersionCorrection versionCorrection) {
assertEquals(versionCorrection, VC);
if (identifier.getValue().equals("Bar")) {
return SPECIFICATION_FOO_VERSIONED.getUniqueId();
} else {
return null;
}
}
});
RESOLVER.addResolver(ComputationTargetType.PRIMITIVE, new PrimitiveResolver());
}
public void testSpecification_null() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_NULL, VC), SPECIFICATION_NULL);
}
public void testSpecification_versioned() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_PRIMITIVE_VERSIONED, VC), SPECIFICATION_PRIMITIVE_VERSIONED);
}
public void testSpecification_latestNoResolver() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_BAR_LATEST, VC), SPECIFICATION_BAR_LATEST);
}
public void testSpecification_latestResolved() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_FOO_LATEST, VC), SPECIFICATION_FOO_VERSIONED);
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_PRIMITIVE_LATEST, VC), SPECIFICATION_PRIMITIVE_LATEST);
}
public void testSpecification_latestUnresolved() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_FOO_BAD, VC), null);
}
public void testSpecification_unionType() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_FOO_OR_BAR, VC), SPECIFICATION_FOO_VERSIONED);
}
public void testSpecification_unionTypeUnresolved() {
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_FOO_OR_BAR_BAD, VC), null);
}
public void testSpecification_unionTypeVersioned() {
//assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_FOO_OR_BAR_VERSIONED, VC), SPECIFICATION_FOO_VERSIONED);
assertEquals(RESOLVER.getTargetSpecification(SPECIFICATION_FOO_OR_BAR_VERSIONED, VC), SPECIFICATION_FOO_OR_BAR_VERSIONED);
}
public void testRequirement_noResolver() {
assertEquals(RESOLVER.getTargetSpecification(REQUIREMENT_PRIMITIVE, VC), SPECIFICATION_PRIMITIVE_LATEST);
}
public void testRequirement_resolved() {
assertEquals(RESOLVER.getTargetSpecification(REQUIREMENT_FOO_VALID, VC), SPECIFICATION_FOO_VERSIONED);
}
public void testRequirement_unresolved() {
assertEquals(RESOLVER.getTargetSpecification(REQUIREMENT_FOO_INVALID, VC), null);
}
public void testRequirement_unionType() {
assertEquals(RESOLVER.getTargetSpecification(REQUIREMENT_FOO_OR_BAR, VC), SPECIFICATION_FOO_VERSIONED);
}
public void testRequirement_unionTypeUnresolved() {
assertEquals(RESOLVER.getTargetSpecification(REQUIREMENT_FOO_OR_BAR_BAD, VC), null);
}
public void testAll() {
final Set<ComputationTargetReference> request = new HashSet<ComputationTargetReference>();
request.add(SPECIFICATION_NULL);
request.add(SPECIFICATION_PRIMITIVE_VERSIONED);
request.add(SPECIFICATION_PRIMITIVE_LATEST);
request.add(SPECIFICATION_FOO_LATEST);
request.add(SPECIFICATION_BAR_LATEST);
request.add(SPECIFICATION_FOO_BAD);
request.add(SPECIFICATION_FOO_OR_BAR);
request.add(SPECIFICATION_FOO_OR_BAR_BAD);
request.add(SPECIFICATION_FOO_OR_BAR_VERSIONED);
request.add(REQUIREMENT_PRIMITIVE);
request.add(REQUIREMENT_FOO_VALID);
request.add(REQUIREMENT_FOO_INVALID);
request.add(REQUIREMENT_FOO_OR_BAR);
request.add(REQUIREMENT_FOO_OR_BAR_BAD);
final Map<ComputationTargetReference, ComputationTargetSpecification> result = RESOLVER.getTargetSpecifications(request, VC);
assertEquals(result.get(SPECIFICATION_NULL), SPECIFICATION_NULL);
assertEquals(result.get(SPECIFICATION_PRIMITIVE_VERSIONED), SPECIFICATION_PRIMITIVE_VERSIONED);
assertEquals(result.get(SPECIFICATION_PRIMITIVE_LATEST), SPECIFICATION_PRIMITIVE_LATEST);
assertEquals(result.get(SPECIFICATION_FOO_LATEST), SPECIFICATION_FOO_VERSIONED);
assertEquals(result.get(SPECIFICATION_BAR_LATEST), SPECIFICATION_BAR_LATEST);
assertEquals(result.get(SPECIFICATION_FOO_BAD), null);
assertEquals(result.get(SPECIFICATION_FOO_OR_BAR), SPECIFICATION_FOO_VERSIONED);
assertEquals(result.get(SPECIFICATION_FOO_OR_BAR_BAD), null);
//assertEquals(result.get(SPECIFICATION_FOO_OR_BAR_VERSIONED), SPECIFICATION_FOO_VERSIONED);
assertEquals(result.get(SPECIFICATION_FOO_OR_BAR_VERSIONED), SPECIFICATION_FOO_OR_BAR_VERSIONED);
assertEquals(result.get(REQUIREMENT_PRIMITIVE), SPECIFICATION_PRIMITIVE_LATEST);
assertEquals(result.get(REQUIREMENT_FOO_VALID), SPECIFICATION_FOO_VERSIONED);
assertEquals(result.get(REQUIREMENT_FOO_INVALID), null);
assertEquals(result.get(REQUIREMENT_FOO_OR_BAR), SPECIFICATION_FOO_VERSIONED);
assertEquals(result.get(REQUIREMENT_FOO_OR_BAR_BAD), null);
}
}