From 81f00774af1eb5eaef4a8e43b05515c38a8fb15c Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Wed, 4 Jan 2023 11:10:10 +0100 Subject: [PATCH] feat(logic): operators sources --- app/models/logic/binary_operator.rb | 4 ++++ app/models/logic/champ_value.rb | 4 ++++ app/models/logic/constant.rb | 4 ++++ app/models/logic/empty.rb | 4 ++++ app/models/logic/n_ary_operator.rb | 4 ++++ spec/models/logic/binary_operator_spec.rb | 10 ++++++++++ spec/models/logic/champ_value_spec.rb | 6 ++++++ spec/models/logic/constant_spec.rb | 4 ++++ spec/models/logic/empty_spec.rb | 4 ++++ spec/models/logic/n_ary_operator_spec.rb | 4 ++++ 10 files changed, 48 insertions(+) diff --git a/app/models/logic/binary_operator.rb b/app/models/logic/binary_operator.rb index 45ad7aa48..0a0d3e54c 100644 --- a/app/models/logic/binary_operator.rb +++ b/app/models/logic/binary_operator.rb @@ -5,6 +5,10 @@ class Logic::BinaryOperator < Logic::Term @left, @right = left, right end + def sources + [@left, @right].flat_map(&:sources) + end + def to_h { "term" => self.class.name, diff --git a/app/models/logic/champ_value.rb b/app/models/logic/champ_value.rb index 07d26af01..462f33880 100644 --- a/app/models/logic/champ_value.rb +++ b/app/models/logic/champ_value.rb @@ -23,6 +23,10 @@ class Logic::ChampValue < Logic::Term @stable_id = stable_id end + def sources + [@stable_id] + end + def compute(champs) targeted_champ = champ(champs) diff --git a/app/models/logic/constant.rb b/app/models/logic/constant.rb index 3b72e7fbf..201e37228 100644 --- a/app/models/logic/constant.rb +++ b/app/models/logic/constant.rb @@ -5,6 +5,10 @@ class Logic::Constant < Logic::Term @value = value end + def sources + [] + end + def compute(_champs = nil) = @value def to_s(_type_de_champs = []) diff --git a/app/models/logic/empty.rb b/app/models/logic/empty.rb index d60e09442..605af6368 100644 --- a/app/models/logic/empty.rb +++ b/app/models/logic/empty.rb @@ -1,4 +1,8 @@ class Logic::Empty < Logic::Term + def sources + [] + end + def to_s(_type_de_champs = []) = I18n.t('logic.empty') def type(_type_de_champs = []) = :empty diff --git a/app/models/logic/n_ary_operator.rb b/app/models/logic/n_ary_operator.rb index e6f723264..02bc0cf42 100644 --- a/app/models/logic/n_ary_operator.rb +++ b/app/models/logic/n_ary_operator.rb @@ -5,6 +5,10 @@ class Logic::NAryOperator < Logic::Term @operands = operands end + def sources + @operands.flat_map(&:sources) + end + def to_h { "term" => self.class.name, diff --git a/spec/models/logic/binary_operator_spec.rb b/spec/models/logic/binary_operator_spec.rb index 28e45d041..e27c3b7bc 100644 --- a/spec/models/logic/binary_operator_spec.rb +++ b/spec/models/logic/binary_operator_spec.rb @@ -18,6 +18,16 @@ describe Logic::BinaryOperator do describe '#errors' do it { expect(greater_than(constant(1), constant(true)).errors).to eq([{ operator_name: "Logic::GreaterThan", type: :required_number }]) } end + + describe '#sources' do + let(:champ) { create(:champ_integer_number, value: nil) } + let(:champ2) { create(:champ_integer_number, value: nil) } + + it { expect(two_greater_than_one.sources).to eq([]) } + it { expect(greater_than(champ_value(champ.stable_id), constant(2)).sources).to eq([champ.stable_id]) } + it { expect(greater_than(constant(2), champ_value(champ.stable_id)).sources).to eq([champ.stable_id]) } + it { expect(greater_than(champ_value(champ.stable_id), champ_value(champ2.stable_id)).sources).to eq([champ.stable_id, champ2.stable_id]) } + end end describe Logic::GreaterThan do diff --git a/spec/models/logic/champ_value_spec.rb b/spec/models/logic/champ_value_spec.rb index af4f284d4..4e359032a 100644 --- a/spec/models/logic/champ_value_spec.rb +++ b/spec/models/logic/champ_value_spec.rb @@ -83,6 +83,12 @@ describe Logic::ChampValue do it { expect(champ_value(champ.stable_id).errors([])).to eq([{ type: :not_available }]) } end + describe '#sources' do + let(:champ) { create(:champ) } + + it { expect(champ_value(champ.stable_id).sources).to eq([champ.stable_id]) } + end + context 'with multiple revision' do let(:options) { ['revision_1'] } let(:procedure) do diff --git a/spec/models/logic/constant_spec.rb b/spec/models/logic/constant_spec.rb index 343fa90be..c535e32e1 100644 --- a/spec/models/logic/constant_spec.rb +++ b/spec/models/logic/constant_spec.rb @@ -21,4 +21,8 @@ describe Logic::Constant do it { expect(constant(1)).to eq(constant(1)) } it { expect(constant(1)).not_to eq(constant('a')) } end + + describe '#sources' do + it { expect(constant(1).sources).to eq([]) } + end end diff --git a/spec/models/logic/empty_spec.rb b/spec/models/logic/empty_spec.rb index 080a3c0c9..1cb9df421 100644 --- a/spec/models/logic/empty_spec.rb +++ b/spec/models/logic/empty_spec.rb @@ -17,4 +17,8 @@ describe Logic::Constant do describe '#to_s' do it { expect(empty.to_s).to eq('un membre vide') } end + + describe '#sources' do + it { expect(empty.sources).to eq([]) } + end end diff --git a/spec/models/logic/n_ary_operator_spec.rb b/spec/models/logic/n_ary_operator_spec.rb index fe592af3b..d3821f7d4 100644 --- a/spec/models/logic/n_ary_operator_spec.rb +++ b/spec/models/logic/n_ary_operator_spec.rb @@ -23,6 +23,10 @@ describe Logic::NAryOperator do end end + describe '#sources' do + it { expect(and_from([false, true]).sources).to eq([]) } + end + def and_from(boolean_to_constants) ds_and(boolean_to_constants.map { |b| constant(b) }) end