# run:
#  python python_pybuffer_runme.py benchmark
# for the benchmark, other wise the test case will be run
import python_pybuffer
import sys

def check(flag):
    if not flag:
        raise RuntimeError("Test failed")

if len(sys.argv) >= 2 and sys.argv[1] == "benchmark":
    # run the benchmark
    import time
    k = 1000000  # number of times to execute the functions

    t = time.time()
    a = bytearray(b"hello world")
    for i in range(k):
        python_pybuffer.title1(a)
    print("Time used by bytearray: {}".format(time.time() - t))

    t = time.time()
    b = "hello world"
    for i in range(k):
        python_pybuffer.title2(b)
    print("Time used by string: {}".format(time.time() - t))
else:
    # run the test case
    buf1 = bytearray(10)
    buf2 = bytearray(50)

    python_pybuffer.func1(buf1)
    check(buf1 == b"a" * 10)

    python_pybuffer.func2(buf2)
    check(buf2.startswith(b"Hello world!\x00"))

    count = python_pybuffer.func3(buf2)
    check(count == 10)  # number of alpha and number in 'Hello world!'

    length = python_pybuffer.func4(buf2)
    check(length == 12)

    buf3 = bytearray(b"hello")
    python_pybuffer.title1(buf3)
    check(buf3 == b"Hello")

    try:
        python_pybuffer.func1(1)
        raise RuntimeError("should throw TypeError")
    except TypeError as e:
        check("(char *buf1, int len)" in str(e))

    try:
        python_pybuffer.func2(1)
        raise RuntimeError("should throw TypeError")
    except TypeError as e:
        check("(char *buf2)" in str(e))

    try:
        python_pybuffer.func3(1)
        raise RuntimeError("should throw TypeError")
    except TypeError as e:
        check("(const char *buf3, int len)" in str(e))

    try:
        python_pybuffer.func4(1)
        raise RuntimeError("should throw TypeError")
    except TypeError as e:
        check("(const char *buf4)" in str(e))
