# -*- coding: utf-8 -*-
import pytest

from pybind11_tests import smart_ptr_base_derived as m

CBASE_GET_INT_RESULT = 90146438
CDERIVED_GET_INT_RESULT = 31607978
VDERIVED_GET_INT_RESULT = 29852452


def test_concrete():
    m.to_cout("")
    m.to_cout("")
    m.to_cout("make_shared_cderived")
    cd = m.make_shared_cderived()
    assert cd.get_int() == CDERIVED_GET_INT_RESULT
    m.pass_shared_cderived(cd)
    m.pass_shared_cbase(cd)
    cb = m.make_shared_cderived_up_cast()
    assert cb.get_int() == CBASE_GET_INT_RESULT
    m.pass_shared_cbase(cb)
    with pytest.raises(TypeError):
        m.pass_shared_cderived(cb)
    m.to_cout("")


def test_virtual():
    m.to_cout("")
    m.to_cout("")
    m.to_cout("make_shared_vderived")
    vd = m.make_shared_vderived()
    assert vd.get_int() == VDERIVED_GET_INT_RESULT
    m.pass_shared_vderived(vd)
    m.pass_shared_vbase(vd)
    vd_uc = m.make_shared_vderived_up_cast()
    assert vd_uc.get_int() == VDERIVED_GET_INT_RESULT
    assert isinstance(vd_uc, m.vderived)  # pybind11 un-did upcast.
    m.pass_shared_vbase(vd_uc)
    m.pass_shared_vderived(vd_uc)
    with pytest.raises(TypeError):
        m.pass_shared_vrederived(vd_uc)
    m.to_cout("")