Search code examples
javajunitjavafxobservablecollectionobservablelist

Comparing two observableLists in Junit


I've tried to check whether two lists are the same using assertEquals and this works just fine but when tried to change the lists to observableList, the test failed.

So how can I compare two observable lists in JUnit? I would like to compare only the content of the lists. Basically, these observableLists contain Point objects and in the Point class I've got hashCodeBuilder and equalsBuilder methods. The hashCode() and equals() methods were needed for the list comparison but I'm not sure whether they are needed for the ObservableList.

public class TestClass {
    private MyClass myclass;
    ObservableList<Point> TestPoints = FXCollections.observableArrayList();

    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        myclass = new MyClass();

        TestPoints.add(new Point(300.0,200.0));
        TestPoints.add(new Point(600.0,500.0));
        TestPoints.add(new Point(100.0,100.0));
        TestPoints.add(new Point(200.0,200.0));
        TestPoints.add(new Point(100.0,500.0));
        TestPoints.add(new Point(600.0,100.0));
    }

    @Test
    public void testClass() {
        ObservableList<Point> expectedResult = FXCollections.observableArrayList();
        expectedResult.add(new Point(100.0,100.0));
        expectedResult.add(new Point(100.0,500.0));
        expectedResult.add(new Point(600.0,500.0));
        expectedResult.add(new Point(600.0,100.0));

        ObservableList<Point> actualResult = FXCollections.observableArrayList();
        actualResult = myclass.giftWrapping(TestPoints);

        assertEquals(expectedResult, actualResult);
    }

This is the point class

public class Point {

    private final DoubleProperty x;
    private final DoubleProperty y;

    public Point() {
        this(0, 0);
    }

    public Point(double x, double y) {
        this.x = new SimpleDoubleProperty(x);
        this.y = new SimpleDoubleProperty(y);
    }
@Override
public int hashCode() {
    HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
    hashCodeBuilder.append(x);
    hashCodeBuilder.append(y);
    return hashCodeBuilder.toHashCode();
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (!(obj instanceof Point)) {
        return false;
    }
    Point other = (Point) obj;
    EqualsBuilder equalsBuilder = new EqualsBuilder();
    equalsBuilder.append(x, other.x);
    equalsBuilder.append(y, other.y);
    return equalsBuilder.isEquals();
}

This would work if i used a List but doesn't not work if i Used an observableList


Solution

  • Basically the problem to this question was in the equals and hashCode methods. The variable x and the variable y had to be converted into doubles as they are initially of type DoubleProperty. So the equals and hashCode methods in the Point class should be as follows

    @Override
        public int hashCode() {
            HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
            hashCodeBuilder.append(x.doubleValue());
            hashCodeBuilder.append(y.doubleValue());
            return hashCodeBuilder.toHashCode();
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (!(obj instanceof Point)) {
                return false;
            }
            Point other = (Point) obj;
            EqualsBuilder equalsBuilder = new EqualsBuilder();
            equalsBuilder.append(x.doubleValue(), other.x.doubleValue());
            equalsBuilder.append(y.doubleValue(), other.y.doubleValue());
            return equalsBuilder.isEquals();
        }
    

    This will enable the test to pass