/**
   * Tests that the UnwovenClassFiles corresponding to jars on the inpath have the correct class
   * name when there is no output path (ultimately tests AjBuildManager.initBcelWorld() when there
   * is a jar on the inpath). Only does one build.
   */
  public void testPathResolutionWithInpathJarAndNoOutputPath() {
    String inpathDir = inpathTestingDir + File.separator + "inpathJar.jar";
    addInpathEntry(inpathDir);
    build("inpathTesting");
    // expect to compile the aspect in 'inpathTesting' project and weave
    // both the aspect and the class in the jar on the inpath.
    checkCompileWeaveCount("inpathTesting", 1, 2);

    AjState state = getState();

    // tests AjState.createUnwovenClassFile(BinarySourceFile)
    Map binarySources = state.getAjBuildManager().getBinarySourcesForThisWeave();
    assertFalse(
        "expected there to be binary sources from the inpath setting but didn't find any",
        binarySources.isEmpty());

    List unwovenClassFiles = (List) binarySources.get(inpathDir);
    List fileNames = new ArrayList();

    for (Iterator iterator = unwovenClassFiles.iterator(); iterator.hasNext(); ) {
      UnwovenClassFile ucf = (UnwovenClassFile) iterator.next();
      if (ucf.getFilename().indexOf(expectedOutputDir) == -1) {
        fileNames.add(ucf.getFilename());
      }
    }
    assertTrue(
        "expected to find UnwovenClassFile from directory\n"
            + expectedOutputDir
            + ", \n but found files "
            + fileNames,
        fileNames.isEmpty());
  }
  /**
   * Tests that the UnwovenClassFiles corresponding to classes on the inpath have the correct class
   * name when there is no output directory (ultimately tests
   * AjState.createUnwovenClassFile(BinarySourceFile) and ensures the unwovenClassFile has the
   * correct name. Makes a change to a class file on the inpath to ensure we enter this method
   * (there is a check that says are we the first build))
   */
  public void testPathResolutionAfterChangeInClassOnInpath() throws Exception {
    String inpathDir = inpathTestingDir + File.separator + "injarBin" + File.separator + "pkg";
    addInpathEntry(inpathDir);
    build("inpathTesting");

    // build again so that we enter
    // AjState.createUnwovenClassFile(BinarySourceFile)
    File from =
        new File(
            testdataSrcDir
                + File.separatorChar
                + "inpathTesting"
                + File.separatorChar
                + "newInpathClass"
                + File.separatorChar
                + "InpathClass.class");
    File destination = new File(inpathDir + File.separatorChar + "InpathClass.class");
    FileUtil.copyFile(from, destination);

    // get hold of the state for this project - expect to find one
    AjState state = getState();
    AjBuildConfig buildConfig = state.getBuildConfig();
    state.prepareForNextBuild(buildConfig);

    Map binarySources = state.getBinaryFilesToCompile(true);
    assertFalse(
        "expected there to be binary sources from the inpath setting but didn't find any",
        binarySources.isEmpty());

    List unwovenClassFiles =
        (List) binarySources.get(inpathDir + File.separator + "InpathClass.class");
    List fileNames = new ArrayList();
    // the unwovenClassFiles should have filenames that point to the output dir
    // (which in this case is the sandbox dir) and not where they came from.
    for (Iterator iterator = unwovenClassFiles.iterator(); iterator.hasNext(); ) {
      UnwovenClassFile ucf = (UnwovenClassFile) iterator.next();
      if (ucf.getFilename().indexOf(expectedOutputDir) == -1) {
        fileNames.add(ucf.getFilename());
      }
    }
    assertTrue(
        "expected to find UnwovenClassFile from directory\n"
            + expectedOutputDir
            + ", \n but found files "
            + fileNames,
        fileNames.isEmpty());
  }
  /**
   * Tests that the UnwovenClassFiles corresponding to classes on the inpath have the correct class
   * name when there is no output directory (ultimately tests AjBuildManager.initBcelWorld() when
   * there is a jar on the inpath). Only does one build.
   */
  public void testPathResolutionWithInpathDirAndNoOutputPath() {
    String inpathDir = inpathTestingDir + File.separator + "injarBin" + File.separator + "pkg";
    addInpathEntry(inpathDir);
    build("inpathTesting");

    // expect to compile the aspect in 'inpathTesting' project and weave
    // both the aspect and the class on the inpath.
    checkCompileWeaveCount("inpathTesting", 1, 2);

    // get hold of the state for this project - expect to find one
    AjState state = getState();

    // the classes onthe inpath are recorded against the AjBuildManager
    // (they are deleted from the ajstate whilst cleaning up after a build)
    Map binarySources = state.getAjBuildManager().getBinarySourcesForThisWeave();
    assertFalse(
        "expected there to be binary sources from the inpath setting but didn't find any",
        binarySources.isEmpty());

    List unwovenClassFiles =
        (List) binarySources.get(inpathDir + File.separator + "InpathClass.class");
    List fileNames = new ArrayList();
    // the unwovenClassFiles should have filenames that point to the output dir
    // (which in this case is the sandbox dir) and not where they came from.
    for (Iterator iterator = unwovenClassFiles.iterator(); iterator.hasNext(); ) {
      UnwovenClassFile ucf = (UnwovenClassFile) iterator.next();
      if (ucf.getFilename().indexOf(expectedOutputDir) == -1) {
        fileNames.add(ucf.getFilename());
      }
    }
    assertTrue(
        "expected to find UnwovenClassFile from directory\n"
            + expectedOutputDir
            + ", \n but found files "
            + fileNames,
        fileNames.isEmpty());
  }