Implemented encode_element_size and write_element_size, and added tests. This should...
[~jspiros/python-ebml.git] / ebml / tests / test_core.py
1 import unittest
2 try:
3         from cStringIO import StringIO
4 except ImportError:
5         from StringIO import StringIO
6 from random import randint
7 from ..core import *
8
9
10 class ElementSizeTestsBase(object):
11         def assert_roundtrip(self, value, min_length=1, max_length=EBMLMaxSizeLength):
12                 encoded = encode_element_size(value, min_length=min_length, max_length=max_length)
13                 encoded_stream = StringIO(encoded)
14                 self.assertEqual(value, read_element_size(encoded_stream, max_length=max_length)[0])
15
16
17 class ElementSizeTests(unittest.TestCase, ElementSizeTestsBase):
18         def test_undefined(self):
19                 for length in xrange(1, 9):
20                         self.assert_roundtrip(None, min_length=length)
21         
22         def test_base_10(self):
23                 for value in (10**exp for exp in xrange(1, 16)):
24                         self.assert_roundtrip(value)
25         
26         def test_base_2(self):
27                 for value in (2**exp for exp in xrange(1, 56)):
28                         self.assert_roundtrip(value)
29         
30         def test_max_base_2(self):
31                 for value in ((2**exp) - 2 for exp in xrange(1, 57)):
32                         self.assert_roundtrip(value)
33                 
34         def test_random(self):
35                 maximum = 2**56 - 2
36                 for value in (randint(0, maximum) for i in xrange(0, 200)):
37                         self.assert_roundtrip(value)
38
39
40 class LargeElementSizeTests(unittest.TestCase, ElementSizeTestsBase): # tests values that WILL be longer than 8 bytes (EBMLMaxSizeLength)
41         def test_base_10(self):
42                 for value in (10**exp for exp in xrange(17, 300)):
43                         self.assert_roundtrip(value, max_length=1024)
44         
45         def test_base_2(self):
46                 for value in (2**exp for exp in xrange(56, 1024)):
47                         self.assert_roundtrip(value, max_length=1024)
48         
49         def test_max_base_2(self):
50                 for value in ((2**exp) - 2 for exp in xrange(57, 1024)):
51                         self.assert_roundtrip(value, max_length=1024)
52         
53         def test_random(self):
54                 for value in (randint(2**56 - 1, 2**10240) for i in xrange(0, 200)):
55                         self.assert_roundtrip(value, max_length=10240)
56
57
58 # class ElementIDTests(unittest.TestCase):
59 #       def assert_roundtrip(self, value, max_length=EBMLMaxIDLength):
60 #               encoded = encode_element_id(value, max_length=max_length)
61
62 if __name__ == '__main__':
63         unittest.main()