diff options
Diffstat (limited to 'vespajlib/src')
5 files changed, 198 insertions, 212 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/slime/Inspector.java b/vespajlib/src/main/java/com/yahoo/slime/Inspector.java index 948a810a39e..b52d0f0272c 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/Inspector.java +++ b/vespajlib/src/main/java/com/yahoo/slime/Inspector.java @@ -144,5 +144,5 @@ public interface Inspector { * @param that inspector. * @return true if they are equal. */ - boolean equalTo(Inspector that); + default boolean equalTo(Inspector that) { return SlimeUtils.equalTo(this, that); } } diff --git a/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java b/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java index 970c71abb8a..f9230ab6df6 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java +++ b/vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; +import java.util.Arrays; import java.util.Iterator; import java.util.Optional; import java.util.OptionalDouble; @@ -165,4 +166,81 @@ public class SlimeUtils { false); } + private static class Equal { + protected final Inspector rhsInspector; + + protected boolean equal = true; + + public Equal(Inspector rhsInspector) { this.rhsInspector = rhsInspector; } + + public boolean isEqual() { return equal; } + } + + private static class EqualArray extends Equal implements ArrayTraverser { + public EqualArray(Inspector rhsInspector) { super(rhsInspector); } + + @Override + public void entry(int idx, Inspector inspector) { + if (equal) { + equal = inspector.equalTo(rhsInspector.entry(idx)); + } + } + } + + private static class EqualObject extends Equal implements ObjectTraverser { + public EqualObject(Inspector rhsInspector) { super(rhsInspector); } + + @Override + public void field(String name, Inspector inspector) { + if (equal) { + equal = inspector.equalTo(rhsInspector.field(name)); + } + } + } + + public static boolean equalTo(Inspector a, Inspector b) { + boolean equal = a.type() == b.type(); + + if (equal) { + switch (a.type()) { + case NIX: + equal = a.valid() == b.valid(); + break; + case BOOL: + equal = a.asBool() == b.asBool(); + break; + case LONG: + equal = a.asLong() == b.asLong(); + break; + case DOUBLE: + equal = Double.compare(a.asDouble(), b.asDouble()) == 0; + break; + case STRING: + equal = a.asString().equals(b.asString()); + break; + case DATA: + equal = Arrays.equals(a.asData(), b.asData()); + break; + case ARRAY: + { + var traverser = new EqualArray(b); + a.traverse(traverser); + equal = traverser.isEqual() && (a.entries() == b.entries()); + } + break; + case OBJECT: + { + var traverser = new EqualObject(b); + a.traverse(traverser); + equal = traverser.isEqual() && (a.fields() == b.fields()); + } + break; + default: + assert(false); + break; + } + } + + return equal; + } } diff --git a/vespajlib/src/main/java/com/yahoo/slime/Value.java b/vespajlib/src/main/java/com/yahoo/slime/Value.java index 985fed6c6bb..1943e77663f 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/Value.java +++ b/vespajlib/src/main/java/com/yahoo/slime/Value.java @@ -2,7 +2,6 @@ package com.yahoo.slime; import java.io.ByteArrayOutputStream; -import java.util.Arrays; import java.util.function.Consumer; /** @@ -91,83 +90,4 @@ abstract class Value implements Cursor { return "null"; } } - - private static class Equal { - protected final Inspector rhsInspector; - - protected boolean equal = true; - - public Equal(Inspector rhsInspector) { this.rhsInspector = rhsInspector; } - - public boolean isEqual() { return equal; } - } - - private static class EqualArray extends Equal implements ArrayTraverser { - public EqualArray(Inspector rhsInspector) { super(rhsInspector); } - - @Override - public void entry(int idx, Inspector inspector) { - if (equal) { - equal = inspector.equalTo(rhsInspector.entry(idx)); - } - } - } - - private static class EqualObject extends Equal implements ObjectTraverser { - public EqualObject(Inspector rhsInspector) { super(rhsInspector); } - - @Override - public void field(String name, Inspector inspector) { - if (equal) { - equal = inspector.equalTo(rhsInspector.field(name)); - } - } - } - - @Override - public boolean equalTo(Inspector that) { - boolean equal = type() == that.type(); - - if (equal) { - switch (type()) { - case NIX: - equal = valid() == that.valid(); - break; - case BOOL: - equal = asBool() == that.asBool(); - break; - case LONG: - equal = asLong() == that.asLong(); - break; - case DOUBLE: - equal = Double.compare(asDouble(), that.asDouble()) == 0; - break; - case STRING: - equal = asString().equals(that.asString()); - break; - case DATA: - equal = Arrays.equals(asData(), that.asData()); - break; - case ARRAY: - { - var traverser = new EqualArray(that); - traverse(traverser); - equal = traverser.isEqual() && (entries() == that.entries()); - } - break; - case OBJECT: - { - var traverser = new EqualObject(that); - traverse(traverser); - equal = traverser.isEqual() && (fields() == that.fields()); - } - break; - default: - assert(false); - break; - } - } - - return equal; - } } diff --git a/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java b/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java index 95a0ef4319e..47f835a42e7 100644 --- a/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java +++ b/vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java @@ -7,11 +7,14 @@ import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; +import java.nio.charset.StandardCharsets; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; + /** * @author Ulf Lilleengen */ @@ -110,4 +113,120 @@ public class SlimeUtilsTest { SlimeUtils.entriesStream(inspector.field("list")).map(Inspector::asLong).toList()); } + @Test + public void verifyObjectEquality() { + Slime slimeLeft = new Slime(); + Cursor left = slimeLeft.setObject(); + left.setString("a", "A"); + left.setString("b", "B"); + + Slime slimeRight = new Slime(); + Cursor right = slimeRight.setObject(); + right.setString("b", "B"); + right.setString("a", "A"); + + assertTrue(left.equalTo(right)); + assertTrue(right.equalTo(left)); + assertTrue(left.equalTo(left)); + + right.setString("c", "C"); + assertFalse(left.equalTo(right)); + assertFalse(right.equalTo(left)); + } + + @Test + public void verifyArrayEquality() { + Slime slimeLeft = new Slime(); + Cursor left = slimeLeft.setArray(); + left.addArray().addString("a"); + left.addArray().addString("b"); + + Slime slimeRight = new Slime(); + Cursor right = slimeRight.setArray(); + right.addArray().addString("a"); + right.addArray().addString("b"); + + assertTrue(left.equalTo(right)); + assertTrue(right.equalTo(left)); + assertTrue(left.equalTo(left)); + + right.addArray().addString("c"); + assertFalse(left.equalTo(right)); + assertFalse(right.equalTo(left)); + + // Order matters + Slime slimeRight2 = new Slime(); + Cursor right2 = slimeRight2.setObject(); + right2.addArray().addString("b"); + right2.addArray().addString("a"); + assertFalse(left.equalTo(right2)); + assertFalse(right2.equalTo(left)); + } + + @Test + public void verifyPrimitiveEquality() { + Slime left = new Slime(); + Cursor leftObject = left.setObject(); + populateWithPrimitives(leftObject, true); + + Slime right = new Slime(); + Cursor rightObject = right.setObject(); + populateWithPrimitives(rightObject, true); + + assertEqualTo(left.get().field("bool"), right.get().field("bool")); + assertEqualTo(left.get().field("nix"), right.get().field("nix")); + assertEqualTo(left.get().field("long"), right.get().field("long")); + assertEqualTo(left.get().field("string"), right.get().field("string")); + assertEqualTo(left.get().field("data"), right.get().field("data")); + assertEqualTo(left.get(), right.get()); + + assertNotEqualTo(left.get().field("bool"), right.get().field("nix")); + assertNotEqualTo(left.get().field("nix"), right.get().field("string")); + assertNotEqualTo(left.get().field("string"), right.get().field("data")); + assertNotEqualTo(left.get().field("bool"), right.get().field("data")); + assertNotEqualTo(left.get().field("bool"), right.get().field("long")); + } + + @Test + public void verifyPrimitiveNotEquality() { + Slime left = new Slime(); + Cursor leftObject = left.setObject(); + populateWithPrimitives(leftObject, true); + + Slime right = new Slime(); + Cursor rightObject = right.setObject(); + populateWithPrimitives(rightObject, false); + + assertNotEqualTo(left.get().field("bool"), right.get().field("bool")); + assertEqualTo(left.get().field("nix"), right.get().field("nix")); + assertNotEqualTo(left.get().field("long"), right.get().field("long")); + assertNotEqualTo(left.get().field("string"), right.get().field("string")); + assertNotEqualTo(left.get().field("data"), right.get().field("data")); + assertNotEqualTo(left.get(), right.get()); + } + + @Test + public void testNixEquality() { + assertEqualTo(NixValue.invalid(), NixValue.invalid()); + assertEqualTo(NixValue.instance(), NixValue.instance()); + assertNotEqualTo(NixValue.instance(), NixValue.invalid()); + assertNotEqualTo(NixValue.invalid(), NixValue.instance()); + } + + private void populateWithPrimitives(Cursor cursor, boolean enabled) { + cursor.setBool("bool", enabled ? true : false); + cursor.setNix("nix"); + cursor.setLong("long", enabled ? 1 : 0); + cursor.setString("string", enabled ? "enabled" : "disabled"); + cursor.setDouble("double", enabled ? 1.5 : 0.5); + cursor.setData("data", (enabled ? "edata" : "ddata").getBytes(StandardCharsets.UTF_8)); + } + + private void assertEqualTo(Inspector left, Inspector right) { + assertTrue("'" + left + "' is not equal to '" + right + "'", left.equalTo(right)); + } + + private void assertNotEqualTo(Inspector left, Inspector right) { + assertTrue("'" + left + "' is equal to '" + right + "'", !left.equalTo(right)); + } } diff --git a/vespajlib/src/test/java/com/yahoo/slime/ValueTest.java b/vespajlib/src/test/java/com/yahoo/slime/ValueTest.java deleted file mode 100644 index b1a0ec0d7a4..00000000000 --- a/vespajlib/src/test/java/com/yahoo/slime/ValueTest.java +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.slime; - -import org.junit.Test; - -import java.nio.charset.StandardCharsets; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @author hakonhall - */ -public class ValueTest { - @Test - public void verifyObjectEquality() { - Slime slimeLeft = new Slime(); - Cursor left = slimeLeft.setObject(); - left.setString("a", "A"); - left.setString("b", "B"); - - Slime slimeRight = new Slime(); - Cursor right = slimeRight.setObject(); - right.setString("b", "B"); - right.setString("a", "A"); - - assertTrue(left.equalTo(right)); - assertTrue(right.equalTo(left)); - assertTrue(left.equalTo(left)); - - right.setString("c", "C"); - assertFalse(left.equalTo(right)); - assertFalse(right.equalTo(left)); - } - - @Test - public void verifyArrayEquality() { - Slime slimeLeft = new Slime(); - Cursor left = slimeLeft.setArray(); - left.addArray().addString("a"); - left.addArray().addString("b"); - - Slime slimeRight = new Slime(); - Cursor right = slimeRight.setArray(); - right.addArray().addString("a"); - right.addArray().addString("b"); - - assertTrue(left.equalTo(right)); - assertTrue(right.equalTo(left)); - assertTrue(left.equalTo(left)); - - right.addArray().addString("c"); - assertFalse(left.equalTo(right)); - assertFalse(right.equalTo(left)); - - // Order matters - Slime slimeRight2 = new Slime(); - Cursor right2 = slimeRight2.setObject(); - right2.addArray().addString("b"); - right2.addArray().addString("a"); - assertFalse(left.equalTo(right2)); - assertFalse(right2.equalTo(left)); - } - - @Test - public void verifyPrimitiveEquality() { - Slime left = new Slime(); - Cursor leftObject = left.setObject(); - populateWithPrimitives(leftObject, true); - - Slime right = new Slime(); - Cursor rightObject = right.setObject(); - populateWithPrimitives(rightObject, true); - - assertEqualTo(left.get().field("bool"), right.get().field("bool")); - assertEqualTo(left.get().field("nix"), right.get().field("nix")); - assertEqualTo(left.get().field("long"), right.get().field("long")); - assertEqualTo(left.get().field("string"), right.get().field("string")); - assertEqualTo(left.get().field("data"), right.get().field("data")); - assertEqualTo(left.get(), right.get()); - - assertNotEqualTo(left.get().field("bool"), right.get().field("nix")); - assertNotEqualTo(left.get().field("nix"), right.get().field("string")); - assertNotEqualTo(left.get().field("string"), right.get().field("data")); - assertNotEqualTo(left.get().field("bool"), right.get().field("data")); - assertNotEqualTo(left.get().field("bool"), right.get().field("long")); - } - - @Test - public void verifyPrimitiveNotEquality() { - Slime left = new Slime(); - Cursor leftObject = left.setObject(); - populateWithPrimitives(leftObject, true); - - Slime right = new Slime(); - Cursor rightObject = right.setObject(); - populateWithPrimitives(rightObject, false); - - assertNotEqualTo(left.get().field("bool"), right.get().field("bool")); - assertEqualTo(left.get().field("nix"), right.get().field("nix")); - assertNotEqualTo(left.get().field("long"), right.get().field("long")); - assertNotEqualTo(left.get().field("string"), right.get().field("string")); - assertNotEqualTo(left.get().field("data"), right.get().field("data")); - assertNotEqualTo(left.get(), right.get()); - } - - @Test - public void testNixEquality() { - assertEqualTo(NixValue.invalid(), NixValue.invalid()); - assertEqualTo(NixValue.instance(), NixValue.instance()); - assertNotEqualTo(NixValue.instance(), NixValue.invalid()); - assertNotEqualTo(NixValue.invalid(), NixValue.instance()); - } - - private void populateWithPrimitives(Cursor cursor, boolean enabled) { - cursor.setBool("bool", enabled ? true : false); - cursor.setNix("nix"); - cursor.setLong("long", enabled ? 1 : 0); - cursor.setString("string", enabled ? "enabled" : "disabled"); - cursor.setDouble("double", enabled ? 1.5 : 0.5); - cursor.setData("data", (enabled ? "edata" : "ddata").getBytes(StandardCharsets.UTF_8)); - } - - private void assertEqualTo(Inspector left, Inspector right) { - assertTrue("'" + left + "' is not equal to '" + right + "'", left.equalTo(right)); - } - - private void assertNotEqualTo(Inspector left, Inspector right) { - assertTrue("'" + left + "' is equal to '" + right + "'", !left.equalTo(right)); - } -}
\ No newline at end of file |