From d35c7b22e6b1f2d110e16a6a61b9347dacc4dede Mon Sep 17 00:00:00 2001 From: Chris Sangwin <C.J.Sangwin@ed.ac.uk> Date: Wed, 17 Jul 2024 15:02:10 +0100 Subject: [PATCH] Fix to issue #1220: display of x-0, x-0.0 etc. That us unary minus and 0. --- stack/maxima/stackmaxima.mac | 2 +- tests/castext_test.php | 19 +++++++++++++++++++ tests/input_algebraic_test.php | 24 ++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/stack/maxima/stackmaxima.mac b/stack/maxima/stackmaxima.mac index 6135dbc71..286d1269d 100644 --- a/stack/maxima/stackmaxima.mac +++ b/stack/maxima/stackmaxima.mac @@ -898,12 +898,12 @@ texput(matrix, stack_matrix_disp)$ unary_minus_traverse(ex) := block( /* We want atom here, not mapatom to catch a[4]. */ if atom(ex) then return(ex), + if op(ex) = "-" and (is(first(args(ex))=0) or is(first(args(ex))=0.0)) then return(ex), if op(ex) = "-" and numberp(first(args(ex))) then return(ev(ex,simp)), if arrayp(ex) then return(arraymake(op(ex), maplist(unary_minus_traverse, args(ex)))), apply(op(ex), map(unary_minus_traverse, args(ex)) ) )$ - /* Pulls out "-" to the front of any expression in a sum of products which needs it. */ /* For example, -(2*y^2) is ok */ /* But (-3)*7 is not. */ diff --git a/tests/castext_test.php b/tests/castext_test.php index 421384cfe..b2861c8a1 100644 --- a/tests/castext_test.php +++ b/tests/castext_test.php @@ -2332,4 +2332,23 @@ class castext_test extends qtype_stack_testcase { $this->assertEquals('Underscore characters are not permitted in this input.', $at2->get_rendered()); } + + /** + * @covers \qtype_stack\stack_cas_castext2_latex + * @covers \qtype_stack\stack_cas_keyval + */ + public function test_unary_minus_zeros() { + $options = new stack_options(); + $options->set_option('simplify', false); + $cs2 = new stack_cas_session2([], $options, 123456); + + $textinput = "{@x-0@}, {@x-0.0@}, {@x*(-0.0)@}, {@-27@}."; + $at1 = castext2_evaluatable::make_from_source($textinput, 'test-case'); + $this->assertTrue($at1->get_valid()); + $cs2->add_statement($at1); + $cs2->instantiate(); + + $this->assertEquals('\({x-0}\), \({x-0.0}\), \({x\cdot \left(-0.0\right)}\), \({-27}\).', + $at1->get_rendered()); + } } diff --git a/tests/input_algebraic_test.php b/tests/input_algebraic_test.php index 36ff5bcd8..2a1bb3280 100644 --- a/tests/input_algebraic_test.php +++ b/tests/input_algebraic_test.php @@ -344,6 +344,30 @@ class input_algebraic_test extends qtype_stack_testcase { $this->assertEquals('Lowest_Terms', $state->note); } + public function test_validate_student_response_with_minus_zero() { + $options = new stack_options(); + $el = stack_input_factory::make('algebraic', 'sans1', '1/2'); + $el->set_parameter('forbidFloats', false); + + $state = $el->validate_student_response(['sans1' => "x-0"], $options, '3.14', new stack_cas_security()); + $this->assertEquals(stack_input::VALID, $state->status); + $this->assertEquals('x-0', $state->contentsmodified); + $this->assertEquals('\[ x-0 \]', $state->contentsdisplayed); + $this->assertEquals('', $state->errors); + + $state = $el->validate_student_response(['sans1' => "x-0.0"], $options, '3.14', new stack_cas_security()); + $this->assertEquals(stack_input::VALID, $state->status); + $this->assertEquals('x-0.0', $state->contentsmodified); + $this->assertEquals('\[ x-0.0 \]', $state->contentsdisplayed); + $this->assertEquals('', $state->errors); + + $state = $el->validate_student_response(['sans1' => "x*(-0.0)"], $options, '3.14', new stack_cas_security()); + $this->assertEquals(stack_input::VALID, $state->status); + $this->assertEquals('x*(-0.0)', $state->contentsmodified); + $this->assertEquals('\[ x\cdot \left(-0.0\right) \]', $state->contentsdisplayed); + $this->assertEquals('', $state->errors); + } + public function test_validate_student_response_with_rationalized() { $options = new stack_options(); $el = stack_input_factory::make('algebraic', 'sans1', '1/2'); -- GitLab