import unittest

from migen.fhdl.std import *

class SignalSizeCase(unittest.TestCase):
	def setUp(self):
		self.i = 0xaa
		self.j = -127
		self.s = Signal((13, True))

	def test_flen(self):
		self.assertEqual(flen(self.s), 13)
		self.assertEqual(flen(self.i), 8)
		self.assertEqual(flen(self.j), 8)

	def test_flen_type(self):
		self.assertRaises(TypeError, flen, [])

	def test_fiter(self):
		for i, si in enumerate(fiter(self.s)):
			self.assertEqual(si, self.s[i])
		self.assertEqual(list(fiter(self.i)),
				[(self.i >> i) & 1 for i in range(8)])
		self.assertEqual(list(fiter(self.j)),
				[(self.j >> i) & 1 for i in range(8)])

	def test_fiter_type(self):
		self.assertRaises(TypeError, fiter, [])

	def test_fslice(self):
		sl = slice(1, None, 2)
		fslice(self.s, sl)
		self.assertEqual(fslice(self.i, sl), 15)
		self.assertEqual(fslice(self.j, sl), 8)
		self.assertEqual(fslice(-1, 9), 1)
		self.assertEqual(fslice(-1, slice(0, 4)), 0b1)
		self.assertEqual(fslice(-7, slice(0, None, 1)), 0b1001)

	def test_fslice_type(self):
		self.assertRaises(TypeError, fslice, [], 3)

	def test_freversed(self):
		freversed(self.s)
		freversed(self.i)
		freversed(self.j)

	def test_freveseed_type(self):
		self.assertRaises(TypeError, freversed, [])