import li_std_string_extra

x = "hello"


if li_std_string_extra.test_ccvalue(x) != x:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_cvalue(x) != x:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_value(x) != x:
    print x, li_std_string_extra.test_value(x)
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_const_reference(x) != x:
    raise RuntimeError, "bad string mapping"


s = li_std_string_extra.string("he")
#s += "ll"
# s.append("o")
s = s + "llo"

if s != x:
    print s, x
    raise RuntimeError, "bad string mapping"

if s[1:4] != x[1:4]:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_value(s) != x:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_const_reference(s) != x:
    raise RuntimeError, "bad string mapping"

a = li_std_string_extra.A(s)

if li_std_string_extra.test_value(a) != x:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_const_reference(a) != x:
    raise RuntimeError, "bad string mapping"

b = li_std_string_extra.string(" world")

s = a + b
if a + b != "hello world":
    print a + b
    raise RuntimeError, "bad string mapping"

if a + " world" != "hello world":
    raise RuntimeError, "bad string mapping"

# This is expected to fail with -builtin option
# Reverse operators not supported in builtin types
if not li_std_string_extra.is_python_builtin():
    if "hello" + b != "hello world":
        raise RuntimeError, "bad string mapping"

    c = "hello" + b
    if c.find_last_of("l") != 9:
        raise RuntimeError, "bad string mapping"

s = "hello world"

b = li_std_string_extra.B("hi")

b.name = li_std_string_extra.string("hello")
if b.name != "hello":
    raise RuntimeError, "bad string mapping"


b.a = li_std_string_extra.A("hello")
if b.a != "hello":
    raise RuntimeError, "bad string mapping"


if li_std_string_extra.test_value_basic1(x) != x:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_value_basic2(x) != x:
    raise RuntimeError, "bad string mapping"


if li_std_string_extra.test_value_basic3(x) != x:
    raise RuntimeError, "bad string mapping"

if li_std_string_extra.test_value_basic_overload(x) != x:
    raise RuntimeError, "bad overload string"

if li_std_string_extra.test_value_basic_overload(123) != "int":
    raise RuntimeError, "bad overload int"

try:
    li_std_string_extra.test_value_basic_overload([x])
    raise RuntimeError, "should throw TypeError"
except TypeError as e:
    if str(e).find("Possible C/C++ prototypes are:") == -1:
        raise RuntimeError("Incorrect error message text:\n{}".format(e))
    pass

try:
    li_std_string_extra.test_value_basic_overload([123])
    raise RuntimeError, "should throw TypeError"
except TypeError as e:
    if str(e).find("Possible C/C++ prototypes are:") == -1:
        raise RuntimeError("Incorrect error message text:\n{}".format(e))
    pass

# Global variables
s = "initial string"
if li_std_string_extra.cvar.GlobalString2 != "global string 2":
    raise RuntimeError, "GlobalString2 test 1"
li_std_string_extra.cvar.GlobalString2 = s
if li_std_string_extra.cvar.GlobalString2 != s:
    raise RuntimeError, "GlobalString2 test 2"
if li_std_string_extra.cvar.ConstGlobalString != "const global string":
    raise RuntimeError, "ConstGlobalString test"

# Member variables
myStructure = li_std_string_extra.Structure()
if myStructure.MemberString2 != "member string 2":
    raise RuntimeError, "MemberString2 test 1"
myStructure.MemberString2 = s
if myStructure.MemberString2 != s:
    raise RuntimeError, "MemberString2 test 2"
if myStructure.ConstMemberString != "const member string":
    raise RuntimeError, "ConstMemberString test"

if li_std_string_extra.cvar.Structure_StaticMemberString2 != "static member string 2":
    raise RuntimeError, "StaticMemberString2 test 1"
li_std_string_extra.cvar.Structure_StaticMemberString2 = s
if li_std_string_extra.cvar.Structure_StaticMemberString2 != s:
    raise RuntimeError, "StaticMemberString2 test 2"
if li_std_string_extra.cvar.Structure_ConstStaticMemberString != "const static member string":
    raise RuntimeError, "ConstStaticMemberString test"


if li_std_string_extra.test_reference_input("hello") != "hello":
    raise RuntimeError
s = li_std_string_extra.test_reference_inout("hello")
if s != "hellohello":
    raise RuntimeError


if li_std_string_extra.stdstring_empty() != "":
    raise RuntimeError


if li_std_string_extra.c_empty() != "":
    raise RuntimeError

if li_std_string_extra.c_null() != None:
    raise RuntimeError
