Beispiel #1
0
int parse_factor(CALC_ELEMENT ** e)
{
	PARSE_SYMBOL s = get_symbol();
	switch (s) {
	case PARSE_NUMBER:
		*e = create_number(get_current_number());
		accept(s);
		return 0;
		break;
	case PARSE_X:
		*e = create_x();
		accept(s);
		return 0;
		break;
	case PARSE_LOG:
		return parse_log(e);
		break;
	case PARSE_LPAREN:
		return parse_paren_expr(e);
		break;
	default:
		parser_error("\'number\', \'x\', \'log\' or \'(\'");
		return -1;
	}
}
Beispiel #2
0
void test_calc_bad(void)
{
	CALC_ELEMENT *t1, *t2;
	/* division by zero, simple */
	t1 = create_number(9.0);
	t2 = create_number(0.0);
	t1 = create_bin_op('/', t1, t2);
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_CALC_DIV_BY_ZERO,
			STATUS_CALC_DIV_BY_ZERO);
	free_calc_element(t1);
	/* division by zero, complex */
	t1 = create_bin_op('/', create_number(4.0),
			   create_bin_op('-', create_number(2.0),
					 create_number(2.0)));
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_CALC_DIV_BY_ZERO,
			STATUS_CALC_DIV_BY_ZERO);
	free_calc_element(t1);
	/* log zero */
	t1 = create_log(create_number(0.0));
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_CALC_DOMAIN, STATUS_CALC_DOMAIN);
	free_calc_element(t1);
	/* log less than zero */
	t1 = create_log(create_number(-3.0));
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_CALC_DOMAIN, STATUS_CALC_DOMAIN);
	free_calc_element(t1);
	/* log zero, complex */
	t1 = create_log(create_bin_op
			('*', create_number(0.0), create_number(28.0)));
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_CALC_DOMAIN, STATUS_CALC_DOMAIN);
	free_calc_element(t1);
	/* x in the expression, simple */
	t1 = create_x();
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_X_PRESENT, STATUS_X_PRESENT);
	free_calc_element(t1);
	/* x in the expression, complex */
	t1 = create_bin_op('-', create_x(), create_number(17));
	CU_ASSERT_NOT_EQUAL(calculate(&t1), 0);
	CU_ASSERT_EQUAL(t1->status & STATUS_X_PRESENT, STATUS_X_PRESENT);
	free_calc_element(t1);
}
 void Logo::create_all() {
   create_z(Point2f(m_upper_left.x - 0.99f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_e(Point2f(m_upper_left.x - 0.55f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_n(Point2f(m_upper_left.x - 0.11f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_i(Point2f(m_upper_left.x + 0.33f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_p(Point2f(m_upper_left.x + 0.77f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_e(Point2f(m_upper_left.x + 1.21f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_x(Point2f(m_upper_left.x + 1.65f * m_height, m_upper_left.y + 0.25f * m_height), 0.5f * m_height);
   create_logo(m_upper_left, m_height);
 }
Beispiel #4
0
void test_x_cf(void)
{
	CALC_ELEMENT *t1 = create_x();
	CU_ASSERT_PTR_NOT_NULL(t1);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_X);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(t1->value, 1.0);
	CU_ASSERT_PTR_NULL(t1->left);
	CU_ASSERT_PTR_NULL(t1->right);
	free_calc_element(t1);
}
Beispiel #5
0
void test_bad_axb(void)
{
	CALC_ELEMENT *t1, *t2, *t3;
	double a, b;
	/* log */
	t2 = create_number(6.0);
	t1 = create_log(t2);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), -1);
	free_calc_element(t1);
	/* bin op different from + */
	t2 = create_number(-9.0);
	t3 = create_x();
	t1 = create_bin_op('*', t2, t3);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), -1);
	free_calc_element(t1);
	/* two numbers */
	t2 = create_number(2.0);
	t3 = create_number(4.2);
	t1 = create_bin_op('+', t2, t3);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), -1);
	free_calc_element(t1);
	/* two xs */
	t2 = create_x();
	t3 = create_x();
	t1 = create_bin_op('*', t2, t3);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), -1);
	free_calc_element(t1);
	/* something wonky, like 4 * 3 + 2 */
	t2 = create_number(4);
	t3 = create_number(3);
	t2 = create_bin_op('*', t2, t3);
	t3 = create_number(2);
	t1 = create_bin_op('+', t2, t3);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), -1);
	free_calc_element(t1);
}
Beispiel #6
0
void test_log_cf(void)
{
	CALC_ELEMENT *t1 = create_number(1.0);
	t1 = create_log(t1);
	CU_ASSERT_PTR_NOT_NULL(t1);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_LOG);
	CU_ASSERT_EQUAL(t1->status, 0);
	CU_ASSERT_EQUAL(t1->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(t1->left);
	CU_ASSERT_PTR_NULL(t1->right);
	free_calc_element(t1);

	t1 = create_x();
	t1 = create_log(t1);
	CU_ASSERT_PTR_NOT_NULL(t1);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_LOG);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT | STATUS_X_IN_LOG);
	CU_ASSERT_EQUAL(t1->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(t1->left);
	CU_ASSERT_PTR_NULL(t1->right);
	free_calc_element(t1);
}
Beispiel #7
0
void test_binop_cf(void)
{
	/* + */
	CALC_ELEMENT *e1 = create_number(3.0), *e2 = create_number(-4.0);
	CALC_ELEMENT *expr = create_bin_op('+', e1, e2);
	CU_ASSERT_PTR_NOT_NULL(expr);
	CU_ASSERT_EQUAL(expr->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(expr->bin_op, '+');
	CU_ASSERT_EQUAL(expr->status, 0);
	CU_ASSERT_EQUAL(expr->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(expr->left);
	CU_ASSERT_PTR_NOT_NULL(expr->right);
	free_calc_element(expr);

	/* - */
	e1 = create_number(-7.0);
	e2 = create_number(9.0);
	expr = create_bin_op('-', e1, e2);
	CU_ASSERT_PTR_NOT_NULL(expr);
	CU_ASSERT_EQUAL(expr->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(expr->bin_op, '+');
	CU_ASSERT_EQUAL(expr->status, 0);
	CU_ASSERT_EQUAL(expr->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(expr->left);
	CU_ASSERT_PTR_NOT_NULL(expr->right);
	CU_ASSERT_EQUAL(expr->right->value, -9.0);
	free_calc_element(expr);

	/* * */
	e1 = create_number(3.0);
	e2 = create_number(11.5);
	expr = create_bin_op('*', e1, e2);
	CU_ASSERT_PTR_NOT_NULL(expr);
	CU_ASSERT_EQUAL(expr->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(expr->bin_op, '*');
	CU_ASSERT_EQUAL(expr->status, 0);
	CU_ASSERT_EQUAL(expr->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(expr->left);
	CU_ASSERT_PTR_NOT_NULL(expr->right);
	free_calc_element(expr);

	/* /, only numbers */
	e1 = create_number(-7.0);
	e2 = create_number(5.0);
	expr = create_bin_op('/', e1, e2);
	CU_ASSERT_PTR_NOT_NULL(expr);
	CU_ASSERT_EQUAL(expr->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(expr->bin_op, '/');
	CU_ASSERT_EQUAL(expr->status, 0);
	CU_ASSERT_EQUAL(expr->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(expr->left);
	CU_ASSERT_PTR_NOT_NULL(expr->right);
	free_calc_element(expr);

	/* /, with an x */
	e1 = create_x();
	e2 = create_number(2.0);
	expr = create_bin_op('/', e1, e2);
	CU_ASSERT_PTR_NOT_NULL(expr);
	CU_ASSERT_EQUAL(expr->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(expr->bin_op, '/');
	CU_ASSERT_EQUAL(expr->status, STATUS_X_PRESENT | STATUS_X_IN_DIV);
	CU_ASSERT_EQUAL(expr->value, 1.0);
	CU_ASSERT_PTR_NOT_NULL(expr->left);
	CU_ASSERT_PTR_NOT_NULL(expr->right);
	free_calc_element(expr);
}
Beispiel #8
0
void test_canon_x(void)
{
	CALC_ELEMENT *t1;
	double a, b;
	/* addition x + a * x */
	t1 = create_bin_op('+', create_x(),
			   create_bin_op('*', create_number(2.5), create_x()));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_X);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(t1->value, 3.5);
	free_calc_element(t1);

	/* addition a * x + b */
	t1 = create_bin_op('+',
			   create_bin_op('*', create_number(1.25), create_x()),
			   create_number(14));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, 1.25);
	CU_ASSERT_EQUAL(b, 14);
	free_calc_element(t1);

	/* addition a * x + b + c */
	t1 = create_bin_op('+',
			   create_bin_op('+',
					 create_bin_op('*', create_number(0.75),
						       create_x()),
					 create_number(6)),
			   create_number(-3.5));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, 0.75);
	CU_ASSERT_EQUAL(b, 2.5);
	free_calc_element(t1);

	/* addition (a1 * x + b1) + (a2 * x + b2) */
	t1 = create_bin_op('+', create_ax_b(9.0, -1.25), create_ax_b(2.0, 6.5));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, 11.0);
	CU_ASSERT_EQUAL(b, 5.25);
	free_calc_element(t1);

	/* multiplication a * x */
	t1 = create_bin_op('*', create_x(), create_number(-9.0));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_X);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, -9.0);
	CU_ASSERT_EQUAL(b, 0);
	free_calc_element(t1);

	/* multiplication x * a */
	t1 = create_bin_op('*', create_number(7.5), create_x());
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_X);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, 7.5);
	CU_ASSERT_EQUAL(b, 0);
	free_calc_element(t1);

	/* multiplication c * (a * x + b) */
	t1 = create_bin_op('*', create_number(19), create_ax_b(4, -0.5));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, 76);
	CU_ASSERT_EQUAL(b, -9.5);
	free_calc_element(t1);

	/* multiplication (a * x + b) * c */
	t1 = create_bin_op('*', create_ax_b(-6, 4.5), create_number(0.5));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_PRESENT);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, -3.0);
	CU_ASSERT_EQUAL(b, 2.25);
	free_calc_element(t1);

	/* multiplication x * x */
	t1 = create_bin_op('*', create_x(), create_x());
	CU_ASSERT_NOT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_NON_LINEAR | STATUS_X_PRESENT);
	free_calc_element(t1);

	/* multiplication x * (a * x + b) */
	t1 = create_bin_op('*', create_x(), create_x());
	CU_ASSERT_NOT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_NON_LINEAR | STATUS_X_PRESENT);
	free_calc_element(t1);

	/* multiplication (2*x - (2*x - 3)) * (3x - 4) - false square, actually linear */
	t1 = create_bin_op('*', create_bin_op('-', create_ax_b(2.0, 0.0),
					      create_ax_b(2, -3)),
			   create_ax_b(3.0, -4.0));
	CU_ASSERT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(get_ax_b(t1, &a, &b), 0);
	CU_ASSERT_EQUAL(a, 9.0);
	CU_ASSERT_EQUAL(b, -12.0);
	free_calc_element(t1);

	/* division x / a */
	t1 = create_bin_op('/', create_x(), create_number(2.0));
	CU_ASSERT_NOT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_BIN_OP);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_IN_DIV | STATUS_X_PRESENT);
	free_calc_element(t1);

	/* log (ax + b) */
	t1 = create_log(create_ax_b(9.0, -3.0));
	CU_ASSERT_NOT_EQUAL(canonical_form(&t1), 0);
	CU_ASSERT_EQUAL(t1->calc_t, CALC_LOG);
	CU_ASSERT_EQUAL(t1->status, STATUS_X_IN_LOG | STATUS_X_PRESENT);
	free_calc_element(t1);
}