require_relative '../test-util'

describe 'Model::PioneFloat' do
  before do
    @one = PioneFloat.new(1.0)
    @two = PioneFloat.new(2.0)
  end

  it 'should get a ruby object that has same value' do
    @one.to_ruby.should == 1.0
  end

  it 'should equal' do
    @one.should == PioneFloat.new(1.0)
  end

  it 'should not equal' do
    @one.should.not == PioneFloat.new(2.0)
    @one.should.not == PioneInteger.new(1)
  end

  describe 'pione method ==' do
    it 'should true' do
      @one.call_pione_method("==", PioneFloat.new(1.0)).should.true
    end

    it 'should false' do
      @one.call_pione_method("==", @two).should.not.true
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method("==", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method !=' do
    it 'should true' do
      @one.call_pione_method("!=", @two).should.true
    end

    it 'should false' do
      @one.call_pione_method("!=", PioneFloat.new(1.0)).should.not.true
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method("!=", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method >' do
    it 'should true' do
      @one.call_pione_method(">", PioneFloat.new(0.0)).should.true
    end

    it 'should false' do
      @one.call_pione_method(">", PioneFloat.new(1.0)).should.false
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method(">", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method >=' do
    it 'should true' do
      @one.call_pione_method(">=", PioneFloat.new(1.0)).should.true
    end

    it 'should false' do
      @one.call_pione_method(">=", @two).should.false
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method(">=", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method <' do
    it 'should true' do
      @one.call_pione_method("<", @two).should.true
    end

    it 'should false' do
      @one.call_pione_method("<", PioneFloat.new(1.0)).should.false
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method("<", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method <=' do
    it 'should true' do
      @one.call_pione_method("<=", PioneFloat.new(1.0)).should.true
    end

    it 'should false' do
      @one.call_pione_method("<=", PioneFloat.new(0.0)).should.false
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method("<=", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method +' do
    it 'should sum' do
      @one.call_pione_method("+", @one).should == @two
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method("+", PioneInteger.new(1))
      end
    end
  end

  describe 'pione method -' do
    it 'should get difference' do
      @two.call_pione_method("-", @one).should == @one
    end

    it 'should raise type error' do
      should.raise(PioneModelTypeError) do
        @one.call_pione_method("-", PioneInteger.new(1))
      end
    end
  end
end