ISIS-943: Make ObjectContracts more resilient
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/b1a0f1de Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/b1a0f1de Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/b1a0f1de Branch: refs/heads/master Commit: b1a0f1de8685661366154b156d50466363804ee8 Parents: 2909e64 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Fri Nov 7 17:12:07 2014 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Mon Nov 10 10:21:47 2014 +0000 ---------------------------------------------------------------------- .../isis/applib/util/ObjectContracts.java | 11 ++- .../applib/util/ObjectContractsTest_equals.java | 91 ++++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/b1a0f1de/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java index 3e88c72..281fa52 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java +++ b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java @@ -16,13 +16,11 @@ */ package org.apache.isis.applib.util; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Comparator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; - import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; @@ -73,6 +71,15 @@ public class ObjectContracts { } public static boolean equals(Object p, Object q, String propertyNames) { + if(p==null && q==null) { + return true; + } + if(p==null || q==null) { + return false; + } + if(p.getClass() != q.getClass()) { + return false; + } for (final Clause clause : iterable(propertyNames)) { final Object pValue = clause.getValueOf(p); final Object qValue = clause.getValueOf(q); http://git-wip-us.apache.org/repos/asf/isis/blob/b1a0f1de/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_equals.java ---------------------------------------------------------------------- diff --git a/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_equals.java b/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_equals.java new file mode 100644 index 0000000..5526e4f --- /dev/null +++ b/core/applib/src/test/java/org/apache/isis/applib/util/ObjectContractsTest_equals.java @@ -0,0 +1,91 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.isis.applib.util; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ObjectContractsTest_equals { + + static class Invoice4 { + private static final String KEY_PROPERTIES = "number"; + + private String number; + public String getNumber() { + return number; + } + public void setNumber(String number) { + this.number = number; + } + @Override + public int hashCode() { + return ObjectContracts.hashCode(this, KEY_PROPERTIES); + } + @Override + public boolean equals(Object obj) { + return ObjectContracts.equals(this, obj, KEY_PROPERTIES); + } + + } + + private Invoice4 p; + private Invoice4 q; + private Invoice4 r; + private String x; + + @Before + public void setUp() throws Exception { + p = new Invoice4(); + p.setNumber("123"); + q = new Invoice4(); + q.setNumber("123"); + r = new Invoice4(); + r.setNumber("456"); + + x = "this is not an invoice"; + } + + @Test + public void happyCase() throws Exception { + assertTrue(ObjectContracts.equals(p, q, "number")); + } + + @Test + public void nullsAreEqual() throws Exception { + assertTrue(ObjectContracts.equals(null, null, "number")); + } + + @Test + public void notEqualDifferentValues() throws Exception { + assertFalse(ObjectContracts.equals(p, r, "number")); + } + + @Test + public void notEqualDifferentTypes() throws Exception { + assertFalse(ObjectContracts.equals(p, x, "number")); + } + + @Test + public void notEqualNull() throws Exception { + assertFalse(ObjectContracts.equals(p, null, "number")); + } + + +}