# cython: c_string_type=str, c_string_encoding=utf8
from libcpp.string cimport string as std_string
from util.generic.string cimport TString
from util.memory.blob cimport TBlob
import pytest
import unittest
class TestBlob(unittest.TestCase):
def test_ctor(self):
cdef TBlob tmp = TBlob()
cdef TBlob tmp2 = TBlob(tmp)
self.assertEqual(tmp.Size(), 0)
self.assertEqual(tmp2.Size(), 0)
def test_empty_data(self):
cdef TBlob tmp = TBlob()
self.assertEqual(tmp.Data() == NULL, True)
self.assertEqual(tmp.AsCharPtr() == NULL, True)
self.assertEqual(tmp.AsUnsignedCharPtr() == NULL, True)
self.assertEqual(tmp.Empty(), True)
self.assertEqual(tmp.IsNull(), True)
def test_empty_is_null(self):
cdef TBlob tmp = TBlob.NoCopy("", 0)
self.assertEqual(tmp.Empty(), True)
self.assertEqual(tmp.IsNull(), False)
def test_data_types(self):
cdef const char* char_data = TBlob().AsCharPtr()
cdef const unsigned char* uchar_data = TBlob().AsUnsignedCharPtr()
cdef const void* void_data = TBlob().Data()
def test_no_copy(self):
cdef const char* txt = "hello world"
cdef TBlob tmp = TBlob.NoCopy(txt, len(txt))
self.assertEqual(tmp.AsCharPtr() - txt, 0)
self.assertEqual(tmp.Size(), 11)
self.assertEqual(tmp.AsCharPtr()[:tmp.Size()], "hello world")
self.assertEqual(tmp.Empty(), False)
self.assertEqual(tmp.IsNull(), False)
def test_copy(self):
cdef const char* txt = "hello world"
cdef TBlob tmp = TBlob.Copy(txt, len(txt))
self.assertNotEqual(tmp.AsCharPtr() - txt, 0)
self.assertEqual(tmp.Size(), 11)
self.assertEqual(tmp.AsCharPtr()[:tmp.Size()], "hello world")
self.assertEqual(tmp.Empty(), False)
self.assertEqual(tmp.IsNull(), False)
def test_from_string(self):
cdef TBlob tmp = TBlob.FromString(TString("hello world"))
self.assertEqual(tmp.Size(), 11)
self.assertEqual(tmp.AsCharPtr()[:tmp.Size()], "hello world")
self.assertEqual(tmp.Empty(), False)
self.assertEqual(tmp.IsNull(), False)
def test_from_file(self):
with open("file", "w") as f:
f.write("hello world")
cdef TBlob tmp = TBlob.FromFile("file")
self.assertEqual(tmp.Size(), 11)
self.assertEqual(tmp.AsCharPtr()[:tmp.Size()], "hello world")
self.assertEqual(tmp.Empty(), False)
self.assertEqual(tmp.IsNull(), False)
def test_precharged_from_file(self):
with open("precharged", "w") as f:
f.write("hello world")
cdef TBlob tmp = TBlob.PrechargedFromFile("precharged")
self.assertEqual(tmp.Size(), 11)
self.assertEqual(tmp.AsCharPtr()[:tmp.Size()], "hello world")
self.assertEqual(tmp.Empty(), False)
self.assertEqual(tmp.IsNull(), False)
def test_swap_drop(self):
cdef TBlob tmp = TBlob.NoCopy("hello world", 11)
cdef TBlob tmp2
tmp2.Swap(tmp)
self.assertEqual(tmp2.Size(), 11)
self.assertEqual(tmp.Size(), 0)
self.assertEqual(tmp2.AsCharPtr()[:tmp2.Size()], "hello world")
tmp2.Swap(tmp)
self.assertEqual(tmp2.Size(), 0)
self.assertEqual(tmp.Size(), 11)
tmp.Drop()
self.assertEqual(tmp.Size(), 0)
def test_operator_brackets(self):
cdef TBlob tmp = TBlob.NoCopy("hello world", 11)
self.assertEqual(tmp[0], ord('h'))
self.assertEqual(tmp[1], ord('e'))
self.assertEqual(tmp[2], ord('l'))
self.assertEqual(tmp[3], ord('l'))
self.assertEqual(tmp[4], ord('o'))
self.assertEqual(tmp[5], ord(' '))
self.assertEqual(tmp[6], ord('w'))
self.assertEqual(tmp[7], ord('o'))
self.assertEqual(tmp[8], ord('r'))
self.assertEqual(tmp[9], ord('l'))
self.assertEqual(tmp[10], ord('d'))
def test_operator_equal(self):
cdef TBlob foo = TBlob.NoCopy("foo", 3)
cdef TBlob bar = TBlob.NoCopy("bar", 3)
self.assertEqual(foo.AsCharPtr(), "foo")
self.assertEqual(bar.AsCharPtr(), "bar")
bar = foo
self.assertEqual(foo.AsCharPtr(), "foo")
self.assertEqual(bar.AsCharPtr(), "foo")
def test_sub_blob(self):
cdef TBlob tmp = TBlob.NoCopy("hello world", 11)
self.assertEqual(tmp.SubBlob(0).Size(), 0)
self.assertEqual(tmp.SubBlob(1).Size(), 1)
self.assertEqual(tmp.SubBlob(5).Size(), 5)
self.assertEqual(tmp.AsCharPtr() - tmp.SubBlob(0).AsCharPtr(), 0)
self.assertEqual(tmp.SubBlob(0, 0).Size(), 0)
self.assertEqual(tmp.SubBlob(0, 1).Size(), 1)
self.assertEqual(tmp.SubBlob(0, 5).Size(), 5)
self.assertEqual(tmp.AsCharPtr() - tmp.SubBlob(0, 0).AsCharPtr(), 0)
self.assertEqual(tmp.SubBlob(1, 1).Size(), 0)
self.assertEqual(tmp.SubBlob(1, 2).Size(), 1)
self.assertEqual(tmp.SubBlob(1, 6).Size(), 5)
self.assertEqual(tmp.SubBlob(1, 1).AsCharPtr() - tmp.AsCharPtr(), 1)
with self.assertRaises(Exception):
tmp.SubBlob(2, 1)
def test_deep_copy(self):
cdef TBlob tmp = TBlob.NoCopy("hello world", 11)
cdef TBlob tmp2 = tmp.DeepCopy()
self.assertEqual(tmp.AsCharPtr()[:tmp.Size()], "hello world")
self.assertEqual(tmp2.AsCharPtr()[:tmp2.Size()], "hello world")
self.assertNotEqual(tmp2.AsCharPtr() - tmp.AsCharPtr(), 0)