danica 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4c20cfa612c100125cf73a89cd2d30f02ab4f12
4
- data.tar.gz: 3894bdce489e74dfdd9dd59320177e6dbbce10b3
3
+ metadata.gz: 68db92a2ab4f0816a2678a44e458b7fcbeb87eda
4
+ data.tar.gz: b83bd4b12f815aae2c7d9eb1f00da008e886e8a5
5
5
  SHA512:
6
- metadata.gz: 8d67bb880292f39d3b3946e1f9a386292fa06fc4f354e4f289ed542b7f24ae79e267bd30e047f3ff75aa5b832da0274b813f83e3b0c593500ec40f649fa985da
7
- data.tar.gz: 5adcd6154c4c4b28a48c2cc99f1f859697a72254c759415a12e8597fc5e223552e4e8c15c5b6985ec55fdfc0d7ba2547748d9c029e8b06f2cbc19efdc2fb06ab
6
+ metadata.gz: 819529160a878cbc4b49d5c2323891cd3ddddabbacb68b764d8d5909fe26bcf84c1b1586294ef2449fe9331376893c103b6e4f600b6ea8871f3c82e232544725
7
+ data.tar.gz: 51d0237f2037afa9c1d4ac1af254d2a93ed9eb0a68341df0fce2830a19c2eb1dc0f5a29f047de83568206883e0d3f06c563b08acdbb24e432f811b8f96ddecf5
data/lib/danica.rb CHANGED
@@ -13,6 +13,8 @@ module Danica
13
13
  autoload :Wrapper, 'danica/wrapper'
14
14
  autoload :Operator, 'danica/operator'
15
15
 
16
+ autoload :PI, 'danica/wrapper/constant'
17
+
16
18
  class << self
17
19
  delegate :build, to: :builder
18
20
 
data/lib/danica/common.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Danica
2
2
  module Common extend ::ActiveSupport::Concern
3
3
  included do
4
+ include Wrapper
4
5
  include DSL
5
6
 
6
7
  class << self
@@ -22,14 +23,6 @@ module Danica
22
23
 
23
24
  private
24
25
 
25
- def wrap_value(value)
26
- return wrap_value(number(value)) if value.is_a?(Numeric)
27
- return wrap_value(variable(value)) if value.is_a?(Hash)
28
- return wrap_value(variable(name: value)) if [ String, Symbol ].any? { |c| value.is_a?(c) }
29
- return wrap_value(variable) if value.nil?
30
- value
31
- end
32
-
33
26
  def wrap_as_group(value)
34
27
  return value if is_grouped? || value.priority >= priority
35
28
  group(value)
@@ -23,6 +23,10 @@ module Danica
23
23
  end
24
24
  end
25
25
 
26
+ def self.create(*vars, &block)
27
+ build(*vars, &block).new
28
+ end
29
+
26
30
  def initialize(*args)
27
31
  options = args.extract_options!
28
32
 
@@ -40,5 +44,15 @@ module Danica
40
44
 
41
45
  self.class.new(vars_map).to_f
42
46
  end
47
+
48
+ def describe_tex
49
+ "#{name}(#{variables.map(&:to_tex).join(', ')}) = #{to_tex}"
50
+ end
51
+
52
+ def describe_gnu
53
+ "#{name}(#{variables.map(&:to_gnu).join(', ')}) = #{to_gnu}"
54
+ end
55
+
56
+ autoload :Gauss, 'danica/function/gauss'
43
57
  end
44
58
  end
@@ -1,9 +1,9 @@
1
1
  module Danica
2
- class Function::Gauss < Function.build(:x, median: :u, variance_root: { latex: '\theta', gnu: :v }) { multiplication(parcels) }
2
+ class Function::Gauss < Function.build(:x, average: { latex: '\mu', gnu: :u }, variance_root: { latex: '\sigma', gnu: :v }) { multiplication(elements) }
3
3
 
4
4
  private
5
5
 
6
- def parcels
6
+ def elements
7
7
  [
8
8
  division(1, denominator),
9
9
  exponential(exp)
@@ -11,8 +11,9 @@ module Danica
11
11
  end
12
12
 
13
13
  def denominator
14
+ variance_root *
14
15
  squared_root(
15
- multiplication(2, PI, variance),
16
+ multiplication(2, PI),
16
17
  )
17
18
  end
18
19
 
@@ -20,7 +21,7 @@ module Danica
20
21
  negative(
21
22
  division(
22
23
  power(group(
23
- addition(x, negative(median))
24
+ addition(x, negative(average))
24
25
  ), 2),
25
26
  multiplication(2, variance)
26
27
  )
@@ -1,6 +1,12 @@
1
1
  module Danica
2
2
  class Operator
3
3
  class Chained < Operator
4
+ attr_reader :variables
5
+
6
+ def variables=(vars)
7
+ @variables = vars.map { |v| wrap_value(v) }
8
+ end
9
+
4
10
  def to_f
5
11
  chain(variables.map(&:to_f))
6
12
  end
@@ -9,29 +9,33 @@ module Danica
9
9
  end
10
10
 
11
11
  def variables_names
12
- @variables_names ||= (
13
- (superclass.try(:variables_names) || []) + []
14
- )
12
+ variables_hash.keys
13
+ end
14
+
15
+ def variables_hash
16
+ @variables_hash ||= (superclass.try(:variables_hash) || {}).dup
15
17
  end
16
18
  end
17
19
  end
18
20
 
19
- attr_accessor :variables
20
-
21
- def variables=(variables)
22
- @variables = variables.map { |v| wrap_value(v) }
21
+ def variables=(vars)
22
+ vars = vars.as_hash(self.class.variables_names).compact unless vars.is_a? Hash
23
+ vars = vars.change_values(skip_inner: false) { |v| wrap_value(v) }
24
+ @variables_hash = self.class.variables_hash.merge(vars)
23
25
  end
24
26
 
25
27
  def variables
26
- @variables ||= variables_hash.values
28
+ variables_hash.values
27
29
  end
28
30
 
29
31
  def variables_hash
30
- @variabels_map ||= (@variables || []).as_hash(self.class.variables_names)
32
+ @variables_hash ||= {}.merge(self.class.variables_hash)
31
33
  end
32
34
 
33
35
  def variables_value_hash
34
- variables.map(&:value).as_hash(self.class.variables_names)
36
+ variables.map do |var|
37
+ var.try(:value)
38
+ end.as_hash(self.class.variables_names)
35
39
  end
36
40
 
37
41
  private
@@ -1,5 +1,8 @@
1
1
  module Danica::VariablesHolder
2
2
  class VariablesBuilder
3
+ include Danica::DSL
4
+ include Danica::Wrapper
5
+
3
6
  attr_reader :instance, :attr_names
4
7
 
5
8
  def initialize(attr_names, instance)
@@ -8,16 +11,18 @@ module Danica::VariablesHolder
8
11
  end
9
12
 
10
13
  def build
11
- attr_names.extract_options!.each do |name, default|
14
+ names_hash = attr_names.extract_options!
15
+
16
+ attr_names.each do |name|
12
17
  add_setter(name)
13
- add_reader(name, default)
14
- instance.variables_names << name
18
+ add_reader(name)
19
+ instance.variables_hash[name.to_sym] = wrap_value(name)
15
20
  end
16
21
 
17
- attr_names.each do |name|
22
+ names_hash.each do |name, default|
18
23
  add_setter(name)
19
- add_reader(name, name)
20
- instance.variables_names << name
24
+ add_reader(name)
25
+ instance.variables_hash[name.to_sym] = wrap_value(default)
21
26
  end
22
27
  end
23
28
 
@@ -26,13 +31,12 @@ module Danica::VariablesHolder
26
31
  def add_setter(name)
27
32
  instance.send(:define_method, "#{name}=") do |value|
28
33
  variables_hash[name.to_sym] = wrap_value(value)
29
- @variables = variables_hash.values
30
34
  end
31
35
  end
32
36
 
33
- def add_reader(name, default)
37
+ def add_reader(name)
34
38
  instance.send(:define_method, name) do
35
- variables_hash[name.to_sym] ||= wrap_value(default)
39
+ variables_hash[name.to_sym]
36
40
  end
37
41
  end
38
42
  end
@@ -1,3 +1,3 @@
1
1
  module Danica
2
- VERSION = '2.3.1'
2
+ VERSION = '2.4.0'
3
3
  end
@@ -1,5 +1,13 @@
1
1
  module Danica
2
2
  module Wrapper
3
+ def wrap_value(value)
4
+ return wrap_value(number(value)) if value.is_a?(Numeric)
5
+ return wrap_value(variable(value)) if value.is_a?(Hash)
6
+ return wrap_value(variable(name: value)) if [ String, Symbol ].any? { |c| value.is_a?(c) }
7
+ return wrap_value(variable) if value.nil?
8
+ value
9
+ end
10
+
3
11
  autoload :Number, 'danica/wrapper/number'
4
12
  autoload :Group, 'danica/wrapper/group'
5
13
  autoload :Negative, 'danica/wrapper/negative'
@@ -17,8 +17,6 @@ shared_context 'a class with mapped dsl' do
17
17
  multiplication: Danica::Operator::Multiplication,
18
18
  product: Danica::Operator::Multiplication,
19
19
  division: Danica::Operator::Division,
20
- sin: Danica::Operator::Sin,
21
- cos: Danica::Operator::Cos,
22
20
  power: Danica::Operator::Power
23
21
  }.each do |aliaz, clazz|
24
22
  it_behaves_like 'a class with alias to a clazz', aliaz, clazz, 2, 3
@@ -26,6 +24,8 @@ shared_context 'a class with mapped dsl' do
26
24
  {
27
25
  squared_root: Danica::Operator::SquaredRoot,
28
26
  exponential: Danica::Operator::Exponential,
27
+ sin: Danica::Operator::Sin,
28
+ cos: Danica::Operator::Cos,
29
29
  group: Danica::Wrapper::Group,
30
30
  negative: Danica::Wrapper::Negative,
31
31
  number: Danica::Wrapper::Number,
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Danica::Function::Gauss do
4
+ let(:variables) do
5
+ {
6
+ x: :x,
7
+ average: :u,
8
+ variance_root: { latex: '\theta', gnu: :v }
9
+ }
10
+ end
11
+
12
+ subject { described_class::Gauss.new(variables) }
13
+ it_behaves_like 'an object that respond to basic_methods'
14
+
15
+ describe '#to_tex' do
16
+ context 'when creating the spatial operator for constantly accelerated movement' do
17
+ let(:expected) { '\frac{1}{\theta \cdot \sqrt{2 \cdot \pi}} \cdot e^{-\frac{\left(x -u\right)^{2}}{2 \cdot \theta^{2}}}' }
18
+
19
+ it 'return the latex format CAM' do
20
+ expect(subject.to_tex).to eq(expected)
21
+ end
22
+ end
23
+ end
24
+
25
+ describe '#to_gnu' do
26
+ context 'when creating the spatial operator for constantly accelerated movement' do
27
+ let(:expected) { '(1)/(v * sqrt(2 * pi)) * exp(-((x -u)**(2))/(2 * v**(2)))' }
28
+
29
+ it 'return the gnu format CAM' do
30
+ expect(subject.to_gnu).to eq(expected)
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'when not passing variables' do
36
+ subject { described_class::Gauss.new }
37
+
38
+ describe '#to_tex' do
39
+ let(:expected) { '\frac{1}{\sigma \cdot \sqrt{2 \cdot \pi}} \cdot e^{-\frac{\left(x -\mu\right)^{2}}{2 \cdot \sigma^{2}}}' }
40
+
41
+ it 'rely on default variables definition' do
42
+ expect(subject.to_tex).to eq(expected)
43
+ end
44
+ end
45
+
46
+ describe '#to_gnu' do
47
+ let(:expected) { '(1)/(v * sqrt(2 * pi)) * exp(-((x -u)**(2))/(2 * v**(2)))' }
48
+
49
+ it 'rely on default variables definition' do
50
+ expect(subject.to_gnu).to eq(expected)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,39 +1,44 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Danica::Function do
4
- describe '.build' do
5
- let(:variables) { %i(x y) }
6
- let(:function_class) do
7
- described_class.build(*variables) do
8
- Danica::Operator::Power.new(x, y)
9
- end
10
- end
11
- let(:function) do
12
- function_class.new
13
- end
3
+ shared_examples 'a generically generated function' do
4
+ it 'returns a function class' do
5
+ expect(function.class.superclass).to eq(described_class)
6
+ end
14
7
 
15
- it 'returns a function class' do
16
- expect(function_class.superclass).to eq(described_class)
8
+ it 'returns a class whose instance responds to the variables' do
9
+ variables.each do |variable|
10
+ expect(function).to respond_to(variable)
17
11
  end
12
+ end
18
13
 
19
- it 'returns a class whose instance responds to the variables' do
20
- variables.each do |variable|
21
- expect(function).to respond_to(variable)
22
- end
23
- end
14
+ it 'returns a function that uses the block to process to_tex' do
15
+ expect(function.to_tex).to eq('x^{y}')
16
+ end
24
17
 
25
- it 'returns a function that uses the block to process to_tex' do
26
- expect(function.to_tex).to eq('x^{y}')
27
- end
18
+ it 'returns a function that uses the block to process to_gnu' do
19
+ expect(function.to_gnu).to eq('x**(y)')
20
+ end
21
+
22
+ it 'returns a function thtat knows how to calculate' do
23
+ expect(function.calculate(x: 2, y: 3)).to eq(8)
24
+ end
25
+ end
28
26
 
29
- it 'returns a function that uses the block to process to_gnu' do
30
- expect(function.to_gnu).to eq('x**(y)')
27
+ describe Danica::Function do
28
+ let(:variables) { %i(x y) }
29
+ let(:function_class) do
30
+ described_class.build(*variables) do
31
+ Danica::Operator::Power.new(x, y)
31
32
  end
33
+ end
32
34
 
33
- it 'returns a function thtat knows how to calculate' do
34
- expect(function.calculate(x: 2, y: 3)).to eq(8)
35
+ describe '.build' do
36
+ let(:function) do
37
+ function_class.new
35
38
  end
36
39
 
40
+ it_behaves_like 'a generically generated function'
41
+
37
42
  context 'when no block is given' do
38
43
  let(:function_class) do
39
44
  described_class.build(*variables)
@@ -52,7 +57,7 @@ describe Danica::Function do
52
57
  end
53
58
 
54
59
  it 'has the defined variables' do
55
- expect(function.variables_hash).to eq(x: nil)
60
+ expect(function.variables_hash).to eq(x: Danica::Wrapper::Variable.new(name: :x))
56
61
  end
57
62
 
58
63
  context 'when calling to_tex' do
@@ -76,7 +81,10 @@ describe Danica::Function do
76
81
  end
77
82
 
78
83
  it 'has the defined variables' do
79
- expect(function.variables_hash).to eq(x: nil, y: nil)
84
+ expect(function.variables_hash).to eq(
85
+ x: Danica::Wrapper::Variable.new(name: :x),
86
+ y: Danica::Wrapper::Variable.new(name: :y)
87
+ )
80
88
  end
81
89
 
82
90
  context 'when calling to_tex' do
@@ -93,6 +101,39 @@ describe Danica::Function do
93
101
  end
94
102
  end
95
103
 
104
+ describe '.create' do
105
+ let(:function) do
106
+ described_class.create(*variables) do
107
+ Danica::Operator::Power.new(x, y)
108
+ end
109
+ end
110
+ it_behaves_like 'a generically generated function'
111
+ end
112
+
113
+ describe '#describe_tex' do
114
+ context 'when function has a name' do
115
+ let(:function) do
116
+ function_class.new(name: :f)
117
+ end
118
+
119
+ it 'returns the full function description' do
120
+ expect(function.describe_tex).to eq('f(x, y) = x^{y}')
121
+ end
122
+ end
123
+ end
124
+
125
+ describe '#describe_gnu' do
126
+ context 'when function has a name' do
127
+ let(:function) do
128
+ function_class.new(name: :f)
129
+ end
130
+
131
+ it 'returns the full function description' do
132
+ expect(function.describe_gnu).to eq('f(x, y) = x**(y)')
133
+ end
134
+ end
135
+ end
136
+
96
137
  describe 'spatial' do
97
138
  let(:variables) do
98
139
  {
@@ -219,7 +260,7 @@ describe Danica::Function do
219
260
 
220
261
  context 'when initialized with an empty variable set' do
221
262
  it do
222
- expect(subject.variables.compact).to be_empty
263
+ expect(subject.variables.compact).not_to be_empty
223
264
  end
224
265
  end
225
266
 
@@ -228,8 +269,13 @@ describe Danica::Function do
228
269
  subject.time = time
229
270
  end
230
271
 
231
- it 'returns the list of variables' do
232
- expect(subject.variables.compact).to eq([ time ])
272
+ it 'returns the list of variables merged default and new variables' do
273
+ expect(subject.variables.compact).to eq([
274
+ time,
275
+ Danica::Wrapper::Variable.new(name: :acceleration),
276
+ Danica::Wrapper::Variable.new(name: :initial_space),
277
+ Danica::Wrapper::Variable.new(name: :initial_velocity)
278
+ ])
233
279
  end
234
280
  end
235
281
 
@@ -309,59 +355,6 @@ describe Danica::Function do
309
355
  end
310
356
  end
311
357
 
312
- describe 'gauss' do
313
- let(:variables) do
314
- {
315
- x: :x,
316
- median: :u,
317
- variance_root: { latex: '\theta', gnu: :v }
318
- }
319
- end
320
-
321
- subject { described_class::Gauss.new(variables) }
322
- it_behaves_like 'an object that respond to basic_methods'
323
-
324
- describe '#to_tex' do
325
- context 'when creating the spatial operator for constantly accelerated movement' do
326
- let(:expected) { '\frac{1}{\sqrt{2 \cdot \pi \cdot \theta^{2}}} \cdot e^{-\frac{\left(x -u\right)^{2}}{2 \cdot \theta^{2}}}' }
327
-
328
- it 'return the latex format CAM' do
329
- expect(subject.to_tex).to eq(expected)
330
- end
331
- end
332
- end
333
-
334
- describe '#to_gnu' do
335
- context 'when creating the spatial operator for constantly accelerated movement' do
336
- let(:expected) { '(1)/(sqrt(2 * pi * v**(2))) * exp(-((x -u)**(2))/(2 * v**(2)))' }
337
-
338
- it 'return the gnu format CAM' do
339
- expect(subject.to_gnu).to eq(expected)
340
- end
341
- end
342
- end
343
-
344
- context 'when not passing variables' do
345
- subject { described_class::Gauss.new }
346
-
347
- describe '#to_tex' do
348
- let(:expected) { '\frac{1}{\sqrt{2 \cdot \pi \cdot \theta^{2}}} \cdot e^{-\frac{\left(x -u\right)^{2}}{2 \cdot \theta^{2}}}' }
349
-
350
- it 'rely on default variables definition' do
351
- expect(subject.to_tex).to eq(expected)
352
- end
353
- end
354
-
355
- describe '#to_gnu' do
356
- let(:expected) { '(1)/(sqrt(2 * pi * v**(2))) * exp(-((x -u)**(2))/(2 * v**(2)))' }
357
-
358
- it 'rely on default variables definition' do
359
- expect(subject.to_gnu).to eq(expected)
360
- end
361
- end
362
- end
363
- end
364
-
365
358
  describe 'baskara' do
366
359
  context 'when using the default value for variables' do
367
360
  subject { described_class::Baskara.new }
@@ -3,6 +3,12 @@ require 'spec_helper'
3
3
  describe Danica::Operator::Addition do
4
4
  subject { described_class.new(10, 2) }
5
5
 
6
+ it 'initializes from array' do
7
+ expect do
8
+ described_class.new(10, 2)
9
+ end.not_to raise_error
10
+ end
11
+
6
12
  it_behaves_like 'an object that respond to basic_methods'
7
13
 
8
14
  it_behaves_like 'an object with basic operation', ignore: %i(+ -)
@@ -4,6 +4,18 @@ describe Danica::Operator::Division do
4
4
  let(:variables) { [2, 4] }
5
5
  subject { described_class.new(*variables) }
6
6
 
7
+ describe '#numerator' do
8
+ it 'returns the numerator' do
9
+ expect(subject.numerator).to eq(Danica::Wrapper::Number.new(2))
10
+ end
11
+ end
12
+
13
+ describe '#denominator' do
14
+ it 'returns the denominator' do
15
+ expect(subject.denominator).to eq(Danica::Wrapper::Number.new(4))
16
+ end
17
+ end
18
+
7
19
  it_behaves_like 'an object that respond to basic_methods'
8
20
  it_behaves_like 'an object with basic operation'
9
21
 
@@ -2,6 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe Danica::Operator::Multiplication do
4
4
  subject { described_class.new(2,4) }
5
+
6
+ it 'initializes from array' do
7
+ expect do
8
+ described_class.new(10, 2)
9
+ end.not_to raise_error
10
+ end
11
+
5
12
  it_behaves_like 'an object that respond to basic_methods'
6
13
 
7
14
  it_behaves_like 'an object with * operation' do
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ class Danica::Operator::Dummy < Danica::Operator
4
+ variables :a, :b
5
+ end
6
+
7
+ describe Danica::Operator do
8
+ let(:variables) { [2, 4] }
9
+ let(:clazz) { described_class::Dummy }
10
+ subject { clazz.new(*variables) }
11
+
12
+ describe 'variables assignment' do
13
+ it 'assignes the variables tpo its places' do
14
+ expect(subject.a).to eq(Danica::Wrapper::Number.new(2))
15
+ expect(subject.b).to eq(Danica::Wrapper::Number.new(4))
16
+ end
17
+
18
+ context 'when initializing with a hash' do
19
+ let(:variables) { [{ name: :A, value: 2 }, { name: :B, value: 4 }] }
20
+
21
+ it 'assignes the variables tpo its places' do
22
+ expect(subject.a).to eq(Danica::Wrapper::Variable.new(name: :A, value: 2))
23
+ expect(subject.b).to eq(Danica::Wrapper::Variable.new(name: :B, value: 4))
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,150 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'an object that returns the default variables hash' do
4
+ it 'returns the default variables hash' do
5
+ expect(subject.variables_hash).to eq(
6
+ x: Danica::Wrapper::Variable.new(name: :x),
7
+ y: Danica::Wrapper::Variable.new(latex: '\y'),
8
+ z: Danica::Wrapper::Number.new(10)
9
+ )
10
+ end
11
+ end
12
+
13
+ shared_examples 'an object that returns the default variables' do
14
+ it 'returns the default variables hash' do
15
+ expect(subject.variables).to eq([
16
+ Danica::Wrapper::Variable.new(name: :x),
17
+ Danica::Wrapper::Variable.new(latex: '\y'),
18
+ Danica::Wrapper::Number.new(10)
19
+ ])
20
+ end
21
+ end
22
+
23
+ describe Danica::VariablesHolder do
24
+ class Danica::VariablesHolder::Dummy
25
+ include Danica::Common
26
+ include Danica::VariablesHolder
27
+
28
+ variables :x, y: { latex: '\y' }, z: 10
29
+ end
30
+
31
+ let(:clazz) { described_class::Dummy }
32
+ subject do
33
+ clazz.new
34
+ end
35
+
36
+ it 'creates setters and getters for the variables' do
37
+ %i(x y z).each do |var|
38
+ expect(subject).to respond_to(var)
39
+ expect(subject).to respond_to("#{var}=")
40
+ end
41
+ end
42
+
43
+ describe '.variables_names' do
44
+ it 'returns the list of variables pre configured' do
45
+ expect(clazz.variables_names).to eq(%i(x y z))
46
+ end
47
+ end
48
+
49
+ describe '#variables=' do
50
+ before do
51
+ subject.variables = variables
52
+ end
53
+
54
+ context 'when setting the variables using a list' do
55
+ let(:variables) { [1, 2, 3] }
56
+
57
+ it 'changes the values of the variables' do
58
+ expect(subject.x).to eq(Danica::Wrapper::Number.new(1))
59
+ end
60
+
61
+ context 'but the array is empty' do
62
+ let(:variables) { [] }
63
+
64
+ it_behaves_like 'an object that returns the default variables hash'
65
+ end
66
+ end
67
+
68
+ context 'when setting the variales using a hash' do
69
+ let(:variables) { { x: 1, y: 2, z: 3 } }
70
+
71
+ it 'changes the values of the variables' do
72
+ expect(subject.x).to eq(Danica::Wrapper::Number.new(1))
73
+ end
74
+
75
+ context 'but the hash is empty' do
76
+ let(:variables) { {} }
77
+
78
+ it_behaves_like 'an object that returns the default variables hash'
79
+ end
80
+ end
81
+ end
82
+
83
+ describe '#variables' do
84
+ context 'when instance has no variables defined' do
85
+ it do
86
+ expect(subject.variables).not_to be_empty
87
+ end
88
+
89
+ it_behaves_like 'an object that returns the default variables'
90
+ end
91
+
92
+ context 'when some variables where defined' do
93
+ before do
94
+ subject.y = 1
95
+ end
96
+
97
+ it 'returns the default variables and the new set one' do
98
+ expect(subject.variables).to eq([
99
+ Danica::Wrapper::Variable.new(name: :x),
100
+ Danica::Wrapper::Number.new(1),
101
+ Danica::Wrapper::Number.new(10)
102
+ ])
103
+ end
104
+
105
+ it 'does not change the class variables' do
106
+ expect do
107
+ subject.z = 2
108
+ end.not_to change { clazz.variables_hash }
109
+ end
110
+ end
111
+ end
112
+
113
+ describe '#variables_hash' do
114
+ context 'when instance has no variables defined' do
115
+ it_behaves_like 'an object that returns the default variables hash'
116
+ end
117
+
118
+ context 'when some variables where defined' do
119
+ before do
120
+ subject.y = 1
121
+ end
122
+
123
+ it 'returns the default hash with the set value' do
124
+ expect(subject.variables_hash).to eq(
125
+ x: Danica::Wrapper::Variable.new(name: :x),
126
+ y: Danica::Wrapper::Number.new(1),
127
+ z: Danica::Wrapper::Number.new(10)
128
+ )
129
+ end
130
+ end
131
+ end
132
+
133
+ describe '#variables_value_hash' do
134
+ context 'when instance has no variables defined' do
135
+ it 'returns the default value' do
136
+ expect(subject.variables_value_hash).to eq({x: nil, y: nil, z: 10})
137
+ end
138
+ end
139
+
140
+ context 'when some of the variables have been valued' do
141
+ before do
142
+ subject.y = 1
143
+ end
144
+
145
+ it 'returns the values' do
146
+ expect(subject.variables_value_hash).to eq({x: nil, y: 1, z: 10})
147
+ end
148
+ end
149
+ end
150
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danica
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-07 00:00:00.000000000 Z
11
+ date: 2017-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -159,6 +159,7 @@ files:
159
159
  - lib/danica/dsl.rb
160
160
  - lib/danica/exception.rb
161
161
  - lib/danica/function.rb
162
+ - lib/danica/function/gauss.rb
162
163
  - lib/danica/operator.rb
163
164
  - lib/danica/operator/addition.rb
164
165
  - lib/danica/operator/chained.rb
@@ -186,6 +187,7 @@ files:
186
187
  - spec/integration/plus_minus_spec.rb
187
188
  - spec/integration/power_spec.rb
188
189
  - spec/lib/danica/dsl_spec.rb
190
+ - spec/lib/danica/function/gauss_spec.rb
189
191
  - spec/lib/danica/function_spec.rb
190
192
  - spec/lib/danica/operator/addition_spec.rb
191
193
  - spec/lib/danica/operator/cos_spec.rb
@@ -195,6 +197,8 @@ files:
195
197
  - spec/lib/danica/operator/power_spec.rb
196
198
  - spec/lib/danica/operator/sin_spec.rb
197
199
  - spec/lib/danica/operator/squared_root_spec.rb
200
+ - spec/lib/danica/operator_spec.rb
201
+ - spec/lib/danica/variables_holder_spec.rb
198
202
  - spec/lib/danica/wrapper/constant_spec.rb
199
203
  - spec/lib/danica/wrapper/group_spec.rb
200
204
  - spec/lib/danica/wrapper/negative_spec.rb
@@ -204,7 +208,6 @@ files:
204
208
  - spec/lib/danica_spec.rb
205
209
  - spec/spec_helper.rb
206
210
  - spec/support/models/functions/baskara.rb
207
- - spec/support/models/functions/gauss.rb
208
211
  - spec/support/models/functions/hyperbole.rb
209
212
  - spec/support/models/functions/spatial.rb
210
213
  - spec/support/shared_contexts/common.rb
@@ -244,6 +247,7 @@ test_files:
244
247
  - spec/integration/plus_minus_spec.rb
245
248
  - spec/integration/power_spec.rb
246
249
  - spec/lib/danica/dsl_spec.rb
250
+ - spec/lib/danica/function/gauss_spec.rb
247
251
  - spec/lib/danica/function_spec.rb
248
252
  - spec/lib/danica/operator/addition_spec.rb
249
253
  - spec/lib/danica/operator/cos_spec.rb
@@ -253,6 +257,8 @@ test_files:
253
257
  - spec/lib/danica/operator/power_spec.rb
254
258
  - spec/lib/danica/operator/sin_spec.rb
255
259
  - spec/lib/danica/operator/squared_root_spec.rb
260
+ - spec/lib/danica/operator_spec.rb
261
+ - spec/lib/danica/variables_holder_spec.rb
256
262
  - spec/lib/danica/wrapper/constant_spec.rb
257
263
  - spec/lib/danica/wrapper/group_spec.rb
258
264
  - spec/lib/danica/wrapper/negative_spec.rb
@@ -262,7 +268,6 @@ test_files:
262
268
  - spec/lib/danica_spec.rb
263
269
  - spec/spec_helper.rb
264
270
  - spec/support/models/functions/baskara.rb
265
- - spec/support/models/functions/gauss.rb
266
271
  - spec/support/models/functions/hyperbole.rb
267
272
  - spec/support/models/functions/spatial.rb
268
273
  - spec/support/shared_contexts/common.rb