geo_pattern 1.3.2 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +58 -0
  3. data/.simplecov +25 -0
  4. data/.travis.yml +12 -0
  5. data/Gemfile +3 -1
  6. data/README.md +125 -23
  7. data/Rakefile +72 -9
  8. data/fixtures/generated_patterns/chevrons.svg +1 -0
  9. data/fixtures/generated_patterns/concentric_circles.svg +1 -0
  10. data/fixtures/generated_patterns/diamonds.svg +1 -0
  11. data/fixtures/generated_patterns/diamonds_with_base_color.svg +1 -0
  12. data/fixtures/generated_patterns/diamonds_with_color.svg +1 -0
  13. data/fixtures/generated_patterns/hexagons.svg +1 -0
  14. data/fixtures/generated_patterns/mosaic_squares.svg +1 -0
  15. data/fixtures/generated_patterns/nested_squares.svg +1 -0
  16. data/fixtures/generated_patterns/octagons.svg +1 -0
  17. data/fixtures/generated_patterns/overlapping_circles.svg +1 -0
  18. data/fixtures/generated_patterns/overlapping_rings.svg +1 -0
  19. data/fixtures/generated_patterns/plaid.svg +1 -0
  20. data/fixtures/generated_patterns/plus_signs.svg +1 -0
  21. data/fixtures/generated_patterns/sine_waves.svg +1 -0
  22. data/fixtures/generated_patterns/squares.svg +1 -0
  23. data/fixtures/generated_patterns/tessellation.svg +1 -0
  24. data/fixtures/generated_patterns/triangles.svg +1 -0
  25. data/fixtures/generated_patterns/xes.svg +1 -0
  26. data/geo_pattern.gemspec +8 -2
  27. data/lib/geo_pattern.rb +42 -20
  28. data/lib/geo_pattern/background.rb +25 -0
  29. data/lib/geo_pattern/background_generators/solid_generator.rb +52 -0
  30. data/lib/geo_pattern/color.rb +25 -0
  31. data/lib/geo_pattern/color_generators/base_color_generator.rb +55 -0
  32. data/lib/geo_pattern/color_generators/simple_generator.rb +27 -0
  33. data/lib/geo_pattern/color_preset.rb +26 -0
  34. data/lib/geo_pattern/errors.rb +7 -0
  35. data/lib/geo_pattern/geo_pattern_task.rb +59 -0
  36. data/lib/geo_pattern/helpers.rb +47 -0
  37. data/lib/geo_pattern/pattern.rb +84 -0
  38. data/lib/geo_pattern/pattern_generator.rb +33 -82
  39. data/lib/geo_pattern/pattern_helpers.rb +31 -2
  40. data/lib/geo_pattern/pattern_preset.rb +23 -0
  41. data/lib/geo_pattern/pattern_sieve.rb +36 -0
  42. data/lib/geo_pattern/pattern_store.rb +63 -0
  43. data/lib/geo_pattern/pattern_validator.rb +27 -0
  44. data/lib/geo_pattern/rake_task.rb +109 -0
  45. data/lib/geo_pattern/roles/comparable_metadata.rb +35 -0
  46. data/lib/geo_pattern/roles/named_generator.rb +13 -0
  47. data/lib/geo_pattern/seed.rb +21 -0
  48. data/lib/geo_pattern/structure.rb +25 -0
  49. data/lib/geo_pattern/structure_generators/base_generator.rb +85 -0
  50. data/lib/geo_pattern/structure_generators/chevrons_generator.rb +55 -0
  51. data/lib/geo_pattern/structure_generators/concentric_circles_generator.rb +56 -0
  52. data/lib/geo_pattern/structure_generators/diamonds_generator.rb +66 -0
  53. data/lib/geo_pattern/structure_generators/hexagons_generator.rb +67 -0
  54. data/lib/geo_pattern/structure_generators/mosaic_squares_generator.rb +85 -0
  55. data/lib/geo_pattern/structure_generators/nested_squares_generator.rb +60 -0
  56. data/lib/geo_pattern/structure_generators/octagons_generator.rb +44 -0
  57. data/lib/geo_pattern/structure_generators/overlapping_circles_generator.rb +55 -0
  58. data/lib/geo_pattern/structure_generators/overlapping_rings_generator.rb +55 -0
  59. data/lib/geo_pattern/structure_generators/plaid_generator.rb +55 -0
  60. data/lib/geo_pattern/structure_generators/plus_signs_generator.rb +62 -0
  61. data/lib/geo_pattern/structure_generators/sine_waves_generator.rb +43 -0
  62. data/lib/geo_pattern/structure_generators/squares_generator.rb +36 -0
  63. data/lib/geo_pattern/structure_generators/tessellation_generator.rb +103 -0
  64. data/lib/geo_pattern/structure_generators/triangles_generator.rb +61 -0
  65. data/lib/geo_pattern/structure_generators/xes_generator.rb +67 -0
  66. data/lib/geo_pattern/svg_image.rb +101 -0
  67. data/lib/geo_pattern/version.rb +1 -1
  68. data/script/bootstrap +30 -0
  69. data/script/console +8 -0
  70. data/script/test +21 -0
  71. data/spec/background_generators/solid_generator_spec.rb +50 -0
  72. data/spec/background_spec.rb +25 -0
  73. data/spec/color_generators/base_color_generator_spec.rb +31 -0
  74. data/spec/color_generators/simple_generator_spec.rb +12 -0
  75. data/spec/color_preset_spec.rb +53 -0
  76. data/spec/color_spec.rb +15 -0
  77. data/spec/geo_pattern_spec.rb +95 -24
  78. data/spec/helpers_spec.rb +65 -0
  79. data/spec/pattern_preset_spec.rb +41 -0
  80. data/spec/pattern_sieve_spec.rb +66 -0
  81. data/spec/pattern_spec.rb +72 -0
  82. data/spec/pattern_store_spec.rb +47 -0
  83. data/spec/pattern_validator_spec.rb +28 -0
  84. data/spec/seed_spec.rb +14 -0
  85. data/spec/spec_helper.rb +1 -6
  86. data/spec/structure_generators/chevrons_generator_spec.rb +5 -0
  87. data/spec/structure_generators/concentric_circles_generator_spec.rb +5 -0
  88. data/spec/structure_generators/diamonds_generator_spec.rb +5 -0
  89. data/spec/structure_generators/hexagons_generator_spec.rb +5 -0
  90. data/spec/structure_generators/mosaic_squares_generator_spec.rb +5 -0
  91. data/spec/structure_generators/nested_squares_generator_spec.rb +5 -0
  92. data/spec/structure_generators/octagons_generator_spec.rb +5 -0
  93. data/spec/structure_generators/overlapping_circles_generator_spec.rb +5 -0
  94. data/spec/structure_generators/overlapping_rings_generator_spec.rb +5 -0
  95. data/spec/structure_generators/plaid_generator_spec.rb +5 -0
  96. data/spec/structure_generators/plus_signs_generator_spec.rb +5 -0
  97. data/spec/structure_generators/sine_waves_generator_spec.rb +5 -0
  98. data/spec/structure_generators/squares_generator_spec.rb +5 -0
  99. data/spec/structure_generators/tessellation_generator_spec.rb +5 -0
  100. data/spec/structure_generators/triangles_generator_spec.rb +5 -0
  101. data/spec/structure_generators/xes_generator_spec.rb +5 -0
  102. data/spec/structure_spec.rb +38 -0
  103. data/spec/support/helpers/fixtures.rb +12 -0
  104. data/spec/support/kernel.rb +40 -0
  105. data/spec/support/matchers/image.rb +17 -0
  106. data/spec/support/matchers/name.rb +15 -0
  107. data/spec/support/rspec.rb +1 -1
  108. data/spec/support/shared_examples/generator.rb +46 -0
  109. data/spec/support/shared_examples/pattern.rb +31 -0
  110. data/spec/support/shared_examples/pattern_name.rb +7 -0
  111. data/spec/support/shared_examples/structure.rb +48 -0
  112. data/spec/svg_spec.rb +3 -3
  113. metadata +141 -25
  114. data/lib/geo_pattern/pattern/base_pattern.rb +0 -47
  115. data/lib/geo_pattern/pattern/chevron_pattern.rb +0 -45
  116. data/lib/geo_pattern/pattern/concentric_circles_pattern.rb +0 -47
  117. data/lib/geo_pattern/pattern/diamond_pattern.rb +0 -56
  118. data/lib/geo_pattern/pattern/hexagon_pattern.rb +0 -57
  119. data/lib/geo_pattern/pattern/mosaic_squares_pattern.rb +0 -76
  120. data/lib/geo_pattern/pattern/nested_squares_pattern.rb +0 -51
  121. data/lib/geo_pattern/pattern/octagon_pattern.rb +0 -35
  122. data/lib/geo_pattern/pattern/overlapping_circles_pattern.rb +0 -46
  123. data/lib/geo_pattern/pattern/overlapping_rings_pattern.rb +0 -46
  124. data/lib/geo_pattern/pattern/plaid_pattern.rb +0 -49
  125. data/lib/geo_pattern/pattern/plus_sign_pattern.rb +0 -53
  126. data/lib/geo_pattern/pattern/sine_wave_pattern.rb +0 -36
  127. data/lib/geo_pattern/pattern/square_pattern.rb +0 -27
  128. data/lib/geo_pattern/pattern/tessellation_pattern.rb +0 -93
  129. data/lib/geo_pattern/pattern/triangle_pattern.rb +0 -51
  130. data/lib/geo_pattern/pattern/xes_pattern.rb +0 -58
  131. data/lib/geo_pattern/svg.rb +0 -77
  132. data/spec/support/helpers.rb +0 -34
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe PatternValidator do
4
+ subject(:validator) { PatternValidator.new(store) }
5
+ let(:store) { instance_double('GeoPattern::PatternStore') }
6
+ let(:patterns) { [] }
7
+
8
+ # Minimum valid object test
9
+ it { expect(validator).not_to be_nil }
10
+
11
+ describe '#validate' do
12
+ context 'when valid pattern is validated' do
13
+ before :each do
14
+ allow(store).to receive(:known?).with('pattern1').and_return(true)
15
+ end
16
+
17
+ it { expect { validator.validate(%w(pattern1)) }.not_to raise_error }
18
+ end
19
+
20
+ context 'when invalid pattern is validated' do
21
+ before :each do
22
+ allow(store).to receive(:known?).with('pattern1').and_return(false)
23
+ end
24
+
25
+ it { expect { validator.validate(%w(pattern1)) }.to raise_error InvalidPatternError }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Seed do
4
+ subject(:seed) { Seed.new(input) }
5
+ let(:input) { 'string' }
6
+
7
+ it { expect(seed).not_to be_nil }
8
+
9
+ describe '#[]' do
10
+ context 'when use an integer' do
11
+ it { expect(seed[1]).to be_kind_of String }
12
+ end
13
+ end
14
+ end
@@ -11,13 +11,8 @@ Bundler.require :default, :test, :development
11
11
 
12
12
  require 'geo_pattern'
13
13
 
14
- # Make some helpers available
15
- include GeoPattern::Helpers
16
-
17
14
  # Loading support files
18
- #::File.expand_path('../support/*.rb', __FILE__)
19
- require_files_matching_pattern ::File.expand_path('../support/*.rb', __FILE__)
20
- require_files_matching_pattern ::File.expand_path('../shared_examples/*.rb', __FILE__)
15
+ GeoPattern::Helpers.require_files_matching_pattern ::File.expand_path('../support/**/*.rb', __FILE__)
21
16
 
22
17
  # No need to add the namespace to every class tested
23
18
  include GeoPattern
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::ChevronsGenerator do
4
+ it_behaves_like 'a structure generator', :chevrons
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::ConcentricCirclesGenerator do
4
+ it_behaves_like 'a structure generator', :concentric_circles
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::DiamondsGenerator do
4
+ it_behaves_like 'a structure generator', :diamonds
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::HexagonsGenerator do
4
+ it_behaves_like 'a structure generator', :hexagons
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::MosaicSquaresGenerator do
4
+ it_behaves_like 'a structure generator', :mosaic_squares
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::NestedSquaresGenerator do
4
+ it_behaves_like 'a structure generator', :nested_squares
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::OctagonsGenerator do
4
+ it_behaves_like 'a structure generator', :octagons
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::OverlappingCirclesGenerator do
4
+ it_behaves_like 'a structure generator', :overlapping_circles
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::OverlappingRingsGenerator do
4
+ it_behaves_like 'a structure generator', :overlapping_rings
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::PlaidGenerator do
4
+ it_behaves_like 'a structure generator', :plaid
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::PlusSignsGenerator do
4
+ it_behaves_like 'a structure generator', :plus_signs
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::SineWavesGenerator do
4
+ it_behaves_like 'a structure generator', :sine_waves
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::SquaresGenerator do
4
+ it_behaves_like 'a structure generator', :squares
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::TessellationGenerator do
4
+ it_behaves_like 'a structure generator', :tessellation
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::TrianglesGenerator do
4
+ it_behaves_like 'a structure generator', :triangles
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StructureGenerators::XesGenerator do
4
+ it_behaves_like 'a structure generator', :xes
5
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Structure do
4
+ subject(:metadata) { described_class.new(image: svg_image, preset: preset, generator: generator, name: name) }
5
+
6
+ let(:svg_image) { instance_double('GeoPattern::SvgImage') }
7
+ let(:svg_image_content) { fixtures_path('generated_patterns/sine_waves.svg').read.chomp }
8
+ let(:preset) { instance_double('GeoPattern::PatternPreset') }
9
+ let(:generator) { stub_const('GeoPattern::StructureGenerators::ChevronGenerator', Class.new) }
10
+
11
+ let(:name) { :chevron }
12
+ let(:fill_color_dark) { '#222' }
13
+ let(:fill_color_light) { '#ddd' }
14
+ let(:stroke_color) { '#000' }
15
+ let(:stroke_opacity) { 0.02 }
16
+ let(:opacity_min) { 0.02 }
17
+ let(:opacity_max) { 0.15 }
18
+
19
+ it { is_expected.not_to be_nil }
20
+
21
+ before :each do
22
+ allow(preset).to receive(:fill_color_dark).and_return(fill_color_dark)
23
+ allow(preset).to receive(:fill_color_light).and_return(fill_color_light)
24
+ allow(preset).to receive(:stroke_color).and_return(stroke_color)
25
+ allow(preset).to receive(:stroke_opacity).and_return(stroke_opacity)
26
+ allow(preset).to receive(:opacity_min).and_return(opacity_min)
27
+ allow(preset).to receive(:opacity_max).and_return(opacity_max)
28
+ end
29
+
30
+ it_behaves_like 'a metadata argument', :name
31
+ it_behaves_like 'a metadata argument', :generator
32
+ it_behaves_like 'a forwarded metadata argument', :fill_color_dark
33
+ it_behaves_like 'a forwarded metadata argument', :fill_color_light
34
+ it_behaves_like 'a forwarded metadata argument', :stroke_color
35
+ it_behaves_like 'a forwarded metadata argument', :stroke_opacity
36
+ it_behaves_like 'a forwarded metadata argument', :opacity_min
37
+ it_behaves_like 'a forwarded metadata argument', :opacity_max
38
+ end
@@ -0,0 +1,12 @@
1
+ module SpecHelper
2
+ module Fixtures
3
+ def fixtures_path(name)
4
+ base_path = Pathname.new(File.expand_path('../../../../fixtures', __FILE__))
5
+ base_path + Pathname.new(name)
6
+ end
7
+ end
8
+ end
9
+
10
+ RSpec.configure do |c|
11
+ c.include SpecHelper::Fixtures
12
+ end
@@ -0,0 +1,40 @@
1
+ module Kernel
2
+ # Captures the given stream and returns it:
3
+ #
4
+ # @param [String] stream
5
+ #
6
+ # The name of the stream to be captured
7
+ #
8
+ # @example Capture output
9
+ #
10
+ # stream = capture(:stdout) { puts 'notice' }
11
+ # stream # => "notice\n"
12
+ #
13
+ # stream = capture(:stderr) { warn 'error' }
14
+ # stream # => "error\n"
15
+ #
16
+ # @example Capture output for subprocesses
17
+ #
18
+ # stream = capture(:stdout) { system('echo notice') }
19
+ # stream # => "notice\n"
20
+ #
21
+ # stream = capture(:stderr) { system('echo error 1>&2') }
22
+ # stream # => "error\n"
23
+ def capture(stream)
24
+ stream = stream.to_s
25
+ captured_stream = Tempfile.new(stream)
26
+ stream_io = eval("$#{stream}")
27
+ origin_stream = stream_io.dup
28
+ stream_io.reopen(captured_stream)
29
+
30
+ yield
31
+
32
+ stream_io.rewind
33
+ return captured_stream.read
34
+ ensure
35
+ captured_stream.close
36
+ captured_stream.unlink
37
+ stream_io.reopen(origin_stream)
38
+ end
39
+ alias_method :silence, :capture
40
+ end
@@ -0,0 +1,17 @@
1
+ require 'rspec/expectations'
2
+
3
+ RSpec::Matchers.define :have_image_with_rgb_color do |*expected|
4
+ expected = format('rgb(%s, %s, %s)', *expected.flatten)
5
+
6
+ match do |actual|
7
+ actual.image.include? expected
8
+ end
9
+
10
+ failure_message_when_negated do |actual|
11
+ "expected that #{actual} includes color #{expected}"
12
+ end
13
+
14
+ failure_message do |actual|
15
+ "expected that #{actual} not includes color #{expected}"
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ require 'rspec/expectations'
2
+
3
+ RSpec::Matchers.define :have_name do |expected|
4
+ match do |actual|
5
+ actual.name? expected
6
+ end
7
+
8
+ failure_message_when_negated do |actual|
9
+ "expected that #{actual} does not nave name \"#{expected}\""
10
+ end
11
+
12
+ failure_message do |actual|
13
+ "expected that #{actual} has name \"#{expected}\""
14
+ end
15
+ end
@@ -17,7 +17,7 @@ RSpec.configure do |config|
17
17
  config.default_formatter = 'doc'
18
18
  end
19
19
 
20
- config.profile_examples = 10
20
+ config.profile_examples = 10 if ENV.key? 'RSPEC_PROFILE'
21
21
 
22
22
  config.order = :random
23
23
  Kernel.srand config.seed
@@ -0,0 +1,46 @@
1
+ RSpec.shared_examples 'a structure generator' do |name|
2
+ subject { described_class.new(seed, preset, svg_image) }
3
+
4
+ let(:seed) { instance_double('GeoPattern::Seed') }
5
+ let(:preset) { instance_double('GeoPattern::PatternPreset') }
6
+ let(:svg_image) { SvgImage.new }
7
+ let(:pattern) { instance_double('GeoPattern::Pattern') }
8
+
9
+ let(:name) { name }
10
+
11
+ let(:fill_color_dark) { '#222' }
12
+ let(:fill_color_light) { '#ddd' }
13
+ let(:stroke_color) { '#000' }
14
+ let(:stroke_opacity) { 0.02 }
15
+ let(:opacity_min) { 0.02 }
16
+ let(:opacity_max) { 0.15 }
17
+
18
+ before :each do
19
+ allow(preset).to receive(:fill_color_dark).and_return(fill_color_dark)
20
+ allow(preset).to receive(:fill_color_light).and_return(fill_color_light)
21
+ allow(preset).to receive(:stroke_color).and_return(stroke_color)
22
+ allow(preset).to receive(:stroke_opacity).and_return(stroke_opacity)
23
+ allow(preset).to receive(:opacity_min).and_return(opacity_min)
24
+ allow(preset).to receive(:opacity_max).and_return(opacity_max)
25
+
26
+ allow(seed).to receive(:to_i).and_return(1)
27
+ end
28
+
29
+ it { is_expected.not_to be_nil }
30
+ it { is_expected.to respond_to(:generate) }
31
+
32
+ it do
33
+ expect(pattern).to receive(:structure=).with(kind_of(Structure))
34
+ expect(pattern).to receive(:height=).with(kind_of(Numeric))
35
+ expect(pattern).to receive(:width=).with(kind_of(Numeric))
36
+
37
+ subject.generate(pattern)
38
+ end
39
+
40
+ it_behaves_like 'a named generator', name
41
+ end
42
+
43
+ RSpec.shared_examples 'a named generator' do |name|
44
+ it { is_expected.to have_name name }
45
+ it { is_expected.to have_name name.to_s }
46
+ end
@@ -0,0 +1,31 @@
1
+ RSpec.shared_examples 'a chosen pattern' do |name|
2
+ subject(:pattern) { GeoPattern.generate(input, patterns: name) }
3
+
4
+ let(:file_name) { "#{name}.svg" }
5
+
6
+ before :each do
7
+ write_file file_name, pattern.to_s
8
+ end
9
+
10
+ it { expect(pattern.structure).to be_name name }
11
+ it { check_binary_file_content(file_name, fixtures_path("generated_patterns/#{name}.svg")) }
12
+ end
13
+
14
+ RSpec.shared_examples 'an invalid pattern' do |chosen_pattern|
15
+ subject(:pattern) { GeoPattern.generate(input, patterns: chosen_pattern) }
16
+
17
+ it { expect { subject }.to raise_error InvalidPatternError }
18
+ end
19
+
20
+ RSpec.shared_examples 'an old style pattern' do |chosen_pattern, name|
21
+ subject(:pattern) { GeoPattern.generate(input, patterns: chosen_pattern) }
22
+
23
+ let(:file_name) { "#{name}.svg" }
24
+
25
+ before :each do
26
+ write_file file_name, pattern.to_s
27
+ end
28
+
29
+ it { expect(pattern.structure).to be_name name }
30
+ it { check_binary_file_content(file_name, fixtures_path("generated_patterns/#{name}.svg")) }
31
+ end
@@ -0,0 +1,7 @@
1
+ RSpec.shared_examples 'a known pattern name' do
2
+ it { silence(:stderr) { expect(pattern_store[pattern_name]).not_to be_nil } }
3
+ end
4
+
5
+ RSpec.shared_examples 'an unknown pattern name' do
6
+ it { silence(:stderr) { expect(pattern_store[pattern_name]).to be_nil } }
7
+ end
@@ -0,0 +1,48 @@
1
+ RSpec.shared_examples 'a metadata argument' do |argument|
2
+ describe "##{argument}" do
3
+ it { expect(metadata.public_send(argument)).to eq public_send(argument) }
4
+ end
5
+
6
+ describe "##{argument}?" do
7
+ context "when #{argument} is not defined" do
8
+ let(argument) { nil }
9
+ it { expect { metadata }.to raise_error ArgumentError, "Argument #{argument} is missing" }
10
+ end
11
+
12
+ context "when #{argument} is defined" do
13
+ context 'when argument is not given' do
14
+ it { is_expected.to public_send(:"be_#{argument}", nil) }
15
+ end
16
+
17
+ context 'when argument is the same as the defined one' do
18
+ it { is_expected.to public_send(:"be_#{argument}", public_send(argument)) }
19
+ end
20
+
21
+ context 'when argument is different from the defined one' do
22
+ it { is_expected.not_to public_send(:"be_#{argument}", 'blub') }
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ RSpec.shared_examples 'a forwarded metadata argument' do |argument|
29
+ describe "##{argument}" do
30
+ it { expect(metadata.public_send(argument)).to eq public_send(argument) }
31
+ end
32
+
33
+ describe "##{argument}?" do
34
+ context "when #{argument} is defined" do
35
+ context 'when argument is not given' do
36
+ it { is_expected.to public_send(:"be_#{argument}", nil) }
37
+ end
38
+
39
+ context 'when argument is the same as the defined one' do
40
+ it { is_expected.to public_send(:"be_#{argument}", public_send(argument)) }
41
+ end
42
+
43
+ context 'when argument is different from the defined one' do
44
+ it { is_expected.not_to public_send(:"be_#{argument}", 'blub') }
45
+ end
46
+ end
47
+ end
48
+ end