diff --git a/src/main/java/org/greenbytes/http/sfv/BooleanItem.java b/src/main/java/org/greenbytes/http/sfv/BooleanItem.java index 41485cb..6ff222b 100644 --- a/src/main/java/org/greenbytes/http/sfv/BooleanItem.java +++ b/src/main/java/org/greenbytes/http/sfv/BooleanItem.java @@ -63,4 +63,19 @@ public String serialize() { public Boolean get() { return value; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof BooleanItem)) { + return false; + } else { + BooleanItem that = (BooleanItem) o; + return value == that.value && Objects.equals(params, that.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/ByteSequenceItem.java b/src/main/java/org/greenbytes/http/sfv/ByteSequenceItem.java index c0fcd29..e92b16a 100644 --- a/src/main/java/org/greenbytes/http/sfv/ByteSequenceItem.java +++ b/src/main/java/org/greenbytes/http/sfv/ByteSequenceItem.java @@ -1,6 +1,7 @@ package org.greenbytes.http.sfv; import java.nio.ByteBuffer; +import java.util.Arrays; import java.util.Base64; import java.util.Objects; @@ -68,4 +69,19 @@ public ByteBuffer get() { // stays immutable return ByteBuffer.wrap(this.value.clone()); } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ByteSequenceItem)) { + return false; + } else { + ByteSequenceItem that = (ByteSequenceItem) o; + return Objects.deepEquals(value, that.value) && Objects.equals(params, that.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(Arrays.hashCode(value), params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/DateItem.java b/src/main/java/org/greenbytes/http/sfv/DateItem.java index 3874bd5..f29d50c 100644 --- a/src/main/java/org/greenbytes/http/sfv/DateItem.java +++ b/src/main/java/org/greenbytes/http/sfv/DateItem.java @@ -77,4 +77,19 @@ public long getAsLong() { public int getDivisor() { return 1; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DateItem)) { + return false; + } else { + DateItem dateItem = (DateItem) o; + return value == dateItem.value && Objects.equals(params, dateItem.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/DecimalItem.java b/src/main/java/org/greenbytes/http/sfv/DecimalItem.java index 6a8c265..515e7e6 100644 --- a/src/main/java/org/greenbytes/http/sfv/DecimalItem.java +++ b/src/main/java/org/greenbytes/http/sfv/DecimalItem.java @@ -120,4 +120,19 @@ public long getAsLong() { public int getDivisor() { return 1000; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DecimalItem)) { + return false; + } else { + DecimalItem that = (DecimalItem) o; + return value == that.value && Objects.equals(params, that.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/DisplayStringItem.java b/src/main/java/org/greenbytes/http/sfv/DisplayStringItem.java index bd92f10..2ef008c 100755 --- a/src/main/java/org/greenbytes/http/sfv/DisplayStringItem.java +++ b/src/main/java/org/greenbytes/http/sfv/DisplayStringItem.java @@ -72,4 +72,19 @@ public String serialize() { public String get() { return this.value; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DisplayStringItem)) { + return false; + } else { + DisplayStringItem that = (DisplayStringItem) o; + return Objects.equals(value, that.value) && Objects.equals(params, that.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/InnerList.java b/src/main/java/org/greenbytes/http/sfv/InnerList.java index 1ef0b4f..648677d 100644 --- a/src/main/java/org/greenbytes/http/sfv/InnerList.java +++ b/src/main/java/org/greenbytes/http/sfv/InnerList.java @@ -74,4 +74,19 @@ public String serialize() { public List> get() { return value; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof InnerList)) { + return false; + } else { + InnerList innerList = (InnerList) o; + return Objects.equals(value, innerList.value) && Objects.equals(params, innerList.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/IntegerItem.java b/src/main/java/org/greenbytes/http/sfv/IntegerItem.java index 959f193..d261f7b 100644 --- a/src/main/java/org/greenbytes/http/sfv/IntegerItem.java +++ b/src/main/java/org/greenbytes/http/sfv/IntegerItem.java @@ -76,4 +76,19 @@ public long getAsLong() { public int getDivisor() { return 1; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof IntegerItem)) { + return false; + } else { + IntegerItem that = (IntegerItem) o; + return value == that.value && Objects.equals(params, that.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/OuterList.java b/src/main/java/org/greenbytes/http/sfv/OuterList.java index dd8dbc0..3faa40b 100644 --- a/src/main/java/org/greenbytes/http/sfv/OuterList.java +++ b/src/main/java/org/greenbytes/http/sfv/OuterList.java @@ -51,4 +51,19 @@ public String serialize() { public List> get() { return value; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof OuterList)) { + return false; + } else { + OuterList list = (OuterList) o; + return Objects.equals(value, list.value); + } + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/StringItem.java b/src/main/java/org/greenbytes/http/sfv/StringItem.java index cc0323f..e859f9f 100644 --- a/src/main/java/org/greenbytes/http/sfv/StringItem.java +++ b/src/main/java/org/greenbytes/http/sfv/StringItem.java @@ -79,4 +79,19 @@ private static String checkParam(String value) { } return value; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof StringItem)) { + return false; + } else { + StringItem that = (StringItem) o; + return Objects.equals(value, that.value) && Objects.equals(params, that.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/main/java/org/greenbytes/http/sfv/TokenItem.java b/src/main/java/org/greenbytes/http/sfv/TokenItem.java index fac9dc6..899677a 100644 --- a/src/main/java/org/greenbytes/http/sfv/TokenItem.java +++ b/src/main/java/org/greenbytes/http/sfv/TokenItem.java @@ -74,4 +74,19 @@ private static String checkParam(String value) { } return value; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof TokenItem)) { + return false; + } else { + TokenItem tokenItem = (TokenItem) o; + return Objects.equals(value, tokenItem.value) && Objects.equals(params, tokenItem.params); + } + } + + @Override + public int hashCode() { + return Objects.hash(value, params); + } } diff --git a/src/test/java/org/greenbytes/http/sfv/EqualityTest.java b/src/test/java/org/greenbytes/http/sfv/EqualityTest.java new file mode 100644 index 0000000..dfdee17 --- /dev/null +++ b/src/test/java/org/greenbytes/http/sfv/EqualityTest.java @@ -0,0 +1,193 @@ +package org.greenbytes.http.sfv; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +public class EqualityTest { + + + @Test + public void testParametersEquality() { + HashMap m1 = new LinkedHashMap<>(); + m1.put("a", "b"); + HashMap m2 = new LinkedHashMap<>(); + m2.put("a", "b"); + Parameters p1 = Parameters.valueOf(m1); + Parameters p2 = Parameters.valueOf(m2); + assertFalse(p1 == p2); + assertEquals(p1, p2); + } + + @Test + public void testStringItemEquality() { + StringItem s1 = StringItem.valueOf("a"); + StringItem s2 = StringItem.valueOf("a"); + assertFalse(s1 == s2); + assertEquals(s1, s2); + StringItem s3 = StringItem.valueOf("b"); + assertNotEquals(s1, s3); + + StringItem s4 = StringItem.valueOf("a").withParams(getParameters("a", "b")); + assertFalse(s1 == s4); + assertNotEquals(s1, s4); + + HashMap m5 = new LinkedHashMap<>(); + m5.put("c", "d"); + Parameters p5 = Parameters.valueOf(m5); + StringItem s5 = StringItem.valueOf("a").withParams(p5); + assertFalse(s4 == s5); + assertNotEquals(s4, s5); + } + + @Test + public void testTokenItemEquality() { + TokenItem t1 = TokenItem.valueOf("a"); + TokenItem t = TokenItem.valueOf("a"); + assertFalse(t1 == t); + assertEquals(t1, t); + TokenItem t3 = TokenItem.valueOf("b"); + assertNotEquals(t1, t3); + + TokenItem t4 = TokenItem.valueOf("a").withParams(getParameters("a", "b")); + assertFalse(t1 == t4); + assertNotEquals(t1, t4); + + TokenItem t5 = TokenItem.valueOf("a").withParams(getParameters("c", "d")); + assertFalse(t4 == t5); + assertNotEquals(t4, t5); + } + + @Test + public void testBooleanItemEquality() { + BooleanItem b1 = BooleanItem.valueOf(true); + BooleanItem b2 = BooleanItem.valueOf(true); + BooleanItem b3 = BooleanItem.valueOf(false); + + // FALSE and TRUE are singletons + assertTrue(b1 == b2); + assertEquals(b1, b2); + + assertFalse(b1 == b3); + assertNotEquals(b1, b3); + + BooleanItem b4 = BooleanItem.valueOf(false).withParams(getParameters("c", "d")); + assertFalse(b1 == b4); + assertNotEquals(b1, b4); + } + + @Test + public void testByteSequenceItemEquality() { + ByteSequenceItem b1 = ByteSequenceItem.valueOf("x".getBytes()); + ByteSequenceItem b2 = ByteSequenceItem.valueOf("x".getBytes()); + ByteSequenceItem b3 = ByteSequenceItem.valueOf("y".getBytes()); + + assertFalse(b1 == b2); + assertEquals(b1, b2); + + assertFalse(b1 == b3); + assertNotEquals(b1, b3); + + ByteSequenceItem b4 = b1.withParams(getParameters("c", "d")); + assertFalse(b1 == b4); + assertNotEquals(b1, b4); + } + + @Test + public void testDateItemEquality() { + DateItem d1 = DateItem.valueOf(0); + DateItem d2 = DateItem.valueOf(0); + DateItem d3 = DateItem.valueOf(1000); + + assertFalse(d1 == d2); + assertEquals(d1, d2); + + assertFalse(d1 == d3); + assertNotEquals(d1, d3); + + DateItem d4 = d1.withParams(getParameters("c", "d")); + assertFalse(d1 == d4); + assertNotEquals(d1, d4); + } + + @Test + public void testDecimalItemEquality() { + DecimalItem d1 = DecimalItem.valueOf(BigDecimal.valueOf(10.5)); + DecimalItem d2 = DecimalItem.valueOf(BigDecimal.valueOf(10.5)); + DecimalItem d3 = DecimalItem.valueOf(BigDecimal.valueOf(10.6)); + + assertFalse(d1 == d2); + assertEquals(d1, d2); + + assertFalse(d1 == d3); + assertNotEquals(d1, d3); + + DecimalItem d4 = d1.withParams(getParameters("c", "d")); + assertFalse(d1 == d4); + assertNotEquals(d1, d4); + } + + @Test + public void testDisplayStringItemEquality() { + DisplayStringItem d1 = DisplayStringItem.valueOf("abc"); + DisplayStringItem d2 = DisplayStringItem.valueOf("abc"); + DisplayStringItem d3 = DisplayStringItem.valueOf("def"); + + assertFalse(d1 == d2); + assertEquals(d1, d2); + + assertFalse(d1 == d3); + assertNotEquals(d1, d3); + + DisplayStringItem d4 = d1.withParams(getParameters("c", "d")); + assertFalse(d1 == d4); + assertNotEquals(d1, d4); + } + + @Test + public void testIntegerItemEquality() { + IntegerItem i1 = IntegerItem.valueOf(1); + IntegerItem i2 = IntegerItem.valueOf(1); + IntegerItem i3 = IntegerItem.valueOf(2); + + assertFalse(i1 == i2); + assertEquals(i1, i2); + + assertFalse(i1 == i3); + assertNotEquals(i1, i3); + + IntegerItem d4 = i1.withParams(getParameters("a", "b")); + assertFalse(i1 == d4); + assertNotEquals(i1, d4); + } + + @Test + public void testOuterListEquality() { + BooleanItem b = BooleanItem.valueOf(true); + DecimalItem d = DecimalItem.valueOf(BigDecimal.valueOf(10.5)); + + OuterList l1 = OuterList.valueOf((Arrays.asList(b, d))); + OuterList l2 = OuterList.valueOf((Arrays.asList(b, d))); + OuterList l3 = OuterList.valueOf((Arrays.asList(b, d, b))); + + assertFalse(l1 == l2); + assertEquals(l1, l2); + + assertFalse(l1 == l3); + assertNotEquals(l1, l3); + } + + private static Parameters getParameters(String a, String b) { + HashMap m = new LinkedHashMap<>(); + m.put(a, b); + return Parameters.valueOf(m); + } +} diff --git a/src/test/java/org/greenbytes/http/sfv/ParametersTest.java b/src/test/java/org/greenbytes/http/sfv/ParametersTest.java index c88f86c..3193408 100644 --- a/src/test/java/org/greenbytes/http/sfv/ParametersTest.java +++ b/src/test/java/org/greenbytes/http/sfv/ParametersTest.java @@ -2,7 +2,14 @@ import org.junit.Test; +import java.math.BigDecimal; +import java.util.Arrays; import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; public class ParametersTest { @@ -54,4 +61,24 @@ public void testReplace3() { public void testReplaceAll1() { params.replaceAll(null); } + + + @Test + public void testParametersEquality() { + Map m1 = new HashMap(); + m1.put("a", BooleanItem.valueOf(true)); + Map m2 = new HashMap(); + m2.put("b", IntegerItem.valueOf(12)); + m2.put("c", StringItem.valueOf("hello")); + + Parameters p1 = Parameters.valueOf(m1); + Parameters p2 = Parameters.valueOf(m1); + Parameters p3 = Parameters.valueOf(m2); + + assertFalse(p1 == p2); + assertEquals(p1, p2); + + assertFalse(p1 == p3); + assertNotEquals(p1, p3); + } } \ No newline at end of file