@Test
 public void testNoReferences() throws DecisionTreeParserException {
   final ReferenceResolver resolver = mock(ReferenceResolver.class);
   final References references = new References();
   references.resolveAll(resolver);
   verify(resolver, never()).resolveReference(anyString(), anyString());
 }
  @Test
  public void testSingleReference() throws DecisionTreeParserException {
    final ReferenceResolver resolver = mock(ReferenceResolver.class);
    when(resolver.resolveReference("b", "a")).thenReturn(true);
    final References references = new References();
    references.addMapping("b", "a");

    references.resolveAll(resolver);
    verify(resolver, atMost(1)).resolveReference("b", "a");
  }
  @Test
  public void testMissingReference() throws DecisionTreeParserException {
    final ReferenceResolver resolver = mock(ReferenceResolver.class);
    when(resolver.resolveReference("b", "a")).thenReturn(false);
    final References references = new References();
    references.addMapping("b", "a");

    try {
      references.resolveAll(resolver);
      fail("Should fail when the reference resolver cannot handle an input");
    } catch (DecisionTreeParserException e) {
      verify(resolver, atMost(1)).resolveReference("b", "a");
    }
  }
  @Test
  public void testNestedReference_backwards() throws DecisionTreeParserException {
    // Same as the test above, but add the mappings backwards to verify the order doesn't matter
    final ReferenceResolver resolver = mock(ReferenceResolver.class);

    when(resolver.resolveReference("b", "c")).thenReturn(false).thenReturn(true);
    when(resolver.resolveReference("c", "a")).thenReturn(true);
    final References references = new References();
    references.addMapping("c", "a");
    references.addMapping("b", "c");

    references.resolveAll(resolver);
    verify(resolver, atMost(1)).resolveReference("c", "a");
    verify(resolver, atMost(2)).resolveReference("b", "c");
  }