fOOrth 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rdoc_options +17 -0
- data/Gemfile +4 -0
- data/README.md +67 -0
- data/bin/fOOrth +8 -0
- data/demo.rb +24 -0
- data/fOOrth.gemspec +40 -0
- data/fOOrth.reek +109 -0
- data/integration/README.md +12 -0
- data/integration/_FILE_test.foorth +5 -0
- data/integration/array_lib_tests.rb +360 -0
- data/integration/class_lib_tests.rb +116 -0
- data/integration/clone_lib_tests.rb +108 -0
- data/integration/comparison_tests.rb +132 -0
- data/integration/compile_lib_tests.rb +190 -0
- data/integration/ctrl_struct_lib_tests.rb +80 -0
- data/integration/data_ref_lib_tests.rb +43 -0
- data/integration/exception_lib_tests.rb +86 -0
- data/integration/fiber_bundle_tests.rb +380 -0
- data/integration/hash_lib_tests.rb +120 -0
- data/integration/in_stream_test_1.txt +4 -0
- data/integration/load_test_one.foorth +6 -0
- data/integration/load_test_two.foorth +4 -0
- data/integration/numeric_lib_tests.rb +321 -0
- data/integration/object_lib_tests.rb +38 -0
- data/integration/procedure_lib_tests.rb +40 -0
- data/integration/queue_lib_tests.rb +66 -0
- data/integration/stack_lib_tests.rb +70 -0
- data/integration/standard_lib_tests.rb +208 -0
- data/integration/stdio_lib_tests.rb +52 -0
- data/integration/stream_lib_tests.rb +196 -0
- data/integration/string_lib_tests.rb +217 -0
- data/integration/support/foorth_testing.rb +135 -0
- data/integration/thread_lib_tests.rb +83 -0
- data/integration/time_lib_tests.rb +791 -0
- data/integration/vm_lib_tests.rb +38 -0
- data/lib/fOOrth.rb +57 -0
- data/lib/fOOrth/compiler.rb +78 -0
- data/lib/fOOrth/compiler/context.rb +49 -0
- data/lib/fOOrth/compiler/context/locals.rb +34 -0
- data/lib/fOOrth/compiler/context/map_name.rb +92 -0
- data/lib/fOOrth/compiler/context/tags.rb +48 -0
- data/lib/fOOrth/compiler/modes.rb +32 -0
- data/lib/fOOrth/compiler/modes/compiled.rb +41 -0
- data/lib/fOOrth/compiler/modes/deferred.rb +57 -0
- data/lib/fOOrth/compiler/modes/delayed.rb +40 -0
- data/lib/fOOrth/compiler/modes/nested.rb +34 -0
- data/lib/fOOrth/compiler/modes/suspend.rb +32 -0
- data/lib/fOOrth/compiler/parser.rb +26 -0
- data/lib/fOOrth/compiler/parser/get_string.rb +71 -0
- data/lib/fOOrth/compiler/parser/normal.rb +53 -0
- data/lib/fOOrth/compiler/parser/skip.rb +50 -0
- data/lib/fOOrth/compiler/parser/special.rb +42 -0
- data/lib/fOOrth/compiler/process.rb +47 -0
- data/lib/fOOrth/compiler/process/generate.rb +24 -0
- data/lib/fOOrth/compiler/process/get_token.rb +23 -0
- data/lib/fOOrth/compiler/process/procedure.rb +55 -0
- data/lib/fOOrth/compiler/process/string.rb +20 -0
- data/lib/fOOrth/compiler/source.rb +51 -0
- data/lib/fOOrth/compiler/source/console.rb +70 -0
- data/lib/fOOrth/compiler/source/file_source.rb +37 -0
- data/lib/fOOrth/compiler/source/read_point.rb +46 -0
- data/lib/fOOrth/compiler/source/string_source.rb +28 -0
- data/lib/fOOrth/compiler/token.rb +37 -0
- data/lib/fOOrth/compiler/word_specs.rb +178 -0
- data/lib/fOOrth/core.rb +27 -0
- data/lib/fOOrth/core/class.rb +116 -0
- data/lib/fOOrth/core/object.rb +78 -0
- data/lib/fOOrth/core/virtual_machine.rb +28 -0
- data/lib/fOOrth/debug.rb +13 -0
- data/lib/fOOrth/debug/context_dump.rb +31 -0
- data/lib/fOOrth/debug/dbg_puts.rb +17 -0
- data/lib/fOOrth/debug/display_abort.rb +37 -0
- data/lib/fOOrth/debug/vm_dump.rb +27 -0
- data/lib/fOOrth/initialize.rb +83 -0
- data/lib/fOOrth/interpreter.rb +24 -0
- data/lib/fOOrth/interpreter/add_to_hash.rb +17 -0
- data/lib/fOOrth/interpreter/data_stack.rb +125 -0
- data/lib/fOOrth/interpreter/do_loop.rb +55 -0
- data/lib/fOOrth/interpreter/squash.rb +25 -0
- data/lib/fOOrth/library.rb +38 -0
- data/lib/fOOrth/library/array_library.rb +577 -0
- data/lib/fOOrth/library/bundle_library.rb +112 -0
- data/lib/fOOrth/library/class_library.rb +90 -0
- data/lib/fOOrth/library/clone_library.rb +72 -0
- data/lib/fOOrth/library/command_library.rb +205 -0
- data/lib/fOOrth/library/compile_library.rb +181 -0
- data/lib/fOOrth/library/complex_library.rb +81 -0
- data/lib/fOOrth/library/ctrl_struct_library.rb +116 -0
- data/lib/fOOrth/library/data_ref_library.rb +100 -0
- data/lib/fOOrth/library/duration/arithmetic.rb +114 -0
- data/lib/fOOrth/library/duration/formatter.rb +152 -0
- data/lib/fOOrth/library/duration/intervals.rb +233 -0
- data/lib/fOOrth/library/duration/make.rb +75 -0
- data/lib/fOOrth/library/duration_library.rb +52 -0
- data/lib/fOOrth/library/fiber_library.rb +120 -0
- data/lib/fOOrth/library/hash_library.rb +203 -0
- data/lib/fOOrth/library/in_stream_library.rb +81 -0
- data/lib/fOOrth/library/integer_library.rb +104 -0
- data/lib/fOOrth/library/mutex_library.rb +31 -0
- data/lib/fOOrth/library/numeric_library.rb +380 -0
- data/lib/fOOrth/library/object_library.rb +80 -0
- data/lib/fOOrth/library/other_value_types_library.rb +96 -0
- data/lib/fOOrth/library/out_stream_library.rb +146 -0
- data/lib/fOOrth/library/procedure_library.rb +65 -0
- data/lib/fOOrth/library/queue_library.rb +47 -0
- data/lib/fOOrth/library/rational_library.rb +90 -0
- data/lib/fOOrth/library/stack_library.rb +56 -0
- data/lib/fOOrth/library/stdio_library.rb +56 -0
- data/lib/fOOrth/library/string_library.rb +285 -0
- data/lib/fOOrth/library/stubs.rb +76 -0
- data/lib/fOOrth/library/sync_bundle_library.rb +50 -0
- data/lib/fOOrth/library/thread_library.rb +73 -0
- data/lib/fOOrth/library/time_library.rb +302 -0
- data/lib/fOOrth/library/vm_library.rb +105 -0
- data/lib/fOOrth/main.rb +125 -0
- data/lib/fOOrth/monkey_patch.rb +14 -0
- data/lib/fOOrth/monkey_patch/complex.rb +30 -0
- data/lib/fOOrth/monkey_patch/exceptions.rb +154 -0
- data/lib/fOOrth/monkey_patch/false.rb +11 -0
- data/lib/fOOrth/monkey_patch/float.rb +22 -0
- data/lib/fOOrth/monkey_patch/integer.rb +22 -0
- data/lib/fOOrth/monkey_patch/nil.rb +11 -0
- data/lib/fOOrth/monkey_patch/numeric.rb +33 -0
- data/lib/fOOrth/monkey_patch/object.rb +43 -0
- data/lib/fOOrth/monkey_patch/rational.rb +31 -0
- data/lib/fOOrth/monkey_patch/string.rb +51 -0
- data/lib/fOOrth/symbol_map.rb +82 -0
- data/lib/fOOrth/version.rb +7 -0
- data/license.txt +21 -0
- data/rakefile.rb +65 -0
- data/reek.txt +1 -0
- data/sire.rb +132 -0
- data/t.txt +3 -0
- data/test.foorth +5 -0
- data/tests/compiler/context_tests.rb +180 -0
- data/tests/compiler/file_source_test_one.txt +1 -0
- data/tests/compiler/file_source_test_three.txt +3 -0
- data/tests/compiler/file_source_test_two.txt +3 -0
- data/tests/compiler/file_source_tests.rb +130 -0
- data/tests/compiler/mode_tests.rb +45 -0
- data/tests/compiler/parser_tests.rb +116 -0
- data/tests/compiler/spec_tests.rb +113 -0
- data/tests/compiler/string_source_tests.rb +128 -0
- data/tests/core_tests.rb +138 -0
- data/tests/interpreter/data_stack_tests.rb +119 -0
- data/tests/monkey_patch/coerce_test.rb +131 -0
- data/tests/monkey_patch/complex_test.rb +25 -0
- data/tests/monkey_patch/numeric_test.rb +62 -0
- data/tests/monkey_patch/object_test.rb +49 -0
- data/tests/monkey_patch/rational_test.rb +57 -0
- data/tests/monkey_patch/string_test.rb +53 -0
- data/tests/symbol_map_tests.rb +53 -0
- metadata +366 -0
data/tests/core_tests.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
$exclude_fOOrth_library = true
|
4
|
+
require_relative '../lib/fOOrth'
|
5
|
+
gem 'minitest'
|
6
|
+
require 'minitest/autorun'
|
7
|
+
require 'minitest_visible'
|
8
|
+
|
9
|
+
#Test the monkey patches applied to the Object class.
|
10
|
+
class CoreTester < Minitest::Test
|
11
|
+
|
12
|
+
#Track mini-test progress.
|
13
|
+
include MinitestVisible
|
14
|
+
|
15
|
+
def test_that_object_handles_no_method_errors
|
16
|
+
#Get an object instance to test with.
|
17
|
+
obj = Object.new
|
18
|
+
|
19
|
+
XfOOrth::SymbolMap.add_entry("a_test_zero", :a_test_zero)
|
20
|
+
|
21
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
22
|
+
obj.a_test_zero
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_raises(NoMethodError) do
|
26
|
+
obj.qwertyuiop
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_that_shared_methods_can_be_defined
|
31
|
+
#Get an object instance to test with.
|
32
|
+
obj = Object.new
|
33
|
+
|
34
|
+
#Get the virtual machine.
|
35
|
+
vm = Thread.current[:vm]
|
36
|
+
|
37
|
+
XfOOrth::SymbolMap.add_entry("a_test_one", :a_test_one)
|
38
|
+
|
39
|
+
spec = Object.create_shared_method("a_test_one", XfOOrth::TosSpec, []) {|vm| vm.push(9671111) }
|
40
|
+
|
41
|
+
obj.a_test_one(vm)
|
42
|
+
|
43
|
+
assert_equal(9671111, vm.pop)
|
44
|
+
assert_equal(spec, Object.map_foorth_shared(:a_test_one))
|
45
|
+
assert_equal(spec, Class.map_foorth_shared(:a_test_one))
|
46
|
+
assert_equal(spec, Object.foorth_shared[:a_test_one])
|
47
|
+
assert_equal(nil, Class.foorth_shared[:a_test_one])
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_that_exclusive_methods_can_be_defined
|
51
|
+
#Get an object instance to test with.
|
52
|
+
obj = Object.new
|
53
|
+
|
54
|
+
#Get the virtual machine.
|
55
|
+
vm = XfOOrth::VirtualMachine.vm
|
56
|
+
|
57
|
+
XfOOrth::SymbolMap.add_entry("a_test_two", :a_test_two)
|
58
|
+
|
59
|
+
spec = obj.create_exclusive_method("a_test_two", XfOOrth::TosSpec, []) do |vm|
|
60
|
+
vm.push(9686668)
|
61
|
+
end
|
62
|
+
|
63
|
+
obj.a_test_two(vm)
|
64
|
+
|
65
|
+
assert_equal(9686668, vm.pop)
|
66
|
+
assert_equal(spec, obj.map_foorth_exclusive(:a_test_two))
|
67
|
+
assert_equal(spec, obj.foorth_exclusive[:a_test_two])
|
68
|
+
assert_equal(nil, Object.map_foorth_shared(:a_test_two))
|
69
|
+
assert_equal(nil, Class.map_foorth_shared(:a_test_two))
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_class_naming
|
73
|
+
assert_equal("Object", Object.foorth_name)
|
74
|
+
assert_equal("Class", Class.foorth_name)
|
75
|
+
assert_equal("VirtualMachine", XfOOrth::VirtualMachine.foorth_name)
|
76
|
+
|
77
|
+
vm = Thread.current[:vm]
|
78
|
+
assert_equal("VirtualMachine instance <Main>", vm.foorth_name)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_instance_naming
|
82
|
+
obj = Object.new
|
83
|
+
assert_equal("Object instance", obj.foorth_name)
|
84
|
+
|
85
|
+
vm = Thread.current[:vm]
|
86
|
+
assert_equal("VirtualMachine instance <Main>", vm.foorth_name)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_that_virtual_machine_rejects_new
|
90
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
91
|
+
XfOOrth::VirtualMachine.new('Fails')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_that_the_VM_class_does_not_subclass
|
96
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
97
|
+
XfOOrth::VirtualMachine.create_foorth_subclass("MyClass")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_creating_subclasses
|
102
|
+
new_class = Object.create_foorth_subclass('MyClass')
|
103
|
+
symbol = XfOOrth::SymbolMap.map('MyClass')
|
104
|
+
|
105
|
+
assert($FOORTH_GLOBALS[symbol])
|
106
|
+
assert_equal('XfOOrth::ClassSpec instance', new_class.foorth_name)
|
107
|
+
assert_equal(XfOOrth::XfOOrth_MyClass, new_class.new_class)
|
108
|
+
assert_equal(XfOOrth::XfOOrth_MyClass, $FOORTH_GLOBALS[symbol].new_class)
|
109
|
+
|
110
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
111
|
+
no_class = Object.create_foorth_subclass('No Class')
|
112
|
+
end
|
113
|
+
|
114
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
115
|
+
copy_class = Object.create_foorth_subclass('MyClass')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_creating_proxies
|
120
|
+
new_proxy = String.create_foorth_proxy
|
121
|
+
symbol = XfOOrth::SymbolMap.map('String')
|
122
|
+
|
123
|
+
assert($FOORTH_GLOBALS[symbol])
|
124
|
+
assert_equal('String', new_proxy.new_class.foorth_name)
|
125
|
+
assert_equal(String, new_proxy.new_class)
|
126
|
+
assert_equal(String, $FOORTH_GLOBALS[symbol].new_class)
|
127
|
+
|
128
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
129
|
+
bad_class = Object.create_foorth_subclass('My Class')
|
130
|
+
end
|
131
|
+
|
132
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
133
|
+
bad_class = Module.create_foorth_proxy('Mod ule')
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
$exclude_fOOrth_library = true
|
4
|
+
require_relative '../../lib/fOOrth'
|
5
|
+
gem 'minitest'
|
6
|
+
require 'minitest/autorun'
|
7
|
+
require 'minitest_visible'
|
8
|
+
|
9
|
+
#Test the monkey patches applied to the Object class.
|
10
|
+
class DataStackMapTester < Minitest::Test
|
11
|
+
|
12
|
+
#Track mini-test progress.
|
13
|
+
include MinitestVisible
|
14
|
+
|
15
|
+
def test_data_stack_ops
|
16
|
+
vm = Thread.current[:vm]
|
17
|
+
refute(vm == nil)
|
18
|
+
|
19
|
+
vm.interpreter_reset
|
20
|
+
|
21
|
+
assert_equal(vm.data_stack, [])
|
22
|
+
vm.push(4)
|
23
|
+
assert_equal(vm.data_stack, [4])
|
24
|
+
vm.push(8)
|
25
|
+
assert_equal(vm.data_stack, [4, 8])
|
26
|
+
assert_equal(vm.peek, 8)
|
27
|
+
assert_equal(vm.peek(1), 8)
|
28
|
+
assert_equal(vm.peek(2), 4)
|
29
|
+
assert_equal(vm.pop, 8)
|
30
|
+
assert_equal(vm.data_stack, [4])
|
31
|
+
assert_equal(vm.pop, 4)
|
32
|
+
assert_equal(vm.data_stack, [])
|
33
|
+
|
34
|
+
vm.push(8)
|
35
|
+
assert_equal(vm.data_stack, [8])
|
36
|
+
vm.pushm([1,2,3])
|
37
|
+
assert_equal(vm.data_stack, [8, 1, 2, 3])
|
38
|
+
|
39
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
40
|
+
vm.peek(-1)
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
44
|
+
vm.peek(0)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_boolean_stack_data
|
49
|
+
vm = Thread.current[:vm]
|
50
|
+
refute(vm == nil)
|
51
|
+
|
52
|
+
vm.interpreter_reset
|
53
|
+
|
54
|
+
vm.push(16)
|
55
|
+
assert(vm.pop?)
|
56
|
+
|
57
|
+
vm.push(true)
|
58
|
+
assert(vm.pop?)
|
59
|
+
|
60
|
+
vm.push('test')
|
61
|
+
assert(vm.pop?)
|
62
|
+
|
63
|
+
vm.push(0)
|
64
|
+
assert(vm.pop?)
|
65
|
+
|
66
|
+
vm.push(false)
|
67
|
+
refute(vm.pop?)
|
68
|
+
|
69
|
+
vm.push('')
|
70
|
+
assert(vm.pop?)
|
71
|
+
|
72
|
+
vm.push(nil)
|
73
|
+
refute(vm.pop?)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_pop_multiple
|
77
|
+
vm = Thread.current[:vm]
|
78
|
+
refute(vm == nil)
|
79
|
+
|
80
|
+
vm.interpreter_reset
|
81
|
+
|
82
|
+
vm.push(16)
|
83
|
+
vm.push(true)
|
84
|
+
vm.push('test')
|
85
|
+
vm.push(0)
|
86
|
+
vm.push('')
|
87
|
+
vm.push(nil)
|
88
|
+
|
89
|
+
assert_equal(vm.data_stack, [16, true, 'test', 0, '', nil])
|
90
|
+
assert_equal(vm.popm(3), [0, '', nil])
|
91
|
+
assert_equal(vm.popm(3), [16, true, 'test'])
|
92
|
+
assert_equal(vm.data_stack, [])
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_poke
|
96
|
+
vm = Thread.current[:vm]
|
97
|
+
refute(vm == nil)
|
98
|
+
|
99
|
+
vm.interpreter_reset
|
100
|
+
|
101
|
+
vm.push(42)
|
102
|
+
vm.poke("hello")
|
103
|
+
assert_equal(vm.data_stack, ["hello"])
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_swap_pop
|
107
|
+
vm = Thread.current[:vm]
|
108
|
+
refute(vm == nil)
|
109
|
+
|
110
|
+
vm.interpreter_reset
|
111
|
+
|
112
|
+
vm.push(16)
|
113
|
+
vm.push(99)
|
114
|
+
assert_equal(vm.swap_pop, 16)
|
115
|
+
assert_equal(vm.pop, 99)
|
116
|
+
assert_equal(vm.data_stack, [])
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative '../../lib/fOOrth/monkey_patch'
|
4
|
+
gem 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest_visible'
|
7
|
+
|
8
|
+
#Test the monkey patches applied to the coerce protocol.
|
9
|
+
class CoerceProtocolTester < Minitest::Test
|
10
|
+
|
11
|
+
#Track mini-test progress.
|
12
|
+
include MinitestVisible
|
13
|
+
|
14
|
+
#Test the default stubs.
|
15
|
+
def test_object_stubs
|
16
|
+
obj = Object.new
|
17
|
+
|
18
|
+
assert_raises(XfOOrth::XfOOrthError) { obj.foorth_coerce(42) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_coerce_for_integers
|
22
|
+
obj = Object.new
|
23
|
+
|
24
|
+
assert_equal(42, (3).foorth_coerce(42))
|
25
|
+
assert_equal(Fixnum, (3).foorth_coerce(42).class)
|
26
|
+
|
27
|
+
assert_equal(42, (3).foorth_coerce('42'))
|
28
|
+
assert_equal(Fixnum, (3).foorth_coerce('42').class)
|
29
|
+
|
30
|
+
assert_raises(XfOOrth::XfOOrthError) { (3).foorth_coerce('turnip') }
|
31
|
+
assert_raises(XfOOrth::XfOOrthError) { (3).foorth_coerce(obj) }
|
32
|
+
assert_raises(XfOOrth::XfOOrthError) { (3).foorth_coerce(nil) }
|
33
|
+
|
34
|
+
assert_equal(42, Integer.foorth_coerce(42))
|
35
|
+
assert_equal(Fixnum, Integer.foorth_coerce(42).class)
|
36
|
+
|
37
|
+
assert_equal(42, Integer.foorth_coerce('42'))
|
38
|
+
assert_equal(Fixnum, Integer.foorth_coerce('42').class)
|
39
|
+
|
40
|
+
assert_raises(XfOOrth::XfOOrthError) { Integer.foorth_coerce('turnip') }
|
41
|
+
assert_raises(XfOOrth::XfOOrthError) { Integer.foorth_coerce(obj) }
|
42
|
+
assert_raises(XfOOrth::XfOOrthError) { Integer.foorth_coerce(nil) }
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_coerce_for_floats
|
47
|
+
obj = Object.new
|
48
|
+
|
49
|
+
assert_equal(42.0, (3.0).foorth_coerce(42))
|
50
|
+
assert_equal(Float, (3.0).foorth_coerce(42).class)
|
51
|
+
|
52
|
+
assert_equal(42.0, (3.0).foorth_coerce(42.0))
|
53
|
+
assert_equal(Float, (3.0).foorth_coerce(42.0).class)
|
54
|
+
|
55
|
+
assert_equal(42.0, (3.0).foorth_coerce('42'))
|
56
|
+
assert_equal(Float, (3.0).foorth_coerce('42').class)
|
57
|
+
|
58
|
+
assert_equal(42.0, (3.0).foorth_coerce('42.0'))
|
59
|
+
assert_equal(Float, (3.0).foorth_coerce('42.0').class)
|
60
|
+
|
61
|
+
assert_raises(XfOOrth::XfOOrthError) { (3.0).foorth_coerce('turnip') }
|
62
|
+
assert_raises(XfOOrth::XfOOrthError) { (3.0).foorth_coerce(obj) }
|
63
|
+
assert_raises(XfOOrth::XfOOrthError) { (3.0).foorth_coerce(nil) }
|
64
|
+
|
65
|
+
assert_equal(42.0, Float.foorth_coerce(42))
|
66
|
+
assert_equal(Float, Float.foorth_coerce(42).class)
|
67
|
+
|
68
|
+
assert_equal(42.0, Float.foorth_coerce(42.0))
|
69
|
+
assert_equal(Float, Float.foorth_coerce(42.0).class)
|
70
|
+
|
71
|
+
assert_equal(42.0, Float.foorth_coerce('42'))
|
72
|
+
assert_equal(Float, Float.foorth_coerce('42').class)
|
73
|
+
|
74
|
+
assert_equal(42.0, Float.foorth_coerce('42.0'))
|
75
|
+
assert_equal(Float, Float.foorth_coerce('42.0').class)
|
76
|
+
|
77
|
+
assert_raises(XfOOrth::XfOOrthError) { Float.foorth_coerce('turnip') }
|
78
|
+
assert_raises(XfOOrth::XfOOrthError) { Float.foorth_coerce(obj) }
|
79
|
+
assert_raises(XfOOrth::XfOOrthError) { Float.foorth_coerce(nil) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_coerce_for_rationals
|
83
|
+
obj = Object.new
|
84
|
+
|
85
|
+
assert_equal('42/1'.to_r, ('3/1'.to_r).foorth_coerce(42))
|
86
|
+
assert_equal(Rational, ('3/1'.to_r).foorth_coerce(42).class)
|
87
|
+
|
88
|
+
assert_equal('42/1'.to_r, ('3/1'.to_r).foorth_coerce(42.0))
|
89
|
+
assert_equal(Rational, ('3/1'.to_r).foorth_coerce(42.0).class)
|
90
|
+
|
91
|
+
assert_equal('42/1'.to_r, ('3/1'.to_r).foorth_coerce('42'))
|
92
|
+
assert_equal(Rational, ('3/1'.to_r).foorth_coerce('42').class)
|
93
|
+
|
94
|
+
assert_equal('42/1'.to_r, ('3/1'.to_r).foorth_coerce('42.0'))
|
95
|
+
assert_equal(Rational, ('3/1'.to_r).foorth_coerce('42.0').class)
|
96
|
+
|
97
|
+
assert_equal('42/1'.to_r, ('3/1'.to_r).foorth_coerce('42/1'))
|
98
|
+
assert_equal(Rational, ('3/1'.to_r).foorth_coerce('42/1').class)
|
99
|
+
|
100
|
+
assert_raises(XfOOrth::XfOOrthError) { ('3/1'.to_r).foorth_coerce('turnip') }
|
101
|
+
assert_raises(XfOOrth::XfOOrthError) { ('3/1'.to_r).foorth_coerce(obj) }
|
102
|
+
assert_raises(XfOOrth::XfOOrthError) { ('3/1'.to_r).foorth_coerce(nil) }
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_coerce_for_complex
|
106
|
+
obj = Object.new
|
107
|
+
|
108
|
+
assert_equal('42+0i'.to_c, ('1+1i'.to_c).foorth_coerce(42))
|
109
|
+
assert_equal(Complex, ('1+1i'.to_c).foorth_coerce(42).class)
|
110
|
+
|
111
|
+
assert_equal('42+0i'.to_c, ('1+1i'.to_c).foorth_coerce(42.0))
|
112
|
+
assert_equal(Complex, ('1+1i'.to_c).foorth_coerce(42.0).class)
|
113
|
+
|
114
|
+
assert_equal('42+0i'.to_c, ('1+1i'.to_c).foorth_coerce('42/1'.to_r))
|
115
|
+
assert_equal(Complex, ('1+1i'.to_c).foorth_coerce('42/1'.to_r).class)
|
116
|
+
|
117
|
+
assert_equal('42+0i'.to_c, ('1+1i'.to_c).foorth_coerce('42'))
|
118
|
+
assert_equal(Complex, ('1+1i'.to_c).foorth_coerce('42').class)
|
119
|
+
|
120
|
+
assert_equal('42+0i'.to_c, ('1+1i'.to_c).foorth_coerce('42.0'))
|
121
|
+
assert_equal(Complex, ('1+1i'.to_c).foorth_coerce('42.0').class)
|
122
|
+
|
123
|
+
assert_equal('42+0i'.to_c, ('1+1i'.to_c).foorth_coerce('42/1'))
|
124
|
+
assert_equal(Complex, ('1+1i'.to_c).foorth_coerce('42/1').class)
|
125
|
+
|
126
|
+
assert_raises(XfOOrth::XfOOrthError) { ('1+1i'.to_c).foorth_coerce('turnip') }
|
127
|
+
assert_raises(XfOOrth::XfOOrthError) { ('1+1i'.to_c).foorth_coerce(obj) }
|
128
|
+
assert_raises(XfOOrth::XfOOrthError) { ('1+1i'.to_c).foorth_coerce(nil) }
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative '../../lib/fOOrth/monkey_patch/numeric'
|
4
|
+
require_relative '../../lib/fOOrth/monkey_patch/complex'
|
5
|
+
gem 'minitest'
|
6
|
+
require 'minitest/autorun'
|
7
|
+
require 'minitest_visible'
|
8
|
+
|
9
|
+
#Test the monkey patches applied to the Object class.
|
10
|
+
class ComplexMonkeyPatchTester < Minitest::Test
|
11
|
+
|
12
|
+
#Track mini-test progress.
|
13
|
+
include MinitestVisible
|
14
|
+
|
15
|
+
#Test that it embeds
|
16
|
+
def test_foorth_embed
|
17
|
+
comp = Complex(1,2)
|
18
|
+
assert_equal(comp.foorth_embed, 'Complex(1,2)')
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_that_it_is_not_rationalizable
|
22
|
+
comp = Complex(1,2)
|
23
|
+
assert_equal(nil, comp.to_foorth_r)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative '../../lib/fOOrth/monkey_patch/numeric'
|
4
|
+
gem 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest_visible'
|
7
|
+
|
8
|
+
#Test the monkey patches applied to the Object class.
|
9
|
+
class NumericMonkeyPatchTester < Minitest::Test
|
10
|
+
|
11
|
+
#Track mini-test progress.
|
12
|
+
include MinitestVisible
|
13
|
+
|
14
|
+
#Test that it embeds
|
15
|
+
def test_foorth_embed
|
16
|
+
assert_equal(5.foorth_embed, '5')
|
17
|
+
assert_equal((5.1).foorth_embed, '5.1')
|
18
|
+
end
|
19
|
+
|
20
|
+
#Test for conversion to a character.
|
21
|
+
def test_to_character
|
22
|
+
assert_equal(65.to_foorth_c, 'A')
|
23
|
+
assert_equal((65.0).to_foorth_c, 'A')
|
24
|
+
assert_equal(Rational(65,1).to_foorth_c, 'A')
|
25
|
+
|
26
|
+
assert_equal(127.to_foorth_c, "\u007F")
|
27
|
+
assert_equal(128.to_foorth_c, "\u0080")
|
28
|
+
|
29
|
+
assert_equal(255.to_foorth_c, "\u00FF")
|
30
|
+
assert_equal(256.to_foorth_c, "\u0100")
|
31
|
+
|
32
|
+
assert_equal(169.to_foorth_c, "\u00A9")
|
33
|
+
assert_equal(1120.to_foorth_c, "\u0460")
|
34
|
+
|
35
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
36
|
+
Complex(65,0).to_foorth_c
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
40
|
+
1114112.to_foorth_c
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_raises(XfOOrth::XfOOrthError) do
|
44
|
+
(-2).to_foorth_c
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
#Test for conversion to a numeric.
|
49
|
+
def test_to_number
|
50
|
+
assert_equal(65.to_foorth_n, 65)
|
51
|
+
assert_equal((65.1).to_foorth_n, 65.1)
|
52
|
+
assert_equal(Complex(65,0).to_foorth_n, Complex(65,0))
|
53
|
+
assert_equal(Rational(65,1).to_foorth_n, Rational(65,1))
|
54
|
+
end
|
55
|
+
|
56
|
+
#Test for conversion to a rational.
|
57
|
+
def test_to_rational
|
58
|
+
assert_equal(Rational(13,10), (1.3).to_foorth_r)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|