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
@@ -0,0 +1,38 @@
|
|
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 ObjectLibraryTester < Minitest::Test
|
11
|
+
|
12
|
+
include XfOOrthTestExtensions
|
13
|
+
|
14
|
+
#Track mini-test progress.
|
15
|
+
include MinitestVisible
|
16
|
+
|
17
|
+
def test_that_the_object_class_is_available
|
18
|
+
foorth_equal("Object", [Object])
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_getting_a_things_name
|
22
|
+
foorth_equal("Object .name", ['Object'])
|
23
|
+
foorth_equal("Class .name", ['Class'])
|
24
|
+
|
25
|
+
foorth_equal("Object .new .name", ['Object instance'])
|
26
|
+
foorth_equal("45 .name", ['Fixnum instance'])
|
27
|
+
foorth_equal('"Foobar" .name', ['String instance'])
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_getting_an_object_as_a_string
|
31
|
+
foorth_equal("4 .to_s", ['4'])
|
32
|
+
foorth_equal("Object .to_s", ['Object'])
|
33
|
+
foorth_equal("VirtualMachine .to_s", ['VirtualMachine'])
|
34
|
+
|
35
|
+
foorth_equal("4 .strlen", [1])
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,40 @@
|
|
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 ProcedureLibraryTester < Minitest::Test
|
11
|
+
|
12
|
+
include XfOOrthTestExtensions
|
13
|
+
|
14
|
+
#Track mini-test progress.
|
15
|
+
include MinitestVisible
|
16
|
+
|
17
|
+
def test_lambda_basics
|
18
|
+
foorth_equal("{{ }} .name ", ["Procedure instance"])
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_calling_lambdas
|
22
|
+
foorth_equal("1 {{ 99 + }} .call ", [100])
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_creating_a_thread
|
26
|
+
foorth_run('0 var$: $tcat2')
|
27
|
+
foorth_equal('{{ 1 $tcat2 ! }} .start drop 0.01 .sleep $tcat2 @', [1])
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_calling_with
|
31
|
+
foorth_equal('4 {{ self dup + }} .call_with', [8])
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_calling_x_v_and_vx
|
35
|
+
foorth_equal('4 {{ v dup + }} .call_v', [8])
|
36
|
+
foorth_equal('4 {{ x dup + }} .call_x', [8])
|
37
|
+
|
38
|
+
foorth_equal('5 4 {{ v x 2dup + }} .call_vx', [5, 4, 9])
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,66 @@
|
|
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 QueueLibraryTester < Minitest::Test
|
11
|
+
|
12
|
+
include XfOOrthTestExtensions
|
13
|
+
|
14
|
+
#Track mini-test progress.
|
15
|
+
include MinitestVisible
|
16
|
+
|
17
|
+
def test_the_queue_class_exists
|
18
|
+
foorth_equal('Queue', [Queue])
|
19
|
+
foorth_equal('Queue .new .class', [Queue])
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_some_queue_operations
|
23
|
+
foorth_run('Queue .new val$: $q')
|
24
|
+
foorth_equal('$q .empty?', [true])
|
25
|
+
foorth_equal('$q .length', [0])
|
26
|
+
|
27
|
+
foorth_equal('5 $q .push', [])
|
28
|
+
foorth_equal('$q .empty?', [false])
|
29
|
+
foorth_equal('$q .length', [1])
|
30
|
+
|
31
|
+
foorth_equal('6 $q .push', [])
|
32
|
+
foorth_equal('$q .empty?', [false])
|
33
|
+
foorth_equal('$q .length', [2])
|
34
|
+
|
35
|
+
foorth_equal('$q .pop' , [5])
|
36
|
+
foorth_equal('$q .empty?', [false])
|
37
|
+
foorth_equal('$q .length', [1])
|
38
|
+
|
39
|
+
foorth_equal('$q .pop' , [6])
|
40
|
+
foorth_equal('$q .empty?', [true])
|
41
|
+
foorth_equal('$q .length', [0])
|
42
|
+
|
43
|
+
foorth_equal('5 $q .push', [])
|
44
|
+
foorth_equal('$q .empty?', [false])
|
45
|
+
foorth_equal('$q .length', [1])
|
46
|
+
foorth_equal('$q .clear', [])
|
47
|
+
foorth_equal('$q .empty?', [true])
|
48
|
+
foorth_equal('$q .length', [0])
|
49
|
+
|
50
|
+
foorth_equal('"A" $q .push $q .pend', ["A"])
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_queues_between_threads
|
54
|
+
foorth_run('Queue .new val$: $q')
|
55
|
+
foorth_run('"Hello" $q .push')
|
56
|
+
foorth_run('{{ $q .pend . }} val$: $b')
|
57
|
+
foorth_output('$b .start 0.01 .sleep', "Hello")
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_that_it_catches_underflows
|
62
|
+
foorth_run('Queue .new val$: $q')
|
63
|
+
foorth_raises('$q .pop')
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative 'support/foorth_testing'
|
4
|
+
gem 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest_visible'
|
7
|
+
|
8
|
+
#Test the standard fOOrth library.
|
9
|
+
class StackLibraryTester < Minitest::Test
|
10
|
+
|
11
|
+
include XfOOrthTestExtensions
|
12
|
+
|
13
|
+
#Track mini-test progress.
|
14
|
+
include MinitestVisible
|
15
|
+
|
16
|
+
def test_the_stack_class_exists
|
17
|
+
foorth_equal('Stack', [XfOOrth::XfOOrth_Stack])
|
18
|
+
foorth_equal('Stack .name', ['Stack'])
|
19
|
+
foorth_equal('Stack .new .class', [XfOOrth::XfOOrth_Stack])
|
20
|
+
foorth_equal('Stack .new .name', ['Stack instance'])
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_some_stack_operations
|
24
|
+
foorth_run('Stack .new val$: $s')
|
25
|
+
foorth_equal('$s .empty?', [true])
|
26
|
+
foorth_equal('$s .length', [0])
|
27
|
+
|
28
|
+
foorth_equal('5 $s .push', [])
|
29
|
+
foorth_equal('$s .peek', [5])
|
30
|
+
foorth_equal('$s .empty?', [false])
|
31
|
+
foorth_equal('$s .length', [1])
|
32
|
+
|
33
|
+
foorth_equal('6 $s .push', [])
|
34
|
+
foorth_equal('$s .peek', [6])
|
35
|
+
foorth_equal('$s .empty?', [false])
|
36
|
+
foorth_equal('$s .length', [2])
|
37
|
+
|
38
|
+
foorth_equal('$s .pop', [6])
|
39
|
+
foorth_equal('$s .peek', [5])
|
40
|
+
foorth_equal('$s .empty?', [false])
|
41
|
+
foorth_equal('$s .length', [1])
|
42
|
+
|
43
|
+
foorth_equal('$s .pop', [5])
|
44
|
+
foorth_equal('$s .empty?', [true])
|
45
|
+
foorth_equal('$s .length', [0])
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_that_it_catches_underflows
|
50
|
+
foorth_run('Stack .new val$: $s')
|
51
|
+
|
52
|
+
foorth_raises('$s .pop')
|
53
|
+
foorth_raises('$s .peek')
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_stack_clear
|
58
|
+
foorth_run('Stack .new val$: $s')
|
59
|
+
|
60
|
+
foorth_run('42 $s .push')
|
61
|
+
foorth_equal('$s .empty?', [false])
|
62
|
+
foorth_equal('$s .peek', [42])
|
63
|
+
|
64
|
+
foorth_run('$s .clear')
|
65
|
+
|
66
|
+
foorth_equal('$s .empty?', [true])
|
67
|
+
foorth_raises('$s .peek')
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,208 @@
|
|
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 StandardLibraryTester < Minitest::Test
|
11
|
+
|
12
|
+
include XfOOrthTestExtensions
|
13
|
+
|
14
|
+
#Track mini-test progress.
|
15
|
+
include MinitestVisible
|
16
|
+
|
17
|
+
def test_basic_constants
|
18
|
+
refute(Thread.current[:vm].nil?)
|
19
|
+
|
20
|
+
foorth_equal("self", [XfOOrth::VirtualMachine.vm])
|
21
|
+
foorth_equal("true", [true])
|
22
|
+
foorth_equal("false", [false])
|
23
|
+
foorth_equal("nil", [nil])
|
24
|
+
|
25
|
+
foorth_equal("true .class .to_s", ['True'])
|
26
|
+
foorth_equal("false .class .to_s", ['False'])
|
27
|
+
foorth_equal("nil .class .to_s", ['Nil'])
|
28
|
+
|
29
|
+
foorth_equal("epsilon", [Float::EPSILON])
|
30
|
+
foorth_equal("infinity", [Float::INFINITY]) #and beyond...
|
31
|
+
foorth_equal("-infinity", [-Float::INFINITY])
|
32
|
+
foorth_equal("max_float", [Float::MAX])
|
33
|
+
foorth_equal("min_float", [Float::MIN])
|
34
|
+
foorth_equal("nan", [Float::NAN])
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_stack_manipulation
|
38
|
+
foorth_equal("1 2", [1, 2])
|
39
|
+
|
40
|
+
foorth_equal("1 2 drop", [1])
|
41
|
+
foorth_raises("drop")
|
42
|
+
|
43
|
+
foorth_equal("33 dup", [33,33])
|
44
|
+
foorth_raises("dup")
|
45
|
+
|
46
|
+
foorth_equal("false ?dup", [false])
|
47
|
+
foorth_equal("nil ?dup", [nil])
|
48
|
+
foorth_equal('"" ?dup', ["", ""])
|
49
|
+
foorth_equal("true ?dup", [true, true])
|
50
|
+
foorth_equal('"A" ?dup', ["A", "A"])
|
51
|
+
foorth_equal("1 ?dup", [1,1])
|
52
|
+
foorth_raises("?dup")
|
53
|
+
|
54
|
+
foorth_equal("1 2 swap", [2,1])
|
55
|
+
foorth_raises("1 swap")
|
56
|
+
foorth_raises("swap")
|
57
|
+
|
58
|
+
foorth_equal("1 2 3 rot", [2,3,1])
|
59
|
+
|
60
|
+
foorth_equal("1 2 over", [1,2,1])
|
61
|
+
|
62
|
+
foorth_equal("1 2 3 1 pick", [1,2,3,3])
|
63
|
+
foorth_equal("1 2 3 2 pick", [1,2,3,2])
|
64
|
+
foorth_equal("1 2 3 3 pick", [1,2,3,1])
|
65
|
+
foorth_raises("1 2 3 4 pick")
|
66
|
+
foorth_raises("1 2 3 -4 pick")
|
67
|
+
foorth_raises('1 2 3 "apple" pick')
|
68
|
+
|
69
|
+
foorth_equal("1 2 nip", [2])
|
70
|
+
foorth_raises("1 nip")
|
71
|
+
|
72
|
+
foorth_equal("1 2 tuck", [2,1,2])
|
73
|
+
foorth_raises("1 tuck")
|
74
|
+
foorth_raises("tuck")
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_the_double_stack_ops
|
78
|
+
foorth_equal('1 2 2drop', [])
|
79
|
+
foorth_equal('1 2 2dup', [1,2,1,2])
|
80
|
+
|
81
|
+
foorth_raises('1 2drop')
|
82
|
+
foorth_raises('1 2dup')
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_for_the_bored_identity
|
86
|
+
foorth_equal("33 33 identical?", [true])
|
87
|
+
foorth_equal("33 33 distinct?", [false])
|
88
|
+
|
89
|
+
foorth_equal('"33" "33" identical?', [false])
|
90
|
+
foorth_equal('"33" "33" distinct?', [true])
|
91
|
+
|
92
|
+
foorth_equal('"33" dup identical?', [true])
|
93
|
+
foorth_equal('"33" dup distinct?', [false])
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_dyadic_error_recovery
|
98
|
+
#Insufficient parameters.
|
99
|
+
foorth_equal('try 5 + catch end', [])
|
100
|
+
|
101
|
+
#Stub action.
|
102
|
+
foorth_equal('try false 5 + catch end', [])
|
103
|
+
|
104
|
+
#Bad parameters.
|
105
|
+
foorth_equal('try 5 false > catch end', [])
|
106
|
+
foorth_equal('try 5 false < catch end', [])
|
107
|
+
foorth_equal('try 5 false >= catch end', [])
|
108
|
+
foorth_equal('try 5 false <= catch end', [])
|
109
|
+
foorth_equal('try 5 false <=> catch end', [])
|
110
|
+
foorth_equal('try 5 false + catch end', [])
|
111
|
+
foorth_equal('try 5 false - catch end', [])
|
112
|
+
foorth_equal('try 5 false * catch end', [])
|
113
|
+
foorth_equal('try 5 false ** catch end', [])
|
114
|
+
foorth_equal('try 5 false / catch end', [])
|
115
|
+
foorth_equal('try 5 false mod catch end', [])
|
116
|
+
|
117
|
+
foorth_equal('try now false > catch end', [])
|
118
|
+
foorth_equal('try now false < catch end', [])
|
119
|
+
foorth_equal('try now false >= catch end', [])
|
120
|
+
foorth_equal('try now false <= catch end', [])
|
121
|
+
foorth_equal('try now false <=> catch end', [])
|
122
|
+
foorth_equal('try now false + catch end', [])
|
123
|
+
foorth_equal('try now false - catch end', [])
|
124
|
+
foorth_equal('try now false format catch end', [])
|
125
|
+
|
126
|
+
foorth_equal('try 10 .to_duration false > catch end', [])
|
127
|
+
foorth_equal('try 10 .to_duration false < catch end', [])
|
128
|
+
foorth_equal('try 10 .to_duration false >= catch end', [])
|
129
|
+
foorth_equal('try 10 .to_duration false <= catch end', [])
|
130
|
+
foorth_equal('try 10 .to_duration false <=> catch end', [])
|
131
|
+
foorth_equal('try 10 .to_duration false + catch end', [])
|
132
|
+
foorth_equal('try 10 .to_duration false - catch end', [])
|
133
|
+
foorth_equal('try 10 .to_duration false * catch end', [])
|
134
|
+
foorth_equal('try 10 .to_duration false / catch end', [])
|
135
|
+
foorth_equal('try 10 .to_duration f"%Z" catch end', [])
|
136
|
+
|
137
|
+
foorth_equal('try 11 false and catch end', [])
|
138
|
+
foorth_equal('try 11 false or catch end', [])
|
139
|
+
foorth_equal('try 11 false xor catch end', [])
|
140
|
+
foorth_equal('try 11 false << catch end', [])
|
141
|
+
foorth_equal('try 11 false >> catch end', [])
|
142
|
+
|
143
|
+
foorth_equal('try 11 false max catch end', [])
|
144
|
+
foorth_equal('try 11 false min catch end', [])
|
145
|
+
|
146
|
+
|
147
|
+
foorth_equal('try 11 false format catch end', [])
|
148
|
+
foorth_equal('try "a" false * catch end', [])
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_some_logical_and
|
153
|
+
foorth_equal("false false &&", [false])
|
154
|
+
foorth_equal("false true &&", [false])
|
155
|
+
foorth_equal("true false &&", [false])
|
156
|
+
foorth_equal("true true &&", [true ])
|
157
|
+
|
158
|
+
foorth_equal("nil false &&", [false])
|
159
|
+
foorth_equal("nil true &&", [false])
|
160
|
+
foorth_equal("true nil &&", [false])
|
161
|
+
foorth_equal("42 true &&", [true ])
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_some_logical_or
|
165
|
+
foorth_equal("false false ||", [false])
|
166
|
+
foorth_equal("false true ||", [true ])
|
167
|
+
foorth_equal("true false ||", [true ])
|
168
|
+
foorth_equal("true true ||", [true ])
|
169
|
+
|
170
|
+
foorth_equal("nil false ||", [false])
|
171
|
+
foorth_equal("nil true ||", [true ])
|
172
|
+
foorth_equal("true nil ||", [true ])
|
173
|
+
foorth_equal("42 true ||", [true ])
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_some_logical_xor
|
177
|
+
foorth_equal("false false ^^", [false])
|
178
|
+
foorth_equal("false true ^^", [true ])
|
179
|
+
foorth_equal("true false ^^", [true ])
|
180
|
+
foorth_equal("true true ^^", [false])
|
181
|
+
|
182
|
+
foorth_equal("nil false ^^", [false])
|
183
|
+
foorth_equal("nil true ^^", [true ])
|
184
|
+
foorth_equal("true nil ^^", [true ])
|
185
|
+
foorth_equal("42 true ^^", [false])
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_some_logical_not
|
189
|
+
foorth_equal("false not", [true ])
|
190
|
+
foorth_equal("true not", [false])
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_is_nil
|
194
|
+
foorth_equal("false nil=", [false])
|
195
|
+
foorth_equal("true nil=", [false])
|
196
|
+
foorth_equal("42 nil=", [false])
|
197
|
+
foorth_equal("nil nil=", [true])
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_is_not_nil
|
201
|
+
foorth_equal("false nil<>", [true])
|
202
|
+
foorth_equal("true nil<>", [true])
|
203
|
+
foorth_equal("42 nil<>", [true])
|
204
|
+
foorth_equal("nil nil<>", [false])
|
205
|
+
end
|
206
|
+
|
207
|
+
|
208
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative './support/foorth_testing'
|
4
|
+
gem 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest_visible'
|
7
|
+
|
8
|
+
#Test the standard fOOrth library.
|
9
|
+
class StdioLibraryTester < Minitest::Test
|
10
|
+
|
11
|
+
include XfOOrthTestExtensions
|
12
|
+
|
13
|
+
#Track mini-test progress.
|
14
|
+
include MinitestVisible
|
15
|
+
|
16
|
+
def test_the_dot
|
17
|
+
foorth_output('4 .', "4")
|
18
|
+
foorth_output('-4 .', "-4")
|
19
|
+
foorth_output('"test" .', "test")
|
20
|
+
foorth_output('Object .name .', "Object")
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_the_dot_quote
|
24
|
+
foorth_output('."test"', "test")
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_the_dot_cr
|
28
|
+
foorth_output('cr', "\n")
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_the_space
|
32
|
+
foorth_output('space', " ")
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_the_spaces
|
36
|
+
foorth_output('1 spaces', " ")
|
37
|
+
foorth_output('2 spaces', " ")
|
38
|
+
foorth_output('0 spaces', "")
|
39
|
+
foorth_raises('"apple" spaces')
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_the_emit
|
43
|
+
foorth_output(' 65 .emit', "A")
|
44
|
+
foorth_output('126 .emit', "~")
|
45
|
+
|
46
|
+
foorth_utf8_output('255 .emit', [195, 191])
|
47
|
+
|
48
|
+
foorth_output(' "A123" .emit', "A")
|
49
|
+
foorth_raises('1+1i .emit')
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|