/** * *************************************************************************** * Copyright (c) 2010 Qcadoo Limited * Project: Qcadoo Framework * Version: 1.4 * * This file is part of Qcadoo. * * Qcadoo is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *************************************************************************** */ package com.qcadoo.model.internal; import static junit.framework.Assert.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.qcadoo.model.api.DataDefinition; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.EntityList; import com.qcadoo.model.api.FieldDefinition; import com.qcadoo.model.api.types.BelongsToType; import com.qcadoo.model.api.types.FieldType; import com.qcadoo.model.api.types.HasManyType; import com.qcadoo.model.api.types.ManyToManyType; import com.qcadoo.model.internal.types.DecimalType; import com.qcadoo.model.internal.types.IntegerType; public class DefaultEntityTest { private DefaultEntity defaultEntity; private DataDefinition dataDefinition; private FieldDefinition belongsToFieldDefinition; private DataDefinition belongsToFieldDataDefinition; private FieldDefinition decimalFieldDefinition; private FieldDefinition integerFieldDefinition; private FieldDefinition manyToManyFieldDefinition; private DataDefinition manyToManyDataDefinition; private FieldDefinition booleanFieldDefinition; private FieldDefinition stringFieldDefinition; private FieldDefinition hasManyFieldDefinition; private DataDefinition hasManyDataDefinition; private FieldDefinition secondManyToManyFieldDefinition; private DataDefinition secondManyToManyDataDefinition; private static final String BELONGS_TO_FIELD_NAME = "belongsToField"; private static final String STRING_FIELD_NAME = "stringField"; private static final String BOOLEAN_FIELD_NAME = "booleanField"; private static final String DECIMAL_FIELD_NAME = "decimalField"; private static final String INTEGER_FIELD_NAME = "integerField"; private static final String MANY_TO_MANY_FIELD_NAME = "manyToMany"; private static final String SECOND_MANY_TO_MANY_FIELD_NAME = "secondManyToMany"; private static final String HAS_MANY_FIELD_NAME = "hasMany"; private static final String L_FIRST = "first"; private static final String L_SECOND = "second"; private static final String L_THIRD = "third"; private static final String L_FOURTH = "fourth"; private static final String L_DIFFERENCE = "difference"; private static final String DATE_FIELD_NAME = "dateField"; @Before public final void init() { belongsToFieldDefinition = mock(FieldDefinition.class); final BelongsToType belongsToType = mock(BelongsToType.class); when(belongsToFieldDefinition.getType()).thenReturn(belongsToType); belongsToFieldDataDefinition = mock(DataDefinition.class); when(belongsToFieldDefinition.getDataDefinition()).thenReturn(belongsToFieldDataDefinition); decimalFieldDefinition = mock(FieldDefinition.class); final DecimalType decimalType = new DecimalType(); when(decimalFieldDefinition.getType()).thenReturn(decimalType); integerFieldDefinition = mock(FieldDefinition.class); final IntegerType integerType = new IntegerType(); when(integerFieldDefinition.getType()).thenReturn(integerType); manyToManyFieldDefinition = mock(FieldDefinition.class); final ManyToManyType manyToManyType = mock(ManyToManyType.class); when(manyToManyFieldDefinition.getType()).thenReturn(manyToManyType); manyToManyDataDefinition = mock(DataDefinition.class); when(manyToManyFieldDefinition.getDataDefinition()).thenReturn(manyToManyDataDefinition); secondManyToManyFieldDefinition = mock(FieldDefinition.class); when(secondManyToManyFieldDefinition.getType()).thenReturn(manyToManyType); secondManyToManyDataDefinition = mock(DataDefinition.class); when(secondManyToManyFieldDefinition.getDataDefinition()).thenReturn(secondManyToManyDataDefinition); hasManyFieldDefinition = mock(FieldDefinition.class); final HasManyType hasManyType = mock(HasManyType.class); when(hasManyType.getJoinFieldName()).thenReturn(BELONGS_TO_FIELD_NAME); when(hasManyFieldDefinition.getType()).thenReturn(hasManyType); hasManyDataDefinition = mock(DataDefinition.class); when(hasManyFieldDefinition.getDataDefinition()).thenReturn(hasManyDataDefinition); stringFieldDefinition = mock(FieldDefinition.class); when(stringFieldDefinition.isPersistent()).thenReturn(false); dataDefinition = mock(DataDefinition.class); booleanFieldDefinition = mock(FieldDefinition.class); defaultEntity = new DefaultEntity(dataDefinition); final Map<String, FieldDefinition> fieldsMap = Maps.newHashMap(); fieldsMap.put(BELONGS_TO_FIELD_NAME, belongsToFieldDefinition); fieldsMap.put(STRING_FIELD_NAME, stringFieldDefinition); fieldsMap.put(BOOLEAN_FIELD_NAME, booleanFieldDefinition); fieldsMap.put(DECIMAL_FIELD_NAME, decimalFieldDefinition); fieldsMap.put(INTEGER_FIELD_NAME, integerFieldDefinition); fieldsMap.put(MANY_TO_MANY_FIELD_NAME, manyToManyFieldDefinition); fieldsMap.put(SECOND_MANY_TO_MANY_FIELD_NAME, secondManyToManyFieldDefinition); fieldsMap.put(HAS_MANY_FIELD_NAME, hasManyFieldDefinition); for (Map.Entry<String, FieldDefinition> fieldEntry : fieldsMap.entrySet()) { when(dataDefinition.getField(fieldEntry.getKey())).thenReturn(fieldEntry.getValue()); } when(dataDefinition.getFields()).thenReturn(fieldsMap); } @Test public final void shouldGetBelongsToFieldReturnEntity() throws Exception { // given Entity belongsToEntity = mock(Entity.class); defaultEntity.setField(BELONGS_TO_FIELD_NAME, belongsToEntity); // when Entity returnedEntity = defaultEntity.getBelongsToField(BELONGS_TO_FIELD_NAME); // then assertEquals(belongsToEntity, returnedEntity); } @Test public final void shouldGetBelongsToFieldReturnProxyEntity() throws Exception { // given Long belongsToEntityId = 1L; defaultEntity.setField(BELONGS_TO_FIELD_NAME, belongsToEntityId); // when Entity returnedEntity = defaultEntity.getBelongsToField(BELONGS_TO_FIELD_NAME); // then assertEquals(belongsToEntityId, returnedEntity.getId()); } @Test public final void shouldGetBelongsToFieldReturnProxyEntityUsingIntegerValue() throws Exception { // given Integer belongsToEntityId = 1; defaultEntity.setField(BELONGS_TO_FIELD_NAME, belongsToEntityId); // when Entity returnedEntity = defaultEntity.getBelongsToField(BELONGS_TO_FIELD_NAME); // then assertTrue(returnedEntity.getId() instanceof Long); assertFalse(belongsToEntityId.equals(returnedEntity.getId())); assertEquals(belongsToEntityId.longValue(), returnedEntity.getId().longValue()); } @Test(expected = IllegalArgumentException.class) public final void shouldGetBelongsToFieldThrowIllegalArgumentExceptionIfFieldIsNotABelongsToType() throws Exception { // given FieldType wrongFieldType = mock(FieldType.class); when(belongsToFieldDefinition.getType()).thenReturn(wrongFieldType); defaultEntity.setField(BELONGS_TO_FIELD_NAME, "some wrong type value"); // when defaultEntity.getBelongsToField(BELONGS_TO_FIELD_NAME); } @Test public final void shouldGetBelongsToFieldReturnNullIfFieldIsEmpty() throws Exception { // when Entity returnedEntity = defaultEntity.getBelongsToField(BELONGS_TO_FIELD_NAME); // then assertNull(returnedEntity); } @Test public final void shouldGetDataDefinitionReturnDataDefinition() throws Exception { // when DataDefinition returnedDataDefinition = defaultEntity.getDataDefinition(); // then assertEquals(dataDefinition, returnedDataDefinition); } @Test public final void shouldCopyReturnCopyOfEntity() throws Exception { // given Entity belongsToEntity = mock(Entity.class); when(belongsToEntity.getDataDefinition()).thenReturn(belongsToFieldDataDefinition); when(belongsToEntity.copy()).thenReturn(belongsToEntity); defaultEntity.setId(1L); defaultEntity.setField(BELONGS_TO_FIELD_NAME, belongsToEntity); defaultEntity.setField(STRING_FIELD_NAME, "some string value"); // when Entity returnedCopy = defaultEntity.copy(); // then assertEquals(defaultEntity, returnedCopy); assertEquals(defaultEntity.hashCode(), returnedCopy.hashCode()); assertNotSame(defaultEntity, returnedCopy); } @Test public final void shouldGetBooleanValueReturnTrueIfFieldValueIsTrue() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, true); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertTrue(returnedValue); } @Test public final void shouldGetBooleanValueReturnFalseIfFieldValueIsFalse() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, false); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertFalse(returnedValue); } @Test public final void shouldGetBooleanValueReturnTrueIfFieldValueIsStringTrue() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, "true"); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertTrue(returnedValue); } @Test public final void shouldGetBooleanValueReturnTrueIfFieldValueIsStringUpperCaseTrue() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, "TRUE"); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertTrue(returnedValue); } @Test public final void shouldGetBooleanValueReturnTrueIfFieldValueIsStringRepresentingNumberOne() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, "1"); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertTrue(returnedValue); } @Test public final void shouldGetBooleanValueReturnTrueIfFieldValueIsStringRepresentingNumberZero() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, "0"); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertFalse(returnedValue); } @Test public final void shouldGetBooleanValueReturnFalseIfFieldValueIsStringFalse() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, "false"); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertFalse(returnedValue); } @Test public final void shouldGetBooleanValueReturnFalseIfFieldValueIsStringOtherThanTrueOrFalse() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, "some other string"); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertFalse(returnedValue); } @Test public final void shouldGetBooleanValueReturnFalseIfFieldValueIsNotAppropriateType() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, 1); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertFalse(returnedValue); } @Test public final void shouldGetBooleanValueReturnFalseIfFieldValueIsNull() throws Exception { // given defaultEntity.setField(BOOLEAN_FIELD_NAME, null); // when boolean returnedValue = defaultEntity.getBooleanField(BOOLEAN_FIELD_NAME); // then assertFalse(returnedValue); } @Test public final void shouldReturnBigDecimalValue() throws Exception { // given BigDecimal decimal = BigDecimal.ZERO; defaultEntity.setField(DECIMAL_FIELD_NAME, decimal); // when BigDecimal result = defaultEntity.getDecimalField(DECIMAL_FIELD_NAME); // then Assert.assertNotNull(result); Assert.assertEquals(decimal, result); } @Test public final void shouldReturnBigDecimalValueFromStringUsingDecimalType() throws Exception { // given final String decimalStringValue = "10.00"; defaultEntity.setField(DECIMAL_FIELD_NAME, decimalStringValue); // when BigDecimal result = defaultEntity.getDecimalField(DECIMAL_FIELD_NAME); // then Assert.assertNotNull(result); Assert.assertEquals(new BigDecimal(decimalStringValue).stripTrailingZeros(), result); } @Test public final void shouldReturnNullBigDecimalValueFromEmptyStringUsingDecimalType() throws Exception { // given final String decimalStringValue = ""; defaultEntity.setField(DECIMAL_FIELD_NAME, decimalStringValue); // when BigDecimal result = defaultEntity.getDecimalField(DECIMAL_FIELD_NAME); // then Assert.assertNull(result); } @Test public final void shouldReturnNullBigDecimalValueFromBlankStringUsingDecimalType() throws Exception { // given final String decimalStringValue = " "; defaultEntity.setField(DECIMAL_FIELD_NAME, decimalStringValue); // when BigDecimal result = defaultEntity.getDecimalField(DECIMAL_FIELD_NAME); // then Assert.assertNull(result); } @Test public final void shouldThrowExceptionWhenGettingBigDecimalValueFromInvalidStringUsingDecimalType() throws Exception { // given final String decimalStringValue = "invalid decimal value"; final String decimalFieldName = "decimalField"; defaultEntity.setField(decimalFieldName, decimalStringValue); given(dataDefinition.getField(decimalFieldName)).willReturn(decimalFieldDefinition); // when & then try { defaultEntity.getDecimalField(decimalFieldName); } catch (Exception e) { assertTrue(e instanceof IllegalArgumentException); } } @Test public final void shouldReturnNullIfDecimalFieldIsNull() throws Exception { // given final String decimalFieldName = "decimalField"; defaultEntity.setField(decimalFieldName, null); // when BigDecimal result = defaultEntity.getDecimalField(decimalFieldName); // then Assert.assertNull(result); } @Test public final void shouldReturnIntegerValue() throws Exception { // given Integer integer = Integer.MAX_VALUE; defaultEntity.setField(INTEGER_FIELD_NAME, integer); // when Integer result = defaultEntity.getIntegerField(INTEGER_FIELD_NAME); // then Assert.assertNotNull(result); Assert.assertEquals(integer, result); } @Test public final void shouldReturnIntegerValueFromStringUsingIntegerType() throws Exception { // given final String integerStringValue = "10"; defaultEntity.setField(INTEGER_FIELD_NAME, integerStringValue); // when Integer result = defaultEntity.getIntegerField(INTEGER_FIELD_NAME); // then Assert.assertNotNull(result); Assert.assertEquals(new Integer(integerStringValue), result); } @Test public final void shouldReturnNullIntegerValueFromEmptyStringUsingIntegerType() throws Exception { // given final String integerStringValue = ""; defaultEntity.setField(INTEGER_FIELD_NAME, integerStringValue); // when Integer result = defaultEntity.getIntegerField(INTEGER_FIELD_NAME); // then Assert.assertNull(result); } @Test public final void shouldReturnNullIntegerValueFromBlankStringUsingIntegerType() throws Exception { // given final String integerStringValue = " "; defaultEntity.setField(INTEGER_FIELD_NAME, integerStringValue); // when Integer result = defaultEntity.getIntegerField(INTEGER_FIELD_NAME); // then Assert.assertNull(result); } @Test public final void shouldThrowExceptionWhenGettingIntegerValueFromInvalidStringUsingIntegerType() throws Exception { // given final String integerStringValue = "invalid integer value"; defaultEntity.setField(INTEGER_FIELD_NAME, integerStringValue); given(dataDefinition.getField(INTEGER_FIELD_NAME)).willReturn(integerFieldDefinition); // when & then try { defaultEntity.getIntegerField(INTEGER_FIELD_NAME); Assert.fail("should throw exception"); } catch (Exception e) { assertTrue(e instanceof IllegalArgumentException); } } @Test public final void shouldReturnNullIfIntegerFieldIsNull() throws Exception { // given defaultEntity.setField(INTEGER_FIELD_NAME, null); // when Integer result = defaultEntity.getIntegerField(INTEGER_FIELD_NAME); // then Assert.assertNull(result); } @Test public final void shouldReturnDetachedEntityListImpl() throws Exception { // given final String hasManyFieldName = "hasManyDetachedField"; List<Entity> listOfMockEntities = getListOfMockEntities(); defaultEntity.setField(hasManyFieldName, listOfMockEntities); // when EntityList resultList = defaultEntity.getHasManyField(hasManyFieldName); // then Assert.assertTrue(resultList instanceof DetachedEntityListImpl); Assert.assertEquals(listOfMockEntities.size(), resultList.size()); Assert.assertArrayEquals(listOfMockEntities.toArray(), resultList.toArray()); } @Test public final void shouldReturnExistingEntityList() throws Exception { // given final String hasManyFieldName = "hasManyDetachedField"; EntityList entityList = mock(EntityList.class); defaultEntity.setField(hasManyFieldName, entityList); // when EntityList resultList = defaultEntity.getHasManyField(hasManyFieldName); // then Assert.assertTrue(resultList instanceof EntityList); Assert.assertEquals(entityList, resultList); } @Test public final void shouldReturnEmptyDetachedEntityListIfFieldIsNull() throws Exception { // given final String hasManyFieldName = "hasManyDetachedField"; defaultEntity.setField(hasManyFieldName, null); // when EntityList resultList = defaultEntity.getHasManyField(hasManyFieldName); // then Assert.assertNotNull(resultList); Assert.assertTrue(resultList instanceof DetachedEntityListImpl); Assert.assertTrue(resultList.isEmpty()); } @Test(expected = IllegalArgumentException.class) public final void shouldThrowExceptionIfHasManyFieldHaveUnsupportedType() throws Exception { // given final String hasManyFieldName = "hasManyDetachedField"; defaultEntity.setField(hasManyFieldName, "usupported value type (String)"); // when defaultEntity.getHasManyField(hasManyFieldName); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith2Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setId(2L); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith2EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith3Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); firstEntity.setId(1L); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); secondEntity.setId(2L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); thirdEntity.setId(3L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith3EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith4Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setId(3L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setId(4L); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith4EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith2DeeplyNestedEntities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setId(3L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setId(4L); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWith2DeeplyNestedEntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertEquals(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(secondEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(thirdEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME)); assertEquals(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); assertNotSame(fourthEntity, copy.getBelongsToField(BELONGS_TO_FIELD_NAME).getBelongsToField(BELONGS_TO_FIELD_NAME) .getBelongsToField(BELONGS_TO_FIELD_NAME)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWithManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertSame(secondEntity, firstEntity.getManyToManyField(MANY_TO_MANY_FIELD_NAME).get(0)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWithManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertSame(secondEntity, firstEntity.getManyToManyField(MANY_TO_MANY_FIELD_NAME).get(0)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWithTwoManyToManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertSame(secondEntity, firstEntity.getManyToManyField(MANY_TO_MANY_FIELD_NAME).get(0)); assertSame(secondEntity, firstEntity.getManyToManyField(SECOND_MANY_TO_MANY_FIELD_NAME).get(0)); } @Test public final void shouldCopyDoNotMakeInfinityCycleWithTwoManyToManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when Entity copy = null; try { copy = firstEntity.copy(); } catch (StackOverflowError e) { Assert.fail(); } // then assertNotSame(firstEntity, copy); assertEquals(firstEntity, copy); assertSame(secondEntity, firstEntity.getManyToManyField(MANY_TO_MANY_FIELD_NAME).get(0)); assertSame(secondEntity, firstEntity.getManyToManyField(SECOND_MANY_TO_MANY_FIELD_NAME).get(0)); } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith2Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setId(2L); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith2EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith3Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); firstEntity.setId(1L); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); secondEntity.setId(2L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); thirdEntity.setId(3L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith3EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith4Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setId(1L); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); secondEntity.setId(2L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); thirdEntity.setId(3L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); fourthEntity.setId(4L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith4EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith2DeeplyNestedEntities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setId(3L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setId(4L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWith2DeeplyNestedEntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithHasManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithHasManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithDeeplyNestedHasManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setId(3L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setId(4L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithDeeplyNestedHasManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(HAS_MANY_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(HAS_MANY_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithTwoManyToManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithTwoManyToManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithDeeplyNestedManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setId(3L); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setId(4L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithDeeplyNestedManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithTwoDeeplyNestedManyToManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setId(3L); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setId(4L); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldHashCodeDoNotMakeInfinityCycleWithTwoDeeplyNestedManyToManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.hashCode(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith2Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setId(2L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith2EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith3Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); thirdEntity.setId(3L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith3EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith4Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setId(3L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setId(4L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith4EntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith2DeeplyNestedEntities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setId(3L); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setId(4L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWith2DeeplyNestedEntitiesWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithHasManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setId(2L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithHasManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithDeeplyNestedHasManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setId(3L); fourthEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setId(4L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithDeeplyNestedHasManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithTwoManyToManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithTwoManyToManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithDeeplyNestedManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setId(3L); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setId(4L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithDeeplyNestedManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithTwoDeeplyNestedManyToManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setId(2L); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setId(3L); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setId(4L); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldToStringDoNotMakeInfinityCycleWithTwoDeeplyNestedManyToManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(fourthEntity)); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(thirdEntity)); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when try { firstEntity.toString(); } catch (StackOverflowError e) { Assert.fail(); } } @Test public final void shouldEqualsReturnFalseIfBelongsToFieldIsNullOnlyOnOneSide() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = null; firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); // when final boolean result = firstEntity.equals(firstOtherEntity); // then assertFalse(result); } @Test public final void shouldEqualsReturnTruIfBelongsToFieldIsBothNull() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = null; final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = null; firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); // when final boolean result = firstEntity.equals(firstOtherEntity); // then assertTrue(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWith2Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = false; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWith2Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_DIFFERENCE); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWith3Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); // introduce another instance with the same values to prevent comparing references instead of entity's values final Entity firstOtherEntityB = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); final Entity thirdOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); firstOtherEntityB.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntityB.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntityB); thirdOtherEntity.setField(STRING_FIELD_NAME, L_THIRD); // when boolean result = false; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWith3Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); // introduce another instance with the same values to prevent comparing references instead of entity's values final Entity firstOtherEntityB = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); final Entity thirdOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); firstOtherEntityB.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntityB.setField(STRING_FIELD_NAME, L_DIFFERENCE); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntityB); thirdOtherEntity.setField(STRING_FIELD_NAME, L_THIRD); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWith4Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); final Entity thirdOtherEntity = new DefaultEntity(dataDefinition); final Entity fourthOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdOtherEntity.setField(BELONGS_TO_FIELD_NAME, fourthOtherEntity); thirdOtherEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntity); fourthOtherEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when boolean result = false; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } assertTrue(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWith4Entities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); final Entity thirdOtherEntity = new DefaultEntity(dataDefinition); final Entity fourthOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdOtherEntity.setField(BELONGS_TO_FIELD_NAME, fourthOtherEntity); thirdOtherEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntity); fourthOtherEntity.setField(STRING_FIELD_NAME, L_DIFFERENCE); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } assertFalse(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWith2DeeplyNestedEntities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); final Entity thirdOtherEntity = new DefaultEntity(dataDefinition); final Entity fourthOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdOtherEntity.setField(BELONGS_TO_FIELD_NAME, fourthOtherEntity); thirdOtherEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); fourthOtherEntity.setField(STRING_FIELD_NAME, L_FOURTH); // when boolean result = false; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWith2DeeplyNestedEntities() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity thirdEntity = new DefaultEntity(dataDefinition); final Entity fourthEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); final Entity thirdOtherEntity = new DefaultEntity(dataDefinition); final Entity fourthOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdEntity.setField(BELONGS_TO_FIELD_NAME, fourthEntity); thirdEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthEntity.setField(BELONGS_TO_FIELD_NAME, thirdEntity); fourthEntity.setField(STRING_FIELD_NAME, L_FOURTH); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); thirdOtherEntity.setField(BELONGS_TO_FIELD_NAME, fourthOtherEntity); thirdOtherEntity.setField(STRING_FIELD_NAME, L_THIRD); fourthOtherEntity.setField(BELONGS_TO_FIELD_NAME, thirdOtherEntity); fourthOtherEntity.setField(STRING_FIELD_NAME, L_DIFFERENCE); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWithHasManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setId(2L); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnsFalseAndDoNotMakeInfinityCycleWithHasManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithHasManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setId(1L); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setId(2L); firstOtherEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setId(1L); secondOtherEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntity); secondOtherEntity.setId(2L); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithHasManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(BELONGS_TO_FIELD_NAME, secondEntity); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(BELONGS_TO_FIELD_NAME, firstEntity); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); firstOtherEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setField(BELONGS_TO_FIELD_NAME, secondOtherEntity); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(HAS_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setField(BELONGS_TO_FIELD_NAME, firstOtherEntity); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWithManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnsFalseAndDoNotMakeInfinityCycleWithManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithManyToManyField() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); firstOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setId(1L); secondOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setId(2L); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithManyToManyFieldWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); firstOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithTwoManyToManyFields() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); firstOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setId(1L); secondOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setId(2L); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWithTwoManyToManyFields2() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setId(1L); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setId(2L); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnFalseAndDoNotMakeInfinityCycleWithTwoManyToManyFieldsWithoutId2() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertFalse(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithTwoManyToManyFieldsWithoutId2() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_FIRST); // when boolean result = true; try { result = firstEntity.equals(secondEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnTrueAndDoNotMakeInfinityCycleWithTwoManyToManyFieldsWithoutId() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); final Entity secondEntity = new DefaultEntity(dataDefinition); final Entity firstOtherEntity = new DefaultEntity(dataDefinition); final Entity secondOtherEntity = new DefaultEntity(dataDefinition); firstEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondEntity)); firstEntity.setField(STRING_FIELD_NAME, L_FIRST); secondEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstEntity)); secondEntity.setField(STRING_FIELD_NAME, L_SECOND); firstOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(secondOtherEntity)); firstOtherEntity.setField(STRING_FIELD_NAME, L_FIRST); secondOtherEntity.setField(MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setField(SECOND_MANY_TO_MANY_FIELD_NAME, Lists.newArrayList(firstOtherEntity)); secondOtherEntity.setField(STRING_FIELD_NAME, L_SECOND); // when boolean result = true; try { result = firstEntity.equals(firstOtherEntity); } catch (StackOverflowError e) { Assert.fail(); } // then assertTrue(result); } @Test public final void shouldEqualsReturnsFalseForNullArgument() { // given final Entity firstEntity = new DefaultEntity(dataDefinition); // when boolean areEquals = firstEntity.equals(null); // then assertFalse(areEquals); } @Test public final void shouldFlatEqualsReturnsFalseForNullArgument() { // given final DefaultEntity firstEntity = new DefaultEntity(dataDefinition); // when boolean areEquals = firstEntity.flatEquals(null); // then assertFalse(areEquals); } private List<Entity> getListOfMockEntities() { Entity e1 = mock(Entity.class); Entity e2 = mock(Entity.class); Entity e3 = mock(Entity.class); when(e1.getId()).thenReturn(1L); when(e2.getId()).thenReturn(2L); when(e3.getId()).thenReturn(3L); return Lists.newArrayList(e1, e2, e3); } @Test public final void shouldReturnDateValue() throws Exception { // given Date date = new Date(); defaultEntity.setField(DATE_FIELD_NAME, date); // when Date result = defaultEntity.getDateField(DATE_FIELD_NAME); // then Assert.assertNotNull(result); Assert.assertEquals(date, result); } @Test public final void shouldReturnNullIfDateFieldIsNull() throws Exception { // given defaultEntity.setField(DATE_FIELD_NAME, null); // when Date result = defaultEntity.getDateField(DATE_FIELD_NAME); // then Assert.assertNull(result); } @Test public final void shouldReturnDateValueFromLong() throws Exception { // given Date date = new Date((Long) 600000L); defaultEntity.setField(DATE_FIELD_NAME, date); // when Date result = defaultEntity.getDateField(DATE_FIELD_NAME); // then Assert.assertNotNull(result); Assert.assertEquals(date, result); } }