require 'test_helper'

module Vedeu

  module Geometry

    describe Dimension do

      let(:described)  { Vedeu::Geometry::Dimension }
      let(:instance)   { described.new(attributes) }
      let(:attributes) {
        {
          d:         d,
          dn:        dn,
          d_dn:      d_dn,
          default:   default,
          maximised: maximised,
          centred:   centred,
        }
      }
      let(:d)         {}
      let(:dn)        {}
      let(:d_dn)      {}
      let(:default)   {}
      let(:maximised) {}
      let(:centred)   {}

      describe '#initialize' do
        it { instance.must_be_instance_of(described) }
        it { instance.instance_variable_get('@d').must_equal(d) }
        it { instance.instance_variable_get('@dn').must_equal(dn) }
        it { instance.instance_variable_get('@d_dn').must_equal(d_dn) }
        it { instance.instance_variable_get('@default').must_equal(default) }
        it { instance.instance_variable_get('@maximised').must_equal(maximised) }
        it { instance.instance_variable_get('@centred').must_equal(centred) }
      end

      describe '.pair' do
        let(:d)  { 15 }
        let(:dn) { 38 }

        subject { described.pair(attributes) }

        it { subject.must_be_instance_of(Array) }
        it { subject.must_equal([15, 38]) }

        context 'when maximised' do
          let(:maximised) { true }
          let(:default)   { 80 }

          it { subject.must_equal([1, 80]) }
        end

        context 'when centred and a length can be determined' do
          let(:centred) { true }
          let(:default) { 80 }

          context 'when d and dn are given' do
            let(:d)  { 7 }
            let(:dn) { 47 }

            it { subject.must_equal([20, 60]) }
          end

          context 'when only a d_dn is given' do
            let(:d_dn) { 30 }

            it { subject.must_equal([28, 52]) }
          end

          context 'when only a default is given' do
            it { subject.must_equal([28, 52]) }
          end
        end
      end

      describe '#d1' do
        subject { instance.d1 }

        it { subject.must_be_instance_of(Fixnum) }

        context 'when not centred and/or a length cannot be determined' do
          context 'when d is given' do
            let(:d) { 5 }

            it { subject.must_equal(5) }
          end

          context 'when d is not given' do
            it { subject.must_equal(1) }
          end
        end

        context 'when centred and a length can be determined' do
          let(:centred) { true }
          let(:default) { 80 }

          context 'when d and dn are given' do
            let(:d)  { 7 }
            let(:dn) { 47 }

            it { subject.must_equal(20) }
          end

          context 'when only a d_dn is given' do
            let(:d_dn) { 30 }

            it { subject.must_equal(25) }
          end

          context 'when only a default is given' do
            it { subject.must_equal(1) }
          end
        end
      end

      describe '#d2' do
        subject { instance.d2 }

        context 'when not centred and/or a length cannot be determined' do
          context 'when d and dn are given' do
            let(:d)  { 5 }
            let(:dn) { 8 }

            it { subject.must_equal(8) }
          end

          context 'when d and d_dn are given' do
            let(:d)    { 5 }
            let(:d_dn) { 2 }

            it { subject.must_equal(6) }
          end

          context 'when only d_dn is given' do
            let(:d_dn) { 6 }

            it { subject.must_equal(6) }
          end

          context 'when only dn is given' do
            let(:dn) { 8 }

            it { subject.must_equal(8) }
          end

          context 'when d and a default is given' do
            let(:d)       { 1 }
            let(:default) { 40 }

            it { subject.must_equal(40) }
          end

          context 'when only a default is given' do
            let(:default) { 25 }

            it { subject.must_equal(25) }
          end

          context 'when no default is given' do
            it { subject.must_equal(nil) }
          end
        end

        context 'when centred and a length can be determined' do
          let(:centred) { true }
          let(:default) { 80 }

          context 'when d and dn are given' do
            let(:d)  { 7 }
            let(:dn) { 47 }

            it { subject.must_equal(60) }
          end

          context 'when only a d_dn is given' do
            let(:d_dn) { 30 }

            it { subject.must_equal(55) }
          end

          context 'when only a default is given' do
            it { subject.must_equal(80) }
          end
        end
      end

    end # Dimension

  end # Geometry

end # Vedeu