hex_values 0.0.3 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -42,6 +42,34 @@ Or transform any hexadecimal to the corresponding float:
42
42
  # => 234.25
43
43
  ```
44
44
 
45
+ ## Hexadecimal
46
+
47
+ To be more precise, when you transoform a Float (or a Fixnum) to an hexadecimal, you get a Hexadecimal object. This object is a representation of the Hexadecimal value, and you can operate on this object:
48
+
49
+ ```ruby
50
+ hexa = 234.25.to_hex
51
+ result = hexa + 234.25
52
+ result.to_s
53
+ # => "1D4.8"
54
+ ```
55
+
56
+ also you can operate over a Float (or a Fixnum) using an Hexadecimal value.
57
+
58
+ ```ruby
59
+ hexa = 234.25.to_hex
60
+ result = 234.25 + hexa # I know, this is obvious...but is better to explain that works.
61
+ result.to_s
62
+ # => "1D4.8"
63
+ ```
64
+
65
+ So far, the operations availables are:
66
+
67
+ * plus (+)
68
+ * minus (-)
69
+ * multiply (*)
70
+ * division (/)
71
+ * Power (**)
72
+
45
73
  ### From float to Hex
46
74
 
47
75
  The "to_hex" method allows a precision parameter to set the maximum number of decimals to calculate (default 14).
@@ -1,44 +1,30 @@
1
1
  require "hex_values/version"
2
+ require "hex_values/hexadecimal"
2
3
 
3
4
  module HexValuesFromFloat
4
- MAX_DECIMALS = 14
5
-
6
- def to_hex(precision = MAX_DECIMALS)
7
- precision = MAX_DECIMALS if precision < 0
8
-
9
- num,dec = get_hex_value(self)
10
- first = num
11
- second = ""
12
- iterations = 0
13
- while dec > 0 && iterations < precision
14
- num, dec = get_hex_value(dec*16)
15
- second << num
16
- iterations += 1
17
- end
18
-
19
- if "".eql? second
20
- first
21
- else
22
- "#{first}.#{second}"
23
- end
24
- end
25
-
26
- private
27
-
28
- def get_hex_value(float_num)
29
- base, remainder = float_num.to_s.split('.')
30
- [base.to_i.to_s(16).upcase, "0.#{remainder}".to_f]
5
+ def to_hex(precision=nil)
6
+ Hexadecimal.new(self, precision)
31
7
  end
32
8
  end
33
9
 
34
10
  module FloatValuesFromString
35
11
  def to_float
12
+ negative = false
13
+ str = self
14
+
15
+ if self[0].eql? "-"
16
+ negative = true
17
+ str = self[1..self.length]
18
+ end
19
+
36
20
  number = 0
37
21
  base, remainder = self.split('.')
38
22
 
39
23
  get_sum(base.split(//).reverse!) { |element, index| number += element.to_i(16) * (16 ** index) } if base
40
24
  get_sum(remainder.split(//)) { |element, index| number += element.to_i(16).to_f / (16 ** (index + 1)) } if remainder
41
25
 
26
+ number = number * -1 if negative
27
+
42
28
  number
43
29
  end
44
30
 
@@ -53,6 +39,37 @@ end
53
39
 
54
40
  class Float
55
41
  include HexValuesFromFloat
42
+
43
+ alias :old_sum :+
44
+ alias :old_min :-
45
+ alias :old_multiply :*
46
+ alias :old_divide :/
47
+ alias :old_pow :**
48
+
49
+ def +(other_obj)
50
+ return other_obj + self if other_obj.instance_of? Hexadecimal
51
+ return old_sum(other_obj)
52
+ end
53
+
54
+ def -(other_obj)
55
+ return self.to_hex - other_obj if other_obj.instance_of? Hexadecimal
56
+ return old_min(other_obj)
57
+ end
58
+
59
+ def *(other_obj)
60
+ return other_obj * self if other_obj.instance_of? Hexadecimal
61
+ return old_multiply(other_obj)
62
+ end
63
+
64
+ def /(other_obj)
65
+ return self.to_hex / other_obj if other_obj.instance_of? Hexadecimal
66
+ return old_divide(other_obj)
67
+ end
68
+
69
+ def **(other_obj)
70
+ return self ** other_obj.to_float if other_obj.instance_of? Hexadecimal
71
+ return old_pow(other_obj)
72
+ end
56
73
  end
57
74
 
58
75
  class String
@@ -60,7 +77,44 @@ class String
60
77
  end
61
78
 
62
79
  class Fixnum
63
- def to_hex(precision=HexValuesFromFloat::MAX_DECIMALS)
80
+ alias :old_sum :+
81
+ alias :old_min :-
82
+ alias :old_multiply :*
83
+ alias :old_divide :/
84
+ alias :old_pow :**
85
+
86
+ def to_hex(precision=Hexadecimal::MAX_DECIMALS)
64
87
  self.to_f.to_hex(precision)
65
88
  end
89
+
90
+ def +(other_obj)
91
+ return other_obj + self if other_obj.instance_of? Hexadecimal
92
+ return old_sum(other_obj)
93
+ end
94
+
95
+ def -(other_obj)
96
+ return self.to_hex - other_obj if other_obj.instance_of? Hexadecimal
97
+ return old_min(other_obj)
98
+ end
99
+
100
+ def *(other_obj)
101
+ return other_obj * self if other_obj.instance_of? Hexadecimal
102
+ return old_multiply(other_obj)
103
+ end
104
+
105
+ def /(other_obj)
106
+ return self.to_hex / other_obj if other_obj.instance_of? Hexadecimal
107
+ return old_divide(other_obj)
108
+ end
109
+
110
+ def **(other_obj)
111
+ return self ** other_obj.to_float if other_obj.instance_of? Hexadecimal
112
+ return old_pow(other_obj)
113
+ end
114
+ end
115
+
116
+ class NilClass
117
+ def to_hex(precision=Hexadecimal::MAX_DECIMALS)
118
+ Hexadecimal.new(0, precision)
119
+ end
66
120
  end
@@ -0,0 +1,130 @@
1
+ class Hexadecimal
2
+ MAX_DECIMALS = 14
3
+
4
+ def initialize(float_representation=0.0, precision=MAX_DECIMALS)
5
+ precision = MAX_DECIMALS if precision.nil? || precision < 0
6
+ @max_decimals=precision
7
+ @float_representation=float_representation
8
+ end
9
+
10
+ # Public: return the float value of the Hexadecimal.
11
+ #
12
+ # Returns the Float value of the Hexadecimal.
13
+ def to_float
14
+ @float_representation
15
+ end
16
+
17
+ # Public: return a String representation.
18
+ #
19
+ # Returns a String representation of the Hexadecimal object.
20
+ def to_s
21
+ return "Infinity" unless @float_representation.to_f.infinite?.nil?
22
+ num,dec = get_hex_value(@float_representation)
23
+ first = num
24
+ second = ""
25
+ iterations = 0
26
+ while dec > 0 && iterations < @max_decimals
27
+ num, dec = get_hex_value(dec*16)
28
+ second << num
29
+ iterations += 1
30
+ end
31
+
32
+ if "".eql? second
33
+ first
34
+ else
35
+ normalize_negativity "#{first}.#{second}", @float_representation
36
+ end
37
+ end
38
+
39
+ # Public: Sum two values.
40
+ #
41
+ # other_obj - An Hexadecimal object, a Fixnum or a Float
42
+ #
43
+ # Returns an Hexadecimal object, sum of the two objects.
44
+ def +(other_obj)
45
+ return operation(self, other_obj, "+".to_sym)
46
+ end
47
+
48
+ # Public: Substracts two values.
49
+ #
50
+ # other_obj - An Hexadecimal object, a Fixnum or a Float
51
+ #
52
+ # Returns an Hexadecimal object, the substaction of the second object over the first.
53
+ def -(other_obj)
54
+ self + (other_obj * -1)
55
+ end
56
+
57
+
58
+ # Public: Multiply two values.
59
+ #
60
+ # other_obj - An Hexadecimal object, a Fixnum or a Float
61
+ #
62
+ # Returns an Hexadecimal object, the multiplication of the operands.
63
+ def *(other_obj)
64
+ return operation(self, other_obj, "*".to_sym)
65
+ end
66
+
67
+ # Public: Divide two values.
68
+ #
69
+ # other_obj - An Hexadecimal object, a Fixnum or a Float
70
+ #
71
+ # Returns an Hexadecimal object, the division of the operands.
72
+ def /(other_obj)
73
+ return operation(self, other_obj, "/".to_sym)
74
+ end
75
+
76
+ # Public: Pow two values.
77
+ #
78
+ # other_obj - An Hexadecimal object, a Fixnum or a Float
79
+ #
80
+ # Returns an Hexadecimal object, the power of the operands.
81
+ def **(other_obj)
82
+ return operation(self, other_obj, "**".to_sym)
83
+ end
84
+
85
+ # Public: Transform a given string into a Hexadecimal object.
86
+ #
87
+ # hex_representation - A String representing a Hexadecimal value
88
+ #
89
+ # Examples:
90
+ # Hexadecimal.from_string("EA.4")
91
+ #
92
+ # Returns an Hexadecimal object. Or throws an exception if the string can't be parsed.
93
+ def self.from_string(hex_representation)
94
+ return Hexadecimal.new if hex_representation.nil?
95
+ Hexadecimal.new(hex_representation.to_float)
96
+ end
97
+
98
+ protected
99
+
100
+ def max_decimals
101
+ @max_decimals
102
+ end
103
+
104
+ private
105
+
106
+ def get_hex_value(float_num)
107
+ base, remainder = float_num.to_s.split('.')
108
+ [base.to_i.to_s(16).upcase, "0.#{remainder}".to_f]
109
+ end
110
+
111
+ def normalize_negativity(string, float_num)
112
+ if string[0] != "-" && float_num < 0
113
+ "-#{string}"
114
+ else
115
+ string
116
+ end
117
+ end
118
+
119
+ def operation(hex1, hex2, operation)
120
+ if hex2.instance_of? Hexadecimal
121
+ float_result = hex1.to_float.send(operation, hex2.to_float)
122
+ max_precision = (hex1.max_decimals > hex2.max_decimals) ? hex1.max_decimals : hex2.max_decimals
123
+ else
124
+ float_result = hex1.to_float.send(operation, hex2)
125
+ max_precision = hex1.max_decimals
126
+ end
127
+
128
+ Hexadecimal.new(float_result, max_precision)
129
+ end
130
+ end
@@ -1,3 +1,3 @@
1
1
  module HexValues
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1"
3
3
  end
@@ -0,0 +1,462 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hexadecimal do
4
+ describe "from_string" do
5
+ it "transform a string into an Hexadecimal object" do
6
+ hex = Hexadecimal.from_string("EA.4")
7
+ hex.to_s.must_equal "EA.4"
8
+ hex.to_float.must_equal 234.25
9
+ end
10
+
11
+ it "transform an empty string into an Hexadecimal object with value 0" do
12
+ hex = Hexadecimal.from_string("")
13
+ hex.to_s.must_equal "0"
14
+ hex.to_float.must_equal 0.0
15
+ end
16
+
17
+ it "transform a negative hex string into an Hexadecimal object" do
18
+ hex = Hexadecimal.from_string("-EA.4")
19
+ hex.to_s.must_equal "-EA.4"
20
+ hex.to_float.must_equal -234.25
21
+ end
22
+
23
+ it "transform a nil into 0" do
24
+ hex = Hexadecimal.from_string(nil)
25
+ hex.to_s.must_equal "0"
26
+ hex.to_float.must_equal 0.0
27
+ end
28
+
29
+ it "transform a nil into 0 (nil as a object)" do
30
+ hex = nil.to_hex
31
+
32
+ hex.to_s.must_equal "0"
33
+ hex.to_float.must_equal 0.0
34
+ end
35
+
36
+ it "transform a no parseable string into 0" do
37
+ hex = Hexadecimal.from_string("ZZZZzz")
38
+
39
+ hex.to_s.must_equal "0"
40
+ hex.to_float.must_equal 0.0
41
+ end
42
+ end
43
+
44
+ describe "plus" do
45
+ it "sum two positive hexadecimals objects" do
46
+ hex1 = Hexadecimal.from_string "EA.4"
47
+ hex2 = Hexadecimal.from_string "EA.4"
48
+
49
+ result = hex1 + hex2
50
+
51
+ result.must_be_instance_of Hexadecimal
52
+ result.to_float.must_equal 468.5
53
+ result.to_s.must_equal "1D4.8"
54
+ end
55
+
56
+ it "sum one hexadecimal object with a float" do
57
+ hex1 = Hexadecimal.from_string "EA.4"
58
+
59
+ result = hex1 + 234.25
60
+
61
+ result.must_be_instance_of Hexadecimal
62
+ result.to_float.must_equal 468.5
63
+ result.to_s.must_equal "1D4.8"
64
+ end
65
+
66
+ it "sum one float with an hexadecimal object" do
67
+ hex1 = Hexadecimal.from_string "EA.4"
68
+
69
+ result = 234.25 + hex1
70
+
71
+ result.must_be_instance_of Hexadecimal
72
+ result.to_float.must_equal 468.5
73
+ result.to_s.must_equal "1D4.8"
74
+ end
75
+
76
+ it "sum two floats (check that + is not broken)" do
77
+ result = 234.25 + 234.25
78
+
79
+ result.must_equal 468.5
80
+ end
81
+
82
+ it "sum one hexadecimal object with an integer" do
83
+ hex1 = Hexadecimal.from_string "EA.4"
84
+
85
+ result = hex1 + 234
86
+
87
+ result.must_be_instance_of Hexadecimal
88
+ result.to_float.must_equal 468.25
89
+ result.to_s.must_equal "1D4.4"
90
+ end
91
+
92
+ it "sum one integer with an hexadecimal object" do
93
+ hex1 = Hexadecimal.from_string "EA.4"
94
+
95
+ result = 234 + hex1
96
+
97
+ result.must_be_instance_of Hexadecimal
98
+ result.to_float.must_equal 468.25
99
+ result.to_s.must_equal "1D4.4"
100
+ end
101
+
102
+ it "sum two integer (check that + is not broken)" do
103
+ result = 234 + 234
104
+
105
+ result.must_equal 468
106
+ end
107
+
108
+ it "sum one positive hexadecimal object and one negative hexadecimal object" do
109
+ hex1 = Hexadecimal.from_string "EA.4"
110
+ hex2 = Hexadecimal.from_string "-EA.4"
111
+
112
+ result = hex1 + hex2
113
+
114
+ result.must_be_instance_of Hexadecimal
115
+ result.to_float.must_equal 0.0
116
+ result.to_s.must_equal "0"
117
+ end
118
+ end
119
+
120
+ describe "minus" do
121
+ it "substracts two positive hexadecimals objects" do
122
+ hex1 = Hexadecimal.from_string "EA.4"
123
+ hex2 = Hexadecimal.from_string "EA.4"
124
+
125
+ result = hex1 - hex2
126
+
127
+ result.must_be_instance_of Hexadecimal
128
+ result.to_float.must_equal 0.0
129
+ result.to_s.must_equal "0"
130
+ end
131
+
132
+ it "substracts one hexadecimal object with a float" do
133
+ hex1 = Hexadecimal.from_string "EA.4"
134
+
135
+ result = hex1 - 234.25
136
+
137
+ result.must_be_instance_of Hexadecimal
138
+ result.to_float.must_equal 0.0
139
+ result.to_s.must_equal "0"
140
+ end
141
+
142
+ it "substracts one float with an hexadecimal object" do
143
+ hex1 = Hexadecimal.from_string "EA.4"
144
+
145
+ result = 234.25 - hex1
146
+
147
+ result.must_be_instance_of Hexadecimal
148
+ result.to_float.must_equal 0.0
149
+ result.to_s.must_equal "0"
150
+ end
151
+
152
+ it "substracts two floats (check minus works)" do
153
+ result = 234.25 - 234.25
154
+
155
+ result.must_equal 0.0
156
+ end
157
+
158
+ it "substracts one hexadecimal object with an integer" do
159
+ hex1 = Hexadecimal.from_string "EA.4"
160
+
161
+ result = hex1 - 234
162
+
163
+ result.must_be_instance_of Hexadecimal
164
+ result.to_float.must_equal 0.25
165
+ result.to_s.must_equal "0.4"
166
+ end
167
+
168
+ it "substracts one integer with an hexadecimal object" do
169
+ hex1 = Hexadecimal.from_string "EA.4"
170
+
171
+ result = 234 - hex1
172
+
173
+ result.must_be_instance_of Hexadecimal
174
+ result.to_float.must_equal -0.25
175
+ result.to_s.must_equal "-0.4"
176
+ end
177
+
178
+ it "substracts two integers (check minus works)" do
179
+ result = 234 - 230
180
+
181
+ result.must_equal 4
182
+ end
183
+
184
+ it "substracts one positive hexadecimal object and one negative hexadecimal object" do
185
+ hex1 = Hexadecimal.from_string "EA.4"
186
+ hex2 = Hexadecimal.from_string "-EA.4"
187
+
188
+ result = hex1 - hex2
189
+
190
+ result.must_be_instance_of Hexadecimal
191
+ result.to_float.must_equal 468.5
192
+ result.to_s.must_equal "1D4.8"
193
+ end
194
+ end
195
+
196
+ describe "multiply" do
197
+ it "multiply two positive hexadecimals objects" do
198
+ hex1 = Hexadecimal.from_string "EA.4"
199
+ hex2 = Hexadecimal.from_string "EA.4"
200
+
201
+ result = hex1 * hex2
202
+
203
+ result.must_be_instance_of Hexadecimal
204
+ result.to_float.must_equal 54873.0625
205
+ result.to_s.must_equal "D659.1"
206
+ end
207
+
208
+ it "multiply one hexadecimal object with a float" do
209
+ hex1 = Hexadecimal.from_string "EA.4"
210
+
211
+ result = hex1 * 234.25
212
+
213
+ result.must_be_instance_of Hexadecimal
214
+ result.to_float.must_equal 54873.0625
215
+ result.to_s.must_equal "D659.1"
216
+ end
217
+
218
+ it "multiply one float with an hexadecimal object" do
219
+ hex1 = Hexadecimal.from_string "EA.4"
220
+
221
+ result = 234.25 * hex1
222
+
223
+ result.must_be_instance_of Hexadecimal
224
+ result.to_float.must_equal 54873.0625
225
+ result.to_s.must_equal "D659.1"
226
+ end
227
+
228
+ it "multiply two floats (check multiply is not broken)" do
229
+ result = 234.25 * 234.25
230
+
231
+ result.must_equal 54873.0625
232
+ end
233
+
234
+ it "multiply one hexadecimal object with an integer" do
235
+ hex1 = Hexadecimal.from_string "EA.4"
236
+
237
+ result = hex1 * 1
238
+
239
+ result.must_be_instance_of Hexadecimal
240
+ result.to_float.must_equal 234.25
241
+ result.to_s.must_equal "EA.4"
242
+ end
243
+
244
+ it "multiply one hexadecimal object with a negative integer" do
245
+ hex1 = Hexadecimal.from_string "EA.4"
246
+
247
+ result = hex1 * -1
248
+
249
+ result.must_be_instance_of Hexadecimal
250
+ result.to_float.must_equal -234.25
251
+ result.to_s.must_equal "-EA.4"
252
+
253
+ end
254
+
255
+ it "multiply one integer with an hexadecimal object" do
256
+ hex1 = Hexadecimal.from_string "EA.4"
257
+
258
+ result = -1 * hex1
259
+
260
+ result.must_be_instance_of Hexadecimal
261
+ result.to_float.must_equal -234.25
262
+ result.to_s.must_equal "-EA.4"
263
+ end
264
+
265
+ it "multiply two integers (check multiply is not broken)" do
266
+ result = 2 * 2
267
+
268
+ result.must_equal 4
269
+ end
270
+
271
+ it "multiply one positive hexadecimal object and one negative hexadecimal object" do
272
+ hex1 = Hexadecimal.from_string "EA.4"
273
+ hex2 = Hexadecimal.from_string "-EA.4"
274
+
275
+ result = hex1 * hex2
276
+
277
+ result.must_be_instance_of Hexadecimal
278
+ result.to_float.must_equal -54873.0625
279
+ result.to_s.must_equal "-D659.1"
280
+ end
281
+ end
282
+
283
+ describe "divide" do
284
+ it "divides two positive hexadecimals objects" do
285
+ hex1 = Hexadecimal.from_string("EA.4")
286
+ hex2 = Hexadecimal.from_string("EA.4")
287
+
288
+ result = hex1 / hex2
289
+
290
+ result.must_be_instance_of Hexadecimal
291
+ result.to_float.must_equal 1
292
+ result.to_s.must_equal "1"
293
+ end
294
+
295
+ it "divides one hexadecimal object with a float" do
296
+ hex1 = Hexadecimal.from_string("EA.4")
297
+
298
+ result = hex1 / 234.25
299
+
300
+ result.must_be_instance_of Hexadecimal
301
+ result.to_float.must_equal 1
302
+ result.to_s.must_equal "1"
303
+ end
304
+
305
+ it "divides one float with an hexadecimal object" do
306
+ hex1 = Hexadecimal.from_string("EA.4")
307
+
308
+ result = 234.25 / hex1
309
+
310
+ result.must_be_instance_of Hexadecimal
311
+ result.to_float.must_equal 1
312
+ result.to_s.must_equal "1"
313
+ end
314
+
315
+ it "divides two floats (check divide is not broken)" do
316
+ result = 234.25 / 234.25
317
+
318
+ result.must_equal 1
319
+ end
320
+
321
+ it "divides one hexadecimal object with an integer" do
322
+ hex1 = Hexadecimal.from_string("EA.4")
323
+
324
+ result = hex1 / 1
325
+
326
+ result.must_be_instance_of Hexadecimal
327
+ result.to_float.must_equal 234.25
328
+ result.to_s.must_equal "EA.4"
329
+ end
330
+
331
+ it "divides one integer with an hexadecimal object" do
332
+ hex1 = Hexadecimal.from_string("EA.4")
333
+
334
+ result = 1 / hex1
335
+
336
+ result.must_be_instance_of Hexadecimal
337
+ result.to_s.must_equal "0.0117C4FC72BFCB"
338
+ result.to_float.must_equal 0.004268943436499467
339
+ end
340
+
341
+ it "divides two integerse (check divide is not broken)" do
342
+ result = 1 / 2
343
+
344
+ result.must_equal 0
345
+ end
346
+
347
+ it "divides one positive hexadecimal object and one negative hexadecimal object" do
348
+ hex1 = Hexadecimal.from_string("EA.4")
349
+ hex2 = Hexadecimal.from_string("-EA.4")
350
+
351
+ result = hex1 / hex2
352
+
353
+ result.must_be_instance_of Hexadecimal
354
+ result.to_float.must_equal -1
355
+ result.to_s.must_equal "-1"
356
+ end
357
+
358
+ it "divide by zero return Infinity" do
359
+ hex1 = Hexadecimal.from_string "EA.4"
360
+
361
+ result = hex1 / 0
362
+
363
+ result.must_be_instance_of Hexadecimal
364
+ result.to_float.must_equal Float::INFINITY
365
+ result.to_s.must_equal "Infinity"
366
+ end
367
+ end
368
+
369
+ describe "pow" do
370
+ it "pows two positive hexadecimals objects" do
371
+ hex1 = Hexadecimal.from_string "EA.4"
372
+ hex2 = 2.34.to_hex
373
+
374
+ result = hex1 ** hex2
375
+
376
+ result.must_be_instance_of Hexadecimal
377
+ result.to_float.must_equal 350792.4704875763
378
+ result.to_s.must_equal "55A48.7871DFB161FF7C"
379
+ end
380
+
381
+ it "pows two big positive hexadecimals object (should return Infinite)" do
382
+ hex1 = Hexadecimal.from_string "EA.4"
383
+ hex2 = Hexadecimal.from_string "EA.4"
384
+
385
+ result = hex1 ** hex2
386
+
387
+ result.must_be_instance_of Hexadecimal
388
+ result.to_float.must_equal Float::INFINITY
389
+ result.to_s.must_equal "Infinity"
390
+ end
391
+
392
+ it "pows one hexadecimal object with a float" do
393
+ hex1 = Hexadecimal.from_string "EA.4"
394
+
395
+ result = hex1 ** 2.34
396
+
397
+ result.must_be_instance_of Hexadecimal
398
+ result.to_float.must_equal 350792.4704875763
399
+ result.to_s.must_equal "55A48.7871DFB161FF7C"
400
+ end
401
+
402
+ it "pows one float with an hexadecimal object" do
403
+ hex1 = Hexadecimal.from_string "A"
404
+
405
+ result = 2.34 ** hex1
406
+
407
+ result.must_be_instance_of Float
408
+ result.must_equal 4922.19227058666
409
+ end
410
+
411
+ it "pows two float (check pow is not broken)" do
412
+ result = 2.34 ** 10.0
413
+
414
+ result.must_equal 4922.19227058666
415
+ end
416
+
417
+ it "pows one hexadecimal object with an integer" do
418
+ hex1 = Hexadecimal.from_string "EA.4"
419
+
420
+ result = hex1 ** 2
421
+
422
+ result.must_be_instance_of Hexadecimal
423
+ result.to_float.must_equal 54873.0625
424
+ result.to_s.must_equal "D659.1"
425
+ end
426
+
427
+ it "pows one integer with an hexadecimal object" do
428
+ hex1 = Hexadecimal.from_string "A"
429
+
430
+ result = 2 ** hex1
431
+
432
+ result.must_be_instance_of Fixnum
433
+ result = 1024
434
+ end
435
+
436
+ it "pows one integer with an hexadecimal (with comma) object" do
437
+ hex1 = Hexadecimal.from_string "A.1"
438
+
439
+ result = 2 ** hex1
440
+
441
+ result.must_be_instance_of Float
442
+ result.must_equal 1069.3363532056717
443
+ end
444
+
445
+ it "pows two integer (check pot is not broken)" do
446
+ result = 2 ** 3
447
+
448
+ result.must_equal 8
449
+ end
450
+
451
+ it "pows one positive hexadecimal object and one negative hexadecimal object" do
452
+ hex1 = Hexadecimal.from_string "A.1"
453
+ hex2 = Hexadecimal.from_string "-A.2"
454
+
455
+ result = hex1 ** hex2
456
+
457
+ result.must_be_instance_of Hexadecimal
458
+ result.to_s.must_equal "7.67161712141568"
459
+ result.to_float.must_equal 7.040489085609713e-11
460
+ end
461
+ end
462
+ end
@@ -3,72 +3,76 @@ require 'spec_helper'
3
3
  describe 'HexValues' do
4
4
  describe "float to hex" do
5
5
  it "converts 234.25 to EA.4" do
6
- 234.25.to_hex.must_equal "EA.4"
6
+ 234.25.to_hex.to_s.must_equal "EA.4"
7
7
  end
8
8
 
9
9
  it "converts 1875.37 to 753.5EB851EB85" do
10
- 1875.37.to_hex.must_equal "753.5EB851EB851EB8"
10
+ 1875.37.to_hex.to_s.must_equal "753.5EB851EB851EB8"
11
11
  end
12
12
 
13
13
  it "converts 5476.28 to 1564.47AE147AE1" do
14
- 5476.28.to_hex.must_equal "1564.47AE147AE147AE"
14
+ 5476.28.to_hex.to_s.must_equal "1564.47AE147AE147AE"
15
15
  end
16
16
 
17
17
  it "converts 7763783.89 to 767747.E3D70A3C" do
18
- 7763783.89.to_hex.must_equal "767747.E3D70A3D70A3D7"
18
+ 7763783.89.to_hex.to_s.must_equal "767747.E3D70A3D70A3D7"
19
19
  end
20
20
 
21
21
  it "converts 1 to 1" do
22
- 1.to_hex.must_equal "1"
22
+ 1.to_hex.to_s.must_equal "1"
23
23
  end
24
24
 
25
25
  it "converts 10 to A" do
26
- 10.to_hex.must_equal "A"
26
+ 10.to_hex.to_s.must_equal "A"
27
27
  end
28
28
 
29
29
  it "converts 0.25 to 0.4" do
30
- 0.25.to_hex.must_equal "0.4"
30
+ 0.25.to_hex.to_s.must_equal "0.4"
31
31
  end
32
32
 
33
33
  it "converts 0.21 to 0.35C28F5C28F5C2" do
34
- 0.21.to_hex.must_equal "0.35C28F5C28F5C2"
34
+ 0.21.to_hex.to_s.must_equal "0.35C28F5C28F5C2"
35
35
  end
36
36
 
37
37
  it "converts 0 to 0" do
38
- 0.to_hex.must_equal "0"
38
+ 0.to_hex.to_s.must_equal "0"
39
+ end
40
+
41
+ it "converts -234.25 to -EA.4" do
42
+ -234.25.to_hex.to_s.must_equal "-EA.4"
39
43
  end
40
44
  end
41
45
 
42
46
  describe "float to hex with precision" do
43
47
  it "converts 234.25 to EA.4 (no matter precision)" do
44
- result = 234.25.to_hex(140)
48
+ result = 234.25.to_hex(140).to_s
45
49
  result.must_equal "EA.4"
46
50
  num, dec = result.split('.')
47
51
  dec.size.must_equal 1
48
52
  end
49
53
 
50
54
  it "converts 1875.37 with 5 numbers after period" do
51
- result = 1875.37.to_hex(5)
55
+ result = 1875.37.to_hex(5).to_s
52
56
  result.must_equal "753.5EB85"
53
57
  num, dec = result.split('.')
54
58
  dec.size.must_equal 5
55
59
  end
56
60
 
57
61
  it "converts 1875.37 with 50 numbers after period" do
58
- result = 1875.37.to_hex(50)
62
+ result = 1875.37.to_hex(50).to_s
59
63
  num, dec = result.split('.')
60
64
  dec.size.must_equal 50
61
65
  end
62
66
 
63
67
  it "converts 1875.37 with 0 numbers after period" do
64
- result = 1875.37.to_hex(0)
68
+ result = 1875.37.to_hex(0).to_s
65
69
  result.must_equal "753"
66
70
  num, dec = result.split('.')
67
71
  dec.must_be_nil
68
72
  end
69
73
 
70
74
  it "converts 1875.37 with 14 numbers after period (if a negative precision is provided)" do
71
- result = 1875.37.to_hex(-1)
75
+ result = 1875.37.to_hex(-1).to_s
72
76
  result.must_equal "753.5EB851EB851EB8"
73
77
  num, dec = result.split('.')
74
78
  dec.size.must_equal 14
@@ -77,23 +81,23 @@ describe 'HexValues' do
77
81
 
78
82
  describe "integer to hex with precision" do
79
83
  it "converts 1 to 1 (without parameter)" do
80
- 1.to_hex.must_equal "1"
84
+ 1.to_hex.to_s.must_equal "1"
81
85
  end
82
86
 
83
87
  it "converts 1 to 1 (with precision = 40)" do
84
- 1.to_hex(14).must_equal "1"
88
+ 1.to_hex(14).to_s.must_equal "1"
85
89
  end
86
90
 
87
91
  it "converts 1 to 1 (with precision = 0)" do
88
- 1.to_hex(0).must_equal "1"
92
+ 1.to_hex(0).to_s.must_equal "1"
89
93
  end
90
94
 
91
95
  it "converts 1 to 1 (with precision = -1)" do
92
- 1.to_hex(-1).must_equal "1"
96
+ 1.to_hex(-1).to_s.must_equal "1"
93
97
  end
94
98
 
95
99
  it "converts 13 to D (with precision = 12)" do
96
- 13.to_hex(12).must_equal "D"
100
+ 13.to_hex(12).to_s.must_equal "D"
97
101
  end
98
102
  end
99
103
 
@@ -133,5 +137,9 @@ describe 'HexValues' do
133
137
  it "converts an empty string to 0" do
134
138
  "".to_float.must_equal 0
135
139
  end
140
+
141
+ it "converts a no parseable string into 0" do
142
+ "ZZZZZZZ".to_float.must_equal 0
143
+ end
136
144
  end
137
145
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hex_values
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: '0.1'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-07 00:00:00.000000000 Z
12
+ date: 2013-05-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -60,8 +60,10 @@ files:
60
60
  - Rakefile
61
61
  - hex_values.gemspec
62
62
  - lib/hex_values.rb
63
+ - lib/hex_values/hexadecimal.rb
63
64
  - lib/hex_values/version.rb
64
65
  - script/benchmark
66
+ - spec/hex_values/hexadecimal_spec.rb
65
67
  - spec/hex_values_spec.rb
66
68
  - spec/performance_hex_values_test.rb
67
69
  - spec/spec_helper.rb
@@ -91,6 +93,7 @@ specification_version: 3
91
93
  summary: Convert any float or fixnum to the correct representation in hexadecimal,
92
94
  and convert any hexadecimal string in their corresponding float representation.
93
95
  test_files:
96
+ - spec/hex_values/hexadecimal_spec.rb
94
97
  - spec/hex_values_spec.rb
95
98
  - spec/performance_hex_values_test.rb
96
99
  - spec/spec_helper.rb