lib/nmatrix/rspec.rb
# = NMatrix
#
# A linear algebra library for scientific computation in Ruby.
# NMatrix is part of SciRuby.
#
# NMatrix was originally inspired by and derived from NArray, by
# Masahiro Tanaka: http://narray.rubyforge.org
#
# == Copyright Information
#
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
#
# Please see LICENSE.txt for additional copyright notices.
#
# == Contributing
#
# By contributing source code to SciRuby, you agree to be bound by
# our Contributor Agreement:
#
# * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
#
# == rspec.rb
#
# Monkey patches for RSpec improving its ability to work well with
# NMatrix (particularly #be_within).
#
require 'rspec'
# Amend RSpec to allow #be_within for matrices.
module RSpec::Matchers::BuiltIn
class BeWithin
def of(expected)
@expected = expected
@unit = ''
if expected.is_a?(NMatrix)
@tolerance = if @delta.is_a?(NMatrix)
@delta.abs
elsif @delta.is_a?(Array)
NMatrix.new(:dense, expected.shape, @delta, :object).abs.cast(:dtype => expected.abs_dtype)
else
(NMatrix.ones_like(expected) * @delta).abs
end
else
@tolerance = @delta
end
self
end
def percent_of(expected)
@expected = expected
@unit = '%'
@tolerance = @expected.abs * @delta / 100.0 # <- only change is to reverse abs and @delta
self
end
def matches?(actual)
@actual = actual
raise needs_expected unless defined? @expected
raise needs_subtractable unless @actual.respond_to? :-
res = (@actual - @expected).abs <= @tolerance
#if res.is_a?(NMatrix)
# require 'pry'
# binding.pry
#end
res.is_a?(NMatrix) ? !res.any? { |x| !x } : res
end
end
end