fOOrth 0.5.0
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.
- 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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../lib/fOOrth'
|
|
4
|
+
require_relative 'support/foorth_testing'
|
|
5
|
+
gem 'minitest'
|
|
6
|
+
require 'minitest/autorun'
|
|
7
|
+
require 'minitest_visible'
|
|
8
|
+
|
|
9
|
+
#Test the standard fOOrth library.
|
|
10
|
+
class CtrlStructLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_if_else_then_constructs
|
|
18
|
+
foorth_equal('1 if "yay" then', ['yay'])
|
|
19
|
+
foorth_equal('false if "yay" then', [])
|
|
20
|
+
foorth_equal('1 if "yay" else "nay" then', ['yay'])
|
|
21
|
+
foorth_equal('nil if "yay" else "nay" then', ['nay'])
|
|
22
|
+
|
|
23
|
+
foorth_raises('false if ."yes" else ."no" else ."NO" then ')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_switch_constructs
|
|
27
|
+
foorth_equal('switch 5 end', [5])
|
|
28
|
+
|
|
29
|
+
foorth_run(': tsw switch 1 = if "one" break then "other" end ; ')
|
|
30
|
+
|
|
31
|
+
foorth_equal(' 1 tsw', ["one"])
|
|
32
|
+
foorth_equal(' 2 tsw', ["other"])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_begin_until_contructs
|
|
36
|
+
foorth_equal('1 begin dup 1 + dup 3 >= until', [1,2,3])
|
|
37
|
+
foorth_equal('1 begin dup 1 + dup 3 < while again', [1,2,3])
|
|
38
|
+
foorth_equal('1 begin dup 1 + dup 3 < while repeat', [1,2,3])
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_do_loop_contructs
|
|
42
|
+
foorth_equal('1 4 do i loop', [1,2,3])
|
|
43
|
+
foorth_equal('1 4 do -i loop', [3,2,1])
|
|
44
|
+
|
|
45
|
+
foorth_equal('1 4 do i 1 +loop', [1,2,3])
|
|
46
|
+
foorth_equal('1 4 do -i 1 +loop', [3,2,1])
|
|
47
|
+
|
|
48
|
+
foorth_equal('1 10 do i 3 +loop', [1,4,7])
|
|
49
|
+
foorth_equal('1 10 do -i 3 +loop', [9,6,3])
|
|
50
|
+
|
|
51
|
+
foorth_equal('3 10 do i 3 +loop', [3,6,9])
|
|
52
|
+
foorth_equal('3 10 do -i 3 +loop', [9,6,3])
|
|
53
|
+
|
|
54
|
+
foorth_equal('1 4 do 1 3 do j loop loop', [1,1,2,2,3,3])
|
|
55
|
+
foorth_equal('1 4 do 1 3 do -j loop loop', [3,3,2,2,1,1])
|
|
56
|
+
|
|
57
|
+
foorth_equal('1 4 do 1 3 do i j loop loop', [1,1,2,1,1,2,2,2,1,3,2,3])
|
|
58
|
+
|
|
59
|
+
foorth_equal('1 4 do 1 3 do i j * loop loop', [1,2,2,4,3,6])
|
|
60
|
+
|
|
61
|
+
foorth_raises('0 10 do 0 +loop')
|
|
62
|
+
foorth_raises('0 10 do -1 +loop')
|
|
63
|
+
foorth_raises('0 10 do "apple" +loop')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_with_constructs
|
|
67
|
+
foorth_equal('4 .with{{ self 2* }}', [8])
|
|
68
|
+
|
|
69
|
+
foorth_run(': twc01 4 .with{{ self 2* }} ;')
|
|
70
|
+
foorth_equal('twc01', [8])
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_for_unsupported_structures
|
|
74
|
+
foorth_raises('4 .new{{ }}')
|
|
75
|
+
foorth_raises('4 .each{{ }}')
|
|
76
|
+
foorth_raises('4 .map{{ }}')
|
|
77
|
+
foorth_raises('4 .select{{ }}')
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../lib/fOOrth'
|
|
4
|
+
require_relative 'support/foorth_testing'
|
|
5
|
+
gem 'minitest'
|
|
6
|
+
require 'minitest/autorun'
|
|
7
|
+
require 'minitest_visible'
|
|
8
|
+
|
|
9
|
+
#Test the standard fOOrth library.
|
|
10
|
+
class DataRefLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_basic_thread_variables
|
|
18
|
+
foorth_equal('10 var#: #test1', [])
|
|
19
|
+
foorth_equal('#test1 @', [10])
|
|
20
|
+
foorth_equal('20 #test1 !', [])
|
|
21
|
+
foorth_equal('#test1 @', [20])
|
|
22
|
+
|
|
23
|
+
foorth_equal('10 val#: #test2', [])
|
|
24
|
+
foorth_equal('#test2', [10])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_thread_vars_some_more
|
|
28
|
+
foorth_run('42 val#: #ttvsm ')
|
|
29
|
+
foorth_output('#ttvsm .', "42")
|
|
30
|
+
foorth_output('{{ #ttvsm . }} .call ', "42")
|
|
31
|
+
foorth_output('{{ #ttvsm . }} .start 0.001 .sleep ', "42")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_basic_global_variables
|
|
35
|
+
foorth_equal('10 var$: $test1', [])
|
|
36
|
+
foorth_equal('$test1 @', [10])
|
|
37
|
+
foorth_equal('20 $test1 !', [])
|
|
38
|
+
foorth_equal('$test1 @', [20])
|
|
39
|
+
|
|
40
|
+
foorth_equal('10 val$: $test2', [])
|
|
41
|
+
foorth_equal('$test2', [10])
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../lib/fOOrth'
|
|
4
|
+
require_relative 'support/foorth_testing'
|
|
5
|
+
gem 'minitest'
|
|
6
|
+
require 'minitest/autorun'
|
|
7
|
+
require 'minitest_visible'
|
|
8
|
+
|
|
9
|
+
#Test the standard fOOrth library.
|
|
10
|
+
class ExceptionLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_for_exception_patches
|
|
18
|
+
assert_equal("E15: ZeroDivisionError", ZeroDivisionError.new.foorth_message)
|
|
19
|
+
assert_equal("F123: oops", XfOOrth::XfOOrthError.new("F123: oops").foorth_message)
|
|
20
|
+
assert_equal("A123: oh oh", XfOOrth::XfOOrthError.new("A123: oh oh").foorth_message)
|
|
21
|
+
|
|
22
|
+
assert(ZeroDivisionError.new.foorth_match('E'))
|
|
23
|
+
assert(ZeroDivisionError.new.foorth_match('E1'))
|
|
24
|
+
assert(ZeroDivisionError.new.foorth_match('E15'))
|
|
25
|
+
|
|
26
|
+
refute(ZeroDivisionError.new.foorth_match('F'))
|
|
27
|
+
refute(ZeroDivisionError.new.foorth_match('E2'))
|
|
28
|
+
refute(ZeroDivisionError.new.foorth_match('E12'))
|
|
29
|
+
refute(ZeroDivisionError.new.foorth_match('E1501'))
|
|
30
|
+
|
|
31
|
+
assert_equal("E??:" , Exception.new.foorth_code)
|
|
32
|
+
assert_equal("E:" , StandardError.new.foorth_code)
|
|
33
|
+
assert_equal("E15:" , ZeroDivisionError.new.foorth_code)
|
|
34
|
+
assert_equal("F12,33:", XfOOrth::XfOOrthError.new("F12,33: oops").foorth_code)
|
|
35
|
+
assert_equal("A12,93:", XfOOrth::XfOOrthError.new("A12,93: oh oh").foorth_code)
|
|
36
|
+
assert_equal("E12,E2BIG:", Errno::E2BIG.new.foorth_code)
|
|
37
|
+
assert_equal("E30:", SignalException.new("INT").foorth_code)
|
|
38
|
+
assert_equal("E30,01:", Interrupt.new.foorth_code)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_for_try_blocks
|
|
42
|
+
foorth_equal('try 5 end', [5])
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_for_try_catch
|
|
46
|
+
foorth_equal('try 5 0 + catch 6 end ', [5])
|
|
47
|
+
foorth_equal('try 5 0 / catch 6 end ', [6])
|
|
48
|
+
foorth_equal('try 5 0 / catch error end ', ["E15: divided by 0"])
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_for_exception_methods
|
|
52
|
+
foorth_equal('try 5 0 / catch ?"E15" if 0 then end ', [0])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_with_finally
|
|
56
|
+
foorth_equal('try 5 0 + drop catch finally "apple" end', ["apple"])
|
|
57
|
+
foorth_equal('try 5 0 / drop catch finally "apple" end', ["apple"])
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_for_bad_constructs_errors
|
|
61
|
+
foorth_raises('try 5 0 / catch 6 catch ."YA!" end ')
|
|
62
|
+
foorth_raises('try 5 0 / finally 6 finally ."YA!" end ')
|
|
63
|
+
foorth_raises('try 5 0 / catch 6 finally error ."YA!" end ')
|
|
64
|
+
foorth_raises('try 5 0 / catch 6 finally ?"E150" ."YA!" end ')
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_for_error_error
|
|
69
|
+
foorth_raises('try 5 0 error end')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_for_error_bouncing
|
|
73
|
+
foorth_run(': test_bounce try .ceil catch ?"E15" if "WTF?" else bounce then end ;')
|
|
74
|
+
foorth_equal('try 1+1i test_bounce catch "Got it!" end', ["Got it!"])
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_raising_an_exception
|
|
78
|
+
foorth_raises(' "F99 Error!!!" .throw')
|
|
79
|
+
foorth_raises(' throw"F99 Error!!!" ')
|
|
80
|
+
|
|
81
|
+
foorth_equal('try "err msg" .throw catch error end', ["err msg"])
|
|
82
|
+
foorth_equal('try throw"err msg" catch error end', ["err msg"])
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../lib/fOOrth'
|
|
4
|
+
require_relative 'support/foorth_testing'
|
|
5
|
+
gem 'minitest'
|
|
6
|
+
require 'minitest/autorun'
|
|
7
|
+
require 'minitest_visible'
|
|
8
|
+
|
|
9
|
+
#Test the standard fOOrth library.
|
|
10
|
+
class FiberBundleLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_that_the_fiber_classes_exist
|
|
18
|
+
foorth_equal('Fiber', [XfOOrth::XfOOrth_Fiber])
|
|
19
|
+
foorth_equal('Bundle', [XfOOrth::XfOOrth_Bundle])
|
|
20
|
+
foorth_equal('SyncBundle', [XfOOrth::XfOOrth_SyncBundle])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Fiber tests!
|
|
24
|
+
|
|
25
|
+
def test_creating_a_fiber
|
|
26
|
+
test_code = <<-EOS
|
|
27
|
+
Fiber .new{{ }} .class .name
|
|
28
|
+
EOS
|
|
29
|
+
|
|
30
|
+
foorth_equal(test_code, ["Fiber"])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_fiber_processing
|
|
34
|
+
test_code = <<-EOS
|
|
35
|
+
// Create a fibonacci fiber.
|
|
36
|
+
Fiber .new{{ 1 1 11 do i * yield loop .yield }} val$: $fac
|
|
37
|
+
|
|
38
|
+
0 10 do $fac .step loop $fac .step
|
|
39
|
+
EOS
|
|
40
|
+
|
|
41
|
+
foorth_equal(test_code, [3628800])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_fiber_processing_data
|
|
45
|
+
test_code = <<-EOS
|
|
46
|
+
// Create a fibonacci fiber.
|
|
47
|
+
Fiber .new{{ 1 1 begin dup .yield over + swap again }} val$: $fib
|
|
48
|
+
|
|
49
|
+
0 8 do $fib .step loop
|
|
50
|
+
EOS
|
|
51
|
+
|
|
52
|
+
foorth_equal(test_code, [1, 1, 2, 3, 5, 8, 13, 21])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_fiber_processing_overrun
|
|
56
|
+
test_code = <<-EOS
|
|
57
|
+
// Create a fiber fiber.
|
|
58
|
+
Fiber .new{{ 0 5 do i .yield loop }} val$: $ovr
|
|
59
|
+
|
|
60
|
+
0 8 do $ovr .step loop
|
|
61
|
+
EOS
|
|
62
|
+
|
|
63
|
+
foorth_raises(test_code)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_for_fiber_alive_and_status
|
|
67
|
+
foorth_run('Fiber .new{{ yield }} val$: $alive')
|
|
68
|
+
|
|
69
|
+
foorth_equal('$alive .alive?', [true])
|
|
70
|
+
foorth_equal('$alive .status', ["new"])
|
|
71
|
+
|
|
72
|
+
foorth_equal('$alive .step $alive .alive?', [true])
|
|
73
|
+
foorth_equal('$alive .status', ["alive"])
|
|
74
|
+
|
|
75
|
+
foorth_equal('$alive .step $alive .alive?', [false])
|
|
76
|
+
foorth_equal('$alive .status', ["dead"])
|
|
77
|
+
|
|
78
|
+
foorth_raises('$alive .step')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_for_bad_yield
|
|
82
|
+
foorth_raises('5 .yield')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_making_a_fiber_from_a_procedure
|
|
86
|
+
test_code = <<-EOS
|
|
87
|
+
// Create a fibonacci fiber.
|
|
88
|
+
{{ 1 1 begin dup .yield over + swap again }} .to_fiber val$: $fib
|
|
89
|
+
|
|
90
|
+
0 8 do $fib .step loop
|
|
91
|
+
EOS
|
|
92
|
+
|
|
93
|
+
foorth_equal(test_code, [1, 1, 2, 3, 5, 8, 13, 21])
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_making_a_fiber_from_not_a_procedure
|
|
97
|
+
foorth_raises('42 .to_fiber')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_getting_the_current_fiber
|
|
101
|
+
foorth_run('Fiber .new{{ Fiber .current .yield }} val$: $current')
|
|
102
|
+
|
|
103
|
+
foorth_equal('Fiber .current', [nil])
|
|
104
|
+
|
|
105
|
+
symbol = XfOOrth::SymbolMap.map('$current')
|
|
106
|
+
current = eval "#{'$' + symbol.to_s}"
|
|
107
|
+
|
|
108
|
+
foorth_equal('$current .step', [current])
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_converting_a_fiber_to_a_fiber
|
|
112
|
+
foorth_run('Fiber .new{{ }} val$: $current')
|
|
113
|
+
|
|
114
|
+
symbol = XfOOrth::SymbolMap.map('$current')
|
|
115
|
+
current = eval "#{'$' + symbol.to_s}"
|
|
116
|
+
|
|
117
|
+
foorth_equal('$current .to_fiber', [current])
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
#Bundle tests!
|
|
121
|
+
|
|
122
|
+
def test_making_a_bundle_of_fibers
|
|
123
|
+
test_code = <<-EOS
|
|
124
|
+
// Create a bunch of fibers.
|
|
125
|
+
[ {{ 1 .yield }} {{ 2 .yield }} {{ 3 .yield }} ] .to_bundle val$: $bundle
|
|
126
|
+
|
|
127
|
+
$bundle .run
|
|
128
|
+
EOS
|
|
129
|
+
|
|
130
|
+
foorth_equal(test_code, [1, 2, 3])
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_making_a_bundle_of_one_fiber
|
|
134
|
+
test_code = <<-EOS
|
|
135
|
+
// Create a bunch of one fiber.
|
|
136
|
+
{{ 1 .yield }} .to_bundle val$: $bundle
|
|
137
|
+
|
|
138
|
+
$bundle .run
|
|
139
|
+
EOS
|
|
140
|
+
|
|
141
|
+
foorth_equal(test_code, [1])
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_making_a_bundle_of_nested_fibers
|
|
145
|
+
test_code = <<-EOS
|
|
146
|
+
// Create a bunch of fibers.
|
|
147
|
+
[ {{ 2 .yield }} {{ 4 .yield 5 .yield }} ] .to_bundle val$: $sub
|
|
148
|
+
|
|
149
|
+
[ {{ 1 .yield }} $sub {{ 3 .yield }} ] .to_bundle val$: $bundle
|
|
150
|
+
|
|
151
|
+
$bundle .run
|
|
152
|
+
EOS
|
|
153
|
+
|
|
154
|
+
foorth_equal(test_code, [1, 2, 3, 4, 5])
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_a_bundle_one_step_at_time
|
|
158
|
+
test_code = <<-EOS
|
|
159
|
+
// Create a bunch of fibers.
|
|
160
|
+
[ {{ 2 .yield }} {{ 4 .yield 5 .yield }} ] .to_bundle val$: $sub
|
|
161
|
+
|
|
162
|
+
[ {{ 1 .yield }} $sub {{ 3 .yield }} ] .to_bundle val$: $bundle
|
|
163
|
+
EOS
|
|
164
|
+
|
|
165
|
+
foorth_run(test_code)
|
|
166
|
+
foorth_equal('$bundle .alive?', [true])
|
|
167
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
168
|
+
foorth_equal('$bundle .length', [3])
|
|
169
|
+
|
|
170
|
+
foorth_equal('$bundle .step', [1])
|
|
171
|
+
foorth_equal('$bundle .alive?', [true])
|
|
172
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
173
|
+
foorth_equal('$bundle .length', [3])
|
|
174
|
+
|
|
175
|
+
foorth_equal('$bundle .step', [2])
|
|
176
|
+
foorth_equal('$bundle .alive?', [true])
|
|
177
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
178
|
+
foorth_equal('$bundle .length', [3])
|
|
179
|
+
|
|
180
|
+
foorth_equal('$bundle .step', [3])
|
|
181
|
+
foorth_equal('$bundle .alive?', [true])
|
|
182
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
183
|
+
foorth_equal('$bundle .length', [3])
|
|
184
|
+
|
|
185
|
+
foorth_equal('$bundle .step', [])
|
|
186
|
+
foorth_equal('$bundle .alive?', [true])
|
|
187
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
188
|
+
foorth_equal('$bundle .length', [2])
|
|
189
|
+
|
|
190
|
+
foorth_equal('$bundle .step', [4])
|
|
191
|
+
foorth_equal('$bundle .alive?', [true])
|
|
192
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
193
|
+
foorth_equal('$bundle .length', [2])
|
|
194
|
+
|
|
195
|
+
foorth_equal('$bundle .step', [])
|
|
196
|
+
foorth_equal('$bundle .alive?', [true])
|
|
197
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
198
|
+
foorth_equal('$bundle .length', [1])
|
|
199
|
+
|
|
200
|
+
foorth_equal('$bundle .step', [])
|
|
201
|
+
foorth_equal('$bundle .alive?', [true])
|
|
202
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
203
|
+
foorth_equal('$bundle .length', [1])
|
|
204
|
+
|
|
205
|
+
foorth_equal('$bundle .step', [5])
|
|
206
|
+
foorth_equal('$bundle .alive?', [true])
|
|
207
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
208
|
+
foorth_equal('$bundle .length', [1])
|
|
209
|
+
|
|
210
|
+
foorth_equal('$bundle .step', [])
|
|
211
|
+
foorth_equal('$bundle .alive?', [false])
|
|
212
|
+
foorth_equal('$bundle .status', ["dead"])
|
|
213
|
+
foorth_equal('$bundle .length', [0])
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def test_converting_a_bundle_to_a_fiber
|
|
217
|
+
foorth_run('[ {{ }} {{ }} ] .to_bundle val$: $test')
|
|
218
|
+
|
|
219
|
+
symbol = XfOOrth::SymbolMap.map('$test')
|
|
220
|
+
test = eval "#{'$' + symbol.to_s}"
|
|
221
|
+
|
|
222
|
+
foorth_equal('$test .to_fiber', [test])
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def test_converting_a_proc_to_a_bundle
|
|
226
|
+
foorth_run('{{ }} .to_bundle val$: $test')
|
|
227
|
+
|
|
228
|
+
symbol = XfOOrth::SymbolMap.map('$test')
|
|
229
|
+
test = eval "#{'$' + symbol.to_s}"
|
|
230
|
+
|
|
231
|
+
foorth_equal('$test .to_fiber', [test])
|
|
232
|
+
foorth_equal('$test .alive?', [true])
|
|
233
|
+
foorth_equal('$test .length', [1])
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def test_adding_fibers_to_a_bundle
|
|
237
|
+
foorth_run('Bundle .new val$: $add')
|
|
238
|
+
foorth_equal('{{ }} $add .add $add .length', [1])
|
|
239
|
+
foorth_equal('{{ }} $add .add $add .length', [2])
|
|
240
|
+
foorth_equal('{{ }} $add .add $add .length', [3])
|
|
241
|
+
foorth_equal('{{ }} $add .add $add .length', [4])
|
|
242
|
+
|
|
243
|
+
foorth_raises('42 $add .add $add .length')
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def test_making_a_bundle_of_not_fibers
|
|
247
|
+
foorth_raises('[ 1 2 3 ] .to_bundle')
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
#Synchronized Bundle tests!
|
|
251
|
+
|
|
252
|
+
def test_making_a_sync_bundle_of_fibers
|
|
253
|
+
test_code = <<-EOS
|
|
254
|
+
// Create a bunch of fibers.
|
|
255
|
+
[ {{ 1 .yield }} {{ 2 .yield }} {{ 3 .yield }} ] .to_sync_bundle val$: $bundle
|
|
256
|
+
|
|
257
|
+
$bundle .run
|
|
258
|
+
EOS
|
|
259
|
+
|
|
260
|
+
foorth_equal(test_code, [1, 2, 3])
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def test_making_a_sync_bundle_of_one_fiber
|
|
264
|
+
test_code = <<-EOS
|
|
265
|
+
// Create a bunch of one fiber.
|
|
266
|
+
{{ 1 .yield }} .to_sync_bundle val$: $bundle
|
|
267
|
+
|
|
268
|
+
$bundle .run
|
|
269
|
+
EOS
|
|
270
|
+
|
|
271
|
+
foorth_equal(test_code, [1])
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def test_making_a_sync_bundle_of_nested_fibers
|
|
275
|
+
test_code = <<-EOS
|
|
276
|
+
// Create a bunch of fibers.
|
|
277
|
+
[ {{ 2 .yield }} {{ 4 .yield 5 .yield }} ] .to_bundle val$: $sub
|
|
278
|
+
|
|
279
|
+
[ {{ 1 .yield }} $sub {{ 3 .yield }} ] .to_sync_bundle val$: $bundle
|
|
280
|
+
|
|
281
|
+
$bundle .run
|
|
282
|
+
EOS
|
|
283
|
+
|
|
284
|
+
foorth_equal(test_code, [1, 2, 3, 4, 5])
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_a_sync_bundle_one_step_at_time
|
|
288
|
+
test_code = <<-EOS
|
|
289
|
+
// Create a bunch of fibers.
|
|
290
|
+
[ {{ 2 .yield }} {{ 4 .yield 5 .yield }} ] .to_bundle val$: $sub
|
|
291
|
+
|
|
292
|
+
[ {{ 1 .yield }} $sub {{ 3 .yield }} ] .to_sync_bundle val$: $bundle
|
|
293
|
+
EOS
|
|
294
|
+
|
|
295
|
+
foorth_run(test_code)
|
|
296
|
+
foorth_equal('$bundle .alive?', [true])
|
|
297
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
298
|
+
foorth_equal('$bundle .length', [3])
|
|
299
|
+
|
|
300
|
+
foorth_equal('$bundle .step', [1])
|
|
301
|
+
foorth_equal('$bundle .alive?', [true])
|
|
302
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
303
|
+
foorth_equal('$bundle .length', [3])
|
|
304
|
+
|
|
305
|
+
foorth_equal('$bundle .step', [2])
|
|
306
|
+
foorth_equal('$bundle .alive?', [true])
|
|
307
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
308
|
+
foorth_equal('$bundle .length', [3])
|
|
309
|
+
|
|
310
|
+
foorth_equal('$bundle .step', [3])
|
|
311
|
+
foorth_equal('$bundle .alive?', [true])
|
|
312
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
313
|
+
foorth_equal('$bundle .length', [3])
|
|
314
|
+
|
|
315
|
+
foorth_equal('$bundle .step', [])
|
|
316
|
+
foorth_equal('$bundle .alive?', [true])
|
|
317
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
318
|
+
foorth_equal('$bundle .length', [2])
|
|
319
|
+
|
|
320
|
+
foorth_equal('$bundle .step', [4])
|
|
321
|
+
foorth_equal('$bundle .alive?', [true])
|
|
322
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
323
|
+
foorth_equal('$bundle .length', [2])
|
|
324
|
+
|
|
325
|
+
foorth_equal('$bundle .step', [])
|
|
326
|
+
foorth_equal('$bundle .alive?', [true])
|
|
327
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
328
|
+
foorth_equal('$bundle .length', [1])
|
|
329
|
+
|
|
330
|
+
foorth_equal('$bundle .step', [])
|
|
331
|
+
foorth_equal('$bundle .alive?', [true])
|
|
332
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
333
|
+
foorth_equal('$bundle .length', [1])
|
|
334
|
+
|
|
335
|
+
foorth_equal('$bundle .step', [5])
|
|
336
|
+
foorth_equal('$bundle .alive?', [true])
|
|
337
|
+
foorth_equal('$bundle .status', ["alive"])
|
|
338
|
+
foorth_equal('$bundle .length', [1])
|
|
339
|
+
|
|
340
|
+
foorth_equal('$bundle .step', [])
|
|
341
|
+
foorth_equal('$bundle .alive?', [false])
|
|
342
|
+
foorth_equal('$bundle .status', ["dead"])
|
|
343
|
+
foorth_equal('$bundle .length', [0])
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def test_converting_a_sync_bundle_to_a_fiber
|
|
347
|
+
foorth_run('[ {{ }} {{ }} ] .to_sync_bundle val$: $test')
|
|
348
|
+
|
|
349
|
+
symbol = XfOOrth::SymbolMap.map('$test')
|
|
350
|
+
test = eval "#{'$' + symbol.to_s}"
|
|
351
|
+
|
|
352
|
+
foorth_equal('$test .to_fiber', [test])
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def test_converting_a_proc_to_a_sync_bundle
|
|
356
|
+
foorth_run('{{ }} .to_sync_bundle val$: $test')
|
|
357
|
+
|
|
358
|
+
symbol = XfOOrth::SymbolMap.map('$test')
|
|
359
|
+
test = eval "#{'$' + symbol.to_s}"
|
|
360
|
+
|
|
361
|
+
foorth_equal('$test .to_fiber', [test])
|
|
362
|
+
foorth_equal('$test .alive?', [true])
|
|
363
|
+
foorth_equal('$test .length', [1])
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def test_adding_fibers_to_a_sync_bundle
|
|
367
|
+
foorth_run('SyncBundle .new val$: $add')
|
|
368
|
+
foorth_equal('{{ }} $add .add $add .length', [1])
|
|
369
|
+
foorth_equal('{{ }} $add .add $add .length', [2])
|
|
370
|
+
foorth_equal('{{ }} $add .add $add .length', [3])
|
|
371
|
+
foorth_equal('{{ }} $add .add $add .length', [4])
|
|
372
|
+
|
|
373
|
+
foorth_raises('42 $add .add $add .length')
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
def test_making_a_sync_bundle_of_not_fibers
|
|
377
|
+
foorth_raises('[ 1 2 3 ] .to_sync_bundle')
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
end
|