require 'rubygems'
require "test/unit"
require 'shoulda'

require '../../config' if @platform == nil
require 'mdarray'

class MDArrayTest < Test::Unit::TestCase

  context "Arithmetic Tests" do

    setup do

      # create a = [20 30 40 50]
      @a = MDArray.arange(20, 60, 10)
      # create b = [0 1 2 3]
      @b = MDArray.arange(4)
      # create c = [1.87 5.34 7.18 8.84]
      @c = MDArray.double([4], [1.87, 5.34, 7.18, 8.84])
      # create d = [[1 2] [3 4]]
      @d = MDArray.int([2, 2], [1, 2, 3, 4])
      # creates an array from a function (actually a block).  The name fromfunction
      # is preserved to maintain API compatibility with NumPy (is it necessary?)
      @e = MDArray.fromfunction("double", [4, 5, 6]) do |x, y, z|
        3.21 * (x + y + z)
      end
      @f = MDArray.fromfunction("double", [4, 5, 6]) do |x, y, z|
        9.57 * x + y + z
      end

      @bool1 = MDArray.boolean([4], [true, false, true, false])
      @bool2 = MDArray.boolean([4], [false, false, true, true])
            
    end # setup

    #-------------------------------------------------------------------------------------
    #
    #-------------------------------------------------------------------------------------

    should "work with boolean arrays and operators" do

      # elementwise boolean operations supported
      result = @bool1.and(@bool2)
      assert_equal("false false true false ", result.to_string)

      result = @bool2.and(@bool1)
      assert_equal("false false true false ", result.to_string)

      # Cannot overload 'and', so using '&' as an alias to 'and'
      result = @bool1 & @bool2
      assert_equal("false false true false ", result.to_string)

      result = @bool2.or(@bool1)
      assert_equal("true false true true ", result.to_string)

      # Cannot overload or, so using | as an alias to or
      result = @bool2 | @bool1
      assert_equal("true false true true ", result.to_string)

      result = @bool1.not
      assert_equal("false true false true ", result.to_string)
      
    end

  end

end