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,61 @@
1
+ module GeoPattern
2
+ module StructureGenerators
3
+ class TrianglesGenerator < BaseGenerator
4
+ private
5
+
6
+ attr_reader :scale, :side_length, :triangle_height, :triangle
7
+
8
+ def after_initialize
9
+ @scale = hex_val(0, 1)
10
+ @side_length = map(scale, 0, 15, 15, 80)
11
+ @triangle_height = side_length / 2 * Math.sqrt(3)
12
+ @triangle = build_triangle_shape(side_length, triangle_height)
13
+
14
+ self.width = side_length * 3
15
+ self.height = triangle_height * 6
16
+ end
17
+
18
+ def generate_structure
19
+ i = 0
20
+ for y in 0..5
21
+ for x in 0..5
22
+ val = hex_val(i, 1)
23
+ opacity = opacity(val)
24
+ fill = fill_color(val)
25
+
26
+ styles = {
27
+ 'fill' => fill,
28
+ 'fill-opacity' => opacity,
29
+ 'stroke' => stroke_color,
30
+ 'stroke-opacity' => stroke_opacity
31
+ }
32
+
33
+ rotation = ''
34
+ if y % 2 == 0
35
+ rotation = x % 2 == 0 ? 180 : 0
36
+ else
37
+ rotation = x % 2 != 0 ? 180 : 0
38
+ end
39
+
40
+ svg.polyline(triangle, styles.merge(
41
+ 'transform' => "translate(#{x * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"))
42
+
43
+ # Add an extra one at top-right, for tiling.
44
+ if (x == 0)
45
+ svg.polyline(triangle, styles.merge(
46
+ 'transform' => "translate(#{6 * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"))
47
+ end
48
+ i += 1
49
+ end
50
+ end
51
+
52
+ svg
53
+ end
54
+
55
+ def build_triangle_shape(side_length, height)
56
+ half_width = side_length / 2
57
+ "#{half_width}, 0, #{side_length}, #{height}, 0, #{height}, #{half_width}, 0"
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,67 @@
1
+ module GeoPattern
2
+ module StructureGenerators
3
+ class XesGenerator < BaseGenerator
4
+ private
5
+
6
+ attr_reader :square_size, :x_shape, :x_size
7
+
8
+ def after_initialize
9
+ @square_size = map(hex_val(0, 1), 0, 15, 10, 25)
10
+ @x_shape = build_plus_shape(square_size) # rotated later
11
+ @x_size = square_size * 3 * 0.943
12
+
13
+ self.height = self.width = x_size * 3
14
+ end
15
+
16
+ def generate_structure
17
+ i = 0
18
+ for y in 0..5
19
+ for x in 0..5
20
+ val = hex_val(i, 1)
21
+ opacity = opacity(val)
22
+ dy = x % 2 == 0 ? y * x_size - x_size * 0.5 : y * x_size - x_size * 0.5 + x_size / 4
23
+ fill = fill_color(val)
24
+
25
+ styles = {
26
+ 'fill' => fill,
27
+ 'style' => {
28
+ 'opacity' => opacity
29
+ }
30
+ }
31
+
32
+ svg.group(x_shape, styles.merge(
33
+ 'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
34
+
35
+ # Add an extra column on the right for tiling.
36
+ if (x == 0)
37
+ svg.group(x_shape, styles.merge(
38
+ 'transform' => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
39
+ end
40
+
41
+ # Add an extra row on the bottom that matches the first row, for tiling.
42
+ if (y == 0)
43
+ dy = x % 2 == 0 ? 6 * x_size - x_size / 2 : 6 * x_size - x_size / 2 + x_size / 4
44
+ svg.group(x_shape, styles.merge(
45
+ 'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
46
+ end
47
+
48
+ # These can hang off the bottom, so put a row at the top for tiling.
49
+ if (y == 5)
50
+ svg.group(x_shape, styles.merge(
51
+ 'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 11 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
52
+ end
53
+
54
+ # Add an extra one at top-right and bottom-right, for tiling.
55
+ if x == 0 && y == 0
56
+ svg.group(x_shape, styles.merge(
57
+ 'transform' => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
58
+ end
59
+ i += 1
60
+ end
61
+ end
62
+
63
+ svg
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,101 @@
1
+ module GeoPattern
2
+ class SvgImage
3
+ include Comparable
4
+
5
+ private
6
+
7
+ attr_reader :svg_string
8
+
9
+ public
10
+
11
+ attr_reader :height, :width
12
+
13
+ def initialize
14
+ @width = 100
15
+ @height = 100
16
+ @svg_string = ''
17
+ end
18
+
19
+ def width=(width)
20
+ @width = width.floor
21
+ end
22
+
23
+ def height=(height)
24
+ @height = height.floor
25
+ end
26
+
27
+ # Pattern includes string
28
+ #
29
+ # @param [String] string
30
+ # The string which should be included in the body of the SvgImage
31
+ def include?(string)
32
+ body.include? string
33
+ end
34
+
35
+ def svg_header
36
+ %(<svg xmlns="http://www.w3.org/2000/svg" width="#{@width}" height="#{@height}">)
37
+ end
38
+
39
+ def svg_closer
40
+ '</svg>'
41
+ end
42
+
43
+ def to_s
44
+ svg_header + svg_string + svg_closer
45
+ end
46
+
47
+ def body
48
+ svg_string
49
+ end
50
+
51
+ def <<(svg)
52
+ svg_string << svg.body
53
+ end
54
+
55
+ def rect(x, y, width, height, args = {})
56
+ svg_string << %(<rect x="#{x}" y="#{y}" width="#{width}" height="#{height}" #{write_args(args)} />)
57
+ end
58
+
59
+ def circle(cx, cy, r, args = {})
60
+ svg_string << %(<circle cx="#{cx}" cy="#{cy}" r="#{r}" #{write_args(args)} />)
61
+ end
62
+
63
+ def path(str, args = {})
64
+ svg_string << %(<path d="#{str}" #{write_args(args)} />)
65
+ end
66
+
67
+ def polyline(str, args = {})
68
+ svg_string << %(<polyline points="#{str}" #{write_args(args)} />)
69
+ end
70
+
71
+ def group(elements, args = {})
72
+ svg_string << %(<g #{write_args(args)}>)
73
+ elements.each { |e| eval e }
74
+ svg_string << %(</g>)
75
+ end
76
+
77
+ def write_args(args)
78
+ str = ''
79
+ args.each do|key, value|
80
+ if value.is_a?(Hash)
81
+ str << %(#{key}=")
82
+ value.each do|k, v|
83
+ str << %(#{k}:#{v};)
84
+ end
85
+ str << %(" )
86
+ else
87
+ str << %(#{key}="#{value}" )
88
+ end
89
+ end
90
+ str
91
+ end
92
+
93
+ def self.as_comment(str)
94
+ "<!-- #{str} -->"
95
+ end
96
+
97
+ def <=>(other)
98
+ to_s <=> other.to_s
99
+ end
100
+ end
101
+ end
@@ -1,3 +1,3 @@
1
1
  module GeoPattern
2
- VERSION = "1.3.2"
2
+ VERSION = '1.4.0'
3
3
  end
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ info_msg="\e[0;32m[INFO]\e[0;30m"
6
+ error_msg="\e[0;31mFAILED\e[0;30m"
7
+
8
+ function output_error_log {
9
+ [[ -f error.log ]] && ( cat error.log >&2; rm error.log)
10
+ }
11
+
12
+ echo -ne "$info_msg Checking if ruby installed? "
13
+ which 'ruby' >/dev/null 2>error.log || ( echo -e "$error_msg\n\nCould not find \`ruby\`. Please install ruby or add it to PATH"; output_error_log; exit 1 )
14
+ echo OK
15
+
16
+ echo -en "$info_msg rubygem \"rake\" "
17
+ gem install rake >/dev/null 2>error.log || ( echo -e "$error_msg\n\nAn error occurred during installation of rake. Run \`gem install rake\` yourself."; output_error_log; exit 1 )
18
+ echo OK
19
+
20
+ if [ -n "$CI" ]; then
21
+ echo -e "$info_msg Bootstrapping in CI mode"
22
+ rake_task='bootstrap:ci'
23
+ else
24
+ echo -e "$info_msg Bootstrapping in normal mode"
25
+ rake_task='bootstrap'
26
+ fi
27
+
28
+ echo -en "$info_msg Running rake task \"$rake_task\" "
29
+ rake --trace $rake_task >error.log 2>&1 || ( echo -e "$error_msg\n\nAn error occurred during run of rake-task \"$rake_task\". Run \`rake $rake_task\` yourself."; output_error_log; exit 1 )
30
+ echo OK
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.expand_path('../../lib', __FILE__)
4
+
5
+ require 'pry'
6
+ require 'geo_pattern'
7
+
8
+ Pry.start
@@ -0,0 +1,21 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ function output_error_log {
6
+ [[ -f error.log ]] && ( cat error.log >&2; rm error.log)
7
+ }
8
+
9
+ info_msg="\e[0;32m[INFO]\e[0;30m"
10
+ error_msg="\e[0;31mFAILED\e[0;30m"
11
+
12
+ if [ -n "$CI" ]; then
13
+ echo -e "$info_msg Testing in CI mode"
14
+ rake_task='test:ci'
15
+ else
16
+ echo -e "$info_msg Testing in normal mode"
17
+ rake_task='test'
18
+ fi
19
+
20
+ echo -en "$info_msg Running rake task \"$rake_task\" "
21
+ bundle exec rake --trace $rake_task
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe BackgroundGenerators::SolidGenerator do
4
+ subject(:generator) { described_class.new(seed, preset) }
5
+
6
+ let(:seed) { instance_double('GeoPattern::Seed') }
7
+ let(:preset) { instance_double('GeoPattern::ColorPreset') }
8
+ let(:pattern) { instance_double('GeoPattern::Pattern') }
9
+ let(:background_metadata) { instance_double('GeoPattern::BackgroundMetadata') }
10
+
11
+ let(:color) { '#aaaaaa' }
12
+ let(:base_color) { '#bbbbbb' }
13
+ let(:base_color_should_be_used) { true }
14
+
15
+ before :each do
16
+ allow(seed).to receive(:to_i).with(14, 3).and_return(2616)
17
+ allow(seed).to receive(:to_i).with(17, 1).and_return(3)
18
+
19
+ allow(preset).to receive(:mode?).with(:base_color).and_return(base_color_should_be_used)
20
+ allow(preset).to receive(:color).and_return(color)
21
+ allow(preset).to receive(:base_color).and_return(base_color)
22
+ end
23
+
24
+ it { is_expected.not_to be_nil }
25
+
26
+ describe '#generate' do
27
+ context 'when base color is given' do
28
+ let(:generated_color) { %w(187 187 187) }
29
+
30
+ before :each do
31
+ expect(pattern).to receive(:background=).with(have_image_with_rgb_color(generated_color))
32
+ end
33
+
34
+ it { generator.generate(pattern) }
35
+ end
36
+
37
+ context 'when color is given' do
38
+ let(:base_color_should_be_used) { false }
39
+ let(:generated_color) { %w(170 170 170) }
40
+
41
+ before :each do
42
+ expect(pattern).to receive(:background=).with(have_image_with_rgb_color(generated_color))
43
+ end
44
+
45
+ it { generator.generate(pattern) }
46
+ end
47
+
48
+ it_behaves_like 'a named generator', :solid
49
+ end
50
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Background do
4
+ subject(:metadata) { described_class.new(image: svg_image, preset: preset, generator: generator, color: color) }
5
+
6
+ let(:svg_image) { instance_double('GeoPattern::SvgImage') }
7
+ let(:svg_image_content) { fixtures_path('generated_patterns/sine_waves.svg').read.chomp }
8
+ let(:preset) { instance_double('GeoPattern::ColorPreset') }
9
+ let(:generator) { stub_const('GeoPattern::BackgroundGenerators::SolidGenerator', Class.new) }
10
+
11
+ let(:color) { '#aaaaaa' }
12
+ let(:base_color) { '#bbbbbb' }
13
+
14
+ it { is_expected.not_to be_nil }
15
+
16
+ before :each do
17
+ allow(preset).to receive(:color).and_return(color)
18
+ allow(preset).to receive(:base_color).and_return(base_color)
19
+ end
20
+
21
+ it_behaves_like 'a metadata argument', :color
22
+ it_behaves_like 'a metadata argument', :generator
23
+ it_behaves_like 'a forwarded metadata argument', :base_color
24
+ it_behaves_like 'a forwarded metadata argument', :color
25
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe ColorGenerators::BaseColorGenerator do
4
+ subject(:generator) { described_class.new(color_string, seed) }
5
+
6
+ let(:seed) { instance_double('GeoPattern::Seed') }
7
+ let(:seed_value1) { 2616 }
8
+ let(:seed_value2) { 2 }
9
+
10
+ let(:color_string) { '#ff00ff' }
11
+
12
+ it { is_expected.not_to be_nil }
13
+
14
+ before :each do
15
+ allow(seed).to receive(:to_i).with(14, 3).and_return(seed_value1)
16
+ allow(seed).to receive(:to_i).with(17, 1).and_return(seed_value2)
17
+ end
18
+
19
+ describe '#generate' do
20
+ let(:color) { generator.generate }
21
+
22
+ context 'when sat offset is % 2 == 0' do
23
+ it { expect(color.to_svg).to eq 'rgb(210, 255, 0)' }
24
+ end
25
+
26
+ context 'when sat offset is not % 2 == 0' do
27
+ let(:seed_value2) { 3 }
28
+ it { expect(color.to_svg).to eq 'rgb(207, 251, 4)' }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+ RSpec.describe ColorGenerators::SimpleGenerator do
2
+ subject(:generator) { described_class.new(color_string) }
3
+
4
+ let(:color_string) { '#ff00ff' }
5
+
6
+ it { is_expected.not_to be_nil }
7
+
8
+ describe '#generate' do
9
+ let(:color) { generator.generate }
10
+ it { expect(color.to_svg).to eq 'rgb(255, 0, 255)' }
11
+ end
12
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe ColorPreset do
4
+ subject(:preset) { ColorPreset.new(**options) }
5
+ let(:options) do
6
+ {
7
+ base_color: '#0f0f0f'
8
+ }
9
+ end
10
+
11
+ it { expect(preset).not_to be nil }
12
+
13
+ describe '#base_color' do
14
+ it { expect(preset.base_color).to eq '#0f0f0f' }
15
+ end
16
+
17
+ describe '#color' do
18
+ context 'when set' do
19
+ let(:options) do
20
+ {
21
+ base_color: '#0f0f0f',
22
+ color: '#1f1f1f'
23
+ }
24
+ end
25
+
26
+ it { expect(preset.color).to eq '#1f1f1f' }
27
+ end
28
+ end
29
+
30
+ describe '#mode?' do
31
+ context 'when nil' do
32
+ let(:options) do
33
+ {
34
+ base_color: '#0f0f0f',
35
+ color: nil
36
+ }
37
+ end
38
+
39
+ it { expect(preset).to be_mode :base_color }
40
+ end
41
+
42
+ context 'when defined' do
43
+ let(:options) do
44
+ {
45
+ base_color: '#0f0f0f',
46
+ color: '#1f1f1f'
47
+ }
48
+ end
49
+
50
+ it { expect(preset).to be_mode :color }
51
+ end
52
+ end
53
+ end