| #!/usr/bin/env ruby |
| # |
| # Tests the bounds checking for integral parameters passed to wrapped functions. |
| # |
| |
| require 'swig_assert' |
| require 'numeric_bounds_checking' |
| |
| limits = Numeric_bounds_checking::Limits.new |
| checker = Numeric_bounds_checking::Checker.new |
| |
| all_ok = true |
| |
| types = %w(schar uchar |
| shrt ushrt |
| int uint |
| long ulong) |
| types += %w(llong ullong) if limits.respond_to?(:llong_min) |
| |
| types.each do |t| |
| min = limits.send("#{t}_min") |
| max = limits.send("#{t}_max") |
| |
| meth = "pass_#{t}" |
| |
| # check within bounds |
| swig_assert_equal("checker.#{meth}(#{min})", "#{min}", binding) |
| swig_assert_equal("checker.#{meth}(#{max})", "#{max}", binding) |
| |
| # check outside bounds |
| [ min - 1, max + 1 ].each do |val| |
| ok = false |
| begin |
| ret = checker.send("#{meth}", val) |
| rescue RangeError, TypeError |
| ok = true |
| end |
| $stderr.puts "\n#{meth}(#{val}): Expected exception but got #{ret} for #{val} (type '#{t}') " unless ok |
| all_ok = all_ok && ok |
| end |
| raise SwigRubyError.new("\nAt least one bounds check failed ") unless all_ok |
| end |