This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new 11770ae08 Test modernization, clean up utility classes.
11770ae08 is described below
commit 11770ae08318b08697013f1d426271a4b6819b36
Author: James Bognar <[email protected]>
AuthorDate: Mon Aug 25 11:20:50 2025 -0400
Test modernization, clean up utility classes.
---
.../juneau/assertions/FluentDateAssertion.java | 3 +-
.../assertions/FluentThrowableAssertion.java | 3 +-
.../org/apache/juneau/common/internal/Utils.java | 20 +++++++++++
.../src/main/java/org/apache/juneau/BeanMeta.java | 3 +-
.../java/org/apache/juneau/BeanPropertyMeta.java | 3 +-
.../src/main/java/org/apache/juneau/ClassMeta.java | 3 +-
.../java/org/apache/juneau/cp/BasicFileFinder.java | 2 +-
.../main/java/org/apache/juneau/cp/LocalDir.java | 3 +-
.../org/apache/juneau/internal/ObjectUtils.java | 40 ----------------------
.../java/org/apache/juneau/reflect/ClassInfo.java | 3 +-
.../main/java/org/apache/juneau/utils/Tuple2.java | 3 +-
.../main/java/org/apache/juneau/utils/Tuple3.java | 3 +-
.../main/java/org/apache/juneau/utils/Tuple4.java | 3 +-
.../main/java/org/apache/juneau/utils/Tuple5.java | 3 +-
.../juneau/rest/beans/ResourceDescription.java | 3 +-
.../juneau/assertions/BeanAssertion_Test.java | 3 +-
.../juneau/assertions/BeanListAssertion_Test.java | 3 +-
17 files changed, 49 insertions(+), 55 deletions(-)
diff --git
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
index 1ed371a59..289bef8b5 100644
---
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
+++
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
@@ -20,6 +20,7 @@ import java.time.temporal.*;
import java.util.*;
import java.util.function.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.serializer.*;
@@ -213,7 +214,7 @@ public class FluentDateAssertion<R> extends
FluentComparableAssertion<Date,R> {
* @throws AssertionError If assertion failed.
*/
public R is(Date value, ChronoUnit precision) throws AssertionError {
- if (ne(value(), value,
(x,y)->x.toInstant().truncatedTo(precision).equals(y.toInstant().truncatedTo(precision))))
+ if (Utils.ne(value(), value,
(x,y)->x.toInstant().truncatedTo(precision).equals(y.toInstant().truncatedTo(precision))))
throw error(MSG_unexpectedValue, value, value());
return returns();
}
diff --git
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
index 0adb76a80..c06f43531 100644
---
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
+++
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
@@ -21,6 +21,7 @@ import java.io.*;
import java.util.*;
import java.util.function.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.serializer.*;
@@ -456,7 +457,7 @@ public class FluentThrowableAssertion<T extends
Throwable,R> extends FluentObjec
@Override
protected boolean equals(Object o1, Object o2) {
if (o1 instanceof Throwable o1t && o2 instanceof Throwable o2t)
- return ObjectUtils.eq(o1t, o2t,
(x,y)->ObjectUtils.eq(x.getClass(),y.getClass()) &&
ObjectUtils.eq(x.getMessage(),y.getMessage()));
+ return Utils.eq(o1t, o2t,
(x,y)->ObjectUtils.eq(x.getClass(),y.getClass()) &&
ObjectUtils.eq(x.getMessage(),y.getMessage()));
return super.equals(o1, o2);
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
index b86c317f4..080e959f0 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
@@ -568,4 +568,24 @@ public class Utils {
return 0;
}
+
+ /**
+ * Tests two objects for inequality, gracefully handling nulls.
+ *
+ * @param <T> Object 1 type.
+ * @param <U> Object 2 type.
+ * @param o1 Object 1.
+ * @param o2 Object 2.
+ * @param test The test to use for equality.
+ * @return <jk>false</jk> if both objects are equal based on the test.
+ */
+ public static <T,U> boolean ne(T o1, U o2, BiPredicate<T,U> test) {
+ if (o1 == null)
+ return o2 != null;
+ if (o2 == null)
+ return true;
+ if (o1 == o2)
+ return false;
+ return ! test.test(o1, o2);
+ }
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index 6d2ffbebe..9351d7304 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -26,6 +26,7 @@ import java.util.*;
import java.util.function.*;
import org.apache.juneau.annotation.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.reflect.*;
@@ -1002,6 +1003,6 @@ public class BeanMeta<T> {
@Override /* Object */
public boolean equals(Object o) {
- return (o instanceof BeanMeta) && eq(this, (BeanMeta<?>)o,
(x,y)->eq(x.classMeta, y.classMeta));
+ return (o instanceof BeanMeta) && Utils.eq(this,
(BeanMeta<?>)o, (x,y)->eq(x.classMeta, y.classMeta));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 971e8dd0a..00066b160 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -28,6 +28,7 @@ import java.util.function.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.collections.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.parser.*;
@@ -1270,6 +1271,6 @@ public final class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
@Override /* Object */
public boolean equals(Object o) {
- return (o instanceof BeanPropertyMeta) && eq(this,
(BeanPropertyMeta)o, (x,y)->eq(x.name, y.name) && eq(x.beanMeta, y.beanMeta));
+ return (o instanceof BeanPropertyMeta) && Utils.eq(this,
(BeanPropertyMeta)o, (x,y)->eq(x.name, y.name) && eq(x.beanMeta, y.beanMeta));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 86d62d1f4..647fd31c0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -32,6 +32,7 @@ import java.util.concurrent.*;
import java.util.function.*;
import org.apache.juneau.annotation.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
@@ -2203,6 +2204,6 @@ public final class ClassMeta<T> implements Type {
@Override /* Object */
public boolean equals(Object o) {
- return (o instanceof ClassMeta) && eq(this, (ClassMeta<?>)o,
(x,y)->eq(x.innerClass, y.innerClass));
+ return (o instanceof ClassMeta) && Utils.eq(this,
(ClassMeta<?>)o, (x,y)->eq(x.innerClass, y.innerClass));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicFileFinder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicFileFinder.java
index 3d666fc46..ffe56fe31 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicFileFinder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicFileFinder.java
@@ -267,7 +267,7 @@ public class BasicFileFinder implements FileFinder {
@Override /* Object */
public boolean equals(Object o) {
- return o instanceof BasicFileFinder && eq(this,
(BasicFileFinder)o, (x,y)->eq(x.hashCode, y.hashCode) && eq(x.getClass(),
y.getClass()) && eq(x.roots, y.roots) && eq(x.cachingLimit, y.cachingLimit) &&
eq(x.includePatterns, y.includePatterns) && eq(x.excludePatterns,
y.excludePatterns));
+ return o instanceof BasicFileFinder && Utils.eq(this,
(BasicFileFinder)o, (x,y)->eq(x.hashCode, y.hashCode) && eq(x.getClass(),
y.getClass()) && eq(x.roots, y.roots) && eq(x.cachingLimit, y.cachingLimit) &&
eq(x.includePatterns, y.includePatterns) && eq(x.excludePatterns,
y.excludePatterns));
}
@Override /* Object */
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/LocalDir.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/LocalDir.java
index a56c19adb..62473592d 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/LocalDir.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/LocalDir.java
@@ -19,6 +19,7 @@ import static org.apache.juneau.internal.ObjectUtils.*;
import java.net.*;
import java.nio.file.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
/**
@@ -113,7 +114,7 @@ public class LocalDir {
@Override /* Object */
public boolean equals(Object o) {
- return o instanceof LocalDir && eq(this, (LocalDir)o,
(x,y)->eq(x.clazz, y.clazz) && eq(x.clazzPath, y.clazzPath) && eq(x.path,
y.path));
+ return o instanceof LocalDir && Utils.eq(this, (LocalDir)o,
(x,y)->eq(x.clazz, y.clazz) && eq(x.clazzPath, y.clazzPath) && eq(x.path,
y.path));
}
@Override /* Object */
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
index f15259c97..fa727e736 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
@@ -30,26 +30,6 @@ import org.apache.juneau.reflect.*;
*/
public class ObjectUtils {
- /**
- * Tests two objects for equality, gracefully handling nulls.
- *
- * @param <T> Object 1 type.
- * @param <U> Object 2 type.
- * @param o1 Object 1.
- * @param o2 Object 2.
- * @param test The test to use for equality.
- * @return <jk>true</jk> if both objects are equal based on the test.
- */
- public static <T,U> boolean eq(T o1, U o2, BiPredicate<T,U> test) {
- if (o1 == null)
- return o2 == null;
- if (o2 == null)
- return false;
- if (o1 == o2)
- return true;
- return test.test(o1, o2);
- }
-
/**
* Tests two objects for equality, gracefully handling nulls and arrays.
*
@@ -94,26 +74,6 @@ public class ObjectUtils {
}
- /**
- * Tests two objects for inequality, gracefully handling nulls.
- *
- * @param <T> Object 1 type.
- * @param <U> Object 2 type.
- * @param o1 Object 1.
- * @param o2 Object 2.
- * @param test The test to use for equality.
- * @return <jk>false</jk> if both objects are equal based on the test.
- */
- public static <T,U> boolean ne(T o1, U o2, BiPredicate<T,U> test) {
- if (o1 == null)
- return o2 != null;
- if (o2 == null)
- return true;
- if (o1 == o2)
- return false;
- return ! test.test(o1, o2);
- }
-
/**
* Tests two objects for equality, gracefully handling nulls and arrays.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index b0f28c789..93c897849 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -26,6 +26,7 @@ import java.util.concurrent.*;
import java.util.function.*;
import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
/**
@@ -2473,6 +2474,6 @@ public final class ClassInfo {
@Override
public boolean equals(Object o) {
- return (o instanceof ClassInfo) && eq(this, (ClassInfo)o,
(x,y)->eq(x.t, y.t));
+ return (o instanceof ClassInfo) && Utils.eq(this, (ClassInfo)o,
(x,y)->eq(x.t, y.t));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple2.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple2.java
index a6ec17d02..dc29f3119 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple2.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple2.java
@@ -14,6 +14,7 @@ package org.apache.juneau.utils;
import static org.apache.juneau.internal.ObjectUtils.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
/**
@@ -79,6 +80,6 @@ public class Tuple2<A,B> {
@Override /* Object */
public boolean equals(Object o) {
- return o instanceof Tuple2 && eq(this, (Tuple2<?,?>)o,
(x,y)->eq(x.a,y.a) && eq(x.b,y.b));
+ return o instanceof Tuple2 && Utils.eq(this, (Tuple2<?,?>)o,
(x,y)->eq(x.a,y.a) && eq(x.b,y.b));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple3.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple3.java
index c7e42ec27..527b26e42 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple3.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple3.java
@@ -14,6 +14,7 @@ package org.apache.juneau.utils;
import static org.apache.juneau.internal.ObjectUtils.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
/**
@@ -94,6 +95,6 @@ public class Tuple3<A,B,C> {
@Override /* Object */
public boolean equals(Object o) {
- return o instanceof Tuple3 && eq(this, (Tuple3<?,?,?>)o,
(x,y)->eq(x.a,y.a) && eq(x.b,y.b) && eq(x.c,y.c));
+ return o instanceof Tuple3 && Utils.eq(this, (Tuple3<?,?,?>)o,
(x,y)->eq(x.a,y.a) && eq(x.b,y.b) && eq(x.c,y.c));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple4.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple4.java
index 778b62c3f..2c7427c05 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple4.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple4.java
@@ -14,6 +14,7 @@ package org.apache.juneau.utils;
import static org.apache.juneau.internal.ObjectUtils.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
/**
@@ -109,6 +110,6 @@ public class Tuple4<A,B,C,D> {
@Override /* Object */
public boolean equals(Object o) {
- return o instanceof Tuple4 && eq(this, (Tuple4<?,?,?,?>)o,
(x,y)->eq(x.a,y.a) && eq(x.b,y.b) && eq(x.c,y.c) && eq(x.d,y.d));
+ return o instanceof Tuple4 && Utils.eq(this,
(Tuple4<?,?,?,?>)o, (x,y)->eq(x.a,y.a) && eq(x.b,y.b) && eq(x.c,y.c) &&
eq(x.d,y.d));
}
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple5.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple5.java
index b847206c8..1f1a1a539 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple5.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/Tuple5.java
@@ -14,6 +14,7 @@ package org.apache.juneau.utils;
import static org.apache.juneau.internal.ObjectUtils.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
/**
@@ -124,6 +125,6 @@ public class Tuple5<A,B,C,D,E> {
@Override /* Object */
public boolean equals(Object o) {
- return o instanceof Tuple5 && eq(this, (Tuple5<?,?,?,?,?>)o,
(x,y)->eq(x.a,y.a) && eq(x.b,y.b) && eq(x.c,y.c) && eq(x.d,y.d) && eq(x.e,y.e));
+ return o instanceof Tuple5 && Utils.eq(this,
(Tuple5<?,?,?,?,?>)o, (x,y)->eq(x.a,y.a) && eq(x.b,y.b) && eq(x.c,y.c) &&
eq(x.d,y.d) && eq(x.e,y.e));
}
}
\ No newline at end of file
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/beans/ResourceDescription.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/beans/ResourceDescription.java
index bf4955094..b85f67a7d 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/beans/ResourceDescription.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/beans/ResourceDescription.java
@@ -15,6 +15,7 @@ package org.apache.juneau.rest.beans;
import static org.apache.juneau.internal.ObjectUtils.*;
import org.apache.juneau.annotation.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.html.annotation.*;
import org.apache.juneau.http.annotation.*;
@@ -135,7 +136,7 @@ public final class ResourceDescription implements
Comparable<ResourceDescription
@Override /* Object */
public boolean equals(Object o) {
- return (o instanceof ResourceDescription) && eq(this,
(ResourceDescription)o, (x,y)->eq(x.getName(), y.getName()));
+ return (o instanceof ResourceDescription) && Utils.eq(this,
(ResourceDescription)o, (x,y)->eq(x.getName(), y.getName()));
}
@Override /* Object */
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanAssertion_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanAssertion_Test.java
index 878753523..24e3d7844 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanAssertion_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanAssertion_Test.java
@@ -18,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.*;
import static org.junit.runners.MethodSorters.*;
import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
import org.apache.juneau.serializer.*;
@@ -42,7 +43,7 @@ public class BeanAssertion_Test {
public A() {}
public A(int a, int b) {this.a = a; this.b = b;}
@Override public String toString() {return "a="+a+",b="+b;}
- @Override public boolean equals(Object o) { return
ObjectUtils.eq(this, (A)o, (x,y)->ObjectUtils.eq(x.a,y.a) &&
ObjectUtils.eq(x.b,y.b)); }
+ @Override public boolean equals(Object o) { return
Utils.eq(this, (A)o, (x,y)->ObjectUtils.eq(x.a,y.a) &&
ObjectUtils.eq(x.b,y.b)); }
@Override public int compareTo(A o) { return a-o.a; }
}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
index 59e93a164..abfcc7037 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
@@ -21,6 +21,7 @@ import static org.junit.runners.MethodSorters.*;
import java.util.*;
import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
import org.apache.juneau.serializer.*;
@@ -45,7 +46,7 @@ public class BeanListAssertion_Test {
public A(Integer a, Integer b) { this.a = a; this.b = b; }
public static A of(Integer a, Integer b) { return new A(a, b); }
@Override public String toString() { return
"(a="+a+",b="+b+")"; }
- @Override public boolean equals(Object o) { return
ObjectUtils.eq(this, (A)o, (x,y)->ObjectUtils.eq(x.a,y.a) &&
ObjectUtils.eq(x.b,y.b)); }
+ @Override public boolean equals(Object o) { return
Utils.eq(this, (A)o, (x,y)->ObjectUtils.eq(x.a,y.a) &&
ObjectUtils.eq(x.b,y.b)); }
@Override public int compareTo(A o) { return a-o.a; }
}