/**
   * Tests whether the refactoring
   *
   * @throws Exception In case of an unexpected exception.
   */
  @Test
  public void testRefactorCaseMethodAddDifferentParam() throws Exception {
    VariationPoint vp = RefactoringTestUtil.getMethodAddDifferentParamCase(VariabilityType.OPTXOR);
    IfStaticConfigClassMethod refactoring = new IfStaticConfigClassMethod();
    refactoring.refactor(vp, null);

    // location has two methods
    Class vpLocation = (Class) ((JaMoPPJavaSoftwareElement) vp.getLocation()).getJamoppElement();
    assertThat(vpLocation.getMethods().size(), equalTo(2));

    Method firstMethod = vpLocation.getMethods().get(0);
    Method secondMethod = vpLocation.getMethods().get(1);

    // assert number of parameters
    assertThat(firstMethod.getParameters().size(), anyOf(equalTo(1), equalTo(2)));
    assertThat(secondMethod.getParameters().size(), anyOf(equalTo(1), equalTo(2)));
    assertThat(
        firstMethod.getParameters().size(), not(equalTo(secondMethod.getParameters().size())));

    // assert method names and return types
    assertThat(firstMethod.getName(), equalTo("someMethod"));
    assertThat(secondMethod.getName(), equalTo("someMethod"));
    assertThat(firstMethod.getTypeReference(), instanceOf(Void.class));
    assertThat(secondMethod.getTypeReference(), instanceOf(Void.class));

    // verify correct VPM
    RefactoringTestUtil.assertValidVPM(vp);
  }
  /**
   * Tests whether the refactoring merges the constants of two enumerations correctly. The generated
   * enumeration must contain the constants from all variants.
   *
   * @throws Exception In case of an unexpected exception.
   */
  @Test
  public void testRefactorCaseEnumerationAddEnumConstant() throws Exception {
    VariationPoint vp =
        RefactoringTestUtil.getEnumerationAddEnumConstantCase(VariabilityType.OPTXOR);
    IfStaticConfigClassEnumerationInMemberContainer refactoring =
        new IfStaticConfigClassEnumerationInMemberContainer();
    refactoring.refactor(vp, null);

    // location has one member (the enumeration)
    MemberContainer vpLocation =
        (MemberContainer) ((JaMoPPJavaSoftwareElement) vp.getLocation()).getJamoppElement();
    assertThat(vpLocation.getMembers().size(), equalTo(1));

    // member is an enumeration
    assertThat(vpLocation.getMembers().get(0), instanceOf(Enumeration.class));

    Enumeration enumeration = (Enumeration) vpLocation.getMembers().get(0);

    // enumeration has the correct name and the two constants from the base and the integration
    assertThat(enumeration.getName(), equalTo("A"));
    assertThat(enumeration.getConstants().size(), equalTo(2));
    assertThat(enumeration.getConstants().get(0).getName(), anyOf(equalTo("A"), equalTo("B")));
    assertThat(enumeration.getConstants().get(1).getName(), anyOf(equalTo("A"), equalTo("B")));
    assertThat(
        enumeration.getConstants().get(0).getName(),
        not(equalTo(enumeration.getConstants().get(1).getName())));

    // verify correct VPM
    RefactoringTestUtil.assertValidVPM(vp);
  }
  /**
   * Tests whether the refactoring
   *
   * @throws Exception In case of an unexpected exception.
   */
  @Test
  public void testRefactorCaseMethodAddSameParam() throws Exception {
    VariationPoint vp = RefactoringTestUtil.getMethodAddSameParamCase(VariabilityType.OPTXOR);
    IfStaticConfigClassMethod refactoring = new IfStaticConfigClassMethod();
    refactoring.refactor(vp, null);

    // location has one method
    Class vpLocation = (Class) ((JaMoPPJavaSoftwareElement) vp.getLocation()).getJamoppElement();
    assertThat(vpLocation.getMethods().size(), equalTo(1));

    // assert number of parameters
    assertThat(vpLocation.getMethods().get(0).getParameters().size(), equalTo(0));

    // assert method name and return type
    assertThat(vpLocation.getMethods().get(0).getTypeReference(), instanceOf(Void.class));

    // verify correct VPM
    RefactoringTestUtil.assertValidVPM(vp);
  }