@Test
  public void keyShouldBeComposedFromUserAndDepth() {
    Map<String, Set<String>> graph = Collections.singletonMap("a", Collections.singleton("b"));

    cache.putGraph("a", 2, graph);

    assertTrue(cache.getGraph("a", 5).isEmpty());
  }
  @Test
  public void putAndGet() {
    Map<String, Set<String>> graph = Collections.singletonMap("a", Collections.singleton("b"));

    cache.putGraph("a", 1, graph);
    Map<String, Set<String>> actual = cache.getGraph("a", 1);

    assertEquals(graph, actual);
  }
  @Test
  public void ifCapacityOrderIsExceeded_thenShouldOverrideLatestEntries() {
    GraphsCache cache = new GraphsCache(2);
    Map<String, Set<String>> graph1 = Collections.singletonMap("a", Collections.singleton("b"));
    Map<String, Set<String>> graph2 = Collections.singletonMap("b", Collections.singleton("c"));
    Map<String, Set<String>> graph3 = Collections.singletonMap("c", Collections.singleton("d"));
    cache.putGraph("x", 1, graph1);
    cache.putGraph("z", 2, graph2);
    cache.putGraph("y", 3, graph3);

    List<Object[]> recent = cache.getRecent();

    assertTuple(recent.get(0), "z", 2);
    assertTuple(recent.get(1), "y", 3);
  }
  @Test
  public void cacheShouldRememberInsertionOrder() {
    Map<String, Set<String>> graph1 = Collections.singletonMap("a", Collections.singleton("b"));
    Map<String, Set<String>> graph2 = Collections.singletonMap("b", Collections.singleton("c"));
    Map<String, Set<String>> graph3 = Collections.singletonMap("c", Collections.singleton("d"));
    cache.putGraph("x", 1, graph1);
    cache.putGraph("z", 2, graph2);
    cache.putGraph("y", 3, graph3);

    List<Object[]> recent = cache.getRecent();

    assertTuple(recent.get(0), "x", 1);
    assertTuple(recent.get(1), "z", 2);
    assertTuple(recent.get(2), "y", 3);
  }
  @Test
  public void topologyShouldReturnEvenDisconnectedGraphs() {
    Map<String, Set<String>> graph1 = new HashMap<>();
    graph1.put("a", Collections.singleton("b"));
    graph1.put("b", Collections.singleton("a"));
    Map<String, Set<String>> graph2 = new HashMap<>();
    graph2.put("c", Collections.singleton("d"));
    graph2.put("d", Collections.singleton("c"));

    cache.putGraph("x", 1, graph1);
    cache.putGraph("z", 2, graph2);
    Map<String, Set<String>> topology = cache.getTopology();

    Map<String, Set<String>> expected = new HashMap<>();
    expected.put("a", Collections.singleton("b"));
    expected.put("b", Collections.singleton("a"));
    expected.put("c", Collections.singleton("d"));
    expected.put("d", Collections.singleton("c"));
    assertEquals(expected, topology);
  }
  @Test
  public void wholeTopology_shouldReturnAllGraphsTogetherAsOne() {
    Map<String, Set<String>> graph1 = new HashMap<>();
    graph1.put("a", Collections.singleton("b"));
    graph1.put("c", Collections.singleton("b"));
    graph1.put("b", neigh("a", "c"));
    Map<String, Set<String>> graph2 = new HashMap<>();
    graph2.put("d", Collections.singleton("b"));
    graph2.put("e", Collections.singleton("b"));
    graph2.put("b", neigh("d", "e"));

    cache.putGraph("x", 1, graph1);
    cache.putGraph("z", 2, graph2);
    Map<String, Set<String>> topology = cache.getTopology();

    Map<String, Set<String>> expected = new HashMap<>();
    expected.put("a", Collections.singleton("b"));
    expected.put("c", Collections.singleton("b"));
    expected.put("d", Collections.singleton("b"));
    expected.put("e", Collections.singleton("b"));
    expected.put("b", neigh("a", "c", "d", "e"));
    assertEquals(expected, topology);
  }