diff --git a/lib/fbe/if_absent.rb b/lib/fbe/if_absent.rb index 0141b000..1a205e78 100644 --- a/lib/fbe/if_absent.rb +++ b/lib/fbe/if_absent.rb @@ -58,7 +58,8 @@ def Fbe.if_absent(fb: Fbe.fb, always: false) k = k[0..-2].to_sym v = args[1] raise(Fbe::Error, "Can't set #{k} to nil") if v.nil? - raise(Fbe::Error, "Can't set #{k} to empty string") if v.is_a?(String) && v.empty? + raise(Fbe::Error, "Can't set #{k} to empty string") if v == '' + raise(Fbe::Error, "Can't set #{k} to #{v.inspect}, it is already #{@map[k].inspect}") if @map.key?(k) @map[k] = v else @map[k.to_sym] diff --git a/lib/fbe/just_one.rb b/lib/fbe/just_one.rb index 9465834a..203fedbc 100644 --- a/lib/fbe/just_one.rb +++ b/lib/fbe/just_one.rb @@ -43,8 +43,10 @@ def Fbe.just_one(fb: Fbe.fb) if k.end_with?('=') v = args[1] raise(Fbe::Error, "Can't set #{k[0..-2]} to nil") if v.nil? - raise(Fbe::Error, "Can't set #{k[0..-2]} to empty string") if v.is_a?(String) && v.empty? - @map[k[0..-2].to_sym] = v + raise(Fbe::Error, "Can't set #{k[0..-2]} to empty string") if v == '' + k = k[0..-2].to_sym + raise(Fbe::Error, "Can't set #{k} to #{v.inspect}, it is already #{@map[k].inspect}") if @map.key?(k) + @map[k] = v else @map[k.to_sym] end diff --git a/test/fbe/test_if_absent.rb b/test/fbe/test_if_absent.rb index 08654c2a..de04e83a 100644 --- a/test/fbe/test_if_absent.rb +++ b/test/fbe/test_if_absent.rb @@ -147,4 +147,30 @@ def test_raises_without_block assert_equal('A block is required by if_absent', error.message) assert_equal(0, fb.size, 'if_absent inserted a fact without a block') end + + def test_cannot_set_property_twice + seed = Random.new_seed + tag = "tæg#{Random.new(seed).rand(1_000_000)}" + assert_raises(Fbe::Error, "second value of a property is accepted, seed #{seed}") do + Fbe.if_absent(fb: Factbase.new) do |f| + f.tag = tag + f.tag = "#{tag}ü" + end + end + end + + def test_dont_insert_fact_when_property_is_set_twice + seed = Random.new_seed + tag = "tæg#{Random.new(seed).rand(1_000_000)}" + fb = Factbase.new + begin + Fbe.if_absent(fb:) do |f| + f.tag = tag + f.tag = tag + end + rescue Fbe::Error + nil + end + assert_equal(0, fb.size, "a fact is inserted for a property set twice, seed #{seed}") + end end diff --git a/test/fbe/test_just_one.rb b/test/fbe/test_just_one.rb index 7aaac15a..8c23e43c 100644 --- a/test/fbe/test_just_one.rb +++ b/test/fbe/test_just_one.rb @@ -88,4 +88,30 @@ def test_dont_insert_fact_without_block end assert_equal(0, fb.size, 'just_one inserted a fact without a block') end + + def test_cannot_set_property_twice + seed = Random.new_seed + tag = "tæg#{Random.new(seed).rand(1_000_000)}" + assert_raises(Fbe::Error, "second value of a property is accepted, seed #{seed}") do + Fbe.just_one(fb: Factbase.new) do |f| + f.tag = tag + f.tag = "#{tag}ü" + end + end + end + + def test_dont_insert_fact_when_property_is_set_twice + seed = Random.new_seed + tag = "tæg#{Random.new(seed).rand(1_000_000)}" + fb = Factbase.new + begin + Fbe.just_one(fb:) do |f| + f.tag = tag + f.tag = tag + end + rescue Fbe::Error + nil + end + assert_equal(0, fb.size, "a fact is inserted for a property set twice, seed #{seed}") + end end