/**
   * Bug 68993: [Preferences] IAE when opening project preferences
   *
   * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=68993"
   */
  public void testBug68993() throws CoreException, BackingStoreException {
    try {
      JavaProject projectA =
          (JavaProject)
              this.createJavaProject(
                  "A",
                  new String[] {}, // source folders
                  new String[] {}, // lib folders
                  new String[] {}, // projects
                  "");

      // set all project options as custom ones: this is what happens when user select
      // "Use project settings" in project 'Java Compiler' preferences page...
      Hashtable options = new Hashtable(projectA.getOptions(true));
      projectA.setOptions(options);

      // reset all project custom options: this is what happens when user select
      // "Use workspace settings" in project 'Java Compiler' preferences page...
      options = new Hashtable();
      options.put("internal.default.compliance", JavaCore.DEFAULT);
      projectA.setOptions(options);

      // verify that project preferences have been reset
      assertEquals(
          "projA: We should not have any custom options!",
          0,
          projectA.getEclipsePreferences().keys().length);
    } finally {
      this.deleteProject("A");
    }
  }
  /**
   * @bug 346010 - [model] strange initialization dependency in OptionTests
   * @test Verify that unfortunate order of map entries doesn't spoil intended semantics.
   * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=346010"
   * @deprecated As using deprecated constants
   */
  public void testBug346010() throws CoreException {
    class ForcedOrderMap extends Hashtable {
      private static final long serialVersionUID = 8012963985718522218L;
      Map original;
      Map.Entry additionalEntry;
      /* Force (additionalKey,additionalValue) to be served after all entries of original. */
      public ForcedOrderMap(Map original, String additionalKey, String additionalValue) {
        this.original = original;
        // convert additionalKey->additionalValue to a Map.Entry without inserting into original:
        Hashtable tmp = new Hashtable();
        tmp.put(additionalKey, additionalValue);
        this.additionalEntry = (Map.Entry) tmp.entrySet().iterator().next();
      }

      public Set entrySet() {
        return new HashSet() {
          private static final long serialVersionUID = 1L;

          public Iterator iterator() {
            List orderedEntries;
            orderedEntries = new ArrayList(ForcedOrderMap.this.original.entrySet());
            orderedEntries.add(ForcedOrderMap.this.additionalEntry);
            return orderedEntries.iterator();
          }
        };
      }

      public synchronized boolean containsKey(Object key) {
        return this.original.containsKey(key) || key.equals(this.additionalEntry.getKey());
      }
    }
    try {
      // Set the obsolete option using the IJavaProject API
      JavaProject project = (JavaProject) createJavaProject("P");
      final String obsoleteOption =
          DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_MEMBER;
      Map testOptions = project.getOptions(true);
      Map orderedOptions = new ForcedOrderMap(testOptions, obsoleteOption, JavaCore.DO_NOT_INSERT);
      project.setOptions(orderedOptions);
      // Verify that obsolete preference is not stored
      assertNull(
          "Unexpected value for formatter deprecated option 'org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member'",
          project.getEclipsePreferences().get(obsoleteOption, null));
      // Verify that project obsolete option is well retrieved
      assertEquals(
          "Unexpected value for formatter deprecated option 'org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member'",
          JavaCore.INSERT,
          project.getOption(obsoleteOption, true));
    } finally {
      deleteProject("P");
    }
  }
  /**
   * Custom options must replace existing ones completely without loosing property listeners
   * http://bugs.eclipse.org/bugs/show_bug.cgi?id=59258
   * http://bugs.eclipse.org/bugs/show_bug.cgi?id=60896
   */
  public void test09() throws CoreException {
    try {
      this.eventCount = 0;
      JavaProject projectA = (JavaProject) this.createJavaProject("A", new String[] {}, "");
      //		Preferences preferences = projectA.getPreferences();
      //		preferences.addPropertyChangeListener(new TestPropertyListener());
      IEclipsePreferences eclipsePreferences = projectA.getEclipsePreferences();
      eclipsePreferences.addPreferenceChangeListener(new TestPropertyListener());

      Hashtable options = new Hashtable();
      options.put(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE, JavaCore.ENABLED);
      options.put(JavaCore.COMPILER_COMPLIANCE, "10.0");
      projectA.setOptions(options);

      // check project A custom options
      assertEquals(
          "projA:unexpected custom value for deprecation option",
          JavaCore.ENABLED,
          projectA.getOptions(true).get(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE));
      assertEquals(
          "projA:unexpected custom value for compliance option",
          "10.0",
          projectA.getOptions(true).get(JavaCore.COMPILER_COMPLIANCE));
      assertTrue(
          "projA:preferences should not be reset",
          eclipsePreferences == projectA.getEclipsePreferences());
      assertEquals("projA:preferences property listener has been lost", 2, this.eventCount);

      // delete/create project A and verify that options are well reset
      this.deleteProject("A");
      projectA = (JavaProject) this.createJavaProject("A", new String[] {}, "");
      assertEquals(
          "projA:unexpected custom value for deprecation option",
          JavaCore.getOption(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE),
          projectA.getOptions(true).get(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE));
      assertEquals(
          "projA:unexpected custom value for compliance option",
          JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE),
          projectA.getOptions(true).get(JavaCore.COMPILER_COMPLIANCE));
      assertTrue(
          "projA:preferences should not be reset",
          eclipsePreferences != projectA.getEclipsePreferences());
    } finally {
      this.deleteProject("A");
    }
  }
 /**
  * @bug 324987: [formatter] API compatibility problem with Annotation Newline options
  * @test Verify that a new option beats the deprecated option when a client sets both through the
  *     IJavaProject#setOptions(Map) API
  * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=324987"
  * @deprecated As using deprecated constants
  */
 public void testBug324987_Project02() throws CoreException {
   try {
     // Set the obsolete option using the IJavaProject API
     JavaProject project = (JavaProject) createJavaProject("P");
     final String obsoleteOption =
         DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_MEMBER;
     Map testOptions = project.getOptions(true);
     testOptions.put(obsoleteOption, JavaCore.DO_NOT_INSERT);
     project.setOptions(testOptions);
     // Verify that obsolete preference is not stored
     assertNull(
         "Unexpected value for formatter deprecated option 'org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member'",
         project.getEclipsePreferences().get(obsoleteOption, null));
     // Verify that project obsolete option is well retrieved
     assertEquals(
         "Unexpected value for formatter deprecated option 'org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member'",
         JavaCore.INSERT,
         project.getOption(obsoleteOption, true));
   } finally {
     deleteProject("P");
   }
 }
  /**
   * Custom options must replace existing ones completely without loosing property listeners
   * http://bugs.eclipse.org/bugs/show_bug.cgi?id=26255
   * http://bugs.eclipse.org/bugs/show_bug.cgi?id=49691
   */
  public void test07() throws CoreException {
    try {
      this.eventCount = 0;
      JavaProject projectA =
          (JavaProject)
              this.createJavaProject(
                  "A",
                  new String[] {}, // source folders
                  new String[] {}, // lib folders
                  new String[] {}, // projects
                  "");
      //		Preferences preferences = projectA.getPreferences();
      //		preferences.addPropertyChangeListener(new TestPropertyListener());
      IEclipsePreferences eclipsePreferences = projectA.getEclipsePreferences();
      TestPropertyListener listener = new TestPropertyListener();
      eclipsePreferences.addPreferenceChangeListener(listener);

      Hashtable options = new Hashtable();
      options.put(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE, JavaCore.ENABLED);
      options.put(JavaCore.COMPILER_COMPLIANCE, "10.0");
      projectA.setOptions(options);

      // check project A custom options
      assertEquals(
          "projA:unexpected custom value for deprecation option",
          JavaCore.ENABLED,
          projectA.getOptions(false).get(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE));
      assertEquals(
          "projA:unexpected custom value for compliance option",
          "10.0",
          projectA.getOptions(false).get(JavaCore.COMPILER_COMPLIANCE));
      assertEquals(
          "projA:unexpected inherited value1 for hidden-catch option",
          null,
          projectA.getOptions(false).get(JavaCore.COMPILER_PB_HIDDEN_CATCH_BLOCK));
      //		assertTrue("projA:preferences should not be reset", preferences ==
      // projectA.getPreferences());
      assertTrue(
          "projA:preferences should not be reset",
          eclipsePreferences == projectA.getEclipsePreferences());
      assertTrue("projA:preferences property listener has been lost", this.eventCount == 2);

      // change custom options to have one less
      options.clear();
      options.put(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE, JavaCore.ENABLED);
      projectA.setOptions(options);
      assertEquals(
          "projA:unexpected custom value for deprecation option",
          JavaCore.ENABLED,
          projectA.getOptions(false).get(JavaCore.COMPILER_PB_DEPRECATION_IN_DEPRECATED_CODE));
      assertEquals(
          "projA:unexpected custom value for compliance option",
          null,
          projectA.getOptions(false).get(JavaCore.COMPILER_COMPLIANCE));
      assertEquals(
          "projA:unexpected inherited value1 for hidden-catch option",
          null,
          projectA.getOptions(false).get(JavaCore.COMPILER_PB_HIDDEN_CATCH_BLOCK));
      //		assertTrue("projA:preferences should not be reset", preferences ==
      // projectA.getPreferences());
      assertTrue(
          "projA:preferences should not be reset",
          eclipsePreferences == projectA.getEclipsePreferences());
      assertTrue("projA:preferences property listener has been lost", this.eventCount == 3);
    } finally {
      this.deleteProject("A");
    }
  }