|
- # -*- coding: utf-8 -*-
-
- from .context import encdec8b10b
- from encdec8b10b import EncDec8B10B
- import random
-
- import unittest
-
- import sys
- if sys.version_info.major != 3:
- raise RuntimeError('invalid major version of python')
-
- class TestClass(unittest.TestCase):
- def test_to10b(self):
- to10b = EncDec8B10B._to10b
-
- self.assertEqual(to10b(0), '0' * 10)
- self.assertEqual(to10b(2**10-1), '1' * 10)
- self.assertEqual(to10b(0x20f), '1' * 4 + '000001')
- self.assertEqual(to10b(0x0ff), '1' * 8 + '00')
-
- dispminmax = [ 2, 3, 2, 3, 2, 1, 2, 1, 2, 1 ]
-
- def test_disparity(self):
- failures = []
- for i in range(512):
- disp = i >> 8
- din = i & 0xff
- ndisp, out = EncDec8B10B.enc_8b10b(din, disp)
- cnt = +1 if disp else -1
-
- for j in range(10):
- out, bit = divmod(out, 2)
- cnt += +1 if bit else -1
- minmax = self.dispminmax[j]
- if cnt < -minmax or cnt > minmax:
- failures.append((disp, din))
-
- if cnt != 1 if ndisp else cnt != -1:
- failures.append((disp, din))
-
- if failures:
- raise RuntimeError('failures(%d): %s' % (len(failures), repr(failures)))
-
- def test_bitdecoding(self):
- coder = EncDec8B10B()
-
- with self.assertRaises(ValueError):
- coder.decode('asioj')
-
- self.assertIsNone(coder.decode(''))
-
- self.assertFalse(coder.issyncd())
- self.assertIsNone(coder.decode('101011011010101101'))
-
- self.assertFalse(coder.issyncd())
-
- self.assertEqual(coder.decode(coder.encode(EncDec8B10B.COMMA)), EncDec8B10B.COMMA)
- self.assertTrue(coder.issyncd())
-
- astr = coder.encode(b'a')
-
- self.assertIsNone(coder.decode(astr[:5]))
-
- self.assertEqual(coder.decode(astr[5:]), b'a')
-
- self.assertEqual(coder.decode(coder.encode(b'abc123')), b'abc123')
-
- chrctrlstr = coder.encode(b'xx') + coder.encode(EncDec8B10B.K_28_0)
-
- self.assertIsNone(coder.decode(chrctrlstr[:5]))
-
- self.assertEqual(coder.decode(chrctrlstr[5:]), b'xx')
- self.assertEqual(coder.decode(''), EncDec8B10B.K_28_0)
- self.assertEqual(coder.decode(coder.encode(EncDec8B10B.K_28_2)), EncDec8B10B.K_28_2)
-
- # that when junk is delivered, it is ignored
- self.assertIsNone(coder.decode('111111111000011111'))
-
- # and is no longer synced
- self.assertFalse(coder.issyncd())
-
- commaastr = coder.encode(EncDec8B10B.COMMA) + \
- coder.encode(b'a')
-
- # But it will sync back up
- self.assertEqual(coder.decode(commaastr), EncDec8B10B.COMMA)
- self.assertEqual(coder.decode(''), b'a')
-
- self.assertIsNone(coder.decode(''))
-
- self.assertEqual(coder.decode(coder.encode(EncDec8B10B.COMMA)), EncDec8B10B.COMMA)
-
- def test_bitencoding(self):
- coder = EncDec8B10B()
-
- self.assertEqual(coder.encode(b'a'), '0111010011')
- # +
- s = ''.join((
- '1000101100', # a -
- '1011010011', # b +
- '1100010011', # c +
- '1000111001', # 1 +
- '0100111001', # 2 +
- '1100101001', # 3 +
- ))
-
- self.assertEqual(coder.encode(b'abc123'), s)
- self.assertEqual(coder.encode(EncDec8B10B.COMMA), '1100000101')
- self.assertEqual(coder.encode(EncDec8B10B.COMMA), '0011111010')
|