# encoding: utf-8

require 'spec_helper'

require "amq/bit_set"


# extracted from amqp gem. MK.
describe AMQ::BitSet do

  #
  # Environment
  #

  let(:nbits) { (1 << 16) - 1 }


  #
  # Examples
  #

  describe "#get, #[]" do
    describe "when bit at given position is set" do
      subject do
        o = described_class.new(nbits)
        o.set(3)
        o
      end

      it "returns true" do
        subject.get(3).should be_true
      end # it
    end # describe

    describe "when bit at given position is off" do
      subject do
        described_class.new(nbits)
      end

      it "returns false" do
        subject.get(5).should be_false
      end # it
    end # describe
  end # describe


  describe "#set" do
    describe "when bit at given position is set" do
      subject do
        described_class.new(nbits)
      end

      it "has no effect" do
        subject.set(3)
        subject.get(3).should be_true
        subject.set(3)
        subject[3].should be_true
      end # it
    end

    describe "when bit at given position is off" do
      subject do
        described_class.new(nbits)
      end

      it "sets that bit" do
        subject.set(3)
        subject.get(3).should be_true

        subject.set(33)
        subject.get(33).should be_true

        subject.set(3387)
        subject.get(3387).should be_true
      end
    end # describe
  end # describe


  describe "#unset" do
    describe "when bit at a given position is set" do
      subject do
        described_class.new(nbits)
      end

      it "unsets that bit" do
        subject.set(3)
        subject.get(3).should be_true
        subject.unset(3)
        subject.get(3).should be_false
      end # it
    end # describe


    describe "when bit at a given position is off" do
      subject do
        described_class.new(nbits)
      end

      it "has no effect" do
        subject.get(3).should be_false
        subject.unset(3)
        subject.get(3).should be_false
      end # it
    end # describe
  end # describe



  describe "#clear" do
    subject do
      described_class.new(nbits)
    end

    it "clears all bits" do
      subject.set(3)
      subject.get(3).should be_true

      subject.set(7668)
      subject.get(7668).should be_true

      subject.clear

      subject.get(3).should be_false
      subject.get(7668).should be_false
    end
  end
end