diff --git a/lib/fbe/same.rb b/lib/fbe/same.rb index 538a1fc2..7a1d40c1 100644 --- a/lib/fbe/same.rb +++ b/lib/fbe/same.rb @@ -15,5 +15,5 @@ # @param [Hash] attrs The attributes the caller asked for # @return [Boolean] TRUE if every Time attribute is in the fact def Fbe.same?(fact, attrs) - attrs.all? { |k, v| !v.is_a?(Time) || [fact.public_send(k)].flatten.include?(v) } + attrs.all? { |k, v| !v.is_a?(Time) || fact[k.to_s]&.include?(v) } end diff --git a/test/fbe/test_if_absent.rb b/test/fbe/test_if_absent.rb index 08654c2a..da4833f8 100644 --- a/test/fbe/test_if_absent.rb +++ b/test/fbe/test_if_absent.rb @@ -147,4 +147,19 @@ 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_dont_duplicate_fact_whose_time_is_not_the_first_value + seed = Random.new_seed + hour = Random.new(seed).rand(0..20) + fb = Factbase.new + g = fb.insert + g.what = 'ëvent' + g.when = Time.utc(2025, 1, 1, hour) + g.when = Time.utc(2025, 1, 1, hour + 1) + Fbe.if_absent(fb:) do |f| + f.what = 'ëvent' + f.when = Time.utc(2025, 1, 1, hour + 1) + end + assert_equal(1, fb.size, "if_absent created a duplicate, seed #{seed}") + end end diff --git a/test/fbe/test_just_one.rb b/test/fbe/test_just_one.rb index 7aaac15a..cd684da5 100644 --- a/test/fbe/test_just_one.rb +++ b/test/fbe/test_just_one.rb @@ -88,4 +88,19 @@ def test_dont_insert_fact_without_block end assert_equal(0, fb.size, 'just_one inserted a fact without a block') end + + def test_dont_duplicate_fact_whose_time_is_not_the_first_value + seed = Random.new_seed + hour = Random.new(seed).rand(0..20) + fb = Factbase.new + g = fb.insert + g.what = 'ëvent' + g.when = Time.utc(2025, 1, 1, hour) + g.when = Time.utc(2025, 1, 1, hour + 1) + Fbe.just_one(fb:) do |f| + f.what = 'ëvent' + f.when = Time.utc(2025, 1, 1, hour + 1) + end + assert_equal(1, fb.size, "just_one created a duplicate, seed #{seed}") + end end diff --git a/test/fbe/test_same.rb b/test/fbe/test_same.rb new file mode 100644 index 00000000..e4db6a69 --- /dev/null +++ b/test/fbe/test_same.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Zerocracy +# SPDX-License-Identifier: MIT + +require 'factbase' +require_relative '../../lib/fbe/same' +require_relative '../test__helper' + +# Test. +# Author:: Yegor Bugayenko (yegor256@gmail.com) +# Copyright:: Copyright (c) 2024-2026 Zerocracy +# License:: MIT +class TestSame < Fbe::Test + def test_finds_time_that_is_not_the_first_value + seed = Random.new_seed + hour = Random.new(seed).rand(0..20) + f = Factbase.new.insert + f.when = Time.utc(2025, 1, 1, hour) + f.when = Time.utc(2025, 1, 1, hour + 1) + assert(Fbe.same?(f, { when: Time.utc(2025, 1, 1, hour + 1) }), "second time of the fact is not seen, seed #{seed}") + end + + def test_refuses_time_that_is_in_no_value + seed = Random.new_seed + hour = Random.new(seed).rand(0..20) + f = Factbase.new.insert + f.when = Time.utc(2025, 1, 1, hour) + f.when = Time.utc(2025, 1, 1, hour + 1) + refute(Fbe.same?(f, { when: Time.utc(2025, 1, 1, hour + 2) }), "absent time is taken as present, seed #{seed}") + end +end