Skip to content

Commit

Permalink
fix to members of objects being found but not evaluated with bad values
Browse files Browse the repository at this point in the history
  • Loading branch information
andy committed Dec 21, 2017
1 parent 910d183 commit bd39978
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 3 deletions.
4 changes: 2 additions & 2 deletions lib/jcr/evaluate_array_rules.rb
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = n
else # else not group rule

successes = 0
for i in behavior.last_index..data.length
for i in behavior.last_index..data.length-1
break if successes == repeat_max
unless behavior.checked_hash[ i ]
e = evaluate_rule( rule, rule_atom, data[ i ], econs, nil )
Expand Down Expand Up @@ -296,7 +296,7 @@ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = n
behavior.last_index = highest_index

if data.length > behavior.checked_hash.length && behavior.extra_prohibited
retval = Evaluation.new( false, "More items in array than specified for #{raised_rule(jcr,rule_atom)}" )
retval = Evaluation.new( false, "More items in array #{data.length} than specified #{behavior.checked_hash.length} for #{raised_rule(jcr,rule_atom)}" )
end

return retval
Expand Down
5 changes: 5 additions & 0 deletions lib/jcr/evaluate_object_rules.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ def self.evaluate_object jcr, rule_atom, data, econs, behavior = nil, target_ann
else # if not grule

repeat_results = nil
member_found = false

# do a little lookahead for member rules defined by names
# if defined by a name, and not a regex, just pluck it from the object
Expand All @@ -132,6 +133,7 @@ def self.evaluate_object jcr, rule_atom, data, econs, behavior = nil, target_ann
unless behavior.checked_hash[k]
e = evaluate_rule(rule, rule_atom, [k, v], econs, nil, nil)
behavior.checked_hash[k] = e.success
member_found = true if e.member_found
repeat_results[ k ] = v if e.success
end
else
Expand All @@ -153,6 +155,7 @@ def self.evaluate_object jcr, rule_atom, data, econs, behavior = nil, target_ann
behavior.checked_hash[k] = e.success
i = i + 1 if e.success
found = true if e.member_found
member_found = true if e.member_found
e.success
end
end
Expand All @@ -174,6 +177,8 @@ def self.evaluate_object jcr, rule_atom, data, econs, behavior = nil, target_ann
retval = Evaluation.new( false, "object has too many #{jcr_to_s(rule)} for #{raised_rule(jcr,rule_atom)}")
elsif repeat_step && ( repeat_results.length - repeat_min ) % repeat_step != 0
retval = Evaluation.new( false, "object matches (#{repeat_results.length}) does not match repetition step of #{repeat_max} & #{repeat_step} for #{jcr_to_s(rule)} for #{raised_rule(jcr,rule_atom)}")
elsif member_found && repeat_results.length == 0 && repeat_max > 0
retval = Evaluation.new( false, "object contains #{jcr_to_s(rule)} with member name though incorrect value for #{raised_rule(jcr,rule_atom)}")
else
retval = Evaluation.new( true, nil)
end
Expand Down
1 change: 1 addition & 0 deletions lib/jcr/evaluate_rules.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ def initialize data, jcr, type, evaluation, stack_level
end

def self.evaluate_rule jcr, rule_atom, data, econs, behavior = nil, target_annotations = nil
trace( econs, "Dispatching rule for #{jcr_to_s(jcr)} with data: #{data}")
if jcr.is_a?( Hash )
if jcr[:rule_name]
rn = slice_to_s( jcr[:rule_name] )
Expand Down
2 changes: 1 addition & 1 deletion lib/jcr/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@

module JCR

VERSION = "0.8.1"
VERSION = "0.8.2"

end
8 changes: 8 additions & 0 deletions spec/evaluate_array_rules_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -864,4 +864,12 @@
expect( e.success ).to be_falsey
end

it 'should pass arrays inside array' do
tree = JCR.parse( '[ "thing", [ "thing" ] ]')
mapping = JCR.map_rule_names( tree )
JCR.check_rule_target_names( tree, mapping )
e = JCR.evaluate_rule( tree[0], tree[0], [ "thing", [ "thing" ] ], JCR::EvalConditions.new( mapping, nil ) )
expect( e.success ).to be_truthy
end

end
16 changes: 16 additions & 0 deletions spec/evaluate_object_rules_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -819,4 +819,20 @@
expect( e.success ).to be_falsey
end

it 'should fail to validate a member that exists but wrong value if optional' do
tree = JCR.parse( '{ "addrs":[ ipv6+ ] ? }')
mapping = JCR.map_rule_names( tree )
JCR.check_rule_target_names( tree, mapping )
e = JCR.evaluate_rule( tree[0], tree[0], {"addrs"=>["192.168.0.1"]}, JCR::EvalConditions.new( mapping, nil ) )
expect( e.success ).to be_falsey
end

it 'should pass a member not specified if optional' do
tree = JCR.parse( '{ "addrs":[ ipv6+ ] ? }')
mapping = JCR.map_rule_names( tree )
JCR.check_rule_target_names( tree, mapping )
e = JCR.evaluate_rule( tree[0], tree[0], {"ipv6"=>["192.168.0.1"]}, JCR::EvalConditions.new( mapping, nil ) )
expect( e.success ).to be_truthy
end

end

0 comments on commit bd39978

Please sign in to comment.