aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2023-03-22 15:46:11 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2023-03-22 15:46:11 +0000
commitfc57b86eb4c5f7d2b40c4da892cf799686598dc2 (patch)
tree0606fcf4655095df91f7141ec453fd5fb8fec45c
parent5a78d21b77d9dc70896182a83d29e855214514b3 (diff)
move Inspector equalTo implementation and test
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/Inspector.java2
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/SlimeUtils.java78
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/Value.java80
-rw-r--r--vespajlib/src/test/java/com/yahoo/slime/SlimeUtilsTest.java119
-rw-r--r--vespajlib/src/test/java/com/yahoo/slime/ValueTest.java131
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