1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
# frozen_string_literal: true
require "dry-logic"
RSpec.describe "Rules" do
specify "defining an anonymous rule with an arbitrary predicate" do
rule = Dry::Logic.Rule { |value| value.is_a?(Integer) }
expect(rule.(1)).to be_success
expect(rule[1]).to be(true)
end
specify "defining a conjunction" do
rule = Dry::Logic.Rule(&:even?) & Dry::Logic.Rule { |v| v > 4 }
expect(rule.(3)).to be_failure
expect(rule.(4)).to be_failure
expect(rule.(5)).to be_failure
expect(rule.(6)).to be_success
end
specify "defining a disjunction" do
rule = Dry::Logic.Rule { |v| v < 4 } | Dry::Logic.Rule { |v| v > 6 }
expect(rule.(5)).to be_failure
expect(rule.(3)).to be_success
expect(rule.(7)).to be_success
end
specify "defining an implication" do
rule = Dry::Logic.Rule(&:empty?) > Dry::Logic.Rule { |v| v.is_a?(Array) }
expect(rule.("foo")).to be_success
expect(rule.([1, 2])).to be_success
expect(rule.([])).to be_success
expect(rule.("")).to be_failure
end
specify "defining an exclusive disjunction" do
rule = Dry::Logic.Rule(&:empty?) ^ Dry::Logic.Rule { |v| v.is_a?(Array) }
expect(rule.("foo")).to be_failure
expect(rule.([])).to be_failure
expect(rule.([1, 2])).to be_success
expect(rule.("")).to be_success
end
specify "defining a rule with options" do
rule = Dry::Logic::Rule(id: :empty?) { |value| value.empty? }
expect(rule.("foo")).to be_failure
expect(rule.("")).to be_success
expect(rule.ast("foo")).to eql([:predicate, [:empty?, [[:value, "foo"]]]])
end
end
|