eac_tools 0.66.0 → 0.67.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +32 -32
  3. data/lib/eac_tools/version.rb +1 -1
  4. data/sub/avm/avm.gemspec +2 -2
  5. data/sub/avm/lib/avm/data/clearer.rb +8 -6
  6. data/sub/avm/lib/avm/data/package/base_performer.rb +38 -0
  7. data/sub/avm/lib/avm/data/package/clear.rb +3 -4
  8. data/sub/avm/lib/avm/data/performer.rb +49 -0
  9. data/sub/avm/lib/avm/instances/base/subcommand_parent.rb +5 -5
  10. data/sub/avm/lib/avm/instances/runner.rb +1 -1
  11. data/sub/avm/lib/avm/scms/auto_commit/for_file.rb +12 -2
  12. data/sub/avm/lib/avm/sources/runner.rb +2 -0
  13. data/sub/avm/lib/avm/version.rb +1 -1
  14. data/sub/avm-eac_ubuntu_base0/avm-eac_ubuntu_base0.gemspec +3 -3
  15. data/sub/avm-eac_ubuntu_base0/lib/avm/eac_ubuntu_base0/runners/base.rb +2 -0
  16. data/sub/avm-eac_ubuntu_base0/lib/avm/eac_ubuntu_base0/version.rb +1 -1
  17. data/sub/avm-eac_webapp_base0/avm-eac_webapp_base0.gemspec +3 -3
  18. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/provider.rb +2 -2
  19. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/version.rb +1 -1
  20. data/sub/avm-git/avm-git.gemspec +2 -2
  21. data/sub/avm-git/lib/avm/git/scms/git/commit_dirty.rb +35 -0
  22. data/sub/avm-git/lib/avm/git/scms/git/commits.rb +0 -14
  23. data/sub/avm-git/lib/avm/git/scms/git/run_commit.rb +1 -1
  24. data/sub/avm-git/lib/avm/git/scms/git_sub_base/changed_file.rb +21 -0
  25. data/sub/avm-git/lib/avm/git/scms/git_sub_base/commit.rb +1 -3
  26. data/sub/avm-git/lib/avm/git/scms/git_sub_base.rb +8 -1
  27. data/sub/avm-git/lib/avm/git/version.rb +1 -1
  28. data/sub/avm-tools/avm-tools.gemspec +2 -2
  29. data/sub/avm-tools/lib/avm/tools/runner/instance/data/clear.rb +1 -1
  30. data/sub/avm-tools/lib/avm/tools/runner/instance/data/unit/dump.rb +2 -2
  31. data/sub/avm-tools/lib/avm/tools/runner/instance/data/unit/load.rb +1 -1
  32. data/sub/avm-tools/lib/avm/tools/runner/instance/data/unit.rb +2 -5
  33. data/sub/avm-tools/lib/avm/tools/runner/instance/data.rb +2 -0
  34. data/sub/avm-tools/lib/avm/tools/runner_with/include_exclude.rb +23 -0
  35. data/sub/avm-tools/lib/avm/tools/runner_with/instance_data_clear.rb +11 -1
  36. data/sub/avm-tools/lib/avm/tools/version.rb +1 -1
  37. data/sub/eac_cli/eac_cli.gemspec +1 -1
  38. data/sub/eac_cli/lib/eac_cli/definition/alternative.rb +11 -7
  39. data/sub/eac_cli/lib/eac_cli/definition/base_option/initialize_args_parser.rb +2 -1
  40. data/sub/eac_cli/lib/eac_cli/definition/base_option.rb +1 -1
  41. data/sub/eac_cli/lib/eac_cli/definition/boolean_option.rb +2 -1
  42. data/sub/eac_cli/lib/eac_cli/definition/error.rb +8 -0
  43. data/sub/eac_cli/lib/eac_cli/runner/after_class_methods.rb +6 -1
  44. data/sub/eac_cli/lib/eac_cli/runner/context.rb +22 -3
  45. data/sub/eac_cli/lib/eac_cli/runner/context_responders/base.rb +24 -0
  46. data/sub/eac_cli/lib/eac_cli/runner/context_responders/parent.rb +27 -0
  47. data/sub/eac_cli/lib/eac_cli/runner/context_responders/runner.rb +20 -0
  48. data/sub/eac_cli/lib/eac_cli/runner/context_responders/runner_missing_method.rb +32 -0
  49. data/sub/eac_cli/lib/eac_cli/runner/context_responders/set.rb +44 -0
  50. data/sub/eac_cli/lib/eac_cli/runner/context_responders.rb +11 -0
  51. data/sub/eac_cli/lib/eac_cli/runner/for_context.rb +40 -0
  52. data/sub/eac_cli/lib/eac_cli/runner/instance_methods.rb +5 -3
  53. data/sub/eac_cli/lib/eac_cli/runner.rb +1 -0
  54. data/sub/eac_cli/lib/eac_cli/version.rb +1 -1
  55. data/sub/eac_cli/spec/lib/eac_cli/runner/for_context_spec.rb +79 -0
  56. data/sub/eac_cli/spec/lib/eac_cli/runner_with/subcommands_spec.rb +1 -0
  57. data/sub/eac_ruby_base0/eac_ruby_base0.gemspec +3 -3
  58. data/sub/eac_ruby_base0/lib/eac_ruby_base0/runner/contexts.rb +52 -0
  59. data/sub/eac_ruby_base0/lib/eac_ruby_base0/runner/prepend.rb +17 -4
  60. data/sub/eac_ruby_base0/lib/eac_ruby_base0/runner.rb +1 -39
  61. data/sub/eac_ruby_base0/lib/eac_ruby_base0/version.rb +1 -1
  62. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_abstract.rb +17 -6
  63. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_immutable/array_accessor.rb +25 -0
  64. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_immutable/base_accessor.rb +57 -0
  65. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/boolean_accessor.rb +3 -3
  66. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/class_methods.rb +2 -2
  67. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/common_accessor.rb +5 -5
  68. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable/array_accessor.rb → acts_as_immutable/enumerable_accessor.rb} +11 -8
  69. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/hash_accessor.rb +5 -5
  70. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable → acts_as_immutable}/instance_methods.rb +1 -1
  71. data/sub/eac_ruby_utils/lib/eac_ruby_utils/acts_as_immutable/set_accessor.rb +25 -0
  72. data/sub/eac_ruby_utils/lib/eac_ruby_utils/{immutable.rb → acts_as_immutable.rb} +1 -1
  73. data/sub/eac_ruby_utils/lib/eac_ruby_utils/enumerables_methods.rb +42 -0
  74. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable/base.rb +34 -0
  75. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable/hash.rb +20 -0
  76. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable/set.rb +19 -0
  77. data/sub/eac_ruby_utils/lib/eac_ruby_utils/module_ancestors_variable.rb +9 -0
  78. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/module/acts_as_immutable.rb +10 -0
  79. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/module/immutable.rb +3 -2
  80. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/object/debug.rb +9 -0
  81. data/sub/eac_ruby_utils/lib/eac_ruby_utils/unimplemented_method_error.rb +6 -0
  82. data/sub/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
  83. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/acts_as_abstract_spec.rb +73 -7
  84. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/{immutable → acts_as_immutable}/array_accessor_spec.rb +11 -3
  85. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/acts_as_immutable/common_accessor_spec.rb +57 -0
  86. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/{immutable → acts_as_immutable}/hash_accessor_spec.rb +3 -3
  87. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/acts_as_immutable/set_accessor_spec.rb +43 -0
  88. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/enumerables_methods_spec.rb +50 -0
  89. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/module_ancestors_variable/hash_spec.rb +57 -0
  90. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/module_ancestors_variable/set_spec.rb +57 -0
  91. metadata +57 -22
  92. data/sub/eac_ruby_utils/lib/eac_ruby_utils/immutable/base_accessor.rb +0 -23
@@ -1,28 +1,94 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'eac_ruby_utils/acts_as_abstract'
4
+ require 'eac_ruby_utils/unimplemented_method_error'
4
5
 
5
- RSpec.describe(::EacRubyUtils::ActsAsAbstract) do
6
+ ::RSpec.describe(::EacRubyUtils::ActsAsAbstract) do
6
7
  let(:base_class) do
7
8
  the_module = described_class
8
9
  ::Class.new do
9
10
  include the_module
10
11
 
11
12
  abstract_methods :method1, :method2
13
+
14
+ def method3
15
+ 'base result'
16
+ end
12
17
  end
13
18
  end
14
- let(:base_instance) { base_class.new }
15
19
  let(:sub_class) do
16
20
  ::Class.new(base_class) do
17
21
  def method1
18
22
  'a result'
19
23
  end
24
+
25
+ def method4
26
+ 'sub result'
27
+ end
20
28
  end
21
29
  end
22
- let(:sub_instance) { sub_class.new }
23
30
 
24
- it { expect { base_instance.method1 }.to raise_error(::NoMethodError) }
25
- it { expect { base_instance.method2 }.to raise_error(::NoMethodError) }
26
- it { expect(sub_instance.method1).to eq('a result') }
27
- it { expect { sub_instance.method2 }.to raise_error(::NoMethodError) }
31
+ class << self
32
+ def specs_for_target(test_target, instances_hash)
33
+ describe "\##{test_target}" do # rubocop:disable RSpec/EmptyExampleGroup
34
+ specs_for_instances(test_target, instances_hash)
35
+ end
36
+ end
37
+
38
+ def specs_for_instances(test_target, instances_hash)
39
+ instances_hash.each do |instance_name, expected_values|
40
+ context "when instance is \"#{instance_name}\"" do # rubocop:disable RSpec/EmptyExampleGroup
41
+ let(:instance) { send("#{instance_name}_class").new }
42
+
43
+ specs_for_methods_values(test_target, expected_values)
44
+ end
45
+ end
46
+ end
47
+
48
+ def specs_for_methods_values(test_target, expected_values)
49
+ expected_values.each_with_index do |expected_value, method_index|
50
+ method_name = "method#{method_index + 1}"
51
+ context "when method is \"#{method_name}\"" do # rubocop:disable RSpec/EmptyExampleGroup
52
+ send("specs_for_#{test_target}", method_name, expected_value)
53
+ end
54
+ end
55
+ end
56
+
57
+ def specs_for_abstract_method(method_name, expected_value)
58
+ it { expect(instance.abstract_method?(method_name)).to eq(expected_value) }
59
+ end
60
+
61
+ def specs_for_method_missing(method_name, expected_value)
62
+ if expected_value.is_a?(::Class) && expected_value < ::Exception
63
+ it do
64
+ expect { instance.send(method_name) }.to raise_error(expected_value)
65
+ end
66
+ else
67
+ it do
68
+ expect(instance.send(method_name)).to eq(expected_value)
69
+ end
70
+ end
71
+ end
72
+
73
+ def specs_for_respond_to_missing(method_name, expected_value)
74
+ it { expect(instance.respond_to?(method_name)).to eq(expected_value) }
75
+ end
76
+ end
77
+ {
78
+ abstract_method: {
79
+ base: [true, true, false, false],
80
+ sub: [false, true, false, false]
81
+ },
82
+ method_missing: {
83
+ base: [::EacRubyUtils::UnimplementedMethodError, ::EacRubyUtils::UnimplementedMethodError,
84
+ 'base result', ::NoMethodError],
85
+ sub: ['a result', ::EacRubyUtils::UnimplementedMethodError, 'base result', 'sub result']
86
+ },
87
+ respond_to_missing: {
88
+ base: [true, true, true, false],
89
+ sub: [true, true, true, true]
90
+ }
91
+ }.each do |test_target, instances_hash|
92
+ specs_for_target(test_target, instances_hash)
93
+ end
28
94
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable'
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
4
 
5
- ::RSpec.describe ::EacRubyUtils::Immutable::ArrayAccessor do
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::ArrayAccessor do
6
6
  let(:stub_class) do
7
7
  ::Class.new do
8
- include ::EacRubyUtils::Immutable
8
+ include ::EacRubyUtils::ActsAsImmutable
9
9
 
10
10
  immutable_accessor :array_attr, type: :array
11
11
  end
@@ -31,5 +31,13 @@ require 'eac_ruby_utils/immutable'
31
31
  it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
32
32
  it { expect(change2_instance.array_attrs).to eq(%w[B]) }
33
33
  end
34
+
35
+ context 'when array_attrs sets for a non array' do
36
+ let(:change2_instance) { initial_instance.array_attrs('B') }
37
+
38
+ it { expect(change2_instance).to be_a(initial_instance.class) }
39
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
40
+ it { expect(change2_instance.array_attrs).to eq(%w[B]) }
41
+ end
34
42
  end
35
43
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
+
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::CommonAccessor do
6
+ let(:stub_class) do
7
+ ::Class.new do
8
+ include ::EacRubyUtils::ActsAsImmutable
9
+
10
+ immutable_accessor :attr1, :attr2, :attr3
11
+
12
+ def attr1_get_filter(value)
13
+ value || 'DEFAULT'
14
+ end
15
+
16
+ def attr2_set_filter(value)
17
+ "#{value}_FILTERED"
18
+ end
19
+ end
20
+ end
21
+
22
+ let(:initial_instance) { stub_class.new }
23
+
24
+ it { expect(initial_instance.attr1).to eq('DEFAULT') }
25
+ it { expect(initial_instance.attr2).to eq(nil) }
26
+ it { expect(initial_instance.attr3).to eq(nil) }
27
+
28
+ context 'when attr1 is set' do
29
+ let(:change1_instance) { initial_instance.attr1('A') }
30
+
31
+ it { expect(change1_instance).to be_a(initial_instance.class) }
32
+ it { expect(change1_instance.object_id).not_to eq(initial_instance.object_id) }
33
+ it { expect(change1_instance.attr1).to eq('A') }
34
+ it { expect(change1_instance.attr2).to eq(nil) }
35
+ it { expect(change1_instance.attr3).to eq(nil) }
36
+
37
+ context 'when attr2 is set' do
38
+ let(:change2_instance) { change1_instance.attr2('B') }
39
+
40
+ it { expect(change2_instance).to be_a(change1_instance.class) }
41
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
42
+ it { expect(change2_instance.attr1).to eq('A') }
43
+ it { expect(change2_instance.attr2).to eq('B_FILTERED') }
44
+ it { expect(change2_instance.attr3).to eq(nil) }
45
+ end
46
+
47
+ context 'when attr3 is set' do
48
+ let(:change2_instance) { change1_instance.attr3('C') }
49
+
50
+ it { expect(change2_instance).to be_a(change1_instance.class) }
51
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
52
+ it { expect(change2_instance.attr1).to eq('A') }
53
+ it { expect(change2_instance.attr2).to eq(nil) }
54
+ it { expect(change2_instance.attr3).to eq('C') }
55
+ end
56
+ end
57
+ end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'eac_ruby_utils/immutable'
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
4
 
5
- ::RSpec.describe ::EacRubyUtils::Immutable::HashAccessor do
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::HashAccessor do
6
6
  let(:stub_class) do
7
7
  ::Class.new do
8
- include ::EacRubyUtils::Immutable
8
+ include ::EacRubyUtils::ActsAsImmutable
9
9
 
10
10
  immutable_accessor :the_hash, type: :hash
11
11
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/acts_as_immutable'
4
+
5
+ ::RSpec.describe ::EacRubyUtils::ActsAsImmutable::SetAccessor do
6
+ let(:stub_class) do
7
+ ::Class.new do
8
+ include ::EacRubyUtils::ActsAsImmutable
9
+
10
+ immutable_accessor :array_attr, type: :set
11
+ end
12
+ end
13
+
14
+ let(:initial_instance) { stub_class.new }
15
+
16
+ it do
17
+ expect(initial_instance.array_attrs).to eq(::Set.new)
18
+ end
19
+
20
+ context 'when array_attr pushs for' do
21
+ let(:change1_instance) { initial_instance.array_attr('A') }
22
+
23
+ it { expect(change1_instance).to be_a(initial_instance.class) }
24
+ it { expect(change1_instance.object_id).not_to eq(initial_instance.object_id) }
25
+ it { expect(change1_instance.array_attrs).to eq(::Set.new(%w[A])) }
26
+
27
+ context 'when array_attrs sets for' do
28
+ let(:change2_instance) { initial_instance.array_attrs(%w[B]) }
29
+
30
+ it { expect(change2_instance).to be_a(initial_instance.class) }
31
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
32
+ it { expect(change2_instance.array_attrs).to eq(::Set.new(%w[B])) }
33
+ end
34
+
35
+ context 'when array_attrs push for a repetead value' do
36
+ let(:change2_instance) { initial_instance.array_attr('A') }
37
+
38
+ it { expect(change2_instance).to be_a(initial_instance.class) }
39
+ it { expect(change2_instance.object_id).not_to eq(change1_instance.object_id) }
40
+ it { expect(change2_instance.array_attrs).to eq(::Set.new(%w[A])) }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/enumerables_methods'
4
+
5
+ ::RSpec.describe ::EacRubyUtils::EnumerablesMethods do
6
+ describe '#write_method?' do
7
+ it do
8
+ expect(described_class).to be_write_method(:'[]=')
9
+ end
10
+
11
+ it do
12
+ expect(described_class).not_to be_write_method(:'!=')
13
+ end
14
+ end
15
+
16
+ [
17
+ [:enumerable, %i[drop lazy sort], []],
18
+ [:hash, %i[\[\] <= compact slice to_h values],
19
+ %i[\[\]= compact! delete default= keep_if shift]],
20
+ [:set, %i[<= include?], %i[<< add clear collect! divide delete keep_if merge reset subtract]]
21
+ ].each do |test_values|
22
+ klass_underscore, read_methods, write_methods = test_values
23
+
24
+ context "when class/module is #{klass_underscore}" do
25
+ let(:const_prefix) { klass_underscore.to_s.upcase }
26
+ let(:const_all) { "#{const_prefix}_METHODS" }
27
+ let(:const_read) { "#{const_prefix}_READ_METHODS" }
28
+ let(:const_write) { "#{const_prefix}_WRITE_METHODS" }
29
+ let(:actual_all) { described_class.const_get(const_all) }
30
+ let(:actual_read) { described_class.const_get(const_read) }
31
+ let(:actual_write) { described_class.const_get(const_write) }
32
+
33
+ read_methods.each do |method_name|
34
+ context "when method is \"#{method_name}\"" do
35
+ it { expect(actual_all).to include(method_name) }
36
+ it { expect(actual_read).to include(method_name) }
37
+ it { expect(actual_write).not_to include(method_name) }
38
+ end
39
+ end
40
+
41
+ write_methods.each do |method_name|
42
+ context "when method is \"#{method_name}\"" do
43
+ it { expect(actual_all).to include(method_name) }
44
+ it { expect(actual_read).not_to include(method_name) }
45
+ it { expect(actual_write).to include(method_name) }
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/module_ancestors_variable/hash'
4
+
5
+ ::RSpec.describe(::EacRubyUtils::ModuleAncestorsVariable::Hash) do
6
+ let(:included_module) do
7
+ ::Module.new do
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods # rubocop:disable RSpec/LeakyConstantDeclaration
13
+ def hash_variable
14
+ @hash_variable ||= ::EacRubyUtils::ModuleAncestorsVariable::Hash.new(self, __method__)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ let(:super_class) do
21
+ r = ::Class.new
22
+ r.include included_module
23
+ r
24
+ end
25
+
26
+ let(:sub_class) do
27
+ ::Class.new(super_class)
28
+ end
29
+
30
+ it { expect(super_class.hash_variable).to be_a(described_class) }
31
+ it { expect(super_class.hash_variable.self_variable).to eq(::Hash.new) }
32
+ it { expect(super_class.hash_variable.ancestors_variable).to eq(::Hash.new) }
33
+ it { expect(super_class.hash_variable.to_h).to eq(::Hash.new) }
34
+
35
+ it { expect(sub_class.hash_variable).to be_a(described_class) }
36
+ it { expect(sub_class.hash_variable.self_variable).to eq(::Hash.new) }
37
+ it { expect(sub_class.hash_variable.ancestors_variable).to eq(::Hash.new) }
38
+ it { expect(sub_class.hash_variable.to_h).to eq(::Hash.new) }
39
+
40
+ context 'when super class is changed' do
41
+ before do
42
+ super_class.hash_variable[:by_super] = 1
43
+ end
44
+
45
+ it { expect(super_class.hash_variable.to_h).to eq({ by_super: 1 }) }
46
+ it { expect(sub_class.hash_variable.to_h).to eq({ by_super: 1 }) }
47
+
48
+ context 'when sub class is changed' do
49
+ before do
50
+ sub_class.hash_variable[:by_sub] = 2
51
+ end
52
+
53
+ it { expect(super_class.hash_variable.to_h).to eq({ by_super: 1 }) }
54
+ it { expect(sub_class.hash_variable.to_h).to eq({ by_super: 1, by_sub: 2 }) }
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/module_ancestors_variable/set'
4
+
5
+ ::RSpec.describe(::EacRubyUtils::ModuleAncestorsVariable::Set) do
6
+ let(:included_module) do
7
+ ::Module.new do
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods # rubocop:disable RSpec/LeakyConstantDeclaration
13
+ def set_variable
14
+ @set_variable ||= ::EacRubyUtils::ModuleAncestorsVariable::Set.new(self, __method__)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ let(:super_class) do
21
+ r = ::Class.new
22
+ r.include included_module
23
+ r
24
+ end
25
+
26
+ let(:sub_class) do
27
+ ::Class.new(super_class)
28
+ end
29
+
30
+ it { expect(super_class.set_variable).to be_a(described_class) }
31
+ it { expect(super_class.set_variable.self_variable).to eq(::Set.new) }
32
+ it { expect(super_class.set_variable.ancestors_variable).to eq(::Set.new) }
33
+ it { expect(super_class.set_variable.to_set).to eq(::Set.new) }
34
+
35
+ it { expect(sub_class.set_variable).to be_a(described_class) }
36
+ it { expect(sub_class.set_variable.self_variable).to eq(::Set.new) }
37
+ it { expect(sub_class.set_variable.ancestors_variable).to eq(::Set.new) }
38
+ it { expect(sub_class.set_variable.to_set).to eq(::Set.new) }
39
+
40
+ context 'when super class is changed' do
41
+ before do
42
+ super_class.set_variable << 1
43
+ end
44
+
45
+ it { expect(super_class.set_variable.to_set).to eq(::Set.new([1])) }
46
+ it { expect(sub_class.set_variable.to_set).to eq(::Set.new([1])) }
47
+
48
+ context 'when sub class is changed' do
49
+ before do
50
+ sub_class.set_variable << 2
51
+ end
52
+
53
+ it { expect(super_class.set_variable.to_set).to eq(::Set.new([1])) }
54
+ it { expect(sub_class.set_variable.to_set).to eq(::Set.new([1, 2])) }
55
+ end
56
+ end
57
+ end