84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
import unittest
|
|
from typing import List, Optional
|
|
from random import randint
|
|
|
|
REC_CHANNEL_COUNT = 16
|
|
|
|
|
|
def to_channel_table(*channel: int) -> List[bool]:
|
|
return [i in channel for i in range(REC_CHANNEL_COUNT)]
|
|
|
|
|
|
def rearrange_channel_mux_table(channel_table: List[bool]) -> Optional[List[int]]:
|
|
enable_channel_number = 0
|
|
last_enable_channel = 0
|
|
|
|
for i in range(REC_CHANNEL_COUNT):
|
|
if channel_table[i]:
|
|
last_enable_channel = i
|
|
enable_channel_number += 1
|
|
|
|
if enable_channel_number == 0:
|
|
return None
|
|
|
|
channel_mux = [0 for _ in range(REC_CHANNEL_COUNT)]
|
|
|
|
if enable_channel_number == 1:
|
|
channel_mux[0] = last_enable_channel
|
|
|
|
return channel_mux
|
|
|
|
next_enable_channel = last_enable_channel
|
|
channel_mux_index = last_enable_channel
|
|
|
|
channel_mux[channel_mux_index] = last_enable_channel
|
|
channel_mux_index -= 1
|
|
|
|
while channel_mux_index >= 0:
|
|
i = next_enable_channel - 1
|
|
|
|
while i >= 0:
|
|
if channel_table[i]:
|
|
next_enable_channel = i
|
|
break
|
|
|
|
i -= 1
|
|
|
|
if i < 0:
|
|
break
|
|
|
|
else:
|
|
channel_mux[channel_mux_index] = next_enable_channel
|
|
channel_mux_index -= 1
|
|
|
|
offset = last_enable_channel - channel_mux_index
|
|
|
|
while channel_mux_index >= 0:
|
|
channel_mux[channel_mux_index] = channel_mux[channel_mux_index + offset]
|
|
channel_mux_index -= 1
|
|
|
|
return channel_mux
|
|
|
|
|
|
class UniRearrangeMuxChannelTest(unittest.TestCase):
|
|
def test_empty_channel(self):
|
|
self.assertIsNone(rearrange_channel_mux_table(to_channel_table()))
|
|
|
|
def test_single_channel(self):
|
|
for _ in range(3):
|
|
c = randint(0, REC_CHANNEL_COUNT - 1)
|
|
|
|
expect = [c if i == 0 else 0 for i in range(REC_CHANNEL_COUNT)]
|
|
print(expect)
|
|
self.assertEqual(expect, rearrange_channel_mux_table(to_channel_table(c)))
|
|
|
|
def test_two_channel(self):
|
|
self.assertEqual([2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
rearrange_channel_mux_table(to_channel_table(1, 2)))
|
|
self.assertEqual([2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
rearrange_channel_mux_table(to_channel_table(2, 1)))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|