require 'minitest/autorun'
require_relative 'example'
class FannTests < Minitest::Test
  def self.network; @network ||= XorExperiment.train; end
  def test_fit_truth_table
    p=XorExperiment::INPUTS.map { |row| XorExperiment.predict(self.class.network,row) }
    assert_equal [0,1,1,0],p.map { |v| v>=0.5 ? 1 : 0 }
    assert_operator p.zip([0,1,1,0]).sum { |a,b| (a-b)**2 }/4,:<,0.0025
  end
  def test_save_reload
    Dir.mktmpdir do |dir|
      path=File.join(dir,'model.net');self.class.network.save(path)
      loaded=RubyFann::Standard.new(filename: path)
      XorExperiment::INPUTS.each do |row|
        assert_in_delta XorExperiment.predict(self.class.network,row),XorExperiment.predict(loaded,row),1e-6
      end
    end
  end
  def test_input_contract
    [[],[0],[0,1,2],['0',1],[Float::NAN,0],[Float::INFINITY,0],[-1,0],[Complex(1,0),0]].each do |row|
      assert_raises(ArgumentError) { XorExperiment.predict(self.class.network,row) }
    end
  end
  def test_patched_zero_arity_method
    assert_kind_of Array,self.class.network.get_neurons
  end
end
