// given a "biarrow" AxB --> C, check we can transpose it via the getExponentialDiagram
 @Test
 public void testExponential() {
   MultiArrow<DOT, ARROW> biArrow = fixtures.arrowFooBarToBaz();
   List<ARROW> projections = biArrow.getProductDiagram().getProjections();
   assertTrue(projections.size() == 2);
   DOT a = projections.get(0).getTarget();
   DOT b = projections.get(1).getTarget();
   DOT c = biArrow.getArrow().getTarget();
   ExponentialDiagram<DOT, ARROW> exponential = _topos.getExponentialDiagram(c, b);
   // Check evaluation maps C^B x B -> C
   MultiArrow<DOT, ARROW> ev = exponential.getEvaluation();
   List<ARROW> expProjections = ev.getProductDiagram().getProjections();
   assertTrue(expProjections.size() == 2);
   assertTrue(expProjections.get(1).getTarget() == b);
   assertTrue(ev.getArrow().getTarget() == c);
   // and the universal property of evaluation
   ARROW transpose = exponential.getTranspose(biArrow); // check this maps A -> B^C
   assertTrue(transpose.getSource() == a);
   assertTrue(
       transpose.getTarget() == expProjections.get(0).getTarget()); // the exponent object itself
   // Next, construct the arrow: transpose x 1 : A x B -> C^B x B as the productGetDiagram of A x B
   // -> A -> C^B and A x B -> B -> B
   ARROW x1 = transpose.compose(projections.get(0));
   ARROW x2 = projections.get(1);
   List<ARROW> multiplicands = new ArrayList<ARROW>();
   multiplicands.add(x1);
   multiplicands.add(x2);
   ARROW t_x_1 =
       ev.getProductDiagram()
           .multiplyArrows(biArrow.getProductDiagram().getProduct(), multiplicands);
   assertTrue(biArrow.getArrow().equals(ev.getArrow().compose(t_x_1)));
 }
  @Test
  public void testCanonicalExponentialIso() {
    DOT dot1 = fixtures.dotFoo();
    DOT dot2 = fixtures.dotBar();

    ExponentialDiagram<DOT, ARROW> expA = _topos.getExponentialDiagram(dot1, dot2);
    ExponentialDiagram<DOT, ARROW> expB = _topos.getExponentialDiagram(dot1, dot2);

    ARROW isoAB = _topos.canonicalIso(expA, expB);
    ARROW isoBA = _topos.canonicalIso(expB, expA);

    DOT dotA = exponentialDot(expA);
    DOT dotB = exponentialDot(expB);

    assertSame(isoAB.getSource(), dotA);
    assertSame(isoAB.getTarget(), dotB);
    assertSame(isoBA.getSource(), dotB);
    assertSame(isoBA.getTarget(), dotA);

    assertEquals(dotA.getIdentity(), isoBA.compose(isoAB));
    assertEquals(dotB.getIdentity(), isoAB.compose(isoBA));
  }