2019-10-12 23:23:16 +08:00
|
|
|
# frozen_string_literal: true
|
2022-01-13 17:05:07 +08:00
|
|
|
|
|
|
|
require("test_helper")
|
2017-01-19 00:28:16 +08:00
|
|
|
|
|
|
|
module Bootsnap
|
|
|
|
module LoadPathCache
|
2023-08-03 21:41:39 +08:00
|
|
|
class ChangeObserverTest < Minitest::Test
|
2023-06-30 06:59:39 +08:00
|
|
|
include LoadPathCacheHelper
|
|
|
|
|
2017-01-19 00:28:16 +08:00
|
|
|
def setup
|
2023-06-30 06:59:39 +08:00
|
|
|
super
|
2017-01-19 00:28:16 +08:00
|
|
|
@observer = Object.new
|
2023-10-30 16:32:37 +08:00
|
|
|
@observer.instance_variable_set(:@mutex, Mutex.new)
|
2017-01-19 00:28:16 +08:00
|
|
|
@arr = []
|
2022-05-31 20:12:50 +08:00
|
|
|
ChangeObserver.register(@arr, @observer)
|
2017-01-19 00:28:16 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_observes_changes
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:push_paths).with(@arr, "a")
|
|
|
|
@arr << "a"
|
2017-01-19 00:28:16 +08:00
|
|
|
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:push_paths).with(@arr, "b", "c")
|
|
|
|
@arr.push("b", "c")
|
2017-01-19 00:28:16 +08:00
|
|
|
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:push_paths).with(@arr, "d", "e")
|
|
|
|
@arr.append("d", "e")
|
2017-01-19 00:28:16 +08:00
|
|
|
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:unshift_paths).with(@arr, "f", "g")
|
|
|
|
@arr.unshift("f", "g")
|
2021-05-05 23:17:18 +08:00
|
|
|
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:push_paths).with(@arr, "h", "i")
|
2023-12-14 17:41:58 +08:00
|
|
|
@arr.push("h", "i")
|
2021-05-05 23:17:18 +08:00
|
|
|
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:unshift_paths).with(@arr, "j", "k")
|
|
|
|
@arr.prepend("j", "k")
|
2021-05-05 23:17:18 +08:00
|
|
|
end
|
|
|
|
|
2022-05-31 20:12:50 +08:00
|
|
|
def test_unregister
|
|
|
|
@observer.expects(:push_paths).never
|
|
|
|
@observer.expects(:unshift_paths).never
|
|
|
|
@observer.expects(:reinitialize).never
|
|
|
|
|
|
|
|
ChangeObserver.unregister(@arr)
|
|
|
|
|
|
|
|
@arr << "a"
|
|
|
|
@arr.push("b", "c")
|
|
|
|
@arr.append("d", "e")
|
|
|
|
@arr.unshift("f", "g")
|
2023-12-14 17:41:58 +08:00
|
|
|
@arr.push("h", "i")
|
2022-05-31 20:12:50 +08:00
|
|
|
@arr.prepend("j", "k")
|
|
|
|
@arr.delete(3)
|
|
|
|
@arr.compact!
|
|
|
|
@arr.map!(&:upcase)
|
|
|
|
assert_equal %w(J K F G A B C D E H I), @arr
|
|
|
|
end
|
|
|
|
|
2021-05-05 23:17:18 +08:00
|
|
|
def test_reinitializes_on_aggressive_modifications
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:push_paths).with(@arr, "a", "b", "c")
|
|
|
|
@arr.push("a", "b", "c")
|
2017-01-19 00:28:16 +08:00
|
|
|
|
2018-04-15 01:59:59 +08:00
|
|
|
@observer.expects(:reinitialize).times(4)
|
2017-01-19 00:28:16 +08:00
|
|
|
@arr.delete(3)
|
|
|
|
@arr.compact!
|
2018-04-13 22:13:03 +08:00
|
|
|
@arr.map!(&:upcase)
|
2022-01-13 17:05:07 +08:00
|
|
|
assert_equal("C", @arr.pop)
|
2021-05-05 23:17:18 +08:00
|
|
|
assert_equal(%w(A B), @arr)
|
2017-01-19 00:28:16 +08:00
|
|
|
end
|
2018-04-20 21:40:51 +08:00
|
|
|
|
2019-02-20 06:22:58 +08:00
|
|
|
def test_register_frozen
|
|
|
|
# just assert no crash
|
2022-05-31 20:12:50 +08:00
|
|
|
ChangeObserver.register(@arr.dup.freeze, @observer)
|
2019-02-20 06:22:58 +08:00
|
|
|
end
|
|
|
|
|
2018-04-20 21:40:51 +08:00
|
|
|
def test_register_twice_observes_once
|
2022-05-31 20:12:50 +08:00
|
|
|
ChangeObserver.register(@arr, @observer)
|
2018-04-20 21:40:51 +08:00
|
|
|
|
2022-01-13 17:05:07 +08:00
|
|
|
@observer.expects(:push_paths).with(@arr, "a").once
|
|
|
|
@arr << "a"
|
2018-04-20 21:40:51 +08:00
|
|
|
assert_equal(%w(a), @arr)
|
|
|
|
end
|
2018-09-03 07:53:11 +08:00
|
|
|
|
2023-10-30 16:32:37 +08:00
|
|
|
def test_dup_returns_ractor_shareable_instance
|
|
|
|
return unless defined?(Ractor)
|
|
|
|
|
|
|
|
ChangeObserver.register(@arr, @observer)
|
|
|
|
Ractor.make_shareable(@arr.dup.freeze)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_clone_returns_ractor_shareable_instance
|
|
|
|
return unless defined?(Ractor)
|
|
|
|
|
|
|
|
ChangeObserver.register(@arr, @observer)
|
|
|
|
Ractor.make_shareable(@arr.clone.freeze)
|
|
|
|
end
|
|
|
|
|
2018-09-03 07:53:11 +08:00
|
|
|
def test_uniq_without_block
|
|
|
|
@observer.expects(:reinitialize).never
|
|
|
|
@arr.uniq!
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_uniq_with_block
|
|
|
|
@observer.expects(:reinitialize).once
|
2022-05-31 22:57:29 +08:00
|
|
|
@arr.uniq! { |i| i }
|
2018-09-03 07:53:11 +08:00
|
|
|
end
|
2017-01-19 00:28:16 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|