describe('catch', function()
  it('ignores errors if no handler is specified', function()
    expect(Rx.Observable.throw():catch()).to.produce.nothing()
  end)

  it('continues producing values from the specified observable if the source errors', function()
    local handler = Rx.Subject.create()
    local observable = Rx.Observable.create(function(observer)
      observer:onNext(1)
      observer:onNext(2)
      observer:onError('ohno')
      observer:onNext(3)
      observer:onCompleted()
    end)

    handler:onNext(5)

    local onNext = observableSpy(observable:catch(handler))

    handler:onNext(6)
    handler:onNext(7)
    handler:onCompleted()

    expect(onNext).to.equal({{1}, {2}, {6}, {7}})
  end)

  it('allows a function as an argument', function()
    local handler = function() return Rx.Observable.empty() end
    expect(Rx.Observable.throw():catch(handler)).to.produce.nothing()
  end)

  it('calls onError if the supplied function errors', function()
    local handler = error
    expect(Rx.Observable.throw():catch(handler)).to.produce.error()
  end)

  it('calls onComplete when the parent completes', function()
    local onComplete = spy()
    Rx.Observable.throw():catch():subscribe(nil, nil, onComplete)
    expect(#onComplete).to.equal(1)
  end)
end)
