geo_pattern 1.3.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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