geo_pattern 1.3.2 → 1.5.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 (135) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +30 -0
  3. data/.gitignore +1 -0
  4. data/.simplecov +26 -0
  5. data/Gemfile +17 -17
  6. data/README.md +154 -29
  7. data/Rakefile +72 -13
  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 +19 -17
  27. data/lib/geo_pattern/background.rb +27 -0
  28. data/lib/geo_pattern/background_generators/solid_generator.rb +54 -0
  29. data/lib/geo_pattern/color.rb +27 -0
  30. data/lib/geo_pattern/color_generators/base_color_generator.rb +57 -0
  31. data/lib/geo_pattern/color_generators/simple_generator.rb +29 -0
  32. data/lib/geo_pattern/color_preset.rb +32 -0
  33. data/lib/geo_pattern/errors.rb +9 -0
  34. data/lib/geo_pattern/geo_pattern_task.rb +61 -0
  35. data/lib/geo_pattern/helpers.rb +50 -1
  36. data/lib/geo_pattern/pattern.rb +86 -0
  37. data/lib/geo_pattern/pattern_generator.rb +34 -81
  38. data/lib/geo_pattern/pattern_helpers.rb +34 -2
  39. data/lib/geo_pattern/pattern_preset.rb +25 -0
  40. data/lib/geo_pattern/pattern_sieve.rb +38 -0
  41. data/lib/geo_pattern/pattern_store.rb +65 -0
  42. data/lib/geo_pattern/pattern_validator.rb +29 -0
  43. data/lib/geo_pattern/rake_task.rb +112 -0
  44. data/lib/geo_pattern/roles/comparable_metadata.rb +37 -0
  45. data/lib/geo_pattern/roles/named_generator.rb +15 -0
  46. data/lib/geo_pattern/seed.rb +23 -0
  47. data/lib/geo_pattern/structure.rb +27 -0
  48. data/lib/geo_pattern/structure_generators/base_generator.rb +88 -0
  49. data/lib/geo_pattern/structure_generators/chevrons_generator.rb +57 -0
  50. data/lib/geo_pattern/structure_generators/concentric_circles_generator.rb +58 -0
  51. data/lib/geo_pattern/structure_generators/diamonds_generator.rb +72 -0
  52. data/lib/geo_pattern/structure_generators/hexagons_generator.rb +69 -0
  53. data/lib/geo_pattern/structure_generators/mosaic_squares_generator.rb +85 -0
  54. data/lib/geo_pattern/structure_generators/nested_squares_generator.rb +62 -0
  55. data/lib/geo_pattern/structure_generators/octagons_generator.rb +45 -0
  56. data/lib/geo_pattern/structure_generators/overlapping_circles_generator.rb +57 -0
  57. data/lib/geo_pattern/structure_generators/overlapping_rings_generator.rb +57 -0
  58. data/lib/geo_pattern/structure_generators/plaid_generator.rb +55 -0
  59. data/lib/geo_pattern/structure_generators/plus_signs_generator.rb +68 -0
  60. data/lib/geo_pattern/structure_generators/sine_waves_generator.rb +45 -0
  61. data/lib/geo_pattern/structure_generators/squares_generator.rb +37 -0
  62. data/lib/geo_pattern/structure_generators/tessellation_generator.rb +105 -0
  63. data/lib/geo_pattern/structure_generators/triangles_generator.rb +64 -0
  64. data/lib/geo_pattern/structure_generators/xes_generator.rb +74 -0
  65. data/lib/geo_pattern/svg_image.rb +103 -0
  66. data/lib/geo_pattern/version.rb +3 -1
  67. data/lib/geo_pattern.rb +54 -30
  68. data/script/bootstrap +30 -0
  69. data/script/console +9 -0
  70. data/script/test +21 -0
  71. data/spec/background_generators/solid_generator_spec.rb +52 -0
  72. data/spec/background_spec.rb +27 -0
  73. data/spec/color_generators/base_color_generator_spec.rb +33 -0
  74. data/spec/color_generators/simple_generator_spec.rb +14 -0
  75. data/spec/color_preset_spec.rb +55 -0
  76. data/spec/color_spec.rb +17 -0
  77. data/spec/geo_pattern_spec.rb +98 -26
  78. data/spec/helpers_spec.rb +67 -0
  79. data/spec/pattern_preset_spec.rb +43 -0
  80. data/spec/pattern_sieve_spec.rb +68 -0
  81. data/spec/pattern_spec.rb +74 -0
  82. data/spec/pattern_store_spec.rb +49 -0
  83. data/spec/pattern_validator_spec.rb +30 -0
  84. data/spec/seed_spec.rb +16 -0
  85. data/spec/spec_helper.rb +9 -13
  86. data/spec/structure_generators/chevrons_generator_spec.rb +7 -0
  87. data/spec/structure_generators/concentric_circles_generator_spec.rb +7 -0
  88. data/spec/structure_generators/diamonds_generator_spec.rb +7 -0
  89. data/spec/structure_generators/hexagons_generator_spec.rb +7 -0
  90. data/spec/structure_generators/mosaic_squares_generator_spec.rb +7 -0
  91. data/spec/structure_generators/nested_squares_generator_spec.rb +7 -0
  92. data/spec/structure_generators/octagons_generator_spec.rb +7 -0
  93. data/spec/structure_generators/overlapping_circles_generator_spec.rb +7 -0
  94. data/spec/structure_generators/overlapping_rings_generator_spec.rb +7 -0
  95. data/spec/structure_generators/plaid_generator_spec.rb +7 -0
  96. data/spec/structure_generators/plus_signs_generator_spec.rb +7 -0
  97. data/spec/structure_generators/sine_waves_generator_spec.rb +7 -0
  98. data/spec/structure_generators/squares_generator_spec.rb +7 -0
  99. data/spec/structure_generators/tessellation_generator_spec.rb +7 -0
  100. data/spec/structure_generators/triangles_generator_spec.rb +7 -0
  101. data/spec/structure_generators/xes_generator_spec.rb +7 -0
  102. data/spec/structure_spec.rb +40 -0
  103. data/spec/support/aruba.rb +6 -6
  104. data/spec/support/helpers/fixtures.rb +14 -0
  105. data/spec/support/kernel.rb +46 -0
  106. data/spec/support/matchers/image.rb +19 -0
  107. data/spec/support/matchers/name.rb +17 -0
  108. data/spec/support/rspec.rb +4 -2
  109. data/spec/support/shared_examples/generator.rb +48 -0
  110. data/spec/support/shared_examples/pattern.rb +33 -0
  111. data/spec/support/shared_examples/pattern_name.rb +9 -0
  112. data/spec/support/shared_examples/structure.rb +50 -0
  113. data/spec/support/string.rb +3 -2
  114. data/spec/svg_spec.rb +8 -6
  115. metadata +105 -37
  116. data/.rubocop.yml +0 -13
  117. data/lib/geo_pattern/pattern/base_pattern.rb +0 -47
  118. data/lib/geo_pattern/pattern/chevron_pattern.rb +0 -45
  119. data/lib/geo_pattern/pattern/concentric_circles_pattern.rb +0 -47
  120. data/lib/geo_pattern/pattern/diamond_pattern.rb +0 -56
  121. data/lib/geo_pattern/pattern/hexagon_pattern.rb +0 -57
  122. data/lib/geo_pattern/pattern/mosaic_squares_pattern.rb +0 -76
  123. data/lib/geo_pattern/pattern/nested_squares_pattern.rb +0 -51
  124. data/lib/geo_pattern/pattern/octagon_pattern.rb +0 -35
  125. data/lib/geo_pattern/pattern/overlapping_circles_pattern.rb +0 -46
  126. data/lib/geo_pattern/pattern/overlapping_rings_pattern.rb +0 -46
  127. data/lib/geo_pattern/pattern/plaid_pattern.rb +0 -49
  128. data/lib/geo_pattern/pattern/plus_sign_pattern.rb +0 -53
  129. data/lib/geo_pattern/pattern/sine_wave_pattern.rb +0 -36
  130. data/lib/geo_pattern/pattern/square_pattern.rb +0 -27
  131. data/lib/geo_pattern/pattern/tessellation_pattern.rb +0 -93
  132. data/lib/geo_pattern/pattern/triangle_pattern.rb +0 -51
  133. data/lib/geo_pattern/pattern/xes_pattern.rb +0 -58
  134. data/lib/geo_pattern/svg.rb +0 -77
  135. data/spec/support/helpers.rb +0 -34
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe ColorPreset do
6
+ subject(:preset) { ColorPreset.new(**options) }
7
+ let(:options) do
8
+ {
9
+ base_color: "#0f0f0f"
10
+ }
11
+ end
12
+
13
+ it { expect(preset).not_to be nil }
14
+
15
+ describe "#base_color" do
16
+ it { expect(preset.base_color).to eq "#0f0f0f" }
17
+ end
18
+
19
+ describe "#color" do
20
+ context "when set" do
21
+ let(:options) do
22
+ {
23
+ base_color: "#0f0f0f",
24
+ color: "#1f1f1f"
25
+ }
26
+ end
27
+
28
+ it { expect(preset.color).to eq "#1f1f1f" }
29
+ end
30
+ end
31
+
32
+ describe "#mode?" do
33
+ context "when nil" do
34
+ let(:options) do
35
+ {
36
+ base_color: "#0f0f0f",
37
+ color: nil
38
+ }
39
+ end
40
+
41
+ it { expect(preset).to be_mode :base_color }
42
+ end
43
+
44
+ context "when defined" do
45
+ let(:options) do
46
+ {
47
+ base_color: "#0f0f0f",
48
+ color: "#1f1f1f"
49
+ }
50
+ end
51
+
52
+ it { expect(preset).to be_mode :color }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe GeoPattern::Color do
6
+ subject(:color) { described_class.new(color_string) }
7
+ let(:color_string) { "#ff00ff" }
8
+ let(:seed) { instance_double("GeoPattern::Seed") }
9
+
10
+ describe "#to_svg" do
11
+ it { expect(color.to_svg).to eq "rgb(255, 0, 255)" }
12
+ end
13
+
14
+ describe "#to_html" do
15
+ it { expect(color.to_html).to eq color_string }
16
+ end
17
+ end
@@ -1,44 +1,116 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
3
4
 
4
5
  RSpec.describe GeoPattern do
5
- let(:string) { 'Mastering Markdown' }
6
+ subject(:pattern) { GeoPattern.generate(input) }
7
+ let(:input) { "Mastering Markdown" }
8
+ let(:color) { "#ffcc00" }
9
+ let(:rgb_base_color) { PatternHelpers.html_to_rgb_for_string(seed, color) }
10
+ let(:seed) { instance_double("GeoPattern::Seed") }
6
11
 
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
12
+ before :each do
13
+ allow(seed).to receive(:to_i).with(14, 3).and_return(2616)
14
+ allow(seed).to receive(:to_i).with(17, 1).and_return(3)
15
+ end
12
16
 
13
- it 'is always the same' do
14
- pattern1 = GeoPattern.generate(string)
15
- pattern2 = GeoPattern.generate(string)
17
+ it { expect(pattern).not_to be_nil }
16
18
 
17
- expect(pattern1.svg_string).to eq pattern2.svg_string
19
+ describe ".generate" do
20
+ context "when invoked with the same input it returns the same output" do
21
+ let(:other_pattern) { GeoPattern.generate(input) }
22
+ it { expect(pattern.to_svg).to eq other_pattern.to_svg }
18
23
  end
19
24
 
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)
25
+ context "when an invalid option is given" do
26
+ subject(:pattern) { GeoPattern.generate(input, **args) }
27
+ let(:args) { {unknown: true} }
24
28
 
25
- expect(pattern.svg_string).to include(rgb_base_color)
29
+ it { expect { pattern }.to raise_error ArgumentError }
26
30
  end
27
31
 
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)
32
+ context "set background color of generated pattern" do
33
+ let(:new_color) { "#ffcc00" }
34
+
35
+ context "when a base color is set" do
36
+ subject(:pattern) { GeoPattern.generate(input, base_color: color) }
37
+ let(:new_color) { "#04fbf6" }
32
38
 
33
- expect(pattern.svg_string).to include(rgb_base_color)
39
+ it { expect(pattern.background.color.to_html).to eq(new_color) }
40
+ end
41
+
42
+ context "when a color is set" do
43
+ subject(:pattern) { GeoPattern.generate(input, color: color) }
44
+
45
+ it { expect(pattern.background.color.to_html).to eq(new_color) }
46
+ end
34
47
  end
35
48
 
36
- it 'uses the specified generator' do
49
+ context "specify the pattern" do
50
+ subject(:pattern) { GeoPattern.generate(input, patterns: chosen_pattern) }
51
+
52
+ let(:chosen_pattern) { :sine_waves }
53
+
54
+ context "when the deprecated generator option is used" do
55
+ subject(:pattern) { GeoPattern.generate(input, generator: chosen_pattern) }
56
+ subject(:other_pattern) { GeoPattern.generate(input, patterns: chosen_pattern) }
57
+
58
+ it { expect { pattern.to_svg }.to output(/deprecated/).to_stderr }
59
+ it { silence(:stderr) { expect(pattern.to_svg).to eq other_pattern.to_svg } }
60
+ end
61
+
62
+ context "when multiple patterns are selected" do
63
+ let(:chosen_pattern) { %i[sine_waves xes] }
64
+
65
+ it { expect(pattern.structure.name).to eq(:sine_waves).or eq(:xes) }
66
+ end
67
+
68
+ context "when an old style pattern was chosen via class name" do
69
+ it_behaves_like "an old style pattern", ChevronPattern, :chevrons
70
+ it_behaves_like "an old style pattern", ConcentricCirclesPattern, :concentric_circles
71
+ it_behaves_like "an old style pattern", DiamondPattern, :diamonds
72
+ it_behaves_like "an old style pattern", HexagonPattern, :hexagons
73
+ it_behaves_like "an old style pattern", MosaicSquaresPattern, :mosaic_squares
74
+ it_behaves_like "an old style pattern", NestedSquaresPattern, :nested_squares
75
+ it_behaves_like "an old style pattern", OctagonPattern, :octagons
76
+ it_behaves_like "an old style pattern", OverlappingCirclesPattern, :overlapping_circles
77
+ it_behaves_like "an old style pattern", OverlappingRingsPattern, :overlapping_rings
78
+ it_behaves_like "an old style pattern", PlaidPattern, :plaid
79
+ it_behaves_like "an old style pattern", PlusSignPattern, :plus_signs
80
+ it_behaves_like "an old style pattern", SineWavePattern, :sine_waves
81
+ it_behaves_like "an old style pattern", SquarePattern, :squares
82
+ it_behaves_like "an old style pattern", TessellationPattern, :tessellation
83
+ it_behaves_like "an old style pattern", TrianglePattern, :triangles
84
+ it_behaves_like "an old style pattern", XesPattern, :xes
85
+ end
86
+
87
+ context "when an valid pattern was chosen" do
88
+ it_behaves_like "a chosen pattern", :chevrons
89
+ it_behaves_like "a chosen pattern", :concentric_circles
90
+ it_behaves_like "a chosen pattern", :diamonds
91
+ it_behaves_like "a chosen pattern", :hexagons
92
+ it_behaves_like "a chosen pattern", :mosaic_squares
93
+ it_behaves_like "a chosen pattern", :nested_squares
94
+ it_behaves_like "a chosen pattern", :octagons
95
+ it_behaves_like "a chosen pattern", :overlapping_circles
96
+ it_behaves_like "a chosen pattern", :overlapping_rings
97
+ it_behaves_like "a chosen pattern", :plaid
98
+ it_behaves_like "a chosen pattern", :plus_signs
99
+ it_behaves_like "a chosen pattern", :sine_waves
100
+ it_behaves_like "a chosen pattern", :squares
101
+ it_behaves_like "a chosen pattern", :tessellation
102
+ it_behaves_like "a chosen pattern", :triangles
103
+ it_behaves_like "a chosen pattern", :xes
104
+ end
37
105
 
38
- pattern1 = GeoPattern.generate(string, generator: GeoPattern::SineWavePattern)
39
- pattern2 = GeoPattern.generate(string)
106
+ context "when invalid patterns were chosen" do
107
+ InvalidPatternClass = Class.new # rubocop:disable Lint/ConstantDefinitionInBlock
40
108
 
41
- expect(pattern1.svg_string).not_to eq pattern2.svg_string
109
+ it_behaves_like "an invalid pattern", InvalidPatternClass
110
+ it_behaves_like "an invalid pattern", "invalid_pattern"
111
+ it_behaves_like "an invalid pattern", :invalid_pattern
112
+ it_behaves_like "an invalid pattern", [:sine_waves, "invalid_pattern"]
113
+ end
42
114
  end
43
115
  end
44
116
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Helpers do
6
+ describe ".underscore" do
7
+ subject { described_class.underscore string }
8
+
9
+ context "when string is empty" do
10
+ let(:string) { "" }
11
+
12
+ it { is_expected.to eq "" }
13
+ end
14
+
15
+ context "when string is in snakecase" do
16
+ let(:string) { "HelloWorld" }
17
+
18
+ it { is_expected.to eq "hello_world" }
19
+ end
20
+
21
+ context "when string is in snakecase at some places" do
22
+ let(:string) { "helloWorld" }
23
+
24
+ it { is_expected.to eq "hello_world" }
25
+ end
26
+ end
27
+
28
+ describe ".demodulize" do
29
+ subject { described_class.demodulize string }
30
+
31
+ context "when constant" do
32
+ before :each do
33
+ stub_const("HelloWorld", Class.new)
34
+ end
35
+
36
+ let(:string) { HelloWorld }
37
+
38
+ it { is_expected.to eq "HelloWorld" }
39
+ end
40
+
41
+ context "when string" do
42
+ context "is empty" do
43
+ let(:string) { "" }
44
+
45
+ it { is_expected.to eq "" }
46
+ end
47
+
48
+ context "starts with ::" do
49
+ let(:string) { "::Class" }
50
+
51
+ it { is_expected.to eq "Class" }
52
+ end
53
+
54
+ context "has :: in betweend" do
55
+ let(:string) { "HelloWorld::Class" }
56
+
57
+ it { is_expected.to eq "Class" }
58
+ end
59
+
60
+ context "when no namespaces is given" do
61
+ let(:string) { "HelloWorld" }
62
+
63
+ it { is_expected.to eq "HelloWorld" }
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe PatternPreset do
6
+ subject(:preset) { PatternPreset.new(options) }
7
+ let(:options) do
8
+ {
9
+ fill_color_dark: "#222",
10
+ fill_color_light: "#ddd",
11
+ stroke_color: "#000",
12
+ stroke_opacity: 0.02,
13
+ opacity_min: 0.02,
14
+ opacity_max: 0.15
15
+ }
16
+ end
17
+
18
+ it { expect(preset).not_to be nil }
19
+
20
+ describe "#fill_color_dark" do
21
+ it { expect(preset.fill_color_dark).to eq "#222" }
22
+ end
23
+
24
+ describe "#fill_color_light" do
25
+ it { expect(preset.fill_color_light).to eq "#ddd" }
26
+ end
27
+
28
+ describe "#stroke_color" do
29
+ it { expect(preset.stroke_color).to eq "#000" }
30
+ end
31
+
32
+ describe "#stroke_opacity" do
33
+ it { expect(preset.stroke_opacity).to eq 0.02 }
34
+ end
35
+
36
+ describe "#opacity_min" do
37
+ it { expect(preset.opacity_min).to eq 0.02 }
38
+ end
39
+
40
+ describe "#opacity_max" do
41
+ it { expect(preset.opacity_max).to eq 0.15 }
42
+ end
43
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe PatternSieve do
6
+ subject(:sieve) { PatternSieve.new(requested_patterns, seed, store) }
7
+
8
+ before :each do
9
+ stub_const("Pattern1", Class.new)
10
+ stub_const("Pattern2", Class.new)
11
+ end
12
+
13
+ let(:store) { instance_double("GeoPattern::PatternStore") }
14
+ let(:available_patterns) { [Pattern1, Pattern2] }
15
+ let(:requested_patterns) { %i[pattern1 pattern2] }
16
+ let(:seed) { instance_double("GeoPattern::Seed") }
17
+
18
+ before :each do
19
+ allow(seed).to receive(:to_i).with(20, 1).and_return(1)
20
+ allow(store).to receive(:[])
21
+ end
22
+
23
+ # Minimum valid object test
24
+ it { expect(sieve).not_to be_nil }
25
+
26
+ describe "#fetch" do
27
+ context "when requested_patterns is empty" do
28
+ let(:requested_patterns) { nil }
29
+
30
+ before :each do
31
+ expect(store).to receive(:all).and_return(available_patterns)
32
+ expect(store).not_to receive(:[])
33
+ end
34
+
35
+ it { expect(sieve.fetch).to eq Pattern2 }
36
+ end
37
+
38
+ context "when a valid pattern is requested" do
39
+ let(:requested_patterns) { [:pattern1] }
40
+
41
+ before :each do
42
+ expect(store).to receive(:[]).with(:pattern1).and_return(Pattern1)
43
+ end
44
+
45
+ it { expect(sieve.fetch).to eq Pattern1 }
46
+ end
47
+
48
+ context "when an invalid pattern is requested" do
49
+ let(:requested_patterns) { [:patternX] }
50
+
51
+ before :each do
52
+ allow(store).to receive(:[]).with(:patternX).and_return(nil)
53
+ end
54
+
55
+ it { expect(sieve.fetch).to be nil }
56
+ end
57
+
58
+ context "when a requested pattern is nil" do
59
+ let(:requested_patterns) { [:pattern1, nil, :pattern2] }
60
+
61
+ before :each do
62
+ expect(store).not_to receive(:[]).with(nil)
63
+ end
64
+
65
+ it { sieve.fetch }
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Pattern do
6
+ subject(:pattern) { Pattern.new(svg_image) }
7
+
8
+ let(:svg_image) { instance_double("GeoPattern::SvgImage") }
9
+ let(:svg_image_content) { fixtures_path("generated_patterns/sine_waves.svg").read.chomp }
10
+ let(:background) { instance_double("GeoPattern::Background") }
11
+ let(:background_image) { instance_double("GeoPattern::SvgImage") }
12
+ let(:background_body) { %(<rect x="0" y="0" width="100%" height="100%" fill="rgb(121, 131, 76)" />) }
13
+ let(:structure) { instance_double("GeoPattern::Structure") }
14
+ let(:structure_image) { instance_double("GeoPattern::SvgImage") }
15
+ 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)" />) }
16
+
17
+ it { expect(pattern).not_to be_nil }
18
+
19
+ before :each do
20
+ allow(svg_image).to receive(:to_s).and_return svg_image_content
21
+ allow(svg_image).to receive(:height=).and_return 100
22
+ allow(svg_image).to receive(:width=).and_return 100
23
+
24
+ allow(background).to receive(:image).and_return background_image
25
+
26
+ allow(structure).to receive(:image).and_return structure_image
27
+ end
28
+
29
+ describe "#to_s" do
30
+ before :each do
31
+ allow(svg_image).to receive(:to_s).and_return(svg_image_content)
32
+ end
33
+
34
+ it { expect(pattern.to_s).to eq svg_image_content }
35
+ end
36
+
37
+ describe "#to_base64" do
38
+ before :each do
39
+ allow(svg_image).to receive(:to_s).and_return(svg_image_content)
40
+ end
41
+
42
+ it { expect(pattern.to_base64).to include "PHN2ZyB4bWxuc" }
43
+ end
44
+
45
+ describe "#to_data_uri" do
46
+ before :each do
47
+ allow(svg_image).to receive(:to_s).and_return(svg_image_content)
48
+ end
49
+
50
+ it { expect(pattern.to_data_uri).to include "PHN2ZyB4bWxuc" }
51
+ end
52
+
53
+ describe "#generate_me" do
54
+ context "when a background is added" do
55
+ let(:generator) { instance_double("GeoPattern::BackgroundGenerator") }
56
+
57
+ before :each do
58
+ expect(generator).to receive(:generate).with(pattern)
59
+ end
60
+
61
+ it do
62
+ pattern.generate_me(generator)
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "#include?" do
68
+ it do
69
+ expect(svg_image).to receive(:include?)
70
+
71
+ pattern.include? ""
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe PatternStore do
6
+ subject(:pattern_store) { PatternStore.new }
7
+
8
+ it { expect(pattern_store).not_to be_nil }
9
+
10
+ describe "#[]" do
11
+ context "when a known pattern is requested" do
12
+ context "as string" do
13
+ let(:pattern_name) { "xes" }
14
+ it_behaves_like "a known pattern name"
15
+ end
16
+
17
+ context "as klass" do
18
+ let(:pattern_name) { XesPattern }
19
+ it_behaves_like "a known pattern name"
20
+ end
21
+
22
+ context "as symbol" do
23
+ let(:pattern_name) { :xes }
24
+ it_behaves_like "a known pattern name"
25
+ end
26
+ end
27
+
28
+ context "when an unknown pattern is requested" do
29
+ context "as string" do
30
+ let(:pattern_name) { "unknown" }
31
+ it_behaves_like "an unknown pattern name"
32
+ end
33
+
34
+ context "as klass" do
35
+ let(:pattern_name) do
36
+ stub_const("UnknownPattern", Class.new)
37
+ UnknownPattern
38
+ end
39
+
40
+ it_behaves_like "an unknown pattern name"
41
+ end
42
+
43
+ context "as symbol" do
44
+ let(:pattern_name) { :unknown }
45
+ it_behaves_like "an unknown pattern name"
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe PatternValidator do
6
+ subject(:validator) { PatternValidator.new(store) }
7
+ let(:store) { instance_double("GeoPattern::PatternStore") }
8
+ let(:patterns) { [] }
9
+
10
+ # Minimum valid object test
11
+ it { expect(validator).not_to be_nil }
12
+
13
+ describe "#validate" do
14
+ context "when valid pattern is validated" do
15
+ before :each do
16
+ allow(store).to receive(:known?).with("pattern1").and_return(true)
17
+ end
18
+
19
+ it { expect { validator.validate(%w[pattern1]) }.not_to raise_error }
20
+ end
21
+
22
+ context "when invalid pattern is validated" do
23
+ before :each do
24
+ allow(store).to receive(:known?).with("pattern1").and_return(false)
25
+ end
26
+
27
+ it { expect { validator.validate(%w[pattern1]) }.to raise_error InvalidPatternError }
28
+ end
29
+ end
30
+ end
data/spec/seed_spec.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Seed do
6
+ subject(:seed) { Seed.new(input) }
7
+ let(:input) { "string" }
8
+
9
+ it { expect(seed).not_to be_nil }
10
+
11
+ describe "#[]" do
12
+ context "when use an integer" do
13
+ it { expect(seed[1]).to be_kind_of String }
14
+ end
15
+ end
16
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,23 +1,19 @@
1
- # encoding: utf-8
2
- $LOAD_PATH << File.expand_path('../../lib', __FILE__)
1
+ # frozen_string_literal: true
3
2
 
4
- require 'simplecov'
5
- SimpleCov.command_name 'rspec'
3
+ $LOAD_PATH << File.expand_path("../lib", __dir__)
4
+
5
+ require "simplecov"
6
+ SimpleCov.command_name "rspec"
6
7
  SimpleCov.start
7
8
 
8
9
  # Pull in all of the gems including those in the `test` group
9
- require 'bundler'
10
+ require "bundler"
10
11
  Bundler.require :default, :test, :development
11
12
 
12
- require 'geo_pattern'
13
-
14
- # Make some helpers available
15
- include GeoPattern::Helpers
13
+ require "geo_pattern"
16
14
 
17
15
  # 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__)
16
+ GeoPattern::Helpers.require_files_matching_pattern ::File.expand_path("support/**/*.rb", __dir__)
21
17
 
22
18
  # No need to add the namespace to every class tested
23
- include GeoPattern
19
+ include GeoPattern # rubocop:disable Style/MixinUsage
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::ChevronsGenerator do
6
+ it_behaves_like "a structure generator", :chevrons
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::ConcentricCirclesGenerator do
6
+ it_behaves_like "a structure generator", :concentric_circles
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::DiamondsGenerator do
6
+ it_behaves_like "a structure generator", :diamonds
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::HexagonsGenerator do
6
+ it_behaves_like "a structure generator", :hexagons
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::MosaicSquaresGenerator do
6
+ it_behaves_like "a structure generator", :mosaic_squares
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::NestedSquaresGenerator do
6
+ it_behaves_like "a structure generator", :nested_squares
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::OctagonsGenerator do
6
+ it_behaves_like "a structure generator", :octagons
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe StructureGenerators::OverlappingCirclesGenerator do
6
+ it_behaves_like "a structure generator", :overlapping_circles
7
+ end