/** Verify {@link BaseProjectProperty#prepareValue(Object)} method. */
 @Test
 public void testPrepareValue() {
   // BaseProject property doesn't perform any changes with value.
   assertNull(property.prepareValue(null));
   Object value = new Object();
   assertTrue(value == property.prepareValue(value));
 }
 /** Verify constructor */
 @Test
 public void testConstructor() {
   try {
     new BaseProjectProperty(null);
     fail("Null should be handled by BaseProjectProperty constructor.");
   } catch (Exception e) {
     assertEquals(BaseProjectProperty.INVALID_JOB_EXCEPTION, e.getMessage());
   }
   assertNotNull(property.getJob());
   assertEquals(project, property.getJob());
 }
 /** Verify {@link BaseProjectProperty#setJob(org.hudsonci.api.model.IJob)} method. */
 @Test
 public void testSetJob() {
   try {
     property.setJob(null);
     fail("Null is not allowed.");
   } catch (Exception e) {
     assertEquals(BaseProjectProperty.INVALID_JOB_EXCEPTION, e.getMessage());
   }
   assertNotNull(property.getJob());
   assertEquals(project, property.getJob());
 }
 /**
  * Verify {@link BaseProjectProperty#setOverridden(boolean)}, {@link
  * BaseProjectProperty#isOverridden()} methods.
  */
 @Test
 public void testGetSetOverridden() {
   // By default property isOverridden flag is set to false.
   assertFalse(property.isOverridden());
   // Test if flag is configured as expected. Set true/false values and check whether they are set
   // correctly.
   property.setOverridden(true);
   assertTrue(property.isOverridden());
   property.setOverridden(false);
   assertFalse(property.isOverridden());
 }
  /** Verify {@link BaseProjectProperty#returnOriginalValue()} method. */
  @Test
  public void testReturnOriginalValue() {
    // False - If isOverridden flag is false and original value is null
    assertFalse(property.returnOriginalValue());
    property.setOverridden(true);

    // True - If isOverridden flag is true or original value is not null
    assertTrue(property.returnOriginalValue());
    property.setOriginalValue(new Object(), false);
    assertTrue(property.returnOriginalValue());
  }
  /** Property should have not null property key. */
  @Test
  public void testNullPropertyKey() {
    BaseProjectProperty property = new BaseProjectProperty(project);
    try {
      property.setValue("value");
      fail("PropertyKey shouldn't be null while calling setValue");
    } catch (Exception e) {
      assertEquals(BaseProjectProperty.INVALID_PROPERTY_KEY_EXCEPTION, e.getMessage());
    }
    try {
      property.getCascadingValue();
      fail("PropertyKey shouldn't be null while calling getCascadingValue()");
    } catch (Exception e) {
      assertEquals(BaseProjectProperty.INVALID_PROPERTY_KEY_EXCEPTION, e.getMessage());
    }
    try {
      property.getValue();
      fail("PropertyKey shouldn't be null while calling getValue()");
    } catch (Exception e) {
      assertEquals(BaseProjectProperty.INVALID_PROPERTY_KEY_EXCEPTION, e.getMessage());
    }

    property.setKey("key");
    try {
      property.setValue("value");
      property.getCascadingValue();
      property.getValue();
    } catch (Exception e) {
      fail("PropertyKey is valid");
    }
  }
  @Before
  public void setUp() {
    parent = new FreeStyleProjectMock("parent");
    project = new FreeStyleProjectMock("project");

    property = new BaseProjectProperty(project);
    property.setKey(propertyKey);
  }
 /** Verify {@link BaseProjectProperty#resetValue()} method. */
 @Test
 public void testResetValue() {
   property.setKey(propertyKey);
   property.setValue(new Object());
   property.setOverridden(true);
   assertNotNull(property.getOriginalValue());
   assertTrue(property.isOverridden());
   property.resetValue();
   assertNull(property.getOriginalValue());
   assertFalse(property.isOverridden());
 }
  /** Verify {@link BaseProjectProperty#updateOriginalValue(Object, Object)} method. */
  @Test
  public void testUpdateOriginalValue() {
    Integer cascadingValue = 10;
    Integer candidateValue = 11;
    property.setOriginalValue(1, false);
    assertFalse(property.isOverridden());
    assertNotNull(property.getOriginalValue());
    // If candidate value is not equal to cascading value - update original value and mark it as
    // overridden
    boolean result = property.updateOriginalValue(candidateValue, cascadingValue);
    assertTrue(result);
    assertTrue(property.isOverridden());
    assertEquals(candidateValue, property.getOriginalValue());

    // If candidate value is equal to cascading value - clear original value and mark it
    // non-overridden
    result = property.updateOriginalValue(cascadingValue, cascadingValue);
    assertFalse(result);
    assertFalse(property.isOverridden());
    assertNull(property.getOriginalValue());
  }
 /** Verify {@link BaseProjectProperty#getOriginalValue()} method. */
 @Test
 public void testGetOriginalValue() {
   assertNull(property.getOriginalValue());
   Object value = new Object();
   property.setKey(propertyKey);
   property.setValue(value);
   assertEquals(value, property.getOriginalValue());
   property.setValue(null);
   assertNull(property.getOriginalValue());
 }
 /** Verify {@link BaseProjectProperty#clearOriginalValue(Object)} method. */
 @Test
 public void testClearOriginalValue() {
   Object originalValue = new Object();
   // Prepare property original value
   property.setOriginalValue(originalValue, true);
   assertEquals(originalValue, property.getOriginalValue());
   assertTrue(property.isOverridden());
   property.clearOriginalValue(null);
   // original value should be null and not overridden.
   assertNull(property.getOriginalValue());
   assertFalse(property.isOverridden());
 }
  /** Verify {@link BaseProjectProperty#setOriginalValue(Object, boolean)} method. */
  @Test
  public void testSetOriginalValue() {
    Object originalValue = new Object();
    // Prepare property original value and mark it as overridden
    property.setOriginalValue(originalValue, true);
    assertEquals(originalValue, property.getOriginalValue());
    assertTrue(property.isOverridden());

    // Prepare property original value and set overridden flag to false.
    originalValue = new Object();
    property.setOriginalValue(originalValue, false);
    assertEquals(originalValue, property.getOriginalValue());
    assertFalse(property.isOverridden());
  }
 /** Verify {@link BaseProjectProperty#allowOverrideValue(Object, Object)} method. */
 @Test
 public void testAllowOverrideValue() {
   assertFalse(property.allowOverrideValue(null, null));
   assertTrue(property.allowOverrideValue(new Object(), null));
   assertTrue(property.allowOverrideValue(null, new Object()));
   // Test properties that don't have correct equals methods
   assertFalse(
       property.allowOverrideValue(
           new JavadocArchiver("", false), new JavadocArchiver("", false)));
   assertTrue(
       property.allowOverrideValue(new JavadocArchiver("", true), new JavadocArchiver("", false)));
   // Object with transient filds should be taken into account
   assertTrue(property.allowOverrideValue(new AxisList(new Axis("DB", "mysql")), new AxisList()));
   assertTrue(
       property.allowOverrideValue(
           new AxisList(new Axis("DB", "mysql")), new AxisList(new Axis("DB", "mysql", "mssql"))));
   assertTrue(
       property.allowOverrideValue(
           new AxisList(new Axis("DB", "mysql")), new AxisList(new Axis("DB", "mssql"))));
 }
 /** Verify {@link BaseProjectProperty#getDefaultValue()} method. */
 @Test
 public void testGetDefaultValue() {
   assertNull(property.getDefaultValue());
 }
  /** Verify {@link BaseProjectProperty#getCascadingValue()} method. */
  @Test
  public void testGetCascadingValue() {
    String parentValue = "parentValue";
    // If project doesn't have cascading project - default value is used as cascading value.
    assertEquals(property.getDefaultValue(), property.getCascadingValue());

    project.setCascadingProject(parent);
    property = new BaseProjectProperty(project);
    property.setKey(propertyKey);
    // If project has cascading project and cascading value is not set - default value is used.
    assertEquals(property.getDefaultValue(), property.getCascadingValue());

    BaseProjectProperty parentProperty = new BaseProjectProperty(parent);
    parentProperty.setKey(propertyKey);
    parentProperty.setValue(parentValue);
    parent.putProjectProperty(propertyKey, parentProperty);
    project.setCascadingProject(parent);
    property = new BaseProjectProperty(project);
    property.setKey(propertyKey);
    property.setValue(parentValue);
    // If project has cascading project and cascading value is set - property value will be used.
    assertEquals(parentProperty.getOriginalValue(), property.getCascadingValue());
  }
  /** Verify {@link BaseProjectProperty#setValue(Object)} method. */
  @Test
  public void testSetValue() {
    BaseProjectProperty property = new BaseProjectProperty(project);
    property.setKey(propertyKey);
    property.setValue(null);
    // If project doesn't have cascading - default boolean value is used for propertyOverridden flag
    assertFalse(property.isOverridden());
    assertNull(property.getOriginalValue());

    Object value = 12345;
    property.setValue(value);
    // If project doesn't have cascading - default boolean value is used for propertyOverridden flag
    assertFalse(property.isOverridden());
    assertEquals(value, property.getOriginalValue());

    String parentValue = "equalValue";
    BaseProjectProperty parentProperty = new BaseProjectProperty(parent);
    parentProperty.setKey(propertyKey);
    parentProperty.setValue(parentValue);
    parent.putProjectProperty(propertyKey, parentProperty);
    project.setCascadingProject(parent);

    // If value set to null, need to check whether default value is equals to cascading
    property.setValue(null);
    assertTrue(property.isOverridden());
    String overriddenValue = "newValue";
    property.setValue(overriddenValue);
    assertTrue(property.isOverridden());

    // Check whether current value is not null, after setting equal-to-cascading value current will
    // be null
    assertNotNull(property.getOriginalValue());
    assertTrue(property.isOverridden());
    property.setValue(parentValue);
    // Reset current property to null
    assertNull(property.getOriginalValue());
    // Cascading value is equal to current - reset flag to false.
    assertFalse(property.isOverridden());
  }
  /** Verify {@link BaseProjectProperty#getValue()} method. */
  @Test
  public void testGetValue() {
    Integer propertyValue = 10;
    property.setValue(propertyValue);
    // if value is not null - return it
    assertEquals(propertyValue, property.getValue());
    property.setValue(null);
    assertNull(property.getValue());

    BaseProjectProperty parentProperty = new BaseProjectProperty(parent);
    parentProperty.setKey(propertyKey);
    parentProperty.setValue(propertyValue);
    parent.putProjectProperty(propertyKey, parentProperty);

    project.setCascadingProject(parent);
    property = new BaseProjectProperty(project);
    property.setKey(propertyKey);
    // if current value is null and is not overridden value, take from cascading
    assertNull(property.getOriginalValue());
    assertEquals(propertyValue, property.getValue());

    property.setOverridden(true);
    // Property is overridden - return current value even if it is null.
    assertNull(property.getOriginalValue());
    assertNull(property.getValue());
  }