local eq = assert.are.same

local tester_function = function()
  error(7)
end

describe("busted specs", function()
  describe("nested", function()
    it("should work", function()
      assert(true)
    end)
  end)

  it("should not nest", function()
    assert(true)
  end)

  it("should not fail unless we unpcall this", function()
    pcall(tester_function)
  end)

  pending("other thing pending", function()
    error()
  end)
end)

describe("before each", function()
  local a = 2
  local b = 3
  it("is not cleared", function()
    eq(2, a)
    eq(3, b)
    a = a + 1
    b = b + 1
  end)
  describe("nested", function()
    before_each(function()
      a = 0
    end)
    it("should clear a but not b", function()
      eq(0, a)
      eq(4, b)
      a = a + 1
      b = b + 1
    end)
    describe("nested nested", function()
      before_each(function()
        b = 0
      end)
      it("should clear b as well", function()
        eq(0, a)
        eq(0, b)
        a = a + 1
        b = b + 1
      end)
    end)
    it("should only clear a", function()
      eq(0, a)
      eq(1, b)
      a = a + 1
      b = b + 1
    end)
  end)
  it("should clear nothing", function()
    eq(1, a)
    eq(2, b)
  end)
end)

describe("after each", function()
  local a = 2
  local b = 3
  it("is not cleared", function()
    eq(2, a)
    eq(3, b)
    a = a + 1
    b = b + 1
  end)
  describe("nested", function()
    after_each(function()
      a = 0
    end)
    it("should not clear any at this point", function()
      eq(3, a)
      eq(4, b)
      a = a + 1
      b = b + 1
    end)
    describe("nested nested", function()
      after_each(function()
        b = 0
      end)
      it("should have cleared a", function()
        eq(0, a)
        eq(5, b)
        a = a + 1
        b = b + 1
      end)
    end)
    it("should have cleared a and b", function()
      eq(0, a)
      eq(0, b)
      a = a + 1
      b = b + 1
    end)
  end)
  it("should only have cleared a", function()
    eq(0, a)
    eq(1, b)
  end)
end)

describe("fourth top level describe test", function()
  it("should work", function()
    eq(1, 1)
  end)
end)