diff --git a/core/src/main/java/org/projectnessie/cel/common/types/BoolT.java b/core/src/main/java/org/projectnessie/cel/common/types/BoolT.java index 5747c73d..3f0549e8 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/BoolT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/BoolT.java @@ -111,6 +111,15 @@ public Val equal(Val other) { case Bool: return Types.boolOf(b == ((BoolT) other).b); case Null: + case Bytes: + case Double: + case Int: + case List: + case Map: + case Object: + case String: + case Type: + case Uint: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/main/java/org/projectnessie/cel/common/types/BytesT.java b/core/src/main/java/org/projectnessie/cel/common/types/BytesT.java index 0b1fa188..e2b2e029 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/BytesT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/BytesT.java @@ -167,6 +167,15 @@ public Val equal(Val other) { case Bytes: return boolOf(Arrays.equals(b, ((BytesT) other).b)); case Null: + case Bool: + case Double: + case Int: + case List: + case Map: + case Object: + case String: + case Type: + case Uint: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/main/java/org/projectnessie/cel/common/types/DoubleT.java b/core/src/main/java/org/projectnessie/cel/common/types/DoubleT.java index 5cfa40e0..fed76630 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/DoubleT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/DoubleT.java @@ -199,7 +199,6 @@ public Val equal(Val other) { case Uint: case Int: case Double: - case String: Val converted = other.convertToType(type()); if (converted.type().typeEnum() == TypeEnum.Err) { return converted; @@ -208,9 +207,13 @@ public Val equal(Val other) { // TODO: Handle NaNs properly. return boolOf(d == o); case Null: + case Bool: case Bytes: case List: case Map: + case Object: + case String: + case Type: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/main/java/org/projectnessie/cel/common/types/IntT.java b/core/src/main/java/org/projectnessie/cel/common/types/IntT.java index 41cb5aa4..17c2baf9 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/IntT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/IntT.java @@ -240,16 +240,19 @@ public Val equal(Val other) { return False; } case Int: - case String: Val converted = other.convertToType(type()); if (converted.type().typeEnum() == TypeEnum.Err) { return converted; } return boolOf(i == converted.intValue()); case Null: + case Bool: case Bytes: case List: case Map: + case Object: + case String: + case Type: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/main/java/org/projectnessie/cel/common/types/NullT.java b/core/src/main/java/org/projectnessie/cel/common/types/NullT.java index 948126d2..415d479f 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/NullT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/NullT.java @@ -104,6 +104,11 @@ public Val equal(Val other) { case Double: case String: case Bytes: + case Bool: + case List: + case Map: + case Object: + case Type: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/main/java/org/projectnessie/cel/common/types/StringT.java b/core/src/main/java/org/projectnessie/cel/common/types/StringT.java index 96275a2b..ebd9b3d4 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/StringT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/StringT.java @@ -173,12 +173,16 @@ public Val equal(Val other) { switch (other.type().typeEnum()) { case String: return boolOf(s.equals(((StringT) other).s)); + case Null: + case Bool: + case Bytes: case Int: case Uint: case Double: - case Bool: - return boolOf(s.equals(((StringT) other.convertToType(StringType)).s)); - case Null: + case List: + case Map: + case Object: + case Type: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/main/java/org/projectnessie/cel/common/types/TypeT.java b/core/src/main/java/org/projectnessie/cel/common/types/TypeT.java index 29305291..56ddacef 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/TypeT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/TypeT.java @@ -15,8 +15,8 @@ */ package org.projectnessie.cel.common.types; +import static org.projectnessie.cel.common.types.BoolT.False; import static org.projectnessie.cel.common.types.Err.newTypeConversionError; -import static org.projectnessie.cel.common.types.Err.noSuchOverload; import static org.projectnessie.cel.common.types.StringT.stringOf; import static org.projectnessie.cel.common.types.Types.boolOf; @@ -106,7 +106,7 @@ public Val convertToType(Type typeVal) { @Override public Val equal(Val other) { if (TypeType != other.type()) { - return noSuchOverload(this, "equal", other); + return False; } return boolOf(this.equals(other)); } diff --git a/core/src/main/java/org/projectnessie/cel/common/types/UintT.java b/core/src/main/java/org/projectnessie/cel/common/types/UintT.java index 04d88528..8255c39a 100644 --- a/core/src/main/java/org/projectnessie/cel/common/types/UintT.java +++ b/core/src/main/java/org/projectnessie/cel/common/types/UintT.java @@ -223,16 +223,19 @@ public Val equal(Val other) { case Double: return other.equal(this); case Uint: - case String: Val converted = other.convertToType(type()); if (converted.type().typeEnum() == TypeEnum.Err) { return converted; } return boolOf(i == converted.intValue()); case Null: + case Bool: case Bytes: case List: case Map: + case Object: + case String: + case Type: return False; default: return noSuchOverload(this, "equal", other); diff --git a/core/src/test/java/org/projectnessie/cel/common/types/BoolTest.java b/core/src/test/java/org/projectnessie/cel/common/types/BoolTest.java index cb711cc2..fc40d8dd 100644 --- a/core/src/test/java/org/projectnessie/cel/common/types/BoolTest.java +++ b/core/src/test/java/org/projectnessie/cel/common/types/BoolTest.java @@ -107,14 +107,8 @@ void boolConvertToType() { void boolEqual() { assertThat(True.equal(True)).extracting(Val::booleanValue).isEqualTo(Boolean.TRUE); assertThat(False.equal(True)).extracting(Val::booleanValue).isEqualTo(Boolean.FALSE); - assertThat(doubleOf(0.0d).equal(False)) - .isInstanceOf(Err.class) - .extracting(Object::toString) - .isEqualTo("no such overload: double.equal(bool)"); - assertThat(False.equal(doubleOf(0.0d))) - .isInstanceOf(Err.class) - .extracting(Object::toString) - .isEqualTo("no such overload: bool.equal(double)"); + assertThat(doubleOf(0.0d).equal(False)).isSameAs(False); + assertThat(False.equal(doubleOf(0.0d))).isSameAs(False); } @Test diff --git a/core/src/test/java/org/projectnessie/cel/common/types/DoubleTest.java b/core/src/test/java/org/projectnessie/cel/common/types/DoubleTest.java index 5dd224c2..f544394d 100644 --- a/core/src/test/java/org/projectnessie/cel/common/types/DoubleTest.java +++ b/core/src/test/java/org/projectnessie/cel/common/types/DoubleTest.java @@ -172,7 +172,7 @@ void doubleDivide() { @Test void doubleEqual() { - assertThat(doubleOf(0).equal(False)).matches(Err::isError); + assertThat(doubleOf(0).equal(False)).isSameAs(False); assertThat(doubleOf(0).equal(NullValue)).isSameAs(False); assertThat(doubleOf(0).equal(intOf(0))).isSameAs(True); assertThat(doubleOf(0).equal(intOf(1))).isSameAs(False); @@ -180,7 +180,7 @@ void doubleEqual() { assertThat(doubleOf(0).equal(uintOf(1))).isSameAs(False); assertThat(doubleOf(0).equal(doubleOf(0))).isSameAs(True); assertThat(doubleOf(0).equal(doubleOf(1))).isSameAs(False); - assertThat(doubleOf(0).equal(stringOf("0"))).isSameAs(True); + assertThat(doubleOf(0).equal(stringOf("0"))).isSameAs(False); assertThat(doubleOf(0).equal(stringOf("1"))).isSameAs(False); } diff --git a/core/src/test/java/org/projectnessie/cel/common/types/IntTest.java b/core/src/test/java/org/projectnessie/cel/common/types/IntTest.java index 17984d7f..48295aea 100644 --- a/core/src/test/java/org/projectnessie/cel/common/types/IntTest.java +++ b/core/src/test/java/org/projectnessie/cel/common/types/IntTest.java @@ -183,12 +183,8 @@ void intDivide() { @Test void intEqual() { - assertThat(intOf(0).equal(False)) - .isInstanceOf(Err.class) - .extracting(Object::toString) - .isEqualTo("no such overload: int.equal(bool)"); + assertThat(intOf(0).equal(False)).isSameAs(False); assertThat(intOf(0).equal(NullValue)).isSameAs(False); - assertThat(intOf(0).equal(stringOf("0"))).isSameAs(True); assertThat(intOf(0).equal(stringOf("1"))).isSameAs(False); assertThat(intOf(0).equal(intOf(0))).isSameAs(True); assertThat(intOf(0).equal(intOf(1))).isSameAs(False); @@ -198,7 +194,7 @@ void intEqual() { assertThat(intOf(0xffffffffffffffffL).equal(uintOf(0xffffffffffffffffL))).isSameAs(False); assertThat(intOf(0).equal(doubleOf(0))).isSameAs(True); assertThat(intOf(0).equal(doubleOf(1))).isSameAs(False); - assertThat(intOf(0).equal(stringOf("0"))).isSameAs(True); + assertThat(intOf(0).equal(stringOf("0"))).isSameAs(False); assertThat(intOf(0).equal(stringOf("1"))).isSameAs(False); } diff --git a/core/src/test/java/org/projectnessie/cel/common/types/StringTest.java b/core/src/test/java/org/projectnessie/cel/common/types/StringTest.java index 63e48256..6ef673fa 100644 --- a/core/src/test/java/org/projectnessie/cel/common/types/StringTest.java +++ b/core/src/test/java/org/projectnessie/cel/common/types/StringTest.java @@ -156,6 +156,8 @@ void stringEqual() { assertThat(stringOf("hello").equal(stringOf("hello"))).isSameAs(True); assertThat(stringOf("hello").equal(stringOf("hell"))).isSameAs(False); assertThat(stringOf("c").equal(intOf(99))).isSameAs(False); + assertThat(stringOf("99").equal(intOf(99))).isSameAs(False); + assertThat(stringOf("true").equal(True)).isSameAs(False); } @Test diff --git a/core/src/test/java/org/projectnessie/cel/common/types/UintTest.java b/core/src/test/java/org/projectnessie/cel/common/types/UintTest.java index 4622b39d..6cdbee48 100644 --- a/core/src/test/java/org/projectnessie/cel/common/types/UintTest.java +++ b/core/src/test/java/org/projectnessie/cel/common/types/UintTest.java @@ -176,10 +176,7 @@ void uintDivide() { @Test void uintEqual() { - assertThat(uintOf(0).equal(False)) - .isInstanceOf(Err.class) - .extracting(Object::toString) - .isEqualTo("no such overload: uint.equal(bool)"); + assertThat(uintOf(0).equal(False)).isSameAs(False); assertThat(uintOf(0).equal(NullValue)).isSameAs(False); assertThat(uintOf(0).equal(intOf(0))).isSameAs(True); assertThat(uintOf(0).equal(intOf(1))).isSameAs(False); @@ -189,7 +186,7 @@ void uintEqual() { assertThat(uintOf(0).equal(uintOf(1))).isSameAs(False); assertThat(uintOf(0).equal(doubleOf(0))).isSameAs(True); assertThat(uintOf(0).equal(doubleOf(1))).isSameAs(False); - assertThat(uintOf(0).equal(stringOf("0"))).isSameAs(True); + assertThat(uintOf(0).equal(stringOf("0"))).isSameAs(False); assertThat(uintOf(0).equal(stringOf("1"))).isSameAs(False); } diff --git a/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTest.java b/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTest.java index 125fbd95..260f7a47 100644 --- a/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTest.java +++ b/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTest.java @@ -248,6 +248,14 @@ static TestCase[] testCases() { new TestCase(InterpreterTestCase.map_key_mixed_numbers_lossy_double_key) .expr("{1u: 1.0, 2: 2.0, 3u: 3.0}[3.1]") .err("no such key: double{3.1}"), + new TestCase(InterpreterTestCase.map_key_string_and_int_are_distinct) + .expr("{1: 'int', '1': 'string'}['1']") + .out(stringOf("string")), + new TestCase(InterpreterTestCase.eq_dyn_string_int).expr("dyn('1') == dyn(1)").out(False), + new TestCase(InterpreterTestCase.eq_dyn_int_string).expr("dyn(1) == dyn('1')").out(False), + new TestCase(InterpreterTestCase.eq_dyn_string_bool) + .expr("dyn('true') == dyn(true)") + .out(False), new TestCase(InterpreterTestCase.zero_based_double_error) .expr("[7, 8, 9][dyn(0.1)]") .err("invalid_argument"), diff --git a/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTestCase.java b/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTestCase.java index 2f0dbdf4..5c585a21 100644 --- a/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTestCase.java +++ b/core/src/test/java/org/projectnessie/cel/interpreter/InterpreterTestCase.java @@ -73,6 +73,10 @@ public enum InterpreterTestCase { lt_dyn_uint_big_double, lt_ne_dyn_int_double, map_key_mixed_numbers_lossy_double_key, + map_key_string_and_int_are_distinct, + eq_dyn_string_int, + eq_dyn_int_string, + eq_dyn_string_bool, map_value_repeat_key_heterogeneous, timestamp_eq_timestamp, timestamp_ne_timestamp,