@Test
  public void testCanonicalProductIso() {
    DOT dot1 = fixtures.dotBar();
    DOT dot2 = fixtures.dotFoo();
    ProductDiagram<DOT, ARROW> productA = _topos.product(dot1, dot2);
    ProductDiagram<DOT, ARROW> productB = _topos.product(dot1, dot2);

    ARROW isoAB = _topos.canonicalIso(productA, productB);
    ARROW isoBA = _topos.canonicalIso(productB, productA);

    DOT dotA = productA.getProduct();
    DOT dotB = productB.getProduct();

    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));
  }
  @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));
  }