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.
- checksums.yaml +4 -4
- data/.rubocop.yml +58 -0
- data/.simplecov +25 -0
- data/.travis.yml +12 -0
- data/Gemfile +3 -1
- data/README.md +125 -23
- data/Rakefile +72 -9
- data/fixtures/generated_patterns/chevrons.svg +1 -0
- data/fixtures/generated_patterns/concentric_circles.svg +1 -0
- data/fixtures/generated_patterns/diamonds.svg +1 -0
- data/fixtures/generated_patterns/diamonds_with_base_color.svg +1 -0
- data/fixtures/generated_patterns/diamonds_with_color.svg +1 -0
- data/fixtures/generated_patterns/hexagons.svg +1 -0
- data/fixtures/generated_patterns/mosaic_squares.svg +1 -0
- data/fixtures/generated_patterns/nested_squares.svg +1 -0
- data/fixtures/generated_patterns/octagons.svg +1 -0
- data/fixtures/generated_patterns/overlapping_circles.svg +1 -0
- data/fixtures/generated_patterns/overlapping_rings.svg +1 -0
- data/fixtures/generated_patterns/plaid.svg +1 -0
- data/fixtures/generated_patterns/plus_signs.svg +1 -0
- data/fixtures/generated_patterns/sine_waves.svg +1 -0
- data/fixtures/generated_patterns/squares.svg +1 -0
- data/fixtures/generated_patterns/tessellation.svg +1 -0
- data/fixtures/generated_patterns/triangles.svg +1 -0
- data/fixtures/generated_patterns/xes.svg +1 -0
- data/geo_pattern.gemspec +8 -2
- data/lib/geo_pattern.rb +42 -20
- data/lib/geo_pattern/background.rb +25 -0
- data/lib/geo_pattern/background_generators/solid_generator.rb +52 -0
- data/lib/geo_pattern/color.rb +25 -0
- data/lib/geo_pattern/color_generators/base_color_generator.rb +55 -0
- data/lib/geo_pattern/color_generators/simple_generator.rb +27 -0
- data/lib/geo_pattern/color_preset.rb +26 -0
- data/lib/geo_pattern/errors.rb +7 -0
- data/lib/geo_pattern/geo_pattern_task.rb +59 -0
- data/lib/geo_pattern/helpers.rb +47 -0
- data/lib/geo_pattern/pattern.rb +84 -0
- data/lib/geo_pattern/pattern_generator.rb +33 -82
- data/lib/geo_pattern/pattern_helpers.rb +31 -2
- data/lib/geo_pattern/pattern_preset.rb +23 -0
- data/lib/geo_pattern/pattern_sieve.rb +36 -0
- data/lib/geo_pattern/pattern_store.rb +63 -0
- data/lib/geo_pattern/pattern_validator.rb +27 -0
- data/lib/geo_pattern/rake_task.rb +109 -0
- data/lib/geo_pattern/roles/comparable_metadata.rb +35 -0
- data/lib/geo_pattern/roles/named_generator.rb +13 -0
- data/lib/geo_pattern/seed.rb +21 -0
- data/lib/geo_pattern/structure.rb +25 -0
- data/lib/geo_pattern/structure_generators/base_generator.rb +85 -0
- data/lib/geo_pattern/structure_generators/chevrons_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/concentric_circles_generator.rb +56 -0
- data/lib/geo_pattern/structure_generators/diamonds_generator.rb +66 -0
- data/lib/geo_pattern/structure_generators/hexagons_generator.rb +67 -0
- data/lib/geo_pattern/structure_generators/mosaic_squares_generator.rb +85 -0
- data/lib/geo_pattern/structure_generators/nested_squares_generator.rb +60 -0
- data/lib/geo_pattern/structure_generators/octagons_generator.rb +44 -0
- data/lib/geo_pattern/structure_generators/overlapping_circles_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/overlapping_rings_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/plaid_generator.rb +55 -0
- data/lib/geo_pattern/structure_generators/plus_signs_generator.rb +62 -0
- data/lib/geo_pattern/structure_generators/sine_waves_generator.rb +43 -0
- data/lib/geo_pattern/structure_generators/squares_generator.rb +36 -0
- data/lib/geo_pattern/structure_generators/tessellation_generator.rb +103 -0
- data/lib/geo_pattern/structure_generators/triangles_generator.rb +61 -0
- data/lib/geo_pattern/structure_generators/xes_generator.rb +67 -0
- data/lib/geo_pattern/svg_image.rb +101 -0
- data/lib/geo_pattern/version.rb +1 -1
- data/script/bootstrap +30 -0
- data/script/console +8 -0
- data/script/test +21 -0
- data/spec/background_generators/solid_generator_spec.rb +50 -0
- data/spec/background_spec.rb +25 -0
- data/spec/color_generators/base_color_generator_spec.rb +31 -0
- data/spec/color_generators/simple_generator_spec.rb +12 -0
- data/spec/color_preset_spec.rb +53 -0
- data/spec/color_spec.rb +15 -0
- data/spec/geo_pattern_spec.rb +95 -24
- data/spec/helpers_spec.rb +65 -0
- data/spec/pattern_preset_spec.rb +41 -0
- data/spec/pattern_sieve_spec.rb +66 -0
- data/spec/pattern_spec.rb +72 -0
- data/spec/pattern_store_spec.rb +47 -0
- data/spec/pattern_validator_spec.rb +28 -0
- data/spec/seed_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -6
- data/spec/structure_generators/chevrons_generator_spec.rb +5 -0
- data/spec/structure_generators/concentric_circles_generator_spec.rb +5 -0
- data/spec/structure_generators/diamonds_generator_spec.rb +5 -0
- data/spec/structure_generators/hexagons_generator_spec.rb +5 -0
- data/spec/structure_generators/mosaic_squares_generator_spec.rb +5 -0
- data/spec/structure_generators/nested_squares_generator_spec.rb +5 -0
- data/spec/structure_generators/octagons_generator_spec.rb +5 -0
- data/spec/structure_generators/overlapping_circles_generator_spec.rb +5 -0
- data/spec/structure_generators/overlapping_rings_generator_spec.rb +5 -0
- data/spec/structure_generators/plaid_generator_spec.rb +5 -0
- data/spec/structure_generators/plus_signs_generator_spec.rb +5 -0
- data/spec/structure_generators/sine_waves_generator_spec.rb +5 -0
- data/spec/structure_generators/squares_generator_spec.rb +5 -0
- data/spec/structure_generators/tessellation_generator_spec.rb +5 -0
- data/spec/structure_generators/triangles_generator_spec.rb +5 -0
- data/spec/structure_generators/xes_generator_spec.rb +5 -0
- data/spec/structure_spec.rb +38 -0
- data/spec/support/helpers/fixtures.rb +12 -0
- data/spec/support/kernel.rb +40 -0
- data/spec/support/matchers/image.rb +17 -0
- data/spec/support/matchers/name.rb +15 -0
- data/spec/support/rspec.rb +1 -1
- data/spec/support/shared_examples/generator.rb +46 -0
- data/spec/support/shared_examples/pattern.rb +31 -0
- data/spec/support/shared_examples/pattern_name.rb +7 -0
- data/spec/support/shared_examples/structure.rb +48 -0
- data/spec/svg_spec.rb +3 -3
- metadata +141 -25
- data/lib/geo_pattern/pattern/base_pattern.rb +0 -47
- data/lib/geo_pattern/pattern/chevron_pattern.rb +0 -45
- data/lib/geo_pattern/pattern/concentric_circles_pattern.rb +0 -47
- data/lib/geo_pattern/pattern/diamond_pattern.rb +0 -56
- data/lib/geo_pattern/pattern/hexagon_pattern.rb +0 -57
- data/lib/geo_pattern/pattern/mosaic_squares_pattern.rb +0 -76
- data/lib/geo_pattern/pattern/nested_squares_pattern.rb +0 -51
- data/lib/geo_pattern/pattern/octagon_pattern.rb +0 -35
- data/lib/geo_pattern/pattern/overlapping_circles_pattern.rb +0 -46
- data/lib/geo_pattern/pattern/overlapping_rings_pattern.rb +0 -46
- data/lib/geo_pattern/pattern/plaid_pattern.rb +0 -49
- data/lib/geo_pattern/pattern/plus_sign_pattern.rb +0 -53
- data/lib/geo_pattern/pattern/sine_wave_pattern.rb +0 -36
- data/lib/geo_pattern/pattern/square_pattern.rb +0 -27
- data/lib/geo_pattern/pattern/tessellation_pattern.rb +0 -93
- data/lib/geo_pattern/pattern/triangle_pattern.rb +0 -51
- data/lib/geo_pattern/pattern/xes_pattern.rb +0 -58
- data/lib/geo_pattern/svg.rb +0 -77
- data/spec/support/helpers.rb +0 -34
data/spec/color_spec.rb
ADDED
@@ -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
|
data/spec/geo_pattern_spec.rb
CHANGED
@@ -2,43 +2,114 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
RSpec.describe GeoPattern do
|
5
|
-
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
14
|
-
pattern1 = GeoPattern.generate(string)
|
15
|
-
pattern2 = GeoPattern.generate(string)
|
16
|
+
it { expect(pattern).not_to be_nil }
|
16
17
|
|
17
|
-
|
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
|
-
|
21
|
-
|
22
|
-
|
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
|
28
|
+
it { expect { pattern }.to raise_error ArgumentError }
|
26
29
|
end
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
39
|
-
|
105
|
+
context 'when invalid patterns were chosen' do
|
106
|
+
InvalidPatternClass = Class.new
|
40
107
|
|
41
|
-
|
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
|