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,116 @@
|
|
|
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 ClassLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_that_the_class_class_is_available
|
|
18
|
+
foorth_equal("Class", [Class])
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_that_we_can_tell_classes_from_non_classes
|
|
22
|
+
foorth_equal("Class .is_class?", [true])
|
|
23
|
+
foorth_equal("Object .is_class?", [true])
|
|
24
|
+
foorth_equal("Object .new .is_class?", [false])
|
|
25
|
+
|
|
26
|
+
foorth_equal("Numeric .is_class?", [true])
|
|
27
|
+
foorth_equal("42 .is_class?", [false])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_that_we_can_find_the_class_of_a_thing
|
|
31
|
+
foorth_equal("Class .class", [Class])
|
|
32
|
+
foorth_equal("Object .class", [Class])
|
|
33
|
+
|
|
34
|
+
foorth_equal("Object .new .class", [Object])
|
|
35
|
+
foorth_equal("42 .class", [Fixnum])
|
|
36
|
+
foorth_equal('"foobar" .class', [String])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_that_we_can_find_the_parent_of_a_class
|
|
40
|
+
foorth_equal("Class .parent_class", [Object])
|
|
41
|
+
foorth_equal("Object .parent_class", [nil])
|
|
42
|
+
|
|
43
|
+
foorth_run('class: TTWCFTPC')
|
|
44
|
+
foorth_equal("TTWCFTPC .parent_class", [Object])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_the_creation_of_a_class
|
|
48
|
+
foorth_equal("class: T1", [])
|
|
49
|
+
|
|
50
|
+
foorth_equal("T1", [XfOOrth::XfOOrth_T1])
|
|
51
|
+
foorth_equal("T1 .parent_class", [Object])
|
|
52
|
+
foorth_equal("T1 .name", ['T1'])
|
|
53
|
+
foorth_equal("T1 .new .name", ['T1 instance'])
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_deferred_class_creation
|
|
57
|
+
foorth_run(" true if class: T1B then ")
|
|
58
|
+
foorth_equal("T1B .name", ["T1B"])
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_deferred_subclass_creation
|
|
62
|
+
foorth_run(" true if Object .subclass: T1C then ")
|
|
63
|
+
foorth_equal("T1C .name", ["T1C"])
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_the_creation_of_a_sub_class
|
|
67
|
+
foorth_equal("class: T2", [])
|
|
68
|
+
foorth_equal("T2 .subclass: T3", [])
|
|
69
|
+
|
|
70
|
+
foorth_equal("T3", [XfOOrth::XfOOrth_T3])
|
|
71
|
+
foorth_equal("T3 .parent_class", [XfOOrth::XfOOrth_T2])
|
|
72
|
+
foorth_equal("T3 .name", ['T3'])
|
|
73
|
+
foorth_equal("T3 .new .name", ['T3 instance'])
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_creating_an_init_method
|
|
77
|
+
foorth_equal("class: T4", [])
|
|
78
|
+
foorth_equal("T4 .: .init 2 4 6 8 ;", [])
|
|
79
|
+
|
|
80
|
+
foorth_equal("T4 .new .name", [2, 4, 6, 8, 'T4 instance'])
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_creating_an_instance_var
|
|
84
|
+
foorth_equal("class: T5", [])
|
|
85
|
+
foorth_equal("T5 .: .init var@: @a ;", [])
|
|
86
|
+
foorth_equal("T5 .: .a@ @a @ ;", [])
|
|
87
|
+
|
|
88
|
+
foorth_equal("10 T5 .new .a@", [10])
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_creating_an_accessor
|
|
92
|
+
foorth_equal("class: T6", [])
|
|
93
|
+
foorth_equal("T6 .: .init var@: @a ;", [])
|
|
94
|
+
foorth_equal("T6 .: .a@ @a @ ;", [])
|
|
95
|
+
foorth_equal("T6 .: .a! @a ! ;", [])
|
|
96
|
+
|
|
97
|
+
foorth_equal("nil T6 .new dup 100 swap .a! .a@", [100])
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_creating_an_instance_val
|
|
101
|
+
foorth_equal("class: T7", [])
|
|
102
|
+
foorth_equal("T7 .: .init val@: @a ;", [])
|
|
103
|
+
foorth_equal("T7 .: .a@ @a ;", [])
|
|
104
|
+
|
|
105
|
+
foorth_equal("10 T7 .new .a@", [10])
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_the_checking_of_classes
|
|
109
|
+
foorth_equal('12 Numeric .check', [12])
|
|
110
|
+
foorth_equal('"12" Numeric .check', [nil])
|
|
111
|
+
|
|
112
|
+
foorth_equal('12 Numeric .check!', [12])
|
|
113
|
+
foorth_raises('"12" Numeric .check!')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
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 CloneLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_some_cloning_around
|
|
18
|
+
foorth_equal("33 clone", [33,33])
|
|
19
|
+
foorth_equal("33 .clone", [33])
|
|
20
|
+
|
|
21
|
+
foorth_equal("33 clone identical?", [true])
|
|
22
|
+
foorth_equal("33 clone distinct?", [false])
|
|
23
|
+
|
|
24
|
+
foorth_equal('"33" clone identical?', [false])
|
|
25
|
+
foorth_equal('"33" clone distinct?', [true])
|
|
26
|
+
|
|
27
|
+
foorth_equal('"33" dup .clone identical?', [false])
|
|
28
|
+
foorth_equal('"33" dup .clone distinct?', [true])
|
|
29
|
+
|
|
30
|
+
foorth_equal('[ "33" ] clone distinct?', [true])
|
|
31
|
+
foorth_equal('[ "33" ] clone @ swap @ distinct?', [true])
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_some_clone_exclusion
|
|
36
|
+
foorth_run('class: Tscx')
|
|
37
|
+
foorth_run('Tscx .: .init "a" val@: @a "b" val@: @b ;')
|
|
38
|
+
foorth_run('Tscx .: .a @a ;')
|
|
39
|
+
foorth_run('Tscx .: .b @b ;')
|
|
40
|
+
foorth_run('Tscx .: .clone_exclude [ "@b" ] ;')
|
|
41
|
+
foorth_run('Tscx .new val$: $tscx1')
|
|
42
|
+
foorth_run('$tscx1 .clone val$: $tscx2')
|
|
43
|
+
|
|
44
|
+
foorth_equal('$tscx1 .clone_exclude', [["@b"]])
|
|
45
|
+
|
|
46
|
+
foorth_equal('$tscx1 .a', ["a"])
|
|
47
|
+
foorth_equal('$tscx1 .b', ["b"])
|
|
48
|
+
foorth_equal('$tscx2 .a', ["a"])
|
|
49
|
+
foorth_equal('$tscx2 .b', ["b"])
|
|
50
|
+
|
|
51
|
+
foorth_run('$tscx1 .a "1" <<')
|
|
52
|
+
foorth_run('$tscx1 .b "1" <<')
|
|
53
|
+
|
|
54
|
+
foorth_equal('$tscx1 .a', ["a1"])
|
|
55
|
+
foorth_equal('$tscx1 .b', ["b1"])
|
|
56
|
+
foorth_equal('$tscx2 .a', ["a"])
|
|
57
|
+
foorth_equal('$tscx2 .b', ["b1"])
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_array_clone_exclusion
|
|
62
|
+
foorth_run('[ "a" "b" ] val$: $tacx1')
|
|
63
|
+
foorth_run('$tacx1 .:: .clone_exclude [ 1 ] ;')
|
|
64
|
+
foorth_run('$tacx1 .clone val$: $tacx2')
|
|
65
|
+
|
|
66
|
+
foorth_equal('$tacx1 .clone_exclude', [[1]])
|
|
67
|
+
foorth_equal('$tacx2 .clone_exclude', [[1]])
|
|
68
|
+
|
|
69
|
+
foorth_equal('$tacx1', [["a", "b"]])
|
|
70
|
+
foorth_equal('$tacx2', [["a", "b"]])
|
|
71
|
+
|
|
72
|
+
foorth_run('0 $tacx1 .[]@ "1" <<')
|
|
73
|
+
foorth_run('1 $tacx1 .[]@ "1" <<')
|
|
74
|
+
|
|
75
|
+
foorth_equal('$tacx1', [["a1", "b1"]])
|
|
76
|
+
foorth_equal('$tacx2', [["a", "b1"]])
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_hash_clone_exclusion
|
|
80
|
+
foorth_run('{ 0 "a" -> 1 "b" -> } val$: $thcx1')
|
|
81
|
+
foorth_run('$thcx1 .:: .clone_exclude [ 1 ] ;')
|
|
82
|
+
foorth_run('$thcx1 .clone val$: $thcx2')
|
|
83
|
+
|
|
84
|
+
foorth_equal('$thcx1 .clone_exclude', [[1]])
|
|
85
|
+
foorth_equal('$thcx2 .clone_exclude', [[1]])
|
|
86
|
+
|
|
87
|
+
foorth_equal('$thcx1', [{0=>"a", 1=>"b"}])
|
|
88
|
+
foorth_equal('$thcx2', [{0=>"a", 1=>"b"}])
|
|
89
|
+
|
|
90
|
+
foorth_run('0 $thcx1 .[]@ "1" <<')
|
|
91
|
+
foorth_run('1 $thcx1 .[]@ "1" <<')
|
|
92
|
+
|
|
93
|
+
foorth_equal('$thcx1', [{0=>"a1", 1=>"b1"}])
|
|
94
|
+
foorth_equal('$thcx2', [{0=>"a", 1=>"b1"}])
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_some_copying_too
|
|
98
|
+
foorth_equal("33 copy", [33,33])
|
|
99
|
+
foorth_equal("33 .copy", [33])
|
|
100
|
+
|
|
101
|
+
foorth_equal('"33" copy identical?', [false])
|
|
102
|
+
foorth_equal('"33" copy distinct?', [true])
|
|
103
|
+
|
|
104
|
+
foorth_equal('[ "33" ] copy distinct?', [true])
|
|
105
|
+
foorth_equal('[ "33" ] copy @ swap @ distinct?', [false])
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
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 ComparisonTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_greater_than
|
|
18
|
+
foorth_raises("Object .new 4 > ")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_max_and_min
|
|
22
|
+
foorth_equal("4 2 max", [4])
|
|
23
|
+
|
|
24
|
+
foorth_equal("4 2 min", [2])
|
|
25
|
+
|
|
26
|
+
foorth_equal('"4" "2" max', ["4"])
|
|
27
|
+
foorth_equal('"4" "2" min', ["2"])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_more_holistically
|
|
31
|
+
foorth_equal("[ 2 4 -2 1/2 555 8 -33 17 ] val$: $tmw", [])
|
|
32
|
+
|
|
33
|
+
foorth_equal("infinity $tmw .each{{ v min }} ", [-33])
|
|
34
|
+
foorth_equal("-infinity $tmw .each{{ v max }} ", [555])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_greater_than
|
|
38
|
+
foorth_equal('4 4 > ', [false])
|
|
39
|
+
foorth_equal('4 5 > ', [false])
|
|
40
|
+
foorth_equal('5 4 > ', [true])
|
|
41
|
+
|
|
42
|
+
foorth_equal('"4" "4" > ', [false])
|
|
43
|
+
foorth_equal('"4" 4 > ', [false])
|
|
44
|
+
foorth_equal('"4" "5" > ', [false])
|
|
45
|
+
foorth_equal('"4" 5 > ', [false])
|
|
46
|
+
foorth_equal('"5" "4" > ', [true])
|
|
47
|
+
foorth_equal('"5" 4 > ', [true])
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_less_than
|
|
51
|
+
foorth_equal('4 4 < ', [false])
|
|
52
|
+
foorth_equal('4 5 < ', [true])
|
|
53
|
+
foorth_equal('5 4 < ', [false])
|
|
54
|
+
|
|
55
|
+
foorth_equal('"4" "4" < ', [false])
|
|
56
|
+
foorth_equal('"4" 4 < ', [false])
|
|
57
|
+
foorth_equal('"4" "5" < ', [true])
|
|
58
|
+
foorth_equal('"4" 5 < ', [true])
|
|
59
|
+
foorth_equal('"5" "4" < ', [false])
|
|
60
|
+
foorth_equal('"5" 4 < ', [false])
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_greater_or_equal
|
|
64
|
+
foorth_equal('4 4 >= ', [true])
|
|
65
|
+
foorth_equal('4 5 >= ', [false])
|
|
66
|
+
foorth_equal('5 4 >= ', [true])
|
|
67
|
+
|
|
68
|
+
foorth_equal('"4" "4" >= ', [true])
|
|
69
|
+
foorth_equal('"4" 4 >= ', [true])
|
|
70
|
+
foorth_equal('"4" "5" >= ', [false])
|
|
71
|
+
foorth_equal('"4" 5 >= ', [false])
|
|
72
|
+
foorth_equal('"5" "4" >= ', [true])
|
|
73
|
+
foorth_equal('"5" 4 >= ', [true])
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_less_or_equal
|
|
77
|
+
foorth_equal('4 4 <= ', [true])
|
|
78
|
+
foorth_equal('4 5 <= ', [true])
|
|
79
|
+
foorth_equal('5 4 <= ', [false])
|
|
80
|
+
|
|
81
|
+
foorth_equal('"4" "4" <= ', [true])
|
|
82
|
+
foorth_equal('"4" 4 <= ', [true])
|
|
83
|
+
foorth_equal('"4" "5" <= ', [true])
|
|
84
|
+
foorth_equal('"4" 5 <= ', [true])
|
|
85
|
+
foorth_equal('"5" "4" <= ', [false])
|
|
86
|
+
foorth_equal('"5" 4 <= ', [false])
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_the_compare_operator
|
|
90
|
+
foorth_equal('4 4 <=>', [0])
|
|
91
|
+
foorth_equal('4 5 <=>', [-1])
|
|
92
|
+
foorth_equal('5 4 <=>', [1])
|
|
93
|
+
|
|
94
|
+
foorth_equal('"4" "4" <=>', [0])
|
|
95
|
+
foorth_equal('"4" 4 <=>', [0])
|
|
96
|
+
foorth_equal('"4" "5" <=>', [-1])
|
|
97
|
+
foorth_equal('"4" 5 <=>', [-1])
|
|
98
|
+
foorth_equal('"5" "4" <=>', [1])
|
|
99
|
+
foorth_equal('"5" 4 <=>', [1])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_some_comparisons_with_zero
|
|
103
|
+
foorth_equal('-2 0= ', [false])
|
|
104
|
+
foorth_equal('0 0= ', [true])
|
|
105
|
+
foorth_equal('4 0= ', [false])
|
|
106
|
+
|
|
107
|
+
foorth_equal('-4 0<> ', [true])
|
|
108
|
+
foorth_equal('0 0<> ', [false])
|
|
109
|
+
foorth_equal('5 0<> ', [true])
|
|
110
|
+
|
|
111
|
+
foorth_equal('-1 0> ', [false])
|
|
112
|
+
foorth_equal('0 0> ', [false])
|
|
113
|
+
foorth_equal('4 0> ', [true])
|
|
114
|
+
|
|
115
|
+
foorth_equal('4 0< ', [false])
|
|
116
|
+
foorth_equal('-5 0< ', [true])
|
|
117
|
+
foorth_equal('0 0< ', [false])
|
|
118
|
+
|
|
119
|
+
foorth_equal('4 0>= ', [true])
|
|
120
|
+
foorth_equal('-5 0>= ', [false])
|
|
121
|
+
foorth_equal('0 0>= ', [true])
|
|
122
|
+
|
|
123
|
+
foorth_equal('-4 0<= ', [true])
|
|
124
|
+
foorth_equal('0 0<= ', [true])
|
|
125
|
+
foorth_equal('4 0<= ', [false])
|
|
126
|
+
|
|
127
|
+
foorth_equal('0 0<=>', [0])
|
|
128
|
+
foorth_equal('-5 0<=>', [-1])
|
|
129
|
+
foorth_equal('4 0<=>', [1])
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
@@ -0,0 +1,190 @@
|
|
|
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 fOOrth compile library.
|
|
10
|
+
class CompileLibraryTester < Minitest::Test
|
|
11
|
+
|
|
12
|
+
include XfOOrthTestExtensions
|
|
13
|
+
|
|
14
|
+
#Track mini-test progress.
|
|
15
|
+
include MinitestVisible
|
|
16
|
+
|
|
17
|
+
def test_creating_simple_words
|
|
18
|
+
foorth_equal(': dbl dup + ; 4 dbl', [8])
|
|
19
|
+
foorth_equal('9 dbl', [18])
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_creating_immediate_words
|
|
23
|
+
foorth_equal('!: five 5 ;', [])
|
|
24
|
+
foorth_equal('five', [5])
|
|
25
|
+
|
|
26
|
+
foorth_equal(': six five 6 ;', [5])
|
|
27
|
+
foorth_equal('six', [6])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_simple_word_override
|
|
31
|
+
foorth_equal(': foo 3 * ; 4 foo', [12])
|
|
32
|
+
foorth_equal('5 foo', [15])
|
|
33
|
+
foorth_equal(': foo 4 * ; 4 foo', [16])
|
|
34
|
+
foorth_equal('5 foo', [20])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_creating_methods
|
|
38
|
+
foorth_equal('Numeric .: .dbl self dup + ; 4 .dbl', [8])
|
|
39
|
+
foorth_equal('9 .dbl', [18])
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_methods_override
|
|
43
|
+
foorth_equal('Numeric .: .foo self 3 * ; 4 .foo', [12])
|
|
44
|
+
foorth_equal('5 .foo', [15])
|
|
45
|
+
foorth_equal('Numeric .: .foo self 4 * ; 4 .foo', [16])
|
|
46
|
+
foorth_equal('5 .foo', [20])
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_words_with_local_vars
|
|
50
|
+
foorth_equal(': lvt1 dup var: lv lv @ * ;' , [])
|
|
51
|
+
foorth_equal('10 lvt1 ' , [100])
|
|
52
|
+
|
|
53
|
+
foorth_equal(': lvt2 val: lv lv 10 * ;' , [])
|
|
54
|
+
foorth_equal('10 lvt2 ' , [100])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_private_methods
|
|
58
|
+
foorth_equal('class: PMTC', [])
|
|
59
|
+
foorth_equal('PMTC .: ~t10 10 * ; ', [])
|
|
60
|
+
foorth_equal('PMTC .: .t11 dup ~t10 + ; ', [])
|
|
61
|
+
foorth_equal('5 PMTC .new .t11 ', [55])
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_some_invalid_names
|
|
65
|
+
foorth_run('class: TSIN')
|
|
66
|
+
|
|
67
|
+
foorth_raises('TSIN .: Bad ."wow" ; ')
|
|
68
|
+
foorth_raises('TSIN .: @ad ."wow" ; ')
|
|
69
|
+
foorth_raises('TSIN .: $ad ."wow" ; ')
|
|
70
|
+
foorth_raises('TSIN .: #ad ."wow" ; ')
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_spec_mapping
|
|
75
|
+
foorth_run('class: TempClass')
|
|
76
|
+
foorth_run('TempClass .: .hi_aaa 42 ; ')
|
|
77
|
+
|
|
78
|
+
foorth_run('class: TempOther')
|
|
79
|
+
foorth_run('TempOther .: .hi_aaa 69 ; ')
|
|
80
|
+
|
|
81
|
+
foorth_equal('TempClass .new .hi_aaa', [42] )
|
|
82
|
+
foorth_equal('TempOther .new .hi_aaa', [69] )
|
|
83
|
+
|
|
84
|
+
foorth_run('TempClass .: + 42 + ; ')
|
|
85
|
+
foorth_run('TempOther .: + 69 + ; ')
|
|
86
|
+
|
|
87
|
+
foorth_equal('TempClass .new 10 + ', [52] )
|
|
88
|
+
foorth_equal('TempOther .new 10 + ', [79] )
|
|
89
|
+
|
|
90
|
+
foorth_run('TempClass .: add 42 + ; ')
|
|
91
|
+
foorth_run('TempOther .: add 69 + ; ')
|
|
92
|
+
|
|
93
|
+
foorth_equal('TempClass .new 10 add ', [52] )
|
|
94
|
+
foorth_equal('TempOther .new 10 add ', [79] )
|
|
95
|
+
|
|
96
|
+
foorth_run(': booboo 5 ;')
|
|
97
|
+
foorth_raises('TempClass .: booboo 6 ;')
|
|
98
|
+
|
|
99
|
+
foorth_run('TempClass .: bambam 6 ;')
|
|
100
|
+
foorth_raises(': bambam 5 ;')
|
|
101
|
+
|
|
102
|
+
foorth_raises('TempClass .: .seesaw" 6 ;')
|
|
103
|
+
|
|
104
|
+
foorth_equal('String .: .seesaw" self 2 * ; ', [])
|
|
105
|
+
foorth_equal(' .seesaw"ab" ', ['abab'])
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_methods_with_local_vars
|
|
110
|
+
foorth_equal('Object .: .lvt5 dup var: lv lv @ * ;' , [])
|
|
111
|
+
foorth_equal('10 Object .new .lvt5 ' , [100])
|
|
112
|
+
|
|
113
|
+
foorth_equal('Object .: .lvt6 val: lv lv 10 * ;' , [])
|
|
114
|
+
foorth_equal('10 Object .new .lvt6 ' , [100])
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_exclusive_methods
|
|
119
|
+
foorth_equal('class: X1 ' , [])
|
|
120
|
+
foorth_equal('X1 .new var$: $a' , [])
|
|
121
|
+
foorth_equal('X1 .new var$: $b' , [])
|
|
122
|
+
|
|
123
|
+
foorth_equal('X1 .: .foobar "foo" ; ' , [])
|
|
124
|
+
|
|
125
|
+
foorth_equal('$a @ .foobar' , ['foo'])
|
|
126
|
+
foorth_equal('$b @ .foobar' , ['foo'])
|
|
127
|
+
|
|
128
|
+
foorth_equal('$b @ .:: .foobar "bar" ;' , [])
|
|
129
|
+
|
|
130
|
+
foorth_equal('$a @ .foobar' , ['foo'])
|
|
131
|
+
foorth_equal('$b @ .foobar' , ['bar'])
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_the_super_method
|
|
135
|
+
foorth_equal('class: X2 ' , [])
|
|
136
|
+
foorth_equal('X2 .new var$: $c' , [])
|
|
137
|
+
foorth_equal('X2 .: .foo 1 ; ' , [])
|
|
138
|
+
foorth_equal('$c @ .foo' , [1])
|
|
139
|
+
|
|
140
|
+
foorth_equal('X2 .subclass: X3 ' , [])
|
|
141
|
+
foorth_equal('X3 .new var$: $d' , [])
|
|
142
|
+
foorth_equal('X3 .: .foo if super else 2 then ; ' , [])
|
|
143
|
+
|
|
144
|
+
foorth_equal('true $d @ .foo' , [1])
|
|
145
|
+
foorth_equal('false $d @ .foo' , [2])
|
|
146
|
+
|
|
147
|
+
foorth_equal('$c @ .foo' , [1])
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_for_unbalanced_code
|
|
151
|
+
foorth_raises('true if ')
|
|
152
|
+
foorth_raises('true if : blah ')
|
|
153
|
+
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_for_delayed_compile
|
|
157
|
+
foorth_run('true if : tfdc_foo "foo" ; then')
|
|
158
|
+
foorth_equal('tfdc_foo', ["foo"])
|
|
159
|
+
|
|
160
|
+
foorth_run('false if : tfdc_bar "bar" ; then')
|
|
161
|
+
foorth_raises('tfdc_bar')
|
|
162
|
+
|
|
163
|
+
foorth_run('true if !: tfdd_foo "foo" ; then')
|
|
164
|
+
foorth_equal('tfdd_foo', ["foo"])
|
|
165
|
+
|
|
166
|
+
foorth_run('false if !: tfdd_bar "bar" ; then')
|
|
167
|
+
foorth_raises('tfdd_bar')
|
|
168
|
+
|
|
169
|
+
foorth_run('true if Object .: .tfde_foo "foo" ; then')
|
|
170
|
+
foorth_equal('Object .new .tfde_foo', ["foo"])
|
|
171
|
+
|
|
172
|
+
foorth_run('false if Object .: .tfde_bar "bar" ; then')
|
|
173
|
+
foorth_raises('Object .new .tfde_bar')
|
|
174
|
+
|
|
175
|
+
foorth_run('Object .new val$: $tfdf_obj')
|
|
176
|
+
foorth_run('true if $tfdf_obj .:: .tfdf_foo "foo" ; then')
|
|
177
|
+
foorth_equal('$tfdf_obj .tfdf_foo', ["foo"])
|
|
178
|
+
|
|
179
|
+
foorth_run('false if $tfdf_obj .:: .tfdf_bar "bar" ; then')
|
|
180
|
+
foorth_raises('$tfdf_obj .tfdf_bar')
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def test_for_FILE_method
|
|
184
|
+
foorth_equal('_FILE_', ['A string.'])
|
|
185
|
+
|
|
186
|
+
nm = File.absolute_path('integration/_FILE_test.foorth')
|
|
187
|
+
foorth_equal('"integration/_FILE_test.foorth" .load ', [nm, 7, nm])
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|