require '../helpers'

{Attachments, Attachment, BaseAttachment} = require '../../server/bw/attachment'
should = require 'should'

describe "An Attachment list", ->
  class TestAttachment extends BaseAttachment
    name: "TestAttachment"
    maxLayers: 2

  class OtherAttachment extends BaseAttachment
    name: "OtherAttachment"

  beforeEach ->
    @attachments = new Attachments()

  it "will not add attachments past the maximum stack", ->
    should.exist @attachments.push(TestAttachment)
    should.exist @attachments.push(TestAttachment)
    should.not.exist @attachments.push(TestAttachment)

  describe '#unattach', ->
    it "removes the current attachment", ->
      @attachments.push(TestAttachment)
      @attachments.unattach(TestAttachment)
      @attachments.attachments.should.have.length(0)

    it "does not remove other attachments if none is found", ->
      @attachments.push(TestAttachment)
      @attachments.unattach(OtherAttachment)
      @attachments.attachments.should.have.length(1)
      @attachments.attachments[0].should.be.instanceOf(TestAttachment)

  describe '#unattachAll', ->
    it 'is never passed an undefined attachment', ->
      stub = @sandbox.stub().returns(true)
      @attachments.push(TestAttachment)
      @attachments.push(OtherAttachment)
      (=> @attachments.unattachAll(stub)).should.not.throw()
      stub.calledWithMatch(undefined).should.be.false
      stub.calledWithMatch(null).should.be.false
      @attachments.attachments.should.be.empty

  describe '#getPassable', ->
    beforeEach ->
      @attachments.attachments.push(new Attachment.Embargo())
      @attachments.attachments.push(new Attachment.Yawn())
      @attachments.attachments.push(new Attachment.Ingrain())
      @attachments.attachments.push(new Attachment.AquaRing())
      @attachments.attachments.push(new Attachment.Disable())
      @attachments.attachments.push(new Attachment.Torment())
      @attachments.attachments.push(new Attachment.Substitute())
      @attachments.attachments.push(new Attachment.Curse())
      @attachments.attachments.push(new Attachment.LeechSeed())
      @attachments.attachments.push(new Attachment.MagnetRise())
      @attachments.attachments.push(new Attachment.Confusion())

    it "returns an array of passable attachments already attached", ->
      attachments = @attachments.getPassable()
      attachments.should.not.containEql(Attachment.Disable)
      attachments.should.not.containEql(Attachment.Torment)
      attachments.should.not.containEql(Attachment.Yawn)
      attachments.should.containEql(Attachment.Ingrain)
      attachments.should.containEql(Attachment.AquaRing)
      attachments.should.containEql(Attachment.Embargo)
      attachments.should.containEql(Attachment.Substitute)
      attachments.should.containEql(Attachment.Curse)
      attachments.should.containEql(Attachment.LeechSeed)
