From 12be4fdb78f1e9c33e771019faa48045a8ca8aef Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Wed, 19 Jun 2024 23:53:20 -0400 Subject: [PATCH] fixed up operators and added tests --- cerise-c.m | 35 ++++++++++++++++++++++++++++++++++- runtime/OpEq.c | 8 ++++---- runtime/OpGt.c | 4 ++-- runtime/OpLt.c | 4 ++-- runtime/OpLtEq.c | 4 ++-- runtime/OpNeq.c | 10 +++++----- 6 files changed, 49 insertions(+), 16 deletions(-) diff --git a/cerise-c.m b/cerise-c.m index e1b7fa7..4f17ff8 100644 --- a/cerise-c.m +++ b/cerise-c.m @@ -105,6 +105,38 @@ TestHashOps() assert hash["baz"] == "boo" } +TestEqOps() { + assert ("" == "") == true + assert ("" == 1) == false + assert ("" == 1.0) == false + assert ("" == true) == false + assert ("" == false) == false + assert ("" == []) == false + assert ("" == {}) == false +} + +TestNeqOps() { + assert ("" != "") == false + assert ("" != 1) == true + assert ("" != 1.0) == true + assert ("" != true) == true + assert ("" != false) == true + assert ("" != []) == true + assert ("" != {}) == true +} + +TestLtOps(){ +} + +TestLtEqOps(){ +} + +TestGtOps(){ +} + +TestGtEqOps(){ +} + Main() { TestLiterals() @@ -114,5 +146,6 @@ Main() TestStringOps() TestArrayOps() TestHashOps() - return true + TestEqOps() + TestNeqOps() } diff --git a/runtime/OpEq.c b/runtime/OpEq.c index 158b7b1..6007357 100644 --- a/runtime/OpEq.c +++ b/runtime/OpEq.c @@ -2,13 +2,13 @@ Value OpEq(Value left, Value right) { Value result; - if (IsBool(left)) { + if (IsBool(left) && IsBool(right)) { result = MakeBool(ValueAsBool(left) == ValueAsBool(right)); - } else if (IsInt(left)) { + } else if (IsInt(left) && IsInt(right)) { result = MakeBool(ValueAsInt(left) == ValueAsInt(right)); - } else if (IsReal(left)) { + } else if (IsReal(left) && IsReal(right)) { result = MakeBool(ValueAsReal(left) == ValueAsReal(right)); - } else if (IsString(left)) { + } else if (IsString(left) && IsString(right)) { result = MakeBool(!strcmp(ValueAsString(left)->bytes, ValueAsString(right)->bytes)); } else { result = MakeBool(false); diff --git a/runtime/OpGt.c b/runtime/OpGt.c index 5c26007..f11f188 100644 --- a/runtime/OpGt.c +++ b/runtime/OpGt.c @@ -2,9 +2,9 @@ Value OpGt(Value left, Value right) { Value result; - if (IsInt(left)) { + if (IsInt(left) && IsInt(right)) { result = MakeBool(ValueAsInt(left) > ValueAsInt(right)); - } else if (IsReal(left)) { + } else if (IsReal(left) && IsReal(right)) { result = MakeBool(ValueAsReal(left) > ValueAsReal(right)); } else { result = MakeBool(false); diff --git a/runtime/OpLt.c b/runtime/OpLt.c index 30c6bbc..b36bab4 100644 --- a/runtime/OpLt.c +++ b/runtime/OpLt.c @@ -2,9 +2,9 @@ Value OpLt(Value left, Value right) { Value result; - if (IsInt(left)) { + if (IsInt(left) && IsInt(right)) { result = MakeBool(ValueAsInt(left) < ValueAsInt(right)); - } else if (IsReal(left)) { + } else if (IsReal(left) && IsReal(right)) { result = MakeBool(ValueAsReal(left) < ValueAsReal(right)); } else { result = MakeBool(false); diff --git a/runtime/OpLtEq.c b/runtime/OpLtEq.c index 862f203..5a2e8a5 100644 --- a/runtime/OpLtEq.c +++ b/runtime/OpLtEq.c @@ -2,9 +2,9 @@ Value OpLtEq(Value left, Value right) { Value result; - if (IsInt(left)) { + if (IsInt(left) && IsInt(right)) { result = MakeBool(ValueAsInt(left) <= ValueAsInt(right)); - } else if (IsReal(left)) { + } else if (IsReal(left) && IsReal(right)) { result = MakeBool(ValueAsReal(left) <= ValueAsReal(right)); } else { result = MakeBool(false); diff --git a/runtime/OpNeq.c b/runtime/OpNeq.c index d2e72be..f7bd8d0 100644 --- a/runtime/OpNeq.c +++ b/runtime/OpNeq.c @@ -2,16 +2,16 @@ Value OpNeq(Value left, Value right) { Value result; - if (IsBool(left)) { + if (IsBool(left) && IsBool(right)) { result = MakeBool(ValueAsBool(left) != ValueAsBool(right)); - } else if (IsInt(left)) { + } else if (IsInt(left) && IsInt(right)) { result = MakeBool(ValueAsInt(left) != ValueAsInt(right)); - } else if (IsReal(left)) { + } else if (IsReal(left) && IsReal(right)) { result = MakeBool(ValueAsReal(left) != ValueAsReal(right)); - } else if (IsString(left)) { + } else if (IsString(left) && IsString(right)) { result = MakeBool(0 != strcmp(ValueAsString(left)->bytes, ValueAsString(right)->bytes)); } else { - result = MakeBool(false); + result = MakeBool(true); } return result; } -- 2.54.0