local cp = require("cpptest")
cp.wrapon()

do
  local a, b = pcall(cp.catch, function() return "x" end)
  assert(a == true and b == "x")
end

do
  local a, b = pcall(function() cp.throw("foo") end)
  assert(a == false and b == "foo")
end

local unwind
do
  local a, b = pcall(cp.catch, function() cp.throw("foo") end)
  unwind = a
  assert((a == false and b == "foo") or (a == true and b == "catch ..."))
end

do
  local st = cp.alloc(function() return cp.isalloc() end)
  assert(st == true)
  assert(cp.isalloc() == false)
end

do
  local a, b = pcall(cp.alloc, function()
    assert(cp.isalloc() == true)
    return "foo", cp.throw
  end)
  assert(a == false and b == "foo")
  assert(cp.isalloc() == false)
end

do
  local a, b = pcall(cp.alloc, function()
    assert(cp.isalloc() == true)
    return "foo", error
  end)
  assert(a == false and b == "foo")
  if unwind then assert(cp.isalloc() == false) end
end