From 542c70aab748cf17960cc2a0959ba490983ceae6 Mon Sep 17 00:00:00 2001 From: Daniel Pepper Date: Sun, 4 Jun 2023 21:29:32 -0700 Subject: [PATCH] [ruby/singleton] Simplify implementation of `Singleton#instance`. (https://github.com/ruby/singleton/pull/9) - Add more tests to cover rails' usage. --- lib/singleton.rb | 7 +------ test/test_singleton.rb | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 07420d2ea2..7ed17a769c 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -121,12 +121,7 @@ module Singleton end def instance # :nodoc: - return @singleton__instance__ if @singleton__instance__ - @singleton__mutex__.synchronize { - return @singleton__instance__ if @singleton__instance__ - @singleton__instance__ = new() - } - @singleton__instance__ + @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= new } end private diff --git a/test/test_singleton.rb b/test/test_singleton.rb index b3c48bb5f5..e474a0ccc5 100644 --- a/test/test_singleton.rb +++ b/test/test_singleton.rb @@ -94,6 +94,23 @@ class TestSingleton < Test::Unit::TestCase assert_same a, b end + def test_inheritance_creates_separate_singleton + a = SingletonTest.instance + b = Class.new(SingletonTest).instance + + assert_not_same a, b + end + + def test_inheritance_instantiation + klass = Class.new do + include Singleton + + public_class_method :new + end + + assert Class.new(klass).new + end + def test_class_level_cloning_preserves_singleton_behavior klass = SingletonTest.clone @@ -101,4 +118,8 @@ class TestSingleton < Test::Unit::TestCase b = klass.instance assert_same a, b end + + def test_class_level_cloning_creates_separate_singleton + assert_not_same SingletonTest.instance, SingletonTest.clone.instance + end end