static Value * _set(const Ast *expr) { Value *rval = value_new(); int n = 0; for(Ast *c = expr->child; c != NULL; c = c->next) n++; int eidx = -1; rf_SetElement *elems[n]; for(Ast *c = expr->child; c != NULL; c = c->next) { Value *v; switch(c->class) { case N_STRING: elems[++eidx] = rf_set_element_new_string(c->value); break; case N_SET: v = _set(c); elems[++eidx] = rf_set_element_new_set(v->as_Set); value_free(v); break; } } value_set_set(rval, rf_set_new(n, elems)); return rval; }
void test_rf_set_element_new_set() { rf_SetElement *elems[3]; elems[0] = rf_set_element_new_string("a"); elems[1] = rf_set_element_new_string("b"); elems[2] = rf_set_element_new_string("c"); rf_Set *subset = rf_set_new(3, elems); rf_SetElement *set_elem = rf_set_element_new_set(subset); // CU_ASSERT_EQUAL(set_elem->type, RF_SET_ELEMENT_TYPE_SET); // CU_ASSERT_TRUE(rf_set_equal(subset, set_elem->value.set)); rf_set_free(subset); rf_set_element_free(set_elem); }
void test_rf_set_element_clone() { //case, element is a char rf_SetElement *src1 = rf_set_element_new_string("a"); rf_SetElement *dst1 = rf_set_element_clone(src1); CU_ASSERT_PTR_NOT_EQUAL(dst1, src1); CU_ASSERT_STRING_EQUAL(dst1->value.string, src1->value.string); //case element is a subset rf_SetElement *elems[] = { rf_set_element_new_string("a"), rf_set_element_new_string("b"), rf_set_element_new_string("c"), }; rf_Set *subset = rf_set_new(3, elems); rf_SetElement *src2 = rf_set_element_new_set(subset); rf_SetElement *dst2 = rf_set_element_clone(src2); //Must not work on same elements by copying pointers CU_ASSERT_PTR_NOT_EQUAL(src2->value.set, subset); CU_ASSERT_PTR_NOT_EQUAL(dst2->value.set, subset); CU_ASSERT_PTR_NOT_EQUAL(dst2, src2); CU_ASSERT_TRUE(rf_set_element_equal(dst2, src2)); CU_ASSERT_STRING_EQUAL(dst2->value.set->elements[0]->value.string, src2->value.set->elements[0]->value.string); CU_ASSERT_STRING_EQUAL(dst2->value.set->elements[1]->value.string, src2->value.set->elements[1]->value.string); CU_ASSERT_STRING_EQUAL(dst2->value.set->elements[2]->value.string, src2->value.set->elements[2]->value.string); rf_set_element_free(src1); rf_set_element_free(dst1); rf_set_free(subset); rf_set_element_free(src2); rf_set_element_free(dst2); }