コード例 #1
0
ファイル: executor.c プロジェクト: Rela-X/rlang
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;
}
コード例 #2
0
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);
}
コード例 #3
0
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);
}