@Test
  public void can_list_all_classes_reachable_in_a_classloader() throws Exception {
    ClassLoader classLoader =
        ClassLoaders.inMemoryClassLoader()
            .withParent(jdkClassLoader())
            .withClassDefinition("a.A", SimpleClassGenerator.makeMarkerInterface("a.A"))
            .withClassDefinition("a.b.B", SimpleClassGenerator.makeMarkerInterface("a.b.B"))
            .withClassDefinition("c.C", SimpleClassGenerator.makeMarkerInterface("c.C"))
            //                .withCodeSourceUrlOf(ClassLoaders.class)
            .build();

    assertThat(ClassLoaders.in(classLoader).listOwnedClasses()).containsOnly("a.A", "a.b.B", "c.C");
    assertThat(ClassLoaders.in(classLoader).omit("b", "c").listOwnedClasses()).containsOnly("a.A");
  }
  @Test
  public void can_load_a_class_in_memory_from_bytes() throws Exception {
    // given
    ClassLoader cl =
        ClassLoaders.inMemoryClassLoader()
            .withClassDefinition("yop.Dude", SimpleClassGenerator.makeMarkerInterface("yop.Dude"))
            .build();

    // when
    Class<?> aClass = cl.loadClass("yop.Dude");

    // then
    assertThat(aClass).isNotNull();
    assertThat(aClass.getClassLoader()).isEqualTo(cl);
    assertThat(aClass.getName()).isEqualTo("yop.Dude");
  }
  @Test
  public void cannot_load_a_class_file_not_in_parent() throws Exception {
    // given
    ClassLoader cl = ClassLoaders.inMemoryClassLoader().withParent(jdkClassLoader()).build();

    cl.loadClass("java.lang.String");

    try {
      // when
      cl.loadClass("org.mockito.Mockito");
      fail("should have not found Mockito class");
    } catch (ClassNotFoundException e) {
      // then
      assertThat(e.getMessage()).contains("org.mockito.Mockito");
    }
  }
  @Test
  public void can_not_load_a_class_not_previously_registered_in_builder() throws Exception {
    // given
    ClassLoader cl =
        ClassLoaders.inMemoryClassLoader()
            .withClassDefinition("yop.Dude", SimpleClassGenerator.makeMarkerInterface("yop.Dude"))
            .build();

    // when
    try {
      cl.loadClass("not.Defined");
      fail();
    } catch (ClassNotFoundException e) {
      // then
      assertThat(e.getMessage()).contains("not.Defined");
    }
  }