@Test
public void testWithRuleAnnotation() throws Exception {
RuleDefinition definition = Rules.define(ValidAndAnnotated.class);
assertThat(definition.getName(), is("AnnotatedRule"));
assertThat(definition.getDescription(), is("Description"));
assertThat(definition.getFireCondition().getTagTypes(), containsInAnyOrder("T1", "T2"));
TagInjection tagInjection = new TagInjection("T1", ValidAndAnnotated.class.getDeclaredField("t1AsTag"), TagValue.InjectionStrategy.BY_TAG);
TagInjection tagInjection1 = new TagInjection("T2", ValidAndAnnotated.class.getDeclaredField("t2TagValue"), TagValue.InjectionStrategy.BY_VALUE);
assertThat(definition.getTagInjections(), is(notNullValue()));
assertThat(definition.getTagInjections(), containsInAnyOrder(tagInjection, tagInjection1));
SessionVariableInjection s1 = new SessionVariableInjection("baseline", false, ValidAndAnnotated.class.getDeclaredField("baseline"));
SessionVariableInjection s2 = new SessionVariableInjection("baseline2", true, ValidAndAnnotated.class.getDeclaredField("baseline2"));
assertThat(definition.getSessionVariableInjections(), containsInAnyOrder(s1, s2));
assertThat(definition.getActionMethod(), is(new ActionMethod(ValidAndAnnotated.class.getDeclaredMethod("action"), "T2", Action.Quantity.SINGLE)));
ConditionMethod conditionMethod = new ConditionMethod("myCondition", "No way out", ValidAndAnnotated.class.getDeclaredMethod("condition"));
assertThat(definition.getConditionMethods(), containsInAnyOrder(conditionMethod));
}