/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.function;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Collections;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.opengamma.sesame.OutputName;
import com.opengamma.util.test.TestGroup;
@Test(groups = TestGroup.UNIT)
public class AvailableOutputsImplTest {
private static final String O1 = "O1";
private static final OutputName O1_NAME = OutputName.of(O1);
private static final String O2 = "O2";
private static final OutputName O2_NAME = OutputName.of(O2);
private static final String O3 = "O3";
private static final OutputName O3_NAME = OutputName.of(O3);
private static final String O4 = "O4";
private static final OutputName O4_NAME = OutputName.of(O4);
private static final ImmutableSet<Class<?>> s_inputTypes =
ImmutableSet.<Class<?>>of(Target1.class, Target2.class, Target3.class);
@Test
public void getAvailableOutputs() {
AvailableOutputs outputs = new AvailableOutputsImpl(s_inputTypes);
outputs.register(F1.class, F2.class);
assertEquals(ImmutableSortedSet.of(O1_NAME, O2_NAME), outputs.getAvailableOutputs(Target3.class));
assertEquals(ImmutableSortedSet.of(O1_NAME, O2_NAME), outputs.getAvailableOutputs(Target2.class));
assertEquals(ImmutableSortedSet.of(O1_NAME), outputs.getAvailableOutputs(Target1.class));
assertEquals(Collections.<String>emptySet(), outputs.getAvailableOutputs(Object.class));
}
@Test
public void getFunctionType() {
AvailableOutputs outputs = new AvailableOutputsImpl(s_inputTypes);
outputs.register(F1.class, F2.class, F3.class, F4.class);
assertEquals(F1.class, outputs.getOutputFunction(O1_NAME, Target1.class).getDeclaringType());
assertEquals(F1.class, outputs.getOutputFunction(O1_NAME, Target2.class).getDeclaringType());
assertEquals(F1.class, outputs.getOutputFunction(O1_NAME, Target3.class).getDeclaringType());
assertEquals(F2.class, outputs.getOutputFunction(O2_NAME, Target2.class).getDeclaringType());
assertEquals(F2.class, outputs.getOutputFunction(O2_NAME, Target3.class).getDeclaringType());
assertEquals(F3.class, outputs.getOutputFunction(O3_NAME).getDeclaringType());
assertEquals(F4.class, outputs.getOutputFunction(O4_NAME).getDeclaringType());
}
class Target1 { }
class Target2 extends Target1 { }
class Target3 extends Target2 { }
interface F1 {
@Output(O1)
Object execute(Target1 target);
}
interface F2 {
@Output(O2)
Object execute(Target2 target);
}
interface F3 {
@Output(O3)
Object execute();
}
interface F4 {
@Output(O4)
Object execute(String notTheTarget);
}
}