/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.collect.id;
import static com.opengamma.collect.TestHelper.assertSerialization;
import static com.opengamma.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.collect.TestHelper.coverBeanEquals;
import static com.opengamma.collect.TestHelper.coverImmutableBean;
import static com.opengamma.collect.id.MockIdentifiable.LINK_RESOLVABLE_MOCK2;
import static com.opengamma.collect.id.MockIdentifiable.LINK_RESOLVED_MOCK2;
import static com.opengamma.collect.id.MockIdentifiable.MOCK1;
import static com.opengamma.collect.id.MockIdentifiable.MOCK2;
import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.Assert.fail;
import org.joda.beans.BeanBuilder;
import org.testng.annotations.Test;
import com.google.common.reflect.TypeToken;
/**
* Simple tests for a link.
*/
@Test
public class StandardLinkTest {
private static final StandardId STANDARD_ID = StandardId.of("LinkTest", "1");
public void test_resolvable() {
StandardLink<MockIdentifiable> test = StandardLink.resolvable(STANDARD_ID, MockIdentifiable.class);
assertThat(test.isResolved()).isFalse();
assertThat(test.getStandardId()).isEqualTo(STANDARD_ID);
assertThat(test.getTargetType()).isEqualTo(MockIdentifiable.class);
assertThat(test.getTargetTypeToken()).isEqualTo(TypeToken.of(MockIdentifiable.class));
}
public void test_resolvable_null() {
assertThrowsIllegalArg(() -> StandardLink.resolvable(null, MockIdentifiable.class));
assertThrowsIllegalArg(() -> StandardLink.resolvable(STANDARD_ID, (Class<? extends IdentifiableBean>) null));
}
public void test_resolved() {
StandardLink<MockIdentifiable> test = StandardLink.resolved(MOCK1);
assertThat(test.isResolved()).isTrue();
assertThat(test.getStandardId()).isEqualTo(MOCK1.getStandardId());
assertThat(test.getTargetType()).isEqualTo(MOCK1.getClass());
assertThat(test.getTargetTypeToken()).isEqualTo(TypeToken.of(MOCK1.getClass()));
}
public void test_resolved_null() {
assertThrowsIllegalArg(() -> StandardLink.resolved(null));
}
//-------------------------------------------------------------------------
public void test_builder_invalid_onlyId() {
BeanBuilder<StandardLink<MockIdentifiable>> builder = StandardLink.meta().builder()
.set(StandardLink.meta().standardId(), STANDARD_ID);
assertThrowsIllegalArg(() -> builder.build());
}
public void test_builder_invalid_onlyType() {
BeanBuilder<StandardLink<MockIdentifiable>> builder = StandardLink.meta().builder()
.set(StandardLink.meta().targetType(), MockIdentifiable.class);
assertThrowsIllegalArg(() -> builder.build());
}
public void test_builder_invalid_targetDoesNotMatchId() {
BeanBuilder<StandardLink<MockIdentifiable>> builder = StandardLink.meta().builder()
.set(StandardLink.meta().standardId(), STANDARD_ID)
.set(StandardLink.meta().target(), MOCK1);
assertThrowsIllegalArg(() -> builder.build());
}
public void test_builder_invalid_targetDoesNotMatchType() {
BeanBuilder<StandardLink<MockIdentifiable>> builder = StandardLink.meta().builder()
.set(StandardLink.meta().targetType(), MockIdentifiable.class)
.set(StandardLink.meta().target(), MockIdentifiable2.builder().standardId(STANDARD_ID).build());
assertThrowsIllegalArg(() -> builder.build());
}
public void test_builder_valid_targetMatchesIdentifier() {
StandardLink<MockIdentifiable> test = StandardLink.metaStandardLink(MockIdentifiable.class).builder()
.set(StandardLink.meta().standardId(), MOCK1.getStandardId())
.set(StandardLink.meta().target(), MOCK1)
.build();
assertThat(test.isResolved()).isTrue();
}
public void test_builder_valid_targetMatchesType() {
StandardLink<MockIdentifiable> test = StandardLink.metaStandardLink(MockIdentifiable.class).builder()
.set(StandardLink.meta().targetType(), IdentifiableBean.class)
.set(StandardLink.meta().target(), MOCK1)
.build();
assertThat(test.isResolved()).isTrue();
}
public void test_builder_valid_targetMatchesIdAndType() {
StandardLink<MockIdentifiable> test = StandardLink.metaStandardLink(MockIdentifiable.class).builder()
.set(StandardLink.meta().standardId(), MOCK1.getStandardId())
.set(StandardLink.meta().targetType(), IdentifiableBean.class)
.set(StandardLink.meta().target(), MOCK1)
.build();
assertThat(test.isResolved()).isTrue();
}
//-------------------------------------------------------------------------
public void test_resolvable_resolve() {
StandardLink<MockIdentifiable> link = StandardLink.resolvable(STANDARD_ID, MockIdentifiable.class);
LinkResolver resolver = new LinkResolver() {
@SuppressWarnings("unchecked")
@Override
public <T extends IdentifiableBean> T resolve(StandardId id, TypeToken<T> targetType) {
assertThat(id).isEqualTo(STANDARD_ID);
assertThat(targetType).isEqualTo(TypeToken.of(MockIdentifiable.class));
return (T) MOCK1;
}
};
assertThat(link.resolve(resolver)).isEqualTo(MOCK1);
}
//-------------------------------------------------------------------------
public void test_resolved_resolve() {
// LinkResolver is not used, use null to check that is allowed
StandardLink<MockIdentifiable> link = StandardLink.resolved(MOCK1);
assertThat(link.resolve(null)).isSameAs(MOCK1);
}
//-------------------------------------------------------------------------
public void test_resolveLinks_resolveNeeded() {
StandardLink<MockIdentifiable> link = LINK_RESOLVABLE_MOCK2;
LinkResolver resolver = new LinkResolver() {
@SuppressWarnings("unchecked")
@Override
public <T extends IdentifiableBean> T resolve(StandardId id, TypeToken<T> targetType) {
assertThat(id).isEqualTo(LINK_RESOLVABLE_MOCK2.getStandardId());
assertThat(targetType).isEqualTo(TypeToken.of(MockIdentifiable.class));
return (T) MOCK2;
}
};
assertThat(link.resolveLinks(resolver)).isEqualTo(LINK_RESOLVED_MOCK2);
}
public void test_resolveLinks_noResolveNeeded() {
StandardLink<MockIdentifiable> link = LINK_RESOLVED_MOCK2;
LinkResolver resolver = new LinkResolver() {
@SuppressWarnings("unchecked")
@Override
public <T extends IdentifiableBean> T resolve(StandardId id, TypeToken<T> targetType) {
fail(); // resolver must not be called as already resolved
return (T) MOCK2;
}
};
assertThat(link.resolveLinks(resolver)).isSameAs(link);
}
public void test_resolveLinks_notResolvable() {
StandardLink<MockIdentifiable2> link = StandardLink.resolved(MockIdentifiable2.MOCK21);
LinkResolver resolver = new LinkResolver() {
@SuppressWarnings("unchecked")
@Override
public <T extends IdentifiableBean> T resolve(StandardId id, TypeToken<T> targetType) {
fail(); // resolver must not be called as not resolvable
return (T) MOCK2;
}
};
assertThat(link.resolveLinks(resolver)).isSameAs(link);
}
//-------------------------------------------------------------------------
public void coverage() {
StandardLink<MockIdentifiable2> test = StandardLink.resolvable(STANDARD_ID, MockIdentifiable2.class);
coverImmutableBean(test);
StandardLink<MockIdentifiable> test2 = StandardLink.resolved(MOCK1);
coverBeanEquals(test, test2);
StandardLink<MockIdentifiable> test3 = StandardLink.resolved(MOCK2);
coverBeanEquals(test2, test3);
StandardLink<MockIdentifiable> test4 = StandardLink.metaStandardLink(MockIdentifiable.class).builder()
.setString(StandardLink.meta().standardId(), STANDARD_ID.toString())
.setString(StandardLink.meta().targetType().name(), MockIdentifiable.class.getName())
.build();
coverBeanEquals(test, test4);
}
public void test_serializable() {
assertSerialization(StandardLink.resolvable(STANDARD_ID, MockIdentifiable.class));
assertSerialization(StandardLink.resolved(MOCK1));
}
}