diff --git a/rsl/eval.py b/rsl/eval.py index 501f5ee..f038dc0 100644 --- a/rsl/eval.py +++ b/rsl/eval.py @@ -260,6 +260,9 @@ def accept_BinaryOpNode(self, node): if self.runtime.is_set(lhs): rhs = self.runtime.cast_to_set(rhs) + + if self.runtime.is_set(rhs): + lhs = self.runtime.cast_to_set(lhs) value = ops[node.sign](lhs, rhs) diff --git a/tests/test_binop.py b/tests/test_binop.py index 90c273d..361f0e7 100644 --- a/tests/test_binop.py +++ b/tests/test_binop.py @@ -254,3 +254,43 @@ def test_instance_minus_same_instance(self): rc = self.eval_text(text) self.assertEqual(0, rc) + + def test_instance_set_minus_instance_set(self): + self.metamodel.define_class('A', [('Name', 'string')]) + + text = ''' + .create object instance a1 of A + .create object instance a2 of A + .assign a1.Name = "A1" + .assign a2.Name = "A2" + .select many an_set from instances of A + .select many a0_set from instances of A where (false) + + .if ((cardinality (an_set - a0_set)) != 2) + .exit 1 + .end if + + .if ((cardinality (a0_set - an_set)) != 0) + .exit 2 + .end if + + .if ((cardinality (an_set - a1)) != 1) + .exit 3 + .end if + + .if ((cardinality (a1 - an_set)) != 0) + .exit 4 + .end if + + .if ((cardinality (a0_set - a1)) != 0) + .exit 5 + .end if + + .if ((cardinality (a1 - a0_set)) != 1) + .exit 6 + .end if + + .exit 0 + ''' + rc = self.eval_text(text) + self.assertEqual(0, rc)