void test_rf_set_equal() { char a[] = "a"; char b[] = "b"; char c[] = "c"; rf_SetElement *elems1[] = { rf_set_element_new_string(a), rf_set_element_new_string(b), rf_set_element_new_string(c), }; rf_Set *set1 = rf_set_new(3, elems1); rf_SetElement *elems2[] = { rf_set_element_new_string(c), rf_set_element_new_string(b), rf_set_element_new_string(a), }; rf_Set *set2 = rf_set_new(3, elems2); rf_SetElement *elems3[] = { rf_set_element_new_string(a), rf_set_element_new_string(b), }; rf_Set *set3 = rf_set_new(2, elems3); CU_ASSERT_TRUE(rf_set_equal(set1, set1)) //stupid case CU_ASSERT_TRUE(rf_set_equal(set1, set2)) //tricky case, same set with switched order CU_ASSERT_FALSE(rf_set_equal(set1, set3)) //false case rf_set_free(set1); rf_set_free(set2); rf_set_free(set3); }
static Value * _eq(const Ast *expr) { Ast *op1 = expr->child; Ast *op2 = expr->child->next; Value *v1 = eval(op1); Value *v2 = eval(op2); Value *rval = v1; if(v1->type != v2->type) { value_set_bool(rval, false); } else { switch(v1->type) { case T_BOOL: value_set_bool(rval, v1->as_bool == v2->as_bool); break; case T_INT: value_set_bool(rval, v1->as_int == v2->as_int); break; case T_FLOAT: value_set_bool(rval, fabs((v1->as_float - v2->as_float)) < 0.05); break; case T_STRING: value_set_bool(rval, strcmp(v1->as_String, v2->as_String) == 0); break; case T_SET: value_set_bool(rval, rf_set_equal(v1->as_Set, v2->as_Set)); break; case T_R: value_set_bool(rval, rf_relation_equal(v1->as_Relation, v2->as_Relation)); break; } } value_free(v2); return rval; }