diff --git a/lib/parfait/data_object.rb b/lib/parfait/data_object.rb index 136ab8aa..6be314b5 100644 --- a/lib/parfait/data_object.rb +++ b/lib/parfait/data_object.rb @@ -22,22 +22,25 @@ module Parfait class DataObject < Object def initialize + super @memory = [] end def data_length raise "called #{self}" end def data_start - return type.length + return get_type.get_length end # 1 -based index def get_internal_word(index) + return super if index <= data_start @memory[index] end # 1 -based index def set_internal_word(index , value) + return super if index <= data_start raise "Word[#{index}] = nil" if( value.nil? ) @memory[index] = value value diff --git a/lib/parfait/integer.rb b/lib/parfait/integer.rb index 2a4c6421..408451be 100644 --- a/lib/parfait/integer.rb +++ b/lib/parfait/integer.rb @@ -11,19 +11,18 @@ module Parfait def initialize(value , next_i = nil) super() - @value = value @next_integer = next_i + set_internal_word(Integer.integer_index, value) end - attr_reader :next_integer, :value + attr_reader :next_integer + def value + get_internal_word(Integer.integer_index) + end def self.integer_index 3 # 1 type, 2 next_i end - def get_internal_word( index ) - return super(index) unless index == Integer.integer_index - return @value - end # :integer?, :odd?, :even?, :upto, :downto, :times, :succ, :next, :pred, :chr, :ord, :to_i, :to_int, :floor, # :ceil, :truncate, :round, :gcd, :lcm, :gcdlcm, :numerator, :denominator, :to_r, :rationalize, # :singleton_method_added, :coerce, :i, :+@, :-@, :fdiv, :div, :divmod, :%, :modulo, :remainder, :abs, :magnitude, diff --git a/test/parfait/test_integer.rb b/test/parfait/test_integer.rb new file mode 100644 index 00000000..a6b8b20a --- /dev/null +++ b/test/parfait/test_integer.rb @@ -0,0 +1,48 @@ +require_relative "../helper" + +module Parfait + class TestInteger < MiniTest::Test + + def setup + Risc.machine.boot + @int = Integer.new(10) + end + + def test_class + assert_equal :Integer, @int.get_type.object_class.name + end + def test_next_nil + assert_nil @int.next_integer + end + def test_next_not_nil + int2 = Integer.new(0 , @int) + assert_equal Integer, int2.next_integer.class + end + def test_value_10 + assert_equal 10 , @int.value + end + def test_word_value_10 + assert_equal 10 , @int.get_internal_word( Integer.integer_index ) + end + def test_word_settable + assert_equal 20 , @int.set_internal_word( Integer.integer_index , 20 ) + end + def test_word_set + assert_equal 20 , @int.set_internal_word( Integer.integer_index , 20 ) + assert_equal 20 , @int.get_internal_word( Integer.integer_index ) + end + def test_integer_first + assert Parfait.object_space.next_integer + end + def test_integer_20 + int = Parfait.object_space.next_integer + 20.times do + assert int + assert_equal Parfait::Integer , int.class + assert int.get_internal_word(2) + int = int.next_integer + end + end + + end +end diff --git a/test/parfait/test_space.rb b/test/parfait/test_space.rb index 7911a857..45c63ea6 100644 --- a/test/parfait/test_space.rb +++ b/test/parfait/test_space.rb @@ -22,17 +22,6 @@ class TestSpace < MiniTest::Test assert @space.false_object , "No lies" assert @space.nil_object , "No nothing" end - def test_integer_first - assert @space.next_integer - end - def test_integer_20 - int = @space.next_integer - 20.times do - assert int - assert_equal Parfait::Integer , int.class - int = int.next_integer - end - end def test_methods_booted word = @space.get_class_by_name(:Word).instance_type assert_equal 4 , word.method_names.get_length