Log Message:
-----------
Backport fixes to inheritance and for answerchecker:
Fix the check for equivalent answers so that it uses the limits and
other settings from the answer checker and the original formula
object.
from HEAD to rel-2-4-patches
Tags:
----
rel-2-4-patches
Modified Files:
--------------
pg/lib:
Value.pm
pg/lib/Value:
AnswerChecker.pm
Formula.pm
Revision Data
-------------
Index: Value.pm
===================================================================
RCS file: /webwork/cvs/system/pg/lib/Value.pm,v
retrieving revision 1.53.2.3.2.2
retrieving revision 1.53.2.3.2.3
diff -Llib/Value.pm -Llib/Value.pm -u -r1.53.2.3.2.2 -r1.53.2.3.2.3
--- lib/Value.pm
+++ lib/Value.pm
@@ -598,8 +598,9 @@
#
sub inherit {
my $self = shift;
- $self = bless {(map {%$_} @_),%$self}, ref($self);
- foreach my $id ($self->noinherit) {delete $self->{$id}};
+ my %copy = (map {%$_} @_); # copy values from given objects
+ foreach my $id ($self->noinherit) {delete $copy{$id}}
+ $self = bless {%copy,%$self}, ref($self);
return $self;
}
Index: AnswerChecker.pm
===================================================================
RCS file: /webwork/cvs/system/pg/lib/Value/AnswerChecker.pm,v
retrieving revision 1.91.2.2.2.2
retrieving revision 1.91.2.2.2.3
diff -Llib/Value/AnswerChecker.pm -Llib/Value/AnswerChecker.pm -u -r1.91.2.2.2.2 -r1.91.2.2.2.3
--- lib/Value/AnswerChecker.pm
+++ lib/Value/AnswerChecker.pm
@@ -1624,7 +1624,7 @@
sub cmp_call_filter {
my $ans = shift; my $method = shift;
- return $ans->{correct_value}->$method($ans);
+ return $ans->{correct_value}->$method($ans,@_);
}
sub cmp_prefilter {
@@ -1646,10 +1646,14 @@
my $self = shift; my $ans = shift;
$ans->{_filter_name} = "produce_equivalence_message";
return $ans if $ans->{ans_message}; # don't overwrite other messages
- $ans->{prev_formula} = Parser::Formula($self->{context},$ans->{prev_ans});
+ my $context = $self->context;
+ $ans->{prev_formula} = Parser::Formula($context,$ans->{prev_ans});
if (defined($ans->{prev_formula}) && defined($ans->{student_formula})) {
- my $prev = eval {$self->promote($ans->{prev_formula})}; break unless defined($prev);
- $ans->{prev_equals_current} = Value::cmp_compare($prev,$ans->{student_formula},{});
+ my $prev = eval {$self->promote($ans->{prev_formula})->inherit($self)}; # inherit limits, etc.
+ break unless defined($prev);
+ $context->{answerHash} = $ans; # values here can override context flags
+ $ans->{prev_equals_current} = Value::cmp_compare($prev,$ans->{student_formula},$ans);
+ $context->{answerHash} = undef;
if ( !$ans->{isPreview} # not preview mode
and $ans->{prev_equals_current} # equivalent
and $ans->{prev_ans} ne $ans->{original_student_ans}) # but not identical
@@ -1681,8 +1685,10 @@
sub cmp_postprocess {
my $self = shift; my $ans = shift;
- return unless $ans->{score} == 0 && !$ans->{isPreview};
- return if $ans->{ans_message};
+ return unless $ans->{score} == 0;
+ eval {$ans->{student_formula}->reduce} if defined($ans->{student_formula}); # check for bad function calls
+ $self->cmp_error($ans) if $self->{context}{error}{flag}; # and report the error
+ return if $ans->{ans_message} || $ans->{isPreview};
if ($self->{domainMismatch} && $ans->{showDomainErrors}) {
$self->cmp_Error($ans,"The domain of your function doesn't match that of the correct answer");
return;
Index: Formula.pm
===================================================================
RCS file: /webwork/cvs/system/pg/lib/Value/Formula.pm,v
retrieving revision 1.43.2.2.2.1
retrieving revision 1.43.2.2.2.2
diff -Llib/Value/Formula.pm -Llib/Value/Formula.pm -u -r1.43.2.2.2.1 -r1.43.2.2.2.2
--- lib/Value/Formula.pm
+++ lib/Value/Formula.pm
@@ -220,6 +220,16 @@
}
#
+# Don't inherit test values or adapted values, or other temporary items
+#
+sub noinherit {
+ my $self = shift;
+ ($self->SUPER::noinherit(@_),"test_values","test_adapt","tree","string","variables",
+ "f","stack","ref","tokens","values","space","domainMismatch");
+}
+
+
+#
# Create the value list from a given set of test points
#
sub createPointValues {
|