numerals 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +149 -5
  3. data/lib/numerals/conversions/bigdecimal.rb +209 -9
  4. data/lib/numerals/conversions/context_conversion.rb +40 -0
  5. data/lib/numerals/conversions/float.rb +106 -71
  6. data/lib/numerals/conversions/flt.rb +115 -44
  7. data/lib/numerals/conversions/integer.rb +32 -3
  8. data/lib/numerals/conversions/rational.rb +27 -3
  9. data/lib/numerals/conversions.rb +74 -33
  10. data/lib/numerals/digits.rb +8 -5
  11. data/lib/numerals/format/base_scaler.rb +160 -0
  12. data/lib/numerals/format/exp_setter.rb +218 -0
  13. data/lib/numerals/format/format.rb +257 -0
  14. data/lib/numerals/format/input.rb +140 -0
  15. data/lib/numerals/format/mode.rb +157 -0
  16. data/lib/numerals/format/notation.rb +51 -0
  17. data/lib/numerals/format/notations/html.rb +53 -0
  18. data/lib/numerals/format/notations/latex.rb +48 -0
  19. data/lib/numerals/format/notations/text.rb +141 -0
  20. data/lib/numerals/format/output.rb +167 -0
  21. data/lib/numerals/format/symbols.rb +565 -0
  22. data/lib/numerals/format/text_parts.rb +35 -0
  23. data/lib/numerals/format.rb +25 -0
  24. data/lib/numerals/formatting_aspect.rb +36 -0
  25. data/lib/numerals/numeral.rb +34 -21
  26. data/lib/numerals/repeat_detector.rb +99 -0
  27. data/lib/numerals/rounding.rb +340 -181
  28. data/lib/numerals/version.rb +1 -1
  29. data/lib/numerals.rb +4 -2
  30. data/numerals.gemspec +1 -1
  31. data/test/test_base_scaler.rb +189 -0
  32. data/test/test_big_conversions.rb +105 -0
  33. data/test/test_digits_definition.rb +23 -28
  34. data/test/test_exp_setter.rb +732 -0
  35. data/test/test_float_conversions.rb +48 -30
  36. data/test/test_flt_conversions.rb +476 -80
  37. data/test/test_format.rb +124 -0
  38. data/test/test_format_input.rb +226 -0
  39. data/test/test_format_mode.rb +124 -0
  40. data/test/test_format_output.rb +789 -0
  41. data/test/test_integer_conversions.rb +22 -22
  42. data/test/test_numeral.rb +35 -0
  43. data/test/test_rational_conversions.rb +28 -28
  44. data/test/test_repeat_detector.rb +72 -0
  45. data/test/test_rounding.rb +158 -0
  46. data/test/test_symbols.rb +32 -0
  47. metadata +38 -5
  48. data/lib/numerals/formatting/digits_definition.rb +0 -75
@@ -0,0 +1,124 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+ include Numerals
3
+ require 'yaml'
4
+
5
+ class TestFormat < Test::Unit::TestCase # < Minitest::Test
6
+
7
+ def test_mutated_copy
8
+ f1 = Format[Rounding[precision: 3, base: 2]]
9
+
10
+ f2 = f1.set(rounding: :short)
11
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
12
+ assert_equal Rounding[:short, base: 2], f2.rounding
13
+
14
+ f2 = f1.set_rounding(:short)
15
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
16
+ assert_equal Rounding[:short, base: 2], f2.rounding
17
+
18
+ f2 = f1.set(rounding: { precision: 4 })
19
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
20
+ assert_equal Rounding[precision: 4, base: 2], f2.rounding
21
+
22
+ f2 = f1.set_rounding(precision: 4)
23
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
24
+ assert_equal Rounding[precision: 4, base: 2], f2.rounding
25
+
26
+ f2 = f1.set(rounding: Rounding[:short])
27
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
28
+ assert_equal Rounding[:short, base: 10], f2.rounding
29
+
30
+ f2 = f1.set(Rounding[:short])
31
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
32
+ assert_equal Rounding[:short, base: 10], f2.rounding
33
+
34
+ f2 = f1.set_rounding(Rounding[:short])
35
+ assert_equal Rounding[precision: 3, base: 2], f1.rounding
36
+ assert_equal Rounding[:short, base: 10], f2.rounding
37
+ end
38
+
39
+ def test_set_base
40
+ f = Format[base: 2, rounding: :short]
41
+ assert_equal 2, f.base
42
+ assert_equal Rounding[:short, base: 2], f.rounding
43
+ f.set_base! 5
44
+ assert_equal 5, f.base
45
+ assert_equal Rounding[:short, base: 5], f.rounding
46
+ f = f[base: 6]
47
+ assert_equal 6, f.base
48
+ assert_equal Rounding[:short, base: 6], f.rounding
49
+ end
50
+
51
+ def test_aspects
52
+ f = Format[exact_input: true, rounding: Rounding[precision: 5]]
53
+ assert_equal true, f.exact_input
54
+ assert_equal Rounding[precision: 5], f.rounding
55
+ assert_equal Format::Mode[], f.mode
56
+
57
+ f = Format[:exact_input, Rounding[precision: 5]]
58
+ assert_equal true, f.exact_input
59
+ assert_equal Rounding[precision: 5], f.rounding
60
+ assert_equal Format::Mode[], f.mode
61
+
62
+ f = Format[Rounding[precision: 5], exact_input: false]
63
+ assert_equal false, f.exact_input
64
+ assert_equal Rounding[precision: 5], f.rounding
65
+ assert_equal Format::Mode[], f.mode
66
+
67
+ f = Format[Rounding[precision: 5], mode: :fixed]
68
+ assert_equal false, f.exact_input
69
+ assert_equal Rounding[precision: 5], f.rounding
70
+ assert_equal Format::Mode[:fixed], f.mode
71
+
72
+ f = f[exact_input: true]
73
+ assert_equal true, f.exact_input
74
+ assert_equal Rounding[precision: 5], f.rounding
75
+ assert_equal Format::Mode[:fixed], f.mode
76
+
77
+ f = f[rounding: { precision: 6 }]
78
+ assert_equal true, f.exact_input
79
+ assert_equal Rounding[precision: 6], f.rounding
80
+ assert_equal Format::Mode[:fixed], f.mode
81
+
82
+ f = f.set_exact_input(false)
83
+ assert_equal false, f.exact_input
84
+ assert_equal Rounding[precision: 6], f.rounding
85
+ assert_equal Format::Mode[:fixed], f.mode
86
+
87
+ f = f.set_rounding(precision: 10)
88
+ assert_equal false, f.exact_input
89
+ assert_equal Rounding[precision: 10], f.rounding
90
+ assert_equal Format::Mode[:fixed], f.mode
91
+
92
+ f = f.set_rounding(precision: 10).set_mode(:engineering)
93
+ assert_equal false, f.exact_input
94
+ assert_equal Rounding[precision: 10], f.rounding
95
+ assert_equal Format::Mode[:engineering], f.mode
96
+ end
97
+
98
+ def test_redefine_aspects
99
+ f = Format[Format::Mode[max_leading: 10]]
100
+ f2 = f[Format::Mode[:scientific]]
101
+ assert_equal :scientific, f2.mode.mode
102
+ assert_equal Format[].mode.max_leading, f2.mode.max_leading
103
+ f2 = f[mode: :scientific]
104
+ assert_equal :scientific, f2.mode.mode
105
+ assert_equal 10, f2.mode.max_leading
106
+
107
+ f = Format[Rounding[base: 2]]
108
+ f2 = f[Rounding[:short]]
109
+ assert_equal :short, f2.rounding.precision
110
+ assert_equal 10, f2.rounding.base
111
+ f2 = f[rounding: :short]
112
+ assert_equal :short, f2.rounding.precision
113
+ assert_equal 2, f2.rounding.base
114
+
115
+ f = Format[Format::Symbols[plus: 'PLUS']]
116
+ f2 = f[Format::Symbols[nan: 'Not a Number']]
117
+ assert_equal 'Not a Number', f2.symbols.nan
118
+ assert_equal '+', f2.symbols.plus
119
+ f2 = f[symbols: { nan: 'Not a Number' }]
120
+ assert_equal 'Not a Number', f2.symbols.nan
121
+ assert_equal 'PLUS', f2.symbols.plus
122
+ end
123
+
124
+ end
@@ -0,0 +1,226 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+ include Numerals
3
+ require 'yaml'
4
+
5
+ class TestFormatInput < Test::Unit::TestCase # < Minitest::Test
6
+
7
+ def assert_same_flt(x, y)
8
+ assert_equal x.class, y.class, x.to_s
9
+ assert_equal x.split, y.split, x.to_s
10
+ end
11
+
12
+ def assert_same_float(x, y)
13
+ assert_equal x.class, y.class, x.to_s
14
+ assert_equal Float.context.split(x), Float.context.split(y), x.to_s
15
+ end
16
+
17
+ def test_read_special_float
18
+ f = Format[]
19
+ assert f.read('NaN', type: Float).nan?
20
+ assert f.read('NAN', type: Float).nan?
21
+ assert_raise(RuntimeError) { f[case_sensitive: true].read('NAN', type: Float) }
22
+ assert_equal Float::INFINITY, f.read('Infinity', type: Float)
23
+ assert_equal Float::INFINITY, f.read('+Infinity', type: Float)
24
+ assert_equal Float::INFINITY, f.read('+INFINITY', type: Float)
25
+ assert_equal -Float::INFINITY, f.read('-Infinity', type: Float)
26
+ assert_equal -Float::INFINITY, f.read('-INFINITY', type: Float)
27
+ end
28
+
29
+ def test_read_float
30
+ f = Format[]
31
+ assert_same_float 1.0, f.read('1', type: Float)
32
+ assert_same_float 1.2345e-23, f.read('1.2345e-23', type: Float)
33
+ assert_same_float -1.2345e-23, f.read('-1.2345e-23', type: Float)
34
+ assert_same_float 1.2345e-23, f.read('1.2345E-23', type: Float)
35
+ assert_same_float 1.2345e23, f.read('1.2345E23', type: Float)
36
+ assert_same_float 1.2345e23, f.read('1.2345E+23', type: Float)
37
+ assert_same_float -1/3.0 - 123456, f.read('-123,456.<3>', type: Float)
38
+ assert_same_float 4/3.0, f.read('+1.<3>', type: Float)
39
+ assert_same_float 4/3.0, f.read('+1.333...', type: Float)
40
+ assert_same_float 0.1, f.read('0.1', type: Float)
41
+ end
42
+
43
+ def test_read_rational
44
+ f = Format[]
45
+ assert_equal Rational(1,1), f.read('1.0', type: Rational)
46
+ assert_equal Rational(-370369,3), f.read('-123,456.<3>', type: Rational)
47
+ assert_equal Rational(4,3), f.read('+1.<3>', type: Rational)
48
+ assert_equal Rational(1,10), f.read('0.1', type: Rational)
49
+ assert_equal Rational(41000000000,333), f.read('1,23123123...', type: Rational)
50
+ end
51
+
52
+ def test_read_decnum
53
+ f = Format[]
54
+ Flt::DecNum.context(precision: 20) do
55
+ assert_same_flt Flt::DecNum('123123123.12312312312'), f.read('1,23123123...', type: Flt::DecNum)
56
+ assert_same_flt Flt::DecNum('-123456.33333333333333'), f.read('-123,456.<3>', type: Flt::DecNum)
57
+ assert_same_flt Flt::DecNum('1.3333333333333333333'), f.read('+1.<3>', type: Flt::DecNum)
58
+ assert_same_flt Flt::DecNum('0.1'), f.read('0.1', type: Flt::DecNum)
59
+ assert_same_flt Flt::DecNum('0.10000000000000000000'), f[:exact_input].read('0.1', type: Flt::DecNum)
60
+ assert_same_flt Flt::DecNum('0.10000000000000000000'), f[:exact_input].read('0.1000', type: Flt::DecNum)
61
+ assert_same_flt Flt::DecNum('0.1'), f[:short].read('0.1000', type: Flt::DecNum)
62
+ assert_same_flt Flt::DecNum('0.1000'), f[:free].read('0.1000', type: Flt::DecNum)
63
+ end
64
+ context = Flt::DecNum.context(precision: 19)
65
+ assert_same_flt Flt::DecNum('123123123.1231231231'), f.read('1,23123123...', type: context)
66
+ assert_same_flt Flt::DecNum('-123456.3333333333333'), f.read('-123,456.<3>', type: context)
67
+ assert_same_flt Flt::DecNum('1.333333333333333333'), f.read('+1.<3>', type: context)
68
+ assert_same_flt Flt::DecNum('0.1'), f.read('0.1', type: context)
69
+ assert_same_flt Flt::DecNum('0.1000000000000000000'), f[:exact_input].read('0.1', type: context)
70
+ assert_same_flt Flt::DecNum('0.1000000000000000000'), f[:exact_input].read('0.1000', type: context)
71
+ assert_same_flt Flt::DecNum('0.1'), f[:short].read('0.1000', type: context)
72
+ assert_same_flt Flt::DecNum('0.1000'), f[:free].read('0.1000', type: context)
73
+ end
74
+
75
+ def test_read_binnum
76
+ f = Format[]
77
+ Flt::BinNum.context(Flt::BinNum::IEEEDoubleContext) do
78
+ assert_same_flt Flt::BinNum('1', :short), f.read('1', type: Flt::BinNum)
79
+ assert_same_flt Flt::BinNum('1', :free), f[:free].read('1', type: Flt::BinNum)
80
+ assert_same_flt Flt::BinNum('1.00', :free), f[:free].read('1.00', type: Flt::BinNum)
81
+ assert_same_flt Flt::BinNum('1.2345E-23', :short), f.read('1.2345E-23', type: Flt::BinNum)
82
+ assert_same_flt Flt::BinNum('-123456.333333333333333', :fixed), f.read('-123,456.<3>', type: Flt::BinNum)
83
+ assert_same_flt Flt::BinNum('1.33333333333333333333', :fixed), f.read('+1.<3>', type: Flt::BinNum)
84
+ assert_same_flt Flt::BinNum('0.1', :short), f.read('0.1', type: Flt::BinNum)
85
+ end
86
+ end
87
+
88
+ def test_read_hexbin
89
+ context = Flt::BinNum::IEEEDoubleContext
90
+ Flt::BinNum.context(context) do
91
+ f = Format[:free, :hexbin]
92
+ x = Flt::BinNum('0.1', :fixed)
93
+ assert_same_flt x, f.read("1.999999999999Ap-4", type: Flt::BinNum)
94
+ assert_same_flt -x, f.read("-1.999999999999Ap-4", type: Flt::BinNum)
95
+ assert_same_flt x, f.read("19.99999999999Ap-8", type: Flt::BinNum)
96
+ %w(1.52d02c7e14af6p+76 1.52d02c7e14af7p+76 1.0066666666666p+6 1.0066666666667p+6).each do |txt|
97
+ x = Flt::BinNum("0x#{txt}", :fixed)
98
+ assert_same_flt x, f.read(txt, type: Flt::BinNum)
99
+ end
100
+ end
101
+ end
102
+
103
+ def test_read_equidistant_flt
104
+ # In IEEEDoubleContext
105
+ # 1E23 is equidistant from 2 Floats: lo & hi
106
+ # one or the other will be chosen based on the rounding mode
107
+
108
+ context = Flt::BinNum::IEEEDoubleContext
109
+
110
+ lo = hi = nil
111
+ Flt::BinNum.context(context) do
112
+ lo = Flt::BinNum('0x1.52d02c7e14af6p+76', :fixed) # 9.999999999999999E22
113
+ hi = Flt::BinNum('0x1.52d02c7e14af7p+76', :fixed) # 1.0000000000000001E23
114
+ end
115
+
116
+ f = Format[:exact_input]
117
+
118
+ # define rounding mode with :type_options
119
+ x = f.read('1E23', type: context, type_options: { input_rounding: :half_even })
120
+ assert_same_flt lo, x
121
+ x = f.read('1E23', type: context, type_options: { input_rounding: :half_down })
122
+ assert_equal lo, x
123
+ x = f.read('1E23', type: context, type_options: { input_rounding: :half_up })
124
+ assert_equal hi, x
125
+
126
+ x = f.read('-1E23', type: context, type_options: { input_rounding: :half_even })
127
+ assert_equal -lo, x
128
+ x = f.read('-1E23', type: context, type_options: { input_rounding: :half_down })
129
+ assert_equal -lo, x
130
+ x = f.read('-1E23', type: context, type_options: { input_rounding: :half_up })
131
+ assert_equal -hi, x
132
+
133
+ # define rounding mode with Format's Rounding
134
+ x = f[:half_even].read('1E23', type: context)
135
+ assert_same_flt lo, x
136
+ x = f[:half_down].read('1E23', type: context)
137
+ assert_equal lo, x
138
+ x = f[:half_up].read('1E23', type: context)
139
+ assert_equal hi, x
140
+
141
+ x = f[:half_even].read('-1E23', type: context)
142
+ assert_equal -lo, x
143
+ x = f[:half_down].read('-1E23', type: context)
144
+ assert_equal -lo, x
145
+ x = f[:half_up].read('-1E23', type: context)
146
+ assert_equal -hi, x
147
+
148
+ # define rounding mode with Format's input_rounding
149
+ x = f[input_rounding: :half_even].read('1E23', type: context)
150
+ assert_same_flt lo, x
151
+ x = f[input_rounding: :half_down].read('1E23', type: context)
152
+ assert_equal lo, x
153
+ x = f[input_rounding: :half_up].read('1E23', type: context)
154
+ assert_equal hi, x
155
+
156
+ x = f[input_rounding: :half_even].read('-1E23', type: context)
157
+ assert_equal -lo, x
158
+ x = f[input_rounding: :half_down].read('-1E23', type: context)
159
+ assert_equal -lo, x
160
+ x = f[input_rounding: :half_up].read('-1E23', type: context)
161
+ assert_equal -hi, x
162
+ end
163
+
164
+ def test_read_single_nearest
165
+ # In IEEEDoubleContext
166
+ # 64.1 between the floats lo, hi, but is closer to lo
167
+ # So there's a closet Float that should be chosen for rounding
168
+
169
+ context = Flt::BinNum::IEEEDoubleContext
170
+
171
+ lo = hi = nil
172
+ Flt::BinNum.context(context) do
173
+ lo = Flt::BinNum('0x1.0066666666666p+6', :fixed) # this is nearer to the 64.1 Float
174
+ hi = Flt::BinNum('0x1.0066666666667p+6', :fixed)
175
+ end
176
+
177
+ f = Format[:exact_input]
178
+
179
+ # define rounding mode with type_optoins
180
+ x = f.read('64.1', type: context, type_options: { input_rounding: :half_even })
181
+ assert_equal lo, x
182
+ x = f.read('64.1', type: context, type_options: { input_rounding: :half_down })
183
+ assert_equal lo, x
184
+ x = f.read('64.1', type: context, type_options: { input_rounding: :half_up })
185
+ assert_equal lo, x
186
+
187
+ x = f.read('-64.1', type: context, type_options: { input_rounding: :half_even })
188
+ assert_equal -lo, x
189
+ x = f.read('-64.1', type: context, type_options: { input_rounding: :half_even })
190
+ assert_equal -lo, x
191
+ x = f.read('-64.1', type: context, type_options: { input_rounding: :half_up })
192
+ assert_equal -lo, x
193
+
194
+ # define rounding mode with Format's Rounding
195
+ x = f[:half_even].read('64.1', type: context)
196
+ assert_equal lo, x
197
+ x = f[:half_down].read('64.1', type: context)
198
+ assert_equal lo, x
199
+ x = f[:half_up].read('64.1', type: context)
200
+ assert_equal lo, x
201
+
202
+ x = f[:half_even].read('-64.1', type: context)
203
+ assert_equal -lo, x
204
+ x = f[:half_down].read('-64.1', type: context)
205
+ assert_equal -lo, x
206
+ x = f[:half_up].read('-64.1', type: context)
207
+ assert_equal -lo, x
208
+
209
+ # define rounding mode with Format's input_rounding
210
+ x = f[input_rounding: :half_even].read('64.1', type: context)
211
+ assert_equal lo, x
212
+ x = f[input_rounding: :half_down].read('64.1', type: context)
213
+ assert_equal lo, x
214
+ x = f[input_rounding: :half_up].read('64.1', type: context)
215
+ assert_equal lo, x
216
+
217
+ x = f[input_rounding: :half_even].read('-64.1', type: context)
218
+ assert_equal -lo, x
219
+ x = f[input_rounding: :half_down].read('-64.1', type: context)
220
+ assert_equal -lo, x
221
+ x = f[input_rounding: :half_up].read('-64.1', type: context)
222
+ assert_equal -lo, x
223
+
224
+ end
225
+
226
+ end
@@ -0,0 +1,124 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'helper.rb'))
2
+
3
+ require 'numerals/rounding'
4
+ include Numerals
5
+
6
+ class TestFormatMode < Test::Unit::TestCase # < Minitest::Test
7
+
8
+ def test_format_mode_constructor
9
+ mode = Format::Mode[:scientific]
10
+ assert mode.scientific?
11
+ refute mode.engineering?
12
+ refute mode.fixed?
13
+ refute mode.general?
14
+ assert_equal :scientific, mode.mode
15
+ assert_equal 1, mode.sci_int_digits
16
+ assert_equal 1, mode.base_scale
17
+ assert_equal Format::Mode[:scientific], Format::Mode[:sci]
18
+ assert_equal Format::Mode[:scientific, sci_int_digits: 2], Format::Mode[:sci, sci_int_digits: 2]
19
+ assert_equal Format::Mode[:scientific, sci_int_digits: :engineering], Format::Mode[:sci, sci_int_digits: :engineering]
20
+ assert_equal Format::Mode[:scientific, sci_int_digits: :eng], Format::Mode[:sci, sci_int_digits: :eng]
21
+
22
+ mode = Format::Mode[:scientific, sci_int_digits: 0]
23
+ assert mode.scientific?
24
+ refute mode.engineering?
25
+ refute mode.fixed?
26
+ refute mode.general?
27
+ assert_equal :scientific, mode.mode
28
+ assert_equal 0, mode.sci_int_digits
29
+ assert_equal 1, mode.base_scale
30
+
31
+ mode = Format::Mode[:scientific, base_scale: 4]
32
+ assert mode.scientific?
33
+ refute mode.engineering?
34
+ refute mode.fixed?
35
+ refute mode.general?
36
+ assert_equal :scientific, mode.mode
37
+ assert_equal 1, mode.sci_int_digits
38
+ assert_equal 4, mode.base_scale
39
+
40
+ mode = Format::Mode[:engineering]
41
+ assert mode.engineering?
42
+ assert mode.scientific?
43
+ refute mode.fixed?
44
+ refute mode.general?
45
+ assert_equal :engineering, mode.sci_int_digits
46
+ assert_equal :scientific, mode.mode
47
+ assert_equal 1, mode.base_scale
48
+ assert_equal Format::Mode[:engineering], Format::Mode[:eng]
49
+ assert_equal Format::Mode[:engineering], Format::Mode[:scientific, sci_int_digits: :engineering]
50
+ assert_equal Format::Mode[:engineering], Format::Mode[:scientific, sci_int_digits: :eng]
51
+
52
+ mode = Format::Mode[:fixed]
53
+ refute mode.scientific?
54
+ refute mode.engineering?
55
+ assert mode.fixed?
56
+ refute mode.general?
57
+ assert_equal :fixed, mode.mode
58
+ assert_equal 1, mode.base_scale
59
+ assert_equal Format::Mode[:fixed], Format::Mode[:fix]
60
+ assert_equal Format::Mode[:fixed, base_scale: 4], Format::Mode[:fix, base_scale: 4]
61
+
62
+ mode = Format::Mode[:general]
63
+ refute mode.scientific?
64
+ refute mode.engineering?
65
+ refute mode.fixed?
66
+ assert mode.general?
67
+ assert_equal :general, mode.mode
68
+ assert_equal 1, mode.sci_int_digits
69
+ assert_equal Format::Mode::DEFAULTS[:max_leading], mode.max_leading
70
+ assert_equal Format::Mode::DEFAULTS[:max_trailing], mode.max_trailing
71
+ assert_equal 1, mode.base_scale
72
+ assert_equal Format::Mode[:general], Format::Mode[]
73
+ assert_equal Format::Mode[:general], Format::Mode[:gen]
74
+ assert_equal Format::Mode[:general, sci_int_digits: 0], Format::Mode[:gen, sci_int_digits: 0]
75
+ assert_equal Format::Mode[:general, sci_int_digits: :engineering], Format::Mode[:gen, sci_int_digits: :engineering]
76
+ assert_equal Format::Mode[:general, sci_int_digits: :eng], Format::Mode[:gen, sci_int_digits: :eng]
77
+
78
+ mode = Format::Mode[:general, max_leading: 8, max_trailing: 2, base_scale: 2, sci_int_digits: 0]
79
+ refute mode.scientific?
80
+ refute mode.engineering?
81
+ refute mode.fixed?
82
+ assert mode.general?
83
+ assert_equal :general, mode.mode
84
+ assert_equal 0, mode.sci_int_digits
85
+ assert_equal 8, mode.max_leading
86
+ assert_equal 2, mode.max_trailing
87
+ assert_equal 2, mode.base_scale
88
+ end
89
+
90
+ def test_copy
91
+ m1 = Format::Mode[:fixed]
92
+ m2 = Format::Mode[m1]
93
+ assert_equal :fixed, m2.mode
94
+ m2.mode = :scientific
95
+ assert_equal :fixed, m1.mode
96
+ assert_equal :scientific, m2.mode
97
+
98
+ m2 = m1[:scientific]
99
+ assert_equal :fixed, m1.mode
100
+ assert_equal :scientific, m2.mode
101
+
102
+ m1 = Format::Mode[:scientific, sci_int_digits: 0]
103
+ m2 = m1[sci_int_digits: 2]
104
+ assert_equal 0, m1.sci_int_digits
105
+ assert_equal 2, m2.sci_int_digits
106
+ assert_equal :scientific, m1.mode
107
+ assert_equal :scientific, m2.mode
108
+
109
+ m1 = Format::Mode[:scientific, sci_int_digits: 0]
110
+ m2 = m1.set(sci_int_digits: 2)
111
+ assert_equal 0, m1.sci_int_digits
112
+ assert_equal 2, m2.sci_int_digits
113
+ assert_equal :scientific, m1.mode
114
+ assert_equal :scientific, m2.mode
115
+ end
116
+
117
+ def test_mutators
118
+ m1 = Format::Mode[:fixed]
119
+ m2 = m1.set!(:scientific)
120
+ assert_equal :scientific, m1.mode
121
+ assert_equal :scientific, m2.mode
122
+ assert_equal m1.object_id, m2.object_id
123
+ end
124
+ end