rpl.rb/spec/words_operations-reals-complexes_spec.rb

344 lines
12 KiB
Ruby
Raw Normal View History

2021-11-10 16:44:57 +01:00
# coding: utf-8
# frozen_string_literal: true
2022-02-17 15:09:29 +01:00
require 'minitest/autorun'
2021-11-10 16:44:57 +01:00
2022-02-15 17:06:19 +01:00
require 'rpl'
2021-11-10 16:44:57 +01:00
2022-08-31 13:19:35 +02:00
class TesttLanguageOperationsRealsAndComplexes < MiniTest::Test
2022-02-26 18:53:39 +01:00
include Types
2022-08-31 13:19:35 +02:00
# TODO: test complexes
2021-11-23 13:00:42 +01:00
def test_add
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 2 +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 3 )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 "a" +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplString, '"1a"' )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 \'a\' +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplName, "'1a'" )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 dup dup →list +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
2022-08-30 14:34:15 +02:00
Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
2021-12-16 16:34:59 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '"a" "b" +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplString, '"ab"' )],
interpreter.stack
2021-12-16 16:34:59 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '"a" \'b\' +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplString, '"ab"' )],
interpreter.stack
2021-12-16 16:34:59 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '"a" 1 +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplString, '"a1"' )],
interpreter.stack
2021-12-16 16:34:59 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '"a" 1 dup →list +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplList, [Types.new_object( RplString, '"a"' ),
2022-08-30 14:34:15 +02:00
Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
2021-12-16 16:34:59 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '\'a\' 1 +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplName, 'a1' )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '\'a\' "b" +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplString, '"ab"' )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '\'a\' \'b\' +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplName, "'ab'" )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '\'a\' 1 dup →list +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplList, [Types.new_object( RplName, 'a' ),
2022-08-30 14:34:15 +02:00
Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 a "test" 3 →list dup rev +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
2022-08-30 14:34:15 +02:00
Types.new_object( RplName, 'a' ),
Types.new_object( RplString, '"test"' ),
Types.new_object( RplString, '"test"' ),
Types.new_object( RplName, 'a' ),
Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
2021-11-10 16:44:57 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 a "test" 3 →list 9 +'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
2022-08-30 14:34:15 +02:00
Types.new_object( RplName, 'a' ),
Types.new_object( RplString, '"test"' ),
Types.new_object( RplNumeric, 9 )] )],
interpreter.stack
#################
# now with vars #
#################
interpreter = Rpl.new
interpreter.run '1 \'a\' sto 2 \'b\' sto a b + a b'
assert_equal [Types.new_object( RplNumeric, 3 ),
Types.new_object( RplNumeric, 1 ),
Types.new_object( RplNumeric, 2 )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '1 \'a\' sto "a" \'b\' sto a b + a b'
assert_equal [Types.new_object( RplString, '"1a"' ),
Types.new_object( RplNumeric, 1 ),
Types.new_object( RplString, '"a"' )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '1 \'a\' sto \'z\' \'b\' sto a b + a b'
assert_equal [Types.new_object( RplName, "'1z'" ),
Types.new_object( RplNumeric, 1 ),
Types.new_object( RplName, "'z'" )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '1 \'a\' sto a dup →list \'b\' sto a b + a b'
assert_equal [Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
Types.new_object( RplNumeric, 1 )] ),
Types.new_object( RplNumeric, 1 ),
Types.new_object( RplList, [Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '"a" \'a\' sto "b" \'b\' sto a b + a b'
assert_equal [Types.new_object( RplString, '"ab"' ),
Types.new_object( RplString, '"a"' ),
Types.new_object( RplString, '"b"' )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '"a" \'a\' sto \'z\' \'b\' sto a b + a b'
assert_equal [Types.new_object( RplString, '"az"' ),
Types.new_object( RplString, '"a"' ),
Types.new_object( RplName, "'z'" )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '"a" \'a\' sto 1 \'b\' sto a b + a b'
assert_equal [Types.new_object( RplString, '"a1"' ),
Types.new_object( RplString, '"a"' ),
Types.new_object( RplNumeric, 1 )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '"a" \'a\' sto 1 dup →list \'b\' sto a b + a b'
assert_equal [Types.new_object( RplList, [Types.new_object( RplString, '"a"' ),
Types.new_object( RplNumeric, 1 )] ),
Types.new_object( RplString, '"a"' ),
Types.new_object( RplList, [Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '\'z\' \'a\' sto 1 \'b\' sto a b + a b'
assert_equal [Types.new_object( RplName, 'z1' ),
Types.new_object( RplName, 'z' ),
Types.new_object( RplNumeric, 1 )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '\'z\' \'a\' sto "b" \'b\' sto a b + a b'
assert_equal [Types.new_object( RplString, '"zb"' ),
Types.new_object( RplName, "'z'" ),
Types.new_object( RplString, '"b"' )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '\'z\' \'a\' sto \'y\' \'b\' sto a b + a b'
assert_equal [Types.new_object( RplName, "'zy'" ),
Types.new_object( RplName, "'z'" ),
Types.new_object( RplName, "'y'" )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '\'z\' \'a\' sto 1 dup →list \'b\' sto a b + a b'
assert_equal [Types.new_object( RplList, [Types.new_object( RplName, "'z'" ),
Types.new_object( RplNumeric, 1 )] ),
Types.new_object( RplName, "'z'" ),
Types.new_object( RplList, [Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '1 z "test" 3 →list \'a\' sto a rev \'b\' sto a b + a b'
assert_equal [Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
Types.new_object( RplName, 'z' ),
Types.new_object( RplString, '"test"' ),
Types.new_object( RplString, '"test"' ),
Types.new_object( RplName, 'z' ),
Types.new_object( RplNumeric, 1 )] ),
Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
Types.new_object( RplName, 'z' ),
Types.new_object( RplString, '"test"' )] ),
Types.new_object( RplList, [Types.new_object( RplString, '"test"' ),
Types.new_object( RplName, 'z' ),
Types.new_object( RplNumeric, 1 )] )],
interpreter.stack
interpreter = Rpl.new
interpreter.run '1 a "test" 3 →list \'a\' sto 9 \'b\' sto a b + a b'
assert_equal [Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
Types.new_object( RplName, 'a' ),
Types.new_object( RplString, '"test"' ),
Types.new_object( RplNumeric, 9 )] ),
Types.new_object( RplList, [Types.new_object( RplNumeric, 1 ),
Types.new_object( RplName, 'a' ),
Types.new_object( RplString, '"test"' )] ),
Types.new_object( RplNumeric, 9 )],
interpreter.stack
2021-11-10 16:44:57 +01:00
end
2021-11-23 13:01:17 +01:00
def test_subtract
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 2 -'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, -1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '2 1 -'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_negate
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '-1 chs'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 chs'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, -1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_multiply
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '3 4 *'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 12 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_divide
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '3.0 4 /'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 0.75 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_inverse
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '4 inv'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 0.25 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_power
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '3 4 ^'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 81 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_sqrt
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '16 √'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 4 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_sq
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '4 sq'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 16 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_abs
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '-1 abs'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 abs'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_dec
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '0x1 dec'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_hex
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 hex'
2022-02-28 11:40:47 +01:00
expected_value = Types.new_object( RplNumeric, 1 )
expected_value.base = 16
assert_equal [expected_value],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_bin
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 bin'
2022-02-28 11:40:47 +01:00
expected_value = Types.new_object( RplNumeric, 1 )
expected_value.base = 2
assert_equal [expected_value],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_base
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '1 31 base'
2022-02-28 11:40:47 +01:00
expected_value = Types.new_object( RplNumeric, 1 )
expected_value.base = 31
assert_equal [expected_value],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
def test_sign
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '-10 sign'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, -1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '10 sign'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 1 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
2022-02-10 14:50:59 +01:00
interpreter = Rpl.new
interpreter.run '0 sign'
2022-02-28 11:40:47 +01:00
assert_equal [Types.new_object( RplNumeric, 0 )],
interpreter.stack
2021-11-23 13:01:17 +01:00
end
2021-11-10 16:44:57 +01:00
end