From aa932fab6daa95cf78fe055519ab283769c6c9dc Mon Sep 17 00:00:00 2001 From: szirbucz Date: Sat, 30 Mar 2019 20:01:32 +0100 Subject: [PATCH] Compute matrix diagonal on normalization #252 (#304) * Compute matrix diagonal on normalization #252 --- .../rulez/demokracia/pdengine/BeatTable.java | 2 +- .../demokracia/pdengine/Normalizable.java | 14 ++++++ .../pdengine/dataobjects/PairEntity.java | 2 +- .../pdengine/persistence/BaseEntity.java | 23 ++++++--- .../pdengine/BaseEntityHashEqualsTest.java | 47 +++++++++++++++++++ .../pdengine/BeatTableNormalizationTest.java | 36 ++++++++++++++ 6 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/rulez/demokracia/pdengine/Normalizable.java create mode 100644 src/test/java/org/rulez/demokracia/pdengine/BaseEntityHashEqualsTest.java create mode 100644 src/test/java/org/rulez/demokracia/pdengine/BeatTableNormalizationTest.java diff --git a/src/main/java/org/rulez/demokracia/pdengine/BeatTable.java b/src/main/java/org/rulez/demokracia/pdengine/BeatTable.java index 2841970e..dc1328de 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/BeatTable.java +++ b/src/main/java/org/rulez/demokracia/pdengine/BeatTable.java @@ -6,7 +6,7 @@ import org.rulez.demokracia.pdengine.dataobjects.Pair; import org.rulez.demokracia.types.MapMatrix; -public class BeatTable extends MapMatrix implements TransitiveClosable { +public class BeatTable extends MapMatrix implements TransitiveClosable, Normalizable { private static final long serialVersionUID = 1L; public enum Direction { diff --git a/src/main/java/org/rulez/demokracia/pdengine/Normalizable.java b/src/main/java/org/rulez/demokracia/pdengine/Normalizable.java new file mode 100644 index 00000000..f7440358 --- /dev/null +++ b/src/main/java/org/rulez/demokracia/pdengine/Normalizable.java @@ -0,0 +1,14 @@ +package org.rulez.demokracia.pdengine; +import org.rulez.demokracia.pdengine.dataobjects.Pair; + +public interface Normalizable extends ContainingBeats { + + long serialVersionUID = 1L; + + default void normalize() { + for (String key : getKeyCollection()) { + setElement(key, key, new Pair(0, 0)); + } + } + +} diff --git a/src/main/java/org/rulez/demokracia/pdengine/dataobjects/PairEntity.java b/src/main/java/org/rulez/demokracia/pdengine/dataobjects/PairEntity.java index 47776dbf..6488f0b9 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/dataobjects/PairEntity.java +++ b/src/main/java/org/rulez/demokracia/pdengine/dataobjects/PairEntity.java @@ -3,7 +3,7 @@ import org.rulez.demokracia.pdengine.persistence.BaseEntity; public class PairEntity extends BaseEntity { - + private static final long serialVersionUID = 1L; public int winning; public int losing; diff --git a/src/main/java/org/rulez/demokracia/pdengine/persistence/BaseEntity.java b/src/main/java/org/rulez/demokracia/pdengine/persistence/BaseEntity.java index 11704a6d..18b0f27e 100644 --- a/src/main/java/org/rulez/demokracia/pdengine/persistence/BaseEntity.java +++ b/src/main/java/org/rulez/demokracia/pdengine/persistence/BaseEntity.java @@ -7,6 +7,8 @@ import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.rulez.demokracia.pdengine.RandomUtils; @Entity @@ -14,12 +16,21 @@ public abstract class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; - + @Id public String id; - - public BaseEntity() { - id = RandomUtils.createRandomKey(); - } - + + public BaseEntity() { + id = RandomUtils.createRandomKey(); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this, "id"); + } + + @Override + public boolean equals(final Object other) { + return EqualsBuilder.reflectionEquals(this, other, "id"); + } } diff --git a/src/test/java/org/rulez/demokracia/pdengine/BaseEntityHashEqualsTest.java b/src/test/java/org/rulez/demokracia/pdengine/BaseEntityHashEqualsTest.java new file mode 100644 index 00000000..0f190179 --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/BaseEntityHashEqualsTest.java @@ -0,0 +1,47 @@ +package org.rulez.demokracia.pdengine; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +import org.junit.Test; +import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; +import org.rulez.demokracia.pdengine.annotations.TestedFeature; +import org.rulez.demokracia.pdengine.annotations.TestedOperation; +import org.rulez.demokracia.pdengine.dataobjects.Pair; +import org.rulez.demokracia.pdengine.dataobjects.VoteEntity; + +@TestedFeature("Supporting functionality") +@TestedOperation("BaseEntity") +@TestedBehaviour("None of the entities count id into the equals and hashCode.") +public class BaseEntityHashEqualsTest { + + + @Test + public void entities_with_equal_fields_are_equal() { + Pair pair1 = new Pair(12, 42); + Pair pair2 = new Pair(12, 42); + assertNotEquals(pair1.id, pair2.id); + assertEquals(pair1, pair2); + } + + @Test + public void entities_with_different_fields_are_not_equal() { + Pair pair1 = new Pair(12, 42); + Pair pair2 = new Pair(12, 69); + assertNotEquals(pair1, pair2); + } + + @Test + public void equal_entities_have_the_same_hash_code() { + Pair pair1 = new Pair(12, 42); + Pair pair2 = new Pair(12, 42); + assertEquals(pair1.hashCode(), pair2.hashCode()); + } + + @Test + public void hashCode_should_return_different_hash_on_different_entities() { + Pair pair = new Pair(10, 10); + VoteEntity vote = new VoteEntity(); + assertNotEquals(pair.hashCode(), vote.hashCode()); + } +} \ No newline at end of file diff --git a/src/test/java/org/rulez/demokracia/pdengine/BeatTableNormalizationTest.java b/src/test/java/org/rulez/demokracia/pdengine/BeatTableNormalizationTest.java new file mode 100644 index 00000000..d9282231 --- /dev/null +++ b/src/test/java/org/rulez/demokracia/pdengine/BeatTableNormalizationTest.java @@ -0,0 +1,36 @@ +package org.rulez.demokracia.pdengine; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; +import org.rulez.demokracia.pdengine.annotations.TestedBehaviour; +import org.rulez.demokracia.pdengine.annotations.TestedFeature; +import org.rulez.demokracia.pdengine.annotations.TestedOperation; +import org.rulez.demokracia.pdengine.dataobjects.Pair; +import org.rulez.demokracia.pdengine.exception.ReportedException; +import org.rulez.demokracia.pdengine.testhelpers.CreatedBeatTable; + +@TestedFeature("Schulze method") +@TestedOperation("normalize beat matrix") +public class BeatTableNormalizationTest extends CreatedBeatTable { + + @Override + @Before + public void setUp() throws ReportedException { + super.setUp(); + createNewBeatTableWithComplexData(); + } + + @TestedBehaviour("the diagonal elements are (0,0)") + @Test + public void normalization_sets_the_diagonal_to_0_0() { + beatTable.normalize(); + beatTable.getKeyCollection().forEach(k -> assertDiagonalElementIsZero(k)); + } + + private void assertDiagonalElementIsZero(final String key) { + Pair element = beatTable.getElement(key, key); + assertEquals(new Pair(0, 0), element); + } +}