percentage 1.0.0 → 1.4.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 20e2362952bb7911cca151e3df92aa1fbd1673d165c745ca577aa7fa269c5d79
4
+ data.tar.gz: 82c0f31ba57b5e8eae7e4c9bf3e27cd202f32fa30d6f7ae544d519499e19cd37
5
+ SHA512:
6
+ metadata.gz: 575215d64aaf5a84851d29e732902abc07239bf0be3e8a542ce8e332272b9c2470cfc6bc4c7d1337d180f2a2249cb854b3fbdf6fc3b697ef0a5f126680bc423b
7
+ data.tar.gz: 1e7ca91c861e49039fd592a82f54c9778ba335efc6286b9ab772c4f634db536e58eb429d9a839e1013684f435aa77c942210d8fcadfb2d49cac73dfbf449ea04
@@ -0,0 +1,35 @@
1
+ # 1.4.1
2
+
3
+ * Added CHANGES.md to gem files
4
+
5
+ * Fixed outdated changelog_uri
6
+
7
+ # 1.4.0
8
+
9
+ * Added optional YAML integration
10
+
11
+ This makes it possible to dump/load percentage objects to/from YAML as scalar values. For example:
12
+
13
+ require 'percentage/yaml'
14
+
15
+ puts YAML.dump([Percentage(BigDecimal('17.5'))])
16
+
17
+ This functionality is not enabled by default, due to the use of Module#prepend.
18
+
19
+ # 1.3.0
20
+
21
+ * Added ndigits argument to Percentage#truncate
22
+
23
+ # 1.2.0
24
+
25
+ * Removed memoization so that Percentage objects can be frozen (thanks @iamvery)
26
+
27
+ # 1.1.0
28
+
29
+ * Added BigDecimal#to_percentage and Integer#to_percentage
30
+
31
+ * Added BigDecimal#percent_of (thanks @mikeymicrophone)
32
+
33
+ # 1.0.0
34
+
35
+ * First version!
@@ -0,0 +1,4 @@
1
+ Copyright (c) 2012-2020 TIMCRAFT
2
+
3
+ This is an Open Source project licensed under the terms of the LGPLv3 license.
4
+ Please see <http://www.gnu.org/licenses/lgpl-3.0.html> for license text.
data/README.md CHANGED
@@ -1,15 +1,27 @@
1
- Percentage
2
- ==========
1
+ # percentage
3
2
 
3
+ ![Gem Version](https://badge.fury.io/rb/percentage.svg)
4
+ ![Build Status](https://github.com/readysteady/percentage/workflows/Test/badge.svg)
4
5
 
5
- A little library for working with percentages.
6
6
 
7
+ Ruby gem for working with percentages.
7
8
 
8
- Feature Tour
9
- ------------
10
9
 
11
- The `Percentage` method converts Integer/BigDecimal/Rational objects
12
- to percentage objects with values that you would expect:
10
+ ## Install
11
+
12
+ Using Bundler:
13
+
14
+ $ bundle add percentage
15
+
16
+ Using RubyGems:
17
+
18
+ $ gem install percentage
19
+
20
+
21
+ ## Constructing Percentages
22
+
23
+ The `Percentage` method converts numeric objects to percentage objects
24
+ with values that you would expect:
13
25
 
14
26
  ```ruby
15
27
  Percentage(50) # => 50%
@@ -20,7 +32,7 @@ Percentage(Rational(25, 2)) # => 12.5%
20
32
  ```
21
33
 
22
34
  Percentage objects can also be constructed directly, but in this case
23
- BigDecimal/Rational values are treated as fractions, for example:
35
+ BigDecimal/Rational values are treated as fractions:
24
36
 
25
37
  ```ruby
26
38
  Percentage.new(50) # => 50%
@@ -30,6 +42,19 @@ Percentage.new(BigDecimal('0.175')) # => 17.5%
30
42
  Percentage.new(Rational(1, 8)) # => 12.5%
31
43
  ```
32
44
 
45
+ Some shortcut methods are defined on Integer and BigDecimal for convenience:
46
+
47
+ ```ruby
48
+ 50.percent # => 50%
49
+
50
+ 5.as_percentage_of(10) # => 50.0%
51
+
52
+ BigDecimal('2.9').to_percentage # => 2.9%
53
+ ```
54
+
55
+
56
+ ## Numeric features
57
+
33
58
  As with other numerics, percentage objects are conceptually immutable.
34
59
  Common numeric functionality like `to_i`, `to_f`, `to_s`, `to_r`, `zero?`,
35
60
  and equality/comparison methods are defined.
@@ -46,9 +71,9 @@ They can also be "scaled up" using the `scale` method:
46
71
  Percentage(10).scale(5) # => 50%
47
72
  ```
48
73
 
49
- Multiplication is then defined using the fractional value of the percentage.
50
- BigDecimal objects can't be coerced into rational objects, so the order of
51
- the multiplication will matter in some cases. For example:
74
+ Multiplication is defined using the fractional value of the percentage.
75
+ BigDecimal objects can't be coerced into rational objects, so the
76
+ multiplication order will matter in some cases, for example:
52
77
 
53
78
  ```ruby
54
79
  Percentage(50) * 10 # => (5/1)
@@ -61,23 +86,19 @@ Percentage(50) * BigDecimal('150.00') # raises TypeError
61
86
  ```
62
87
 
63
88
 
64
- Bonus Extras
65
- ------------
89
+ ## Bonus extras
66
90
 
67
- Some shortcut methods are defined on Integer/BigDecimal for convenience:
91
+ There's a #percent_of method defined on Integer and BigDecimal for percentage calculations:
68
92
 
69
93
  ```ruby
70
- 50.percent # => 50%
71
-
72
94
  50.percent_of(BigDecimal(150)) # => BigDecimal('75.00')
73
95
 
74
96
  10.percent_of(100) # => (10/1)
75
97
 
76
- 5.as_percentage_of(10) # => 50.0%
98
+ BigDecimal('0.5').percent_of(88) # => BigDecimal('0.44')
77
99
  ```
78
100
 
79
- And there's also a class method for calculating the percentage
80
- change between two values:
101
+ There's also a `Percentage.change` method for calculating the percentage change between two values:
81
102
 
82
103
  ```ruby
83
104
  Percentage.change(2, 3) # => 50.0%
@@ -1,4 +1,3 @@
1
- require 'rational'
2
1
  require 'bigdecimal'
3
2
 
4
3
  class Percentage
@@ -76,8 +75,16 @@ class Percentage
76
75
  end
77
76
  end
78
77
 
79
- def truncate(n)
80
- self.class.new(fractional_value.truncate(n))
78
+ def truncate(ndigits = nil)
79
+ return self if @value.integer?
80
+
81
+ value = @value * 100
82
+
83
+ if ndigits.nil?
84
+ self.class.new(value.truncate)
85
+ else
86
+ self.class.new(value.truncate(ndigits) / 100)
87
+ end
81
88
  end
82
89
 
83
90
  def scale(n)
@@ -87,7 +94,7 @@ class Percentage
87
94
  protected
88
95
 
89
96
  def fractional_value
90
- @fractional_value ||= @value.integer? ? Rational(@value, 100) : @value
97
+ @value.integer? ? Rational(@value, 100) : @value
91
98
  end
92
99
 
93
100
  private
@@ -98,7 +105,7 @@ class Percentage
98
105
  elsif BigDecimal === @value
99
106
  (@value * 100).to_s('F')
100
107
  else
101
- BigDecimal(@value * 100, _precision=10).to_s('F')
108
+ (@value * 100).to_f.to_s
102
109
  end
103
110
  end
104
111
  end
@@ -112,18 +119,28 @@ def Percentage.change(a, b)
112
119
  end
113
120
 
114
121
  class BigDecimal
122
+ def to_percentage
123
+ Percentage(self)
124
+ end
125
+
126
+ def percent_of(n)
127
+ n * Percentage(self)
128
+ end
129
+
115
130
  def as_percentage_of(n)
116
131
  Percentage.new(self / n)
117
132
  end
118
133
  end
119
134
 
120
135
  class Integer
121
- def percent
122
- Percentage.new(self)
136
+ def to_percentage
137
+ Percentage(self)
123
138
  end
124
139
 
140
+ alias_method :percent, :to_percentage
141
+
125
142
  def percent_of(n)
126
- n * Percentage.new(self)
143
+ n * Percentage(self)
127
144
  end
128
145
 
129
146
  def as_percentage_of(n)
@@ -0,0 +1,29 @@
1
+ require 'yaml'
2
+
3
+ class Percentage
4
+ def encode_with(coder)
5
+ coder.represent_scalar(nil, to_s)
6
+ end
7
+
8
+ module ScalarScannerPatch
9
+ INTEGER = /\A(\d+)%\z/
10
+
11
+ DECIMAL = /\A(\d+\.\d+)%\z/
12
+
13
+ def tokenize(string)
14
+ if !string.empty? && string.match(INTEGER)
15
+ return Percentage($1.to_i)
16
+ end
17
+
18
+ if !string.empty? && string.match(DECIMAL)
19
+ return Percentage(BigDecimal($1))
20
+ end
21
+
22
+ super string
23
+ end
24
+
25
+ YAML::ScalarScanner.prepend(self)
26
+ end
27
+
28
+ private_constant :ScalarScannerPatch
29
+ end
@@ -1,12 +1,20 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'percentage'
3
- s.version = '1.0.0'
3
+ s.version = '1.4.1'
4
+ s.license = 'LGPL-3.0'
4
5
  s.platform = Gem::Platform::RUBY
5
6
  s.authors = ['Tim Craft']
6
7
  s.email = ['mail@timcraft.com']
7
- s.homepage = 'http://github.com/timcraft/percentage'
8
- s.description = 'A little library for working with percentages'
8
+ s.homepage = 'https://github.com/readysteady/percentage'
9
+ s.description = 'Ruby gem for working with percentages'
9
10
  s.summary = 'See description'
10
- s.files = Dir.glob('{lib,spec}/**/*') + %w(README.md Rakefile.rb percentage.gemspec)
11
+ s.files = Dir.glob('lib/**/*.rb') + %w[CHANGES.md LICENSE.txt README.md percentage.gemspec]
12
+ s.required_ruby_version = '>= 1.9.3'
11
13
  s.require_path = 'lib'
14
+ s.metadata = {
15
+ 'homepage' => 'https://github.com/readysteady/percentage',
16
+ 'source_code_uri' => 'https://github.com/readysteady/percentage',
17
+ 'bug_tracker_uri' => 'https://github.com/readysteady/percentage/issues',
18
+ 'changelog_uri' => 'https://github.com/readysteady/percentage/blob/main/CHANGES.md'
19
+ }
12
20
  end
metadata CHANGED
@@ -1,51 +1,53 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: percentage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.4.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Craft
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-29 00:00:00.000000000 Z
11
+ date: 2020-11-03 00:00:00.000000000 Z
13
12
  dependencies: []
14
- description: A little library for working with percentages
13
+ description: Ruby gem for working with percentages
15
14
  email:
16
15
  - mail@timcraft.com
17
16
  executables: []
18
17
  extensions: []
19
18
  extra_rdoc_files: []
20
19
  files:
21
- - lib/percentage.rb
22
- - spec/percentage_spec.rb
20
+ - CHANGES.md
21
+ - LICENSE.txt
23
22
  - README.md
24
- - Rakefile.rb
23
+ - lib/percentage.rb
24
+ - lib/percentage/yaml.rb
25
25
  - percentage.gemspec
26
- homepage: http://github.com/timcraft/percentage
27
- licenses: []
28
- post_install_message:
26
+ homepage: https://github.com/readysteady/percentage
27
+ licenses:
28
+ - LGPL-3.0
29
+ metadata:
30
+ homepage: https://github.com/readysteady/percentage
31
+ source_code_uri: https://github.com/readysteady/percentage
32
+ bug_tracker_uri: https://github.com/readysteady/percentage/issues
33
+ changelog_uri: https://github.com/readysteady/percentage/blob/main/CHANGES.md
34
+ post_install_message:
29
35
  rdoc_options: []
30
36
  require_paths:
31
37
  - lib
32
38
  required_ruby_version: !ruby/object:Gem::Requirement
33
- none: false
34
39
  requirements:
35
- - - ! '>='
40
+ - - ">="
36
41
  - !ruby/object:Gem::Version
37
- version: '0'
42
+ version: 1.9.3
38
43
  required_rubygems_version: !ruby/object:Gem::Requirement
39
- none: false
40
44
  requirements:
41
- - - ! '>='
45
+ - - ">="
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
48
  requirements: []
45
- rubyforge_project:
46
- rubygems_version: 1.8.24
47
- signing_key:
48
- specification_version: 3
49
+ rubygems_version: 3.1.4
50
+ signing_key:
51
+ specification_version: 4
49
52
  summary: See description
50
53
  test_files: []
51
- has_rdoc:
@@ -1,7 +0,0 @@
1
- require 'rake/testtask'
2
-
3
- task :default => :spec
4
-
5
- Rake::TestTask.new(:spec) do |t|
6
- t.test_files = FileList['spec/*_spec.rb']
7
- end
@@ -1,352 +0,0 @@
1
- require 'minitest/autorun'
2
-
3
- require_relative '../lib/percentage'
4
-
5
- describe 'Percentage object' do
6
- it 'is comparable' do
7
- percentage = Percentage.new(Rational(1, 8))
8
-
9
- (Comparable === percentage).must_equal(true)
10
- end
11
-
12
- it 'is comparable to other objects of the same class' do
13
- (Percentage.new(Rational(1, 8)) > Percentage.new(Rational(1, 10))).must_equal(true)
14
- end
15
-
16
- it 'is comparable to other numeric objects' do
17
- (Percentage.new(Rational(1, 8)) > Rational(1, 10)).must_equal(true)
18
- end
19
-
20
- it 'can be used as a hash key' do
21
- hash = Hash.new(0)
22
-
23
- 3.times { hash[Percentage.new(Rational(1, 10))] += 1 }
24
-
25
- hash[Percentage.new(Rational(1, 10))].must_equal(3)
26
- end
27
- end
28
-
29
- describe 'Percentage object initialized with an integer value' do
30
- before do
31
- @percentage = Percentage.new(10)
32
- end
33
-
34
- describe 'value method' do
35
- it 'returns the value passed to the constructor' do
36
- @percentage.value.must_equal(10)
37
- end
38
- end
39
-
40
- describe 'to_i method' do
41
- it 'returns the integer value of the percentage' do
42
- @percentage.to_i.must_equal(10)
43
- end
44
- end
45
-
46
- describe 'to_f method' do
47
- it 'returns the float value of the percentage' do
48
- @percentage.to_f.must_be_close_to(10.0)
49
- end
50
- end
51
-
52
- describe 'to_s method' do
53
- it 'returns the integer value of the percentage suffixed with the percent symbol' do
54
- @percentage.to_s.must_equal('10%')
55
- end
56
- end
57
-
58
- describe 'to_r method' do
59
- it 'returns the rational value of the percentage' do
60
- @percentage.to_r.must_equal(Rational(1, 10))
61
- end
62
- end
63
-
64
- describe 'zero query method' do
65
- it 'returns true if the percentage has a zero value' do
66
- Percentage.new(0).zero?.must_equal(true)
67
- end
68
-
69
- it 'returns false otherwise' do
70
- @percentage.zero?.must_equal(false)
71
- end
72
- end
73
-
74
- describe 'truncate method' do
75
- it 'returns a percentage object with a truncated rational value' do
76
- percentage = @percentage.truncate(1)
77
- percentage.must_be_instance_of(Percentage)
78
- percentage.value.must_equal(Rational(1, 10))
79
- end
80
- end
81
-
82
- describe 'scale method' do
83
- it 'returns a percentage object with the value of the percentage multiplied by the integer argument' do
84
- percentage = @percentage.scale(2)
85
- percentage.must_be_instance_of(Percentage)
86
- percentage.value.must_equal(20)
87
- end
88
- end
89
- end
90
-
91
- describe 'Percentage object initialized with a rational value' do
92
- before do
93
- @percentage = Percentage.new(Rational(1, 8))
94
- end
95
-
96
- describe 'value method' do
97
- it 'returns the value passed to the constructor' do
98
- @percentage.value.must_equal(Rational(1, 8))
99
- end
100
- end
101
-
102
- describe 'to_i method' do
103
- it 'returns the integer value of the percentage' do
104
- @percentage.to_i.must_equal(12)
105
- end
106
- end
107
-
108
- describe 'to_f method' do
109
- it 'returns the float value of the percentage' do
110
- @percentage.to_f.must_be_close_to(12.5)
111
- end
112
- end
113
-
114
- describe 'to_s method' do
115
- it 'returns the decimal value of the percentage suffixed with the percent symbol' do
116
- @percentage.to_s.must_equal('12.5%')
117
- end
118
- end
119
-
120
- describe 'to_r method' do
121
- it 'returns the rational value of the percentage' do
122
- @percentage.to_r.must_equal(Rational(1, 8))
123
- end
124
- end
125
-
126
- describe 'zero query method' do
127
- it 'returns true if the percentage has a zero value' do
128
- Percentage.new(Rational(0)).zero?.must_equal(true)
129
- end
130
-
131
- it 'returns false otherwise' do
132
- @percentage.zero?.must_equal(false)
133
- end
134
- end
135
-
136
- describe 'truncate method' do
137
- it 'returns a percentage object with a truncated rational value' do
138
- percentage = @percentage.truncate(1)
139
- percentage.must_be_instance_of(Percentage)
140
- percentage.value.must_equal(Rational(1, 10))
141
- end
142
- end
143
-
144
- describe 'scale method' do
145
- it 'returns a percentage object with the value of the percentage multiplied by the integer argument' do
146
- percentage = @percentage.scale(2)
147
- percentage.must_be_instance_of(Percentage)
148
- percentage.value.must_equal(Rational(1, 4))
149
- end
150
- end
151
- end
152
-
153
- describe 'Percentage object initialized with a decimal value' do
154
- before do
155
- @percentage = Percentage.new(BigDecimal('0.175'))
156
- end
157
-
158
- describe 'value method' do
159
- it 'returns the value passed to the constructor' do
160
- @percentage.value.must_equal(BigDecimal('0.175'))
161
- end
162
- end
163
-
164
- describe 'to_i method' do
165
- it 'returns the integer value of the percentage' do
166
- @percentage.to_i.must_equal(17)
167
- end
168
- end
169
-
170
- describe 'to_f method' do
171
- it 'returns the float value of the percentage' do
172
- @percentage.to_f.must_be_close_to(17.5)
173
- end
174
- end
175
-
176
- describe 'to_s method' do
177
- it 'returns the decimal value of the percentage suffixed with the percent symbol' do
178
- @percentage.to_s.must_equal('17.5%')
179
- end
180
- end
181
-
182
- describe 'to_r method' do
183
- it 'returns the rational value of the percentage' do
184
- @percentage.to_r.must_equal(Rational(175, 1000))
185
- end
186
- end
187
-
188
- describe 'zero query method' do
189
- it 'returns true if the percentage has a zero value' do
190
- Percentage.new(BigDecimal(0)).zero?.must_equal(true)
191
- end
192
-
193
- it 'returns false otherwise' do
194
- @percentage.zero?.must_equal(false)
195
- end
196
- end
197
-
198
- describe 'truncate method' do
199
- it 'returns a percentage object with a truncated decimal value' do
200
- percentage = @percentage.truncate(1)
201
- percentage.must_be_instance_of(Percentage)
202
- percentage.value.must_equal(BigDecimal('0.1'))
203
- end
204
- end
205
-
206
- describe 'scale method' do
207
- it 'returns a percentage object with the value of the percentage multiplied by the integer argument' do
208
- percentage = @percentage.scale(2)
209
- percentage.must_be_instance_of(Percentage)
210
- percentage.value.must_equal(BigDecimal('0.35'))
211
- end
212
- end
213
- end
214
-
215
- describe 'Addition of percentage objects' do
216
- it 'returns a percentage object with the value of the two percentages added together' do
217
- percentage = Percentage.new(10) + Percentage.new(10)
218
- percentage.must_be_instance_of(Percentage)
219
- percentage.value.must_equal(20)
220
-
221
- percentage = Percentage.new(Rational(1, 8)) + Percentage.new(10)
222
- percentage.must_be_instance_of(Percentage)
223
- percentage.value.must_equal(Rational(9, 40))
224
-
225
- percentage = Percentage.new(BigDecimal('0.175')) + Percentage.new(BigDecimal('0.025'))
226
- percentage.must_be_instance_of(Percentage)
227
- percentage.value.must_equal(BigDecimal('0.2'))
228
- end
229
- end
230
-
231
- describe 'Addition of percentage object with another type of object' do
232
- it 'raises an exception' do
233
- proc { Percentage.new(10) + 5 }.must_raise(TypeError)
234
- end
235
- end
236
-
237
- describe 'Multiplication of percentage objects' do
238
- it 'returns a percentage object with the fractional value of the two percentages multiplied together' do
239
- percentage = Percentage.new(10) * Percentage.new(10)
240
- percentage.must_be_instance_of(Percentage)
241
- percentage.value.must_equal(Rational(1, 100))
242
-
243
- percentage = Percentage.new(Rational(1, 8)) * Percentage.new(10)
244
- percentage.must_be_instance_of(Percentage)
245
- percentage.value.must_equal(Rational(1, 80))
246
-
247
- percentage = Percentage.new(BigDecimal('0.175')) * Percentage.new(10)
248
- percentage.must_be_instance_of(Percentage)
249
- percentage.value.must_equal(Rational(7, 400))
250
- end
251
- end
252
-
253
- describe 'Multiplication of a decimal object with a percentage object' do
254
- it 'returns a decimal object with the value of the decimal multiplied by the fractional value of the percentage' do
255
- percentage, decimal = Percentage.new(BigDecimal('0.175')), BigDecimal('99.00')
256
-
257
- (decimal * percentage).must_equal(BigDecimal('17.325'))
258
- (percentage * decimal).must_equal(BigDecimal('17.325'))
259
- end
260
- end
261
-
262
- describe 'Percentage object equality' do
263
- describe 'double equals method' do
264
- it 'returns true for percentage objects with the same fractional value' do
265
- (Percentage.new(50) == Percentage.new(50)).must_equal(true)
266
- (Percentage.new(50) == Percentage.new(Rational(1, 2))).must_equal(true)
267
- (Percentage.new(50) == Percentage.new(BigDecimal('0.5'))).must_equal(true)
268
- end
269
-
270
- it 'returns false otherwise' do
271
- (Percentage.new(50) == Percentage.new(100)).must_equal(false)
272
- end
273
- end
274
-
275
- describe 'eql query method' do
276
- it 'returns true for percentage objects with exactly the same fractional value' do
277
- (Percentage.new(50).eql? Percentage.new(50)).must_equal(true)
278
- end
279
-
280
- it 'returns false otherwise' do
281
- (Percentage.new(50).eql? Percentage.new(Rational(1, 2))).must_equal(false)
282
- (Percentage.new(50).eql? Percentage.new(BigDecimal('0.5'))).must_equal(false)
283
- (Percentage.new(50).eql? Percentage.new(100)).must_equal(false)
284
- end
285
- end
286
- end
287
-
288
- describe 'Percentage method' do
289
- describe 'when called with an integer argument' do
290
- it 'returns a percentage object with the integer value' do
291
- percentage = Percentage(10)
292
- percentage.must_be_instance_of(Percentage)
293
- percentage.value.must_equal(10)
294
- end
295
- end
296
-
297
- describe 'when called with a decimal argument' do
298
- it 'returns a percentage object with the value of the argument divided by 100' do
299
- percentage = Percentage(BigDecimal('17.5'))
300
- percentage.must_be_instance_of(Percentage)
301
- percentage.value.must_equal(BigDecimal('0.175'))
302
- end
303
- end
304
-
305
- describe 'when called with a rational argument' do
306
- it 'returns a percentage object with the value of the argument divided by 100' do
307
- percentage = Percentage(Rational(100, 3))
308
- percentage.must_be_instance_of(Percentage)
309
- percentage.value.must_equal(Rational(1, 3))
310
- end
311
- end
312
- end
313
-
314
- describe 'Percentage change method' do
315
- it 'returns the difference between the arguments as a percentage of the first argument' do
316
- percentage = Percentage.change(2, 3)
317
- percentage.must_be_instance_of(Percentage)
318
- percentage.must_equal(Percentage.new(50))
319
- end
320
- end
321
-
322
- describe 'BigDecimal as_percentage_of method' do
323
- it 'returns a percentage object with the value of the decimal divided by the argument' do
324
- percentage = BigDecimal('50.00').as_percentage_of(BigDecimal('100.00'))
325
- percentage.must_be_instance_of(Percentage)
326
- percentage.value.must_equal(BigDecimal('0.5'))
327
- end
328
- end
329
-
330
- describe 'Integer percent method' do
331
- it 'returns a percentage object with the value of the integer' do
332
- percentage = 10.percent
333
- percentage.must_be_instance_of(Percentage)
334
- percentage.value.must_equal(10)
335
- end
336
- end
337
-
338
- describe 'Integer percent_of method' do
339
- it 'returns the value of the receiver as a percentage multiplied by the argument' do
340
- 10.percent_of(100).must_equal(10)
341
- 10.percent_of(BigDecimal(15)).must_equal(BigDecimal('1.5'))
342
- 10.percent_of(Rational(150, 2)).must_equal(Rational(15, 2))
343
- end
344
- end
345
-
346
- describe 'Integer as_percentage_of method' do
347
- it 'returns a percentage object with the value of the integer divided by the argument' do
348
- percentage = 10.as_percentage_of(20)
349
- percentage.must_be_instance_of(Percentage)
350
- percentage.value.must_equal(Rational(1, 2))
351
- end
352
- end