Setting an STL container wrapper slice better matches the way Ruby arrays work. The behaviour is now the same as Ruby arrays. The only exception is the default value used when expanding a container cannot be nil as this is not a valid type/value for C++ container elements.
262 lines
5.2 KiB
Ruby
262 lines
5.2 KiB
Ruby
#!/usr/bin/env ruby
|
|
#
|
|
# Put description here
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
|
|
require 'swig_assert'
|
|
|
|
require 'li_std_vector'
|
|
|
|
include Li_std_vector
|
|
|
|
iv = IntVector.new(4)
|
|
|
|
swig_assert( "iv.respond_to? :each", binding )
|
|
|
|
begin
|
|
iv.each
|
|
swig_assert( false, nil, "iv.each worked with no block!")
|
|
rescue ArgumentError
|
|
end
|
|
|
|
swig_assert_each_line(<<'EOF', binding)
|
|
iv.respond_to?(:each) == true
|
|
iv.respond_to?(:each_with_index) == true
|
|
EOF
|
|
|
|
iv.each_with_index { |e,i|
|
|
swig_assert("#{e} == 0", binding, "for iv[#{i}] == 0")
|
|
}
|
|
|
|
0.upto(3) { |i| iv[i] = i }
|
|
|
|
{ "iv[-1]" => 3,
|
|
"iv.slice(0,2).to_s" => "01",
|
|
"iv.slice(1,2).to_s" => "12",
|
|
"iv[0,-2]" => nil,
|
|
"iv[0,3].to_s" => "012",
|
|
"iv[0,10].to_s" => "0123",
|
|
"iv[1..2].to_s" => '12',
|
|
"iv[1..3].to_s" => '123',
|
|
"iv[1..4].to_s" => '123',
|
|
"iv[1..-2].to_s" => '12',
|
|
"iv[2..-3].to_s" => '',
|
|
}.each do |k,v|
|
|
swig_assert( "#{k} == #{v.inspect}", binding )
|
|
end
|
|
|
|
swig_assert_each_line(<<'EOF', binding)
|
|
iv << 5
|
|
iv.push 5
|
|
iv.pop == 5
|
|
iv.unshift(7)
|
|
iv.shift == 7
|
|
iv.unshift(7, 3)
|
|
iv.insert(1,5)
|
|
iv.insert(0, 3)
|
|
iv.unshift(2,3,4)
|
|
x = average(iv)
|
|
y = average([1, 2, 3, 4])
|
|
half([10, 10.5, 11, 11.5])
|
|
EOF
|
|
|
|
iv = IntVector.new([0,1,2,3,4,5,6])
|
|
iv.delete_if { |x| x == 0 || x == 3 || x == 6 }
|
|
swig_assert_equal(iv.to_s, '1245', binding)
|
|
|
|
iv[1,2] = [-2, -4]
|
|
swig_assert_equal(iv.to_s, '1-2-45', binding)
|
|
|
|
iv = IntVector.new([0,1,2,3])
|
|
iv[0,1] = [-1, -2]
|
|
swig_assert_equal(iv.to_s, '-1-2123', binding)
|
|
|
|
iv = IntVector.new([1,2,3,4])
|
|
iv[1,3] = [6,7,8,9]
|
|
#__setitem__ needs fixing
|
|
#swig_assert_equal(iv.to_s, '16789', binding)
|
|
|
|
iv = IntVector.new([1,2,3,4])
|
|
|
|
swig_assert_equal(iv[0], 1, binding)
|
|
swig_assert_equal(iv[3], 4, binding)
|
|
swig_assert_equal(iv[4], nil, binding)
|
|
swig_assert_equal(iv[-5], nil, binding)
|
|
|
|
iv[-1] = 9
|
|
iv[-4] = 6
|
|
swig_assert_equal(iv.to_s, '6239', binding)
|
|
|
|
begin
|
|
iv[-5] = 99
|
|
raise "exception missed"
|
|
rescue IndexError
|
|
end
|
|
|
|
iv[6] = 5
|
|
swig_assert_equal(iv.to_s, '6239555', binding)
|
|
|
|
def failed(a, b, msg)
|
|
a = 'nil' if a == nil
|
|
b = 'nil' if b == nil
|
|
raise RuntimeError, "#{msg}: #{a} ... #{b}"
|
|
end
|
|
|
|
def compare_sequences(a, b)
|
|
if a != nil && b != nil
|
|
if a.size != b.size
|
|
failed(a, b, "different sizes")
|
|
end
|
|
for i in 0..a.size-1
|
|
failed(a, b, "elements are different") if a[i] != b[i]
|
|
end
|
|
else
|
|
unless a == nil && b == nil
|
|
failed(a, b, "only one of the sequences is nil")
|
|
end
|
|
end
|
|
end
|
|
|
|
def compare_expanded_sequences(a, b)
|
|
# a can contain nil elements which indicate additional elements
|
|
# b won't contain nil for additional elements
|
|
if a != nil && b != nil
|
|
if a.size != b.size
|
|
failed(a, b, "different sizes")
|
|
end
|
|
for i in 0..a.size-1
|
|
failed(a, b, "elements are different") if a[i] != b[i] && a[i] != nil
|
|
end
|
|
else
|
|
unless a == nil && b == nil
|
|
failed(a, b, "only one of the sequences is nil")
|
|
end
|
|
end
|
|
end
|
|
|
|
def check_slice(i, length)
|
|
aa = [1,2,3,4]
|
|
iv = IntVector.new(aa)
|
|
|
|
aa_slice = aa[i, length]
|
|
iv_slice = iv[i, length]
|
|
compare_sequences(aa_slice, iv_slice)
|
|
|
|
aa_slice = aa.slice(i, length)
|
|
iv_slice = iv.slice(i, length)
|
|
compare_sequences(aa_slice, iv_slice)
|
|
end
|
|
|
|
def check_range(i, j)
|
|
aa = [1,2,3,4]
|
|
iv = IntVector.new(aa)
|
|
|
|
aa_range = aa[i..j]
|
|
iv_range = iv[i..j]
|
|
compare_sequences(aa_range, iv_range)
|
|
|
|
aa_range = aa[Range.new(i, j, true)]
|
|
iv_range = iv[Range.new(i, j, true)]
|
|
compare_sequences(aa_range, iv_range)
|
|
end
|
|
|
|
def set_slice(i, length, expect_nil_expanded_elements)
|
|
aa = [1,2,3,4]
|
|
iv = IntVector.new(aa)
|
|
aa_new = [8, 9]
|
|
iv_new = IntVector.new(aa_new)
|
|
|
|
aa[i, length] = aa_new
|
|
iv[i, length] = iv_new
|
|
if expect_nil_expanded_elements
|
|
compare_expanded_sequences(aa, iv)
|
|
else
|
|
compare_sequences(aa, iv)
|
|
end
|
|
end
|
|
|
|
for i in -5..5
|
|
for length in -5..5
|
|
check_slice(i, length)
|
|
end
|
|
end
|
|
|
|
for i in -5..5
|
|
for j in -5..5
|
|
check_range(i, j)
|
|
end
|
|
end
|
|
|
|
for i in -4..4
|
|
for length in 0..4
|
|
set_slice(i, length, false)
|
|
end
|
|
end
|
|
|
|
for i in [5, 6]
|
|
for length in 0..5
|
|
set_slice(i, length, true)
|
|
end
|
|
end
|
|
|
|
|
|
dv = DoubleVector.new(10)
|
|
|
|
swig_assert( "dv.respond_to? :each_with_index", binding )
|
|
|
|
dv.each_with_index { |e,i| swig_assert_equal("dv[#{i}]", 0.0, binding) }
|
|
|
|
0.upto(9) { |i| dv[i] = i/2.0 }
|
|
|
|
{ "dv[-1]" => 4.5,
|
|
"dv.slice(0,2).to_s" => "0.00.5",
|
|
"dv[0,-2]" => nil,
|
|
"dv[0,3].to_s" => "0.00.51.0",
|
|
"dv[3,3].to_s" => "1.52.02.5",
|
|
}.each do |k,v|
|
|
swig_assert_equal( k, v.inspect, binding )
|
|
end
|
|
|
|
swig_assert_each_line(<<'EOF', binding)
|
|
dv.delete_at(2)
|
|
dv.delete_if { |x| x == 2.0 }
|
|
dv.include? 3.0
|
|
dv.find {|x| x == 3.0 }
|
|
dv.kind_of? DoubleVector
|
|
halved = []
|
|
halved = dv.map { |x| x / 2 }
|
|
halve_in_place(dv)
|
|
halved.to_a == dv.to_a
|
|
sv = StructVector.new
|
|
sv << Li_std_vector::Struct.new
|
|
sv[0].class == Li_std_vector::Struct
|
|
sv[1] = Li_std_vector::Struct.new
|
|
|
|
EOF
|
|
|
|
bv = BoolVector.new(2)
|
|
[true, false, true, true].each { |i| bv.push(i) }
|
|
0.upto(bv.size-1) { |i| bv[i] = !bv[i] }
|
|
bv_check = [true, true, false, true, false, false]
|
|
for i in 0..bv.size-1 do
|
|
swig_assert(bv_check[i] == bv[i], binding, "bv[#{i}]")
|
|
end
|
|
|
|
swig_assert_each_line(<<'EOF', binding)
|
|
lv = LanguageVector.new
|
|
lv << 1
|
|
lv << [1,2]
|
|
lv << 'asd'
|
|
lv[0], lv[1] = lv[1], lv[0]
|
|
EOF
|
|
|
|
|
|
# this should assert
|
|
begin
|
|
lv = LanguageVector.new('crapola')
|
|
rescue
|
|
end
|