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,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe GeoPattern::Color do
4
+ subject(:color) { described_class.new(color_string) }
5
+ let(:color_string) { '#ff00ff' }
6
+ let(:seed) { instance_double('GeoPattern::Seed') }
7
+
8
+ describe '#to_svg' do
9
+ it { expect(color.to_svg).to eq 'rgb(255, 0, 255)' }
10
+ end
11
+
12
+ describe '#to_html' do
13
+ it { expect(color.to_html).to eq color_string }
14
+ end
15
+ end
@@ -2,43 +2,114 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  RSpec.describe GeoPattern do
5
- let(:string) { 'Mastering Markdown' }
5
+ subject(:pattern) { GeoPattern.generate(input) }
6
+ let(:input) { 'Mastering Markdown' }
7
+ let(:color) { '#ffcc00' }
8
+ let(:rgb_base_color) { PatternHelpers.html_to_rgb_for_string(seed, color) }
9
+ let(:seed) { instance_double('GeoPattern::Seed') }
6
10
 
7
- context '.generate' do
8
- it 'generates a pattern for a string' do
9
- pattern = GeoPattern.generate(string)
10
- expect(pattern).not_to be_nil
11
- end
11
+ before :each do
12
+ allow(seed).to receive(:to_i).with(14, 3).and_return(2616)
13
+ allow(seed).to receive(:to_i).with(17, 1).and_return(3)
14
+ end
12
15
 
13
- it 'is always the same' do
14
- pattern1 = GeoPattern.generate(string)
15
- pattern2 = GeoPattern.generate(string)
16
+ it { expect(pattern).not_to be_nil }
16
17
 
17
- expect(pattern1.svg_string).to eq pattern2.svg_string
18
+ describe '.generate' do
19
+ context 'when invoked with the same input it returns the same output' do
20
+ let(:other_pattern) { GeoPattern.generate(input) }
21
+ it { expect(pattern.to_svg).to eq other_pattern.to_svg }
18
22
  end
19
23
 
20
- it 'sets background color with adjusting hue and saturation based on string' do
21
- html_base_color = '#fc0'
22
- rgb_base_color = html_to_rgb_for_string(string, html_base_color)
23
- pattern = GeoPattern.generate(string, base_color: html_base_color)
24
+ context 'when an invalid option is given' do
25
+ subject(:pattern) { GeoPattern.generate(input, **args) }
26
+ let(:args) { { unknown: true } }
24
27
 
25
- expect(pattern.svg_string).to include(rgb_base_color)
28
+ it { expect { pattern }.to raise_error ArgumentError }
26
29
  end
27
30
 
28
- it 'sets background color' do
29
- html_base_color = '#fc0'
30
- rgb_base_color = html_to_rgb(html_base_color)
31
- pattern = GeoPattern.generate(string, color: html_base_color)
31
+ context 'set background color of generated pattern' do
32
+ let(:new_color) { '#ffcc00' }
33
+
34
+ context 'when a base color is set' do
35
+ subject(:pattern) { GeoPattern.generate(input, base_color: color) }
36
+ let(:new_color) { '#04fbf6' }
32
37
 
33
- expect(pattern.svg_string).to include(rgb_base_color)
38
+ it { expect(pattern.background.color.to_html).to eq(new_color) }
39
+ end
40
+
41
+ context 'when a color is set' do
42
+ subject(:pattern) { GeoPattern.generate(input, color: color) }
43
+
44
+ it { expect(pattern.background.color.to_html).to eq(new_color) }
45
+ end
34
46
  end
35
47
 
36
- it 'uses the specified generator' do
48
+ context 'specify the pattern' do
49
+ subject(:pattern) { GeoPattern.generate(input, patterns: chosen_pattern) }
50
+
51
+ let(:chosen_pattern) { :sine_waves }
52
+
53
+ context 'when the deprecated generator option is used' do
54
+ subject(:pattern) { GeoPattern.generate(input, generator: chosen_pattern) }
55
+ subject(:other_pattern) { GeoPattern.generate(input, patterns: chosen_pattern) }
56
+
57
+ it { expect { pattern.to_svg }.to output(/deprecated/).to_stderr }
58
+ it { silence(:stderr) { expect(pattern.to_svg).to eq other_pattern.to_svg } }
59
+ end
60
+
61
+ context 'when multiple patterns are selected' do
62
+ let(:chosen_pattern) { [:sine_waves, :xes] }
63
+
64
+ it { expect(pattern.structure.name).to eq(:sine_waves).or eq(:xes) }
65
+ end
66
+
67
+ context 'when an old style pattern was chosen via class name' do
68
+ it_behaves_like 'an old style pattern', ChevronPattern, :chevrons
69
+ it_behaves_like 'an old style pattern', ConcentricCirclesPattern, :concentric_circles
70
+ it_behaves_like 'an old style pattern', DiamondPattern, :diamonds
71
+ it_behaves_like 'an old style pattern', HexagonPattern, :hexagons
72
+ it_behaves_like 'an old style pattern', MosaicSquaresPattern, :mosaic_squares
73
+ it_behaves_like 'an old style pattern', NestedSquaresPattern, :nested_squares
74
+ it_behaves_like 'an old style pattern', OctagonPattern, :octagons
75
+ it_behaves_like 'an old style pattern', OverlappingCirclesPattern, :overlapping_circles
76
+ it_behaves_like 'an old style pattern', OverlappingRingsPattern, :overlapping_rings
77
+ it_behaves_like 'an old style pattern', PlaidPattern, :plaid
78
+ it_behaves_like 'an old style pattern', PlusSignPattern, :plus_signs
79
+ it_behaves_like 'an old style pattern', SineWavePattern, :sine_waves
80
+ it_behaves_like 'an old style pattern', SquarePattern, :squares
81
+ it_behaves_like 'an old style pattern', TessellationPattern, :tessellation
82
+ it_behaves_like 'an old style pattern', TrianglePattern, :triangles
83
+ it_behaves_like 'an old style pattern', XesPattern, :xes
84
+ end
85
+
86
+ context 'when an valid pattern was chosen' do
87
+ it_behaves_like 'a chosen pattern', :chevrons
88
+ it_behaves_like 'a chosen pattern', :concentric_circles
89
+ it_behaves_like 'a chosen pattern', :diamonds
90
+ it_behaves_like 'a chosen pattern', :hexagons
91
+ it_behaves_like 'a chosen pattern', :mosaic_squares
92
+ it_behaves_like 'a chosen pattern', :nested_squares
93
+ it_behaves_like 'a chosen pattern', :octagons
94
+ it_behaves_like 'a chosen pattern', :overlapping_circles
95
+ it_behaves_like 'a chosen pattern', :overlapping_rings
96
+ it_behaves_like 'a chosen pattern', :plaid
97
+ it_behaves_like 'a chosen pattern', :plus_signs
98
+ it_behaves_like 'a chosen pattern', :sine_waves
99
+ it_behaves_like 'a chosen pattern', :squares
100
+ it_behaves_like 'a chosen pattern', :tessellation
101
+ it_behaves_like 'a chosen pattern', :triangles
102
+ it_behaves_like 'a chosen pattern', :xes
103
+ end
37
104
 
38
- pattern1 = GeoPattern.generate(string, generator: GeoPattern::SineWavePattern)
39
- pattern2 = GeoPattern.generate(string)
105
+ context 'when invalid patterns were chosen' do
106
+ InvalidPatternClass = Class.new
40
107
 
41
- expect(pattern1.svg_string).not_to eq pattern2.svg_string
108
+ it_behaves_like 'an invalid pattern', InvalidPatternClass
109
+ it_behaves_like 'an invalid pattern', 'invalid_pattern'
110
+ it_behaves_like 'an invalid pattern', :invalid_pattern
111
+ it_behaves_like 'an invalid pattern', [:sine_waves, 'invalid_pattern']
112
+ end
42
113
  end
43
114
  end
44
115
  end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Helpers do
4
+ describe '.underscore' do
5
+ subject { described_class.underscore string }
6
+
7
+ context 'when string is empty' do
8
+ let(:string) { '' }
9
+
10
+ it { is_expected.to eq '' }
11
+ end
12
+
13
+ context 'when string is in snakecase' do
14
+ let(:string) { 'HelloWorld' }
15
+
16
+ it { is_expected.to eq 'hello_world' }
17
+ end
18
+
19
+ context 'when string is in snakecase at some places' do
20
+ let(:string) { 'helloWorld' }
21
+
22
+ it { is_expected.to eq 'hello_world' }
23
+ end
24
+ end
25
+
26
+ describe '.demodulize' do
27
+ subject { described_class.demodulize string }
28
+
29
+ context 'when constant' do
30
+ before :each do
31
+ stub_const('HelloWorld', Class.new)
32
+ end
33
+
34
+ let(:string) { HelloWorld }
35
+
36
+ it { is_expected.to eq 'HelloWorld' }
37
+ end
38
+
39
+ context 'when string' do
40
+ context 'is empty' do
41
+ let(:string) { '' }
42
+
43
+ it { is_expected.to eq '' }
44
+ end
45
+
46
+ context 'starts with ::' do
47
+ let(:string) { '::Class' }
48
+
49
+ it { is_expected.to eq 'Class' }
50
+ end
51
+
52
+ context 'has :: in betweend' do
53
+ let(:string) { 'HelloWorld::Class' }
54
+
55
+ it { is_expected.to eq 'Class' }
56
+ end
57
+
58
+ context 'when no namespaces is given' do
59
+ let(:string) { 'HelloWorld' }
60
+
61
+ it { is_expected.to eq 'HelloWorld' }
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe PatternPreset do
4
+ subject(:preset) { PatternPreset.new(options) }
5
+ let(:options) do
6
+ {
7
+ fill_color_dark: '#222',
8
+ fill_color_light: '#ddd',
9
+ stroke_color: '#000',
10
+ stroke_opacity: 0.02,
11
+ opacity_min: 0.02,
12
+ opacity_max: 0.15
13
+ }
14
+ end
15
+
16
+ it { expect(preset).not_to be nil }
17
+
18
+ describe '#fill_color_dark' do
19
+ it { expect(preset.fill_color_dark).to eq '#222' }
20
+ end
21
+
22
+ describe '#fill_color_light' do
23
+ it { expect(preset.fill_color_light).to eq '#ddd' }
24
+ end
25
+
26
+ describe '#stroke_color' do
27
+ it { expect(preset.stroke_color).to eq '#000' }
28
+ end
29
+
30
+ describe '#stroke_opacity' do
31
+ it { expect(preset.stroke_opacity).to eq 0.02 }
32
+ end
33
+
34
+ describe '#opacity_min' do
35
+ it { expect(preset.opacity_min).to eq 0.02 }
36
+ end
37
+
38
+ describe '#opacity_max' do
39
+ it { expect(preset.opacity_max).to eq 0.15 }
40
+ end
41
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe PatternSieve do
4
+ subject(:sieve) { PatternSieve.new(requested_patterns, seed, store) }
5
+
6
+ before :each do
7
+ stub_const('Pattern1', Class.new)
8
+ stub_const('Pattern2', Class.new)
9
+ end
10
+
11
+ let(:store) { instance_double('GeoPattern::PatternStore') }
12
+ let(:available_patterns) { [Pattern1, Pattern2] }
13
+ let(:requested_patterns) { [:pattern1, :pattern2] }
14
+ let(:seed) { instance_double('GeoPattern::Seed') }
15
+
16
+ before :each do
17
+ allow(seed).to receive(:to_i).with(20, 1).and_return(1)
18
+ allow(store).to receive(:[])
19
+ end
20
+
21
+ # Minimum valid object test
22
+ it { expect(sieve).not_to be_nil }
23
+
24
+ describe '#fetch' do
25
+ context 'when requested_patterns is empty' do
26
+ let(:requested_patterns) { nil }
27
+
28
+ before :each do
29
+ expect(store).to receive(:all).and_return(available_patterns)
30
+ expect(store).not_to receive(:[])
31
+ end
32
+
33
+ it { expect(sieve.fetch).to eq Pattern2 }
34
+ end
35
+
36
+ context 'when a valid pattern is requested' do
37
+ let(:requested_patterns) { [:pattern1] }
38
+
39
+ before :each do
40
+ expect(store).to receive(:[]).with(:pattern1).and_return(Pattern1)
41
+ end
42
+
43
+ it { expect(sieve.fetch).to eq Pattern1 }
44
+ end
45
+
46
+ context 'when an invalid pattern is requested' do
47
+ let(:requested_patterns) { [:patternX] }
48
+
49
+ before :each do
50
+ allow(store).to receive(:[]).with(:patternX).and_return(nil)
51
+ end
52
+
53
+ it { expect(sieve.fetch).to be nil }
54
+ end
55
+
56
+ context 'when a requested pattern is nil' do
57
+ let(:requested_patterns) { [:pattern1, nil, :pattern2] }
58
+
59
+ before :each do
60
+ expect(store).not_to receive(:[]).with(nil)
61
+ end
62
+
63
+ it { sieve.fetch }
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Pattern do
4
+ subject(:pattern) { Pattern.new(svg_image) }
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(:background) { instance_double('GeoPattern::Background') }
9
+ let(:background_image) { instance_double('GeoPattern::SvgImage') }
10
+ let(:background_body) { %(<rect x="0" y="0" width="100%" height="100%" fill="rgb(121, 131, 76)" />) }
11
+ let(:structure) { instance_double('GeoPattern::Structure') }
12
+ let(:structure_image) { instance_double('GeoPattern::SvgImage') }
13
+ let(:structure_body) { %(<path d=\"M0 53 C 28.0 0, 52.0 0, 80 53 S 132.0 106, 160 53 S 212.0 0, 240.0, 53\" fill=\"none\" stroke=\"#222\" style=\"opacity:0.046;stroke-width:6px;\" transform=\"translate(-40, -79.5)\" />) }
14
+
15
+ it { expect(pattern).not_to be_nil }
16
+
17
+ before :each do
18
+ allow(svg_image).to receive(:to_s).and_return svg_image_content
19
+ allow(svg_image).to receive(:height=).and_return 100
20
+ allow(svg_image).to receive(:width=).and_return 100
21
+
22
+ allow(background).to receive(:image).and_return background_image
23
+
24
+ allow(structure).to receive(:image).and_return structure_image
25
+ end
26
+
27
+ describe '#to_s' do
28
+ before :each do
29
+ allow(svg_image).to receive(:to_s).and_return(svg_image_content)
30
+ end
31
+
32
+ it { expect(pattern.to_s).to eq svg_image_content }
33
+ end
34
+
35
+ describe '#to_base64' do
36
+ before :each do
37
+ allow(svg_image).to receive(:to_s).and_return(svg_image_content)
38
+ end
39
+
40
+ it { expect(pattern.to_base64).to include 'PHN2ZyB4bWxuc' }
41
+ end
42
+
43
+ describe '#to_data_uri' do
44
+ before :each do
45
+ allow(svg_image).to receive(:to_s).and_return(svg_image_content)
46
+ end
47
+
48
+ it { expect(pattern.to_data_uri).to include 'PHN2ZyB4bWxuc' }
49
+ end
50
+
51
+ describe '#generate_me' do
52
+ context 'when a background is added' do
53
+ let(:generator) { instance_double('GeoPattern::BackgroundGenerator') }
54
+
55
+ before :each do
56
+ expect(generator).to receive(:generate).with(pattern)
57
+ end
58
+
59
+ it do
60
+ pattern.generate_me(generator)
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#include?' do
66
+ it do
67
+ expect(svg_image).to receive(:include?)
68
+
69
+ pattern.include? ''
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe PatternStore do
4
+ subject(:pattern_store) { PatternStore.new }
5
+
6
+ it { expect(pattern_store).not_to be_nil }
7
+
8
+ describe '#[]' do
9
+ context 'when a known pattern is requested' do
10
+ context 'as string' do
11
+ let(:pattern_name) { 'xes' }
12
+ it_behaves_like 'a known pattern name'
13
+ end
14
+
15
+ context 'as klass' do
16
+ let(:pattern_name) { XesPattern }
17
+ it_behaves_like 'a known pattern name'
18
+ end
19
+
20
+ context 'as symbol' do
21
+ let(:pattern_name) { :xes }
22
+ it_behaves_like 'a known pattern name'
23
+ end
24
+ end
25
+
26
+ context 'when an unknown pattern is requested' do
27
+ context 'as string' do
28
+ let(:pattern_name) { 'unknown' }
29
+ it_behaves_like 'an unknown pattern name'
30
+ end
31
+
32
+ context 'as klass' do
33
+ let(:pattern_name) do
34
+ stub_const('UnknownPattern', Class.new)
35
+ UnknownPattern
36
+ end
37
+
38
+ it_behaves_like 'an unknown pattern name'
39
+ end
40
+
41
+ context 'as symbol' do
42
+ let(:pattern_name) { :unknown }
43
+ it_behaves_like 'an unknown pattern name'
44
+ end
45
+ end
46
+ end
47
+ end