001package beginner;
002
003import com.sandwich.koan.Koan;
004
005import static com.sandwich.koan.constant.KoanConstants.__;
006import static com.sandwich.util.Assert.assertEquals;
007
008public class AboutEquality {
009
010    @Koan
011    public void doubleEqualsTestsIfTwoObjectsAreTheSame() {
012        Object object = new Object();
013        Object sameObject = object;
014        assertEquals(object == sameObject, __);
015        assertEquals(object == new Object(), __);
016    }
017
018    @Koan
019    public void equalsMethodByDefaultTestsIfTwoObjectsAreTheSame() {
020        Object object = new Object();
021        assertEquals(object.equals(object), __);
022        assertEquals(object.equals(new Object()), __);
023    }
024
025    @Koan
026    public void equalsMethodCanBeChangedBySubclassesToTestsIfTwoObjectsAreEqual() {
027        Object object = new Integer(1);
028        assertEquals(object.equals(object), __);
029        assertEquals(object.equals(new Integer(1)), __);
030        // Note: This means that for the class 'Object' there is no difference between 'equal' and 'same'
031        // but for the class 'Integer' there is difference - see below
032    }
033
034    @Koan
035    public void equalsMethodCanBeChangedBySubclassesToTestsIfTwoObjectsAreEqualExample() {
036        Integer value1 = new Integer(4);
037        Integer value2 = new Integer(2 + 2);
038        assertEquals(value1.equals(value2), __);
039        assertEquals(value1, __);
040    }
041
042    @Koan
043    public void objectsNeverEqualNull() {
044        assertEquals(new Object().equals(null), __);
045    }
046
047    @Koan
048    public void objectsEqualThemselves() {
049        Object obj = new Object();
050        assertEquals(obj.equals(obj), __);
051    }
052}