/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.target.resolver;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertSame;
import org.mockito.Mockito;
import org.testng.annotations.Test;
import com.opengamma.engine.target.logger.ResolutionLogger;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdentifiable;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
/**
* Test the {@link ChainedResolver} class
*/
@Test(groups = TestGroup.UNIT)
public class ChainedResolverTest {
@SuppressWarnings("unchecked")
public void testFirst() {
final ObjectResolver first = Mockito.mock(ObjectResolver.class);
final ObjectResolver second = Mockito.mock(ObjectResolver.class);
final ObjectResolver chained = ChainedResolver.CREATE.apply(second, first);
Mockito.when(first.resolveObject(UniqueId.of("Foo", "1"), VersionCorrection.LATEST)).thenReturn(Currency.USD);
Mockito.when(second.resolveObject(UniqueId.of("Foo", "1"), VersionCorrection.LATEST)).thenReturn(Currency.GBP);
assertEquals(chained.resolveObject(UniqueId.of("Foo", "1"), VersionCorrection.LATEST), Currency.USD);
Mockito.verify(second, Mockito.only()).deepResolver();
}
@SuppressWarnings("unchecked")
public void testSecond() {
final ObjectResolver first = Mockito.mock(ObjectResolver.class);
final ObjectResolver second = Mockito.mock(ObjectResolver.class);
final ObjectResolver chained = ChainedResolver.CREATE.apply(second, first);
Mockito.when(first.resolveObject(UniqueId.of("Foo", "1"), VersionCorrection.LATEST)).thenReturn(null);
Mockito.when(second.resolveObject(UniqueId.of("Foo", "1"), VersionCorrection.LATEST)).thenReturn(Currency.GBP);
assertEquals(chained.resolveObject(UniqueId.of("Foo", "1"), VersionCorrection.LATEST), Currency.GBP);
}
@SuppressWarnings("unchecked")
public void testDeepResolver_first() {
final ObjectResolver first = Mockito.mock(ObjectResolver.class);
final DeepResolver deepFirst = Mockito.mock(DeepResolver.class);
final ObjectResolver second = Mockito.mock(ObjectResolver.class);
Mockito.when(first.deepResolver()).thenReturn(deepFirst);
Mockito.when(second.deepResolver()).thenReturn(null);
final ObjectResolver chained = ChainedResolver.CREATE.apply(second, first);
assertSame(chained.deepResolver(), deepFirst);
}
@SuppressWarnings("unchecked")
public void testDeepResolver_second() {
final ObjectResolver first = Mockito.mock(ObjectResolver.class);
final ObjectResolver second = Mockito.mock(ObjectResolver.class);
final DeepResolver deepSecond = Mockito.mock(DeepResolver.class);
Mockito.when(first.deepResolver()).thenReturn(null);
Mockito.when(second.deepResolver()).thenReturn(deepSecond);
final ObjectResolver chained = ChainedResolver.CREATE.apply(second, first);
assertSame(chained.deepResolver(), deepSecond);
}
@SuppressWarnings("unchecked")
public void testDeepResolver_none() {
final ObjectResolver first = Mockito.mock(ObjectResolver.class);
final ObjectResolver second = Mockito.mock(ObjectResolver.class);
Mockito.when(first.deepResolver()).thenReturn(null);
Mockito.when(second.deepResolver()).thenReturn(null);
final ObjectResolver chained = ChainedResolver.CREATE.apply(second, first);
assertNull(chained.deepResolver());
}
@SuppressWarnings("unchecked")
public void testDeepResolver_chained() {
final ObjectResolver first = Mockito.mock(ObjectResolver.class);
final DeepResolver deepFirst = Mockito.mock(DeepResolver.class);
final ObjectResolver second = Mockito.mock(ObjectResolver.class);
final DeepResolver deepSecond = Mockito.mock(DeepResolver.class);
Mockito.when(first.deepResolver()).thenReturn(deepFirst);
Mockito.when(second.deepResolver()).thenReturn(deepSecond);
final ObjectResolver chained = ChainedResolver.CREATE.apply(second, first);
final DeepResolver deep = chained.deepResolver();
final ResolutionLogger logger = Mockito.mock(ResolutionLogger.class);
assertNotNull(deep);
UniqueIdentifiable o1 = Mockito.mock(UniqueIdentifiable.class);
UniqueIdentifiable o2 = Mockito.mock(UniqueIdentifiable.class);
Mockito.when(deepFirst.withLogger(o1, logger)).thenReturn(o1);
Mockito.when(deepFirst.withLogger(o2, logger)).thenReturn(null);
Mockito.when(deepSecond.withLogger(o2, logger)).thenReturn(o2);
assertSame(deep.withLogger(o1, logger), o1);
assertSame(deep.withLogger(o2, logger), o2);
Mockito.verify(deepFirst).withLogger(o1, logger);
Mockito.verify(deepFirst).withLogger(o2, logger);
Mockito.verifyNoMoreInteractions(deepFirst);
Mockito.verify(deepSecond).withLogger(o2, logger);
Mockito.verifyNoMoreInteractions(deepSecond);
}
}