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,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