# -*- 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')