def test_access(self):
        class test(object):
            i = IntegerStructure("i")
            s = StringStructure("s")
            g = GroupStructure("g",
                               structures=[
                                   StringStructure("s"),
                                   GroupStructure(
                                       "g", structures=[StringStructure("s")])
                               ])

        obj = test()

        self.assertRaises(AttributeError, lambda: obj.i)
        obj.i = 3
        self.assertEquals(obj.i, 3)
        self.assertFalse(obj.i != 3)

        value = unpack(test.i.xstruct, test.i.pack(obj))[0][0]
        self.assertEqual(obj.i, value)
        test.i.unpack(obj, test.i.pack(obj))
        self.assertEqual(obj.i, value)

        del obj.i
        self.assertRaises(AttributeError, lambda: obj.i)

        obj.s = "test"
        self.assertEquals(obj.s, "test")

        obj.g = ["foo", ["bar"]]
        self.assertEquals(obj.g.s, "foo")
        self.assertEquals(obj.g.g.s, "bar")
        self.assertEquals(obj.g, ["foo", ["bar"]])
        self.assertTrue(obj.g != [])

        test.g.unpack(obj, test.g.pack(obj))
        self.assertEqual(obj.g, ["foo", ["bar"]])

        obj.g[0] = "oof"
        self.assertEquals(obj.g[0], "oof")
        del obj.g[0]
        self.assertRaises(AttributeError, lambda: obj.g[0])
        self.assertRaises(AttributeError, lambda: obj.g.s)
        self.assertRaises(AttributeError, lambda: obj.g.x)
        obj.g.s = "foo"
        self.assertEquals(obj.g.s, "foo")
        try:
            obj.g.x = 0
            self.fail(
                "Assigning a non-existent member of a GroupStructure didn't fail."
            )
        except AttributeError, e:
            pass
	def unpack(self, obj, string):
		size, string = unpack('I', string)
		size = size[0]
		data = []
		for i in xrange(size):
			data.append(self.Container(obj))
			for structure in self.structures:
				string = structure.unpack(data[-1], string)

		setattr(obj, "_" + self.name, data)
		
		return string
    def test_integer(self):
        for size in (8, 16, 32, 64):
            for sign in ('signed', 'unsigned', 'semisigned'):
                if size == 8 and sign == 'semisigned':
                    #only combination that dosent exist
                    continue
                if sign == 'signed':
                    min = -2**(size - 1)
                    max = 2**(size - 1) - 1
                if sign == 'unsigned':
                    min = 0
                    max = 2**(size) - 1
                if sign == 'semisigned':
                    min = -1
                    max = 2**(size) - 2

                #good values
                structure = IntegerStructure('int', size=size, type=sign)

                self.assertEqual(structure.length(min), size / 8)
                self.assertTrue(structure.check(min))
                self.assertTrue(structure.check(max))

                format = structure.xstruct
                self.assertEqual(unpack(format, pack(format, min))[0][0], min)
                self.assertEqual(unpack(format, pack(format, max))[0][0], max)

                #bad values
                self.assertRaises(ValueError, structure.check, min - 1)
                self.assertRaises(ValueError, structure.check, max + 1)
                self.assertRaises(ValueError, structure.check, 0.)
                self.assertRaises(ValueError, structure.check, '')
                self.assertRaises(ValueError, structure.check, None)

        self.assertRaises(ValueError, lambda: IntegerStructure('int', size=7))
        self.assertRaises(ValueError,
                          lambda: IntegerStructure('int', type='supersigned'))
	def test_integer(self):
		for size in (8, 16, 32, 64):
			for sign in ('signed', 'unsigned', 'semisigned'):
				if size == 8 and sign == 'semisigned':
					#only combination that dosent exist
					continue
				if sign == 'signed':
					min = -2**(size-1)
					max = 2**(size-1)-1
				if sign == 'unsigned':
					min = 0
					max = 2**(size)-1
				if sign == 'semisigned':
					min = -1
					max = 2**(size)-2
				
				#good values
				structure = IntegerStructure('int', size=size, type=sign)
				
				self.assertEqual(structure.length(min), size/8)
				self.assertTrue(structure.check(min))
				self.assertTrue(structure.check(max))
				
				format = structure.xstruct
				self.assertEqual(unpack(format, pack(format, min))[0][0], min)
				self.assertEqual(unpack(format, pack(format, max))[0][0], max)
				
				#bad values
				self.assertRaises(ValueError, structure.check, min-1)
				self.assertRaises(ValueError, structure.check, max+1)
				self.assertRaises(ValueError, structure.check, 0.)
				self.assertRaises(ValueError, structure.check, '')
				self.assertRaises(ValueError, structure.check, None)
		
		self.assertRaises(ValueError, lambda: IntegerStructure('int', size=7))
		self.assertRaises(ValueError, lambda: IntegerStructure('int', type='supersigned'))
	def test_access(self):
		class test(object):
			i = IntegerStructure("i")
			s = StringStructure("s")
			g = GroupStructure("g", structures=[StringStructure("s"), GroupStructure("g", structures=[StringStructure("s")])])
		
		obj = test()
		
		self.assertRaises(AttributeError, lambda: obj.i)
		obj.i = 3
		self.assertEquals(obj.i, 3)
		self.assertFalse(obj.i != 3)
		
		value = unpack(test.i.xstruct, test.i.pack(obj))[0][0]
		self.assertEqual(obj.i, value)
		test.i.unpack(obj, test.i.pack(obj))
		self.assertEqual(obj.i, value)
		
		del obj.i
		self.assertRaises(AttributeError, lambda: obj.i)
		
		obj.s = "test"
		self.assertEquals(obj.s, "test")
		
		obj.g = ["foo", ["bar"]]
		self.assertEquals(obj.g.s, "foo")
		self.assertEquals(obj.g.g.s, "bar")
		self.assertEquals(obj.g, ["foo", ["bar"]])
		self.assertTrue(obj.g != [])
		
		test.g.unpack(obj, test.g.pack(obj))
		self.assertEqual(obj.g, ["foo", ["bar"]])
		
		obj.g[0] = "oof"
		self.assertEquals(obj.g[0], "oof")
		del obj.g[0]
		self.assertRaises(AttributeError, lambda: obj.g[0])
		self.assertRaises(AttributeError, lambda: obj.g.s)
		self.assertRaises(AttributeError, lambda: obj.g.x)
		obj.g.s = "foo"
		self.assertEquals(obj.g.s, "foo")
		try:
			obj.g.x = 0
			self.fail("Assigning a non-existent member of a GroupStructure didn't fail.")
		except AttributeError, e:
			pass
    def test_list_access(self):
        class test(object):
            l = ListStructure(
                "l",
                structures=[StringStructure("s"),
                            CharacterStructure("c")])
            l2 = ListStructure("l2", structures=[StringStructure("s")])
            l3 = ListStructure("l3", structures=[IntegerStructure("i")])
            l4 = ListStructure("l4",
                               structures=[
                                   EnumerationStructure("e",
                                                        values={
                                                            'a': 0,
                                                            'b': 1
                                                        })
                               ])

        obj = test()

        obj.l = []
        self.assertEquals(len(obj.l), 0)
        self.assertEquals(obj.l, [])

        obj.l = [['abc', '\x00']]
        self.assertEquals(obj.l[0], ['abc', '\x00'])
        self.assertEquals(obj.l, [['abc', '\x00']])

        self.assertNotEquals(obj.l, [[]])
        self.assertNotEquals(obj.l, [])
        self.assertNotEquals(obj.l, [[], []])
        #this test differs from the above:
        #assertNotEquals(a,b) asserts not a == b, this asserts a != b
        #these are different statements
        self.assertTrue(obj.l != [])

        obj.l[0] = ['1', '2']
        obj.l.insert(1, ['3', '4'])
        self.assertEquals(obj.l.pop(1), ['3', '4'])
        del obj.l[0]
        self.assertEqual(len(obj.l), 0)
        obj.l[0:] = [['a', 'b'], ['c', 'd']]
        self.assertEqual(obj.l, [['a', 'b'], ['c', 'd']])
        obj.l.append(['e', 'f'])
        self.assertEqual(obj.l, [['a', 'b'], ['c', 'd'], ['e', 'f']])
        del obj.l

        obj.l2 = ["ab", "cd", "ef"]
        self.assertEquals(obj.l2, ["ab", "cd", "ef"])
        self.assertEquals(len(obj.l2), 3)
        obj.l2[1] = "CD"
        self.assertEquals(obj.l2, ["ab", "CD", "ef"])
        obj.l2[1:-1] = ["cd"]
        self.assertEquals(obj.l2, ["ab", "cd", "ef"])
        del obj.l2[1]
        self.assertEquals(obj.l2, ["ab", "ef"])
        self.assertEquals(len(obj.l2), 2)

        for i, j in zip(obj.l2, ["ab", "ef"]):
            self.assertEquals(i, j)
        self.assertEquals(obj.l2 + ["gh"], ["ab", "ef", "gh"])
        self.assertEquals(obj.l2 * 2, ["ab", "ef", "ab", "ef"])
        self.assertEquals(2 * obj.l2, ["ab", "ef", "ab", "ef"])
        self.assertTrue("ef" in obj.l2)
        self.assertFalse("ef" not in obj.l2)
        self.assertFalse("CD" in obj.l2)
        self.assertTrue("CD" not in obj.l2)
        obj.l2.append("gh")
        self.assertEqual(obj.l2, ["ab", "ef", "gh"])
        self.assertEqual(list(reversed(obj.l2)), ["gh", "ef", "ab"])
        obj.l2.reverse()
        self.assertEqual(obj.l2, ["gh", "ef", "ab"])
        obj.l2.sort()
        self.assertEqual(obj.l2, ["ab", "ef", "gh"])

        obj.l3 = [2]
        self.assertTrue(obj.l3 < [3])
        self.assertTrue(obj.l3 <= [3])
        self.assertTrue(obj.l3 <= [2])
        self.assertTrue(obj.l3 > [1])
        self.assertTrue(obj.l3 >= [1])
        self.assertTrue(obj.l3 >= [2])

        obj.l3 = range(10)
        self.assertEqual(obj.l3, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        self.assertEqual(obj.l3[1:8], [1, 2, 3, 4, 5, 6, 7])
        self.assertEqual(obj.l3[1:8:2], [1, 3, 5, 7])
        self.assertEqual(obj.l3.count(2), 1)
        self.assertEqual(obj.l3.pop(0), 0)
        obj.l3.insert(0, 0)
        self.assertEqual(obj.l3, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        self.assertEqual(obj.l3.index(1), 1)
        obj.l3.extend([10, 11, 12, 13])
        self.assertEqual(obj.l3,
                         [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
        obj.l3.reverse()
        self.assertEqual(obj.l3,
                         [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
        obj.l3.remove(5)
        self.assertEqual(obj.l3, [13, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, 0])
        obj.l3[0:13:2] = [13, 11, 9, 7, 4, 2, 0]
        self.assertEqual(obj.l3, [13, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, 0])

        #Need a function to test illegal assignment with List
        def assign(object):
            object[1:9:2] = [2]

        self.assertRaises(ValueError, assign, obj.l3)

        value = unpack(test.l3.xstruct, test.l3.pack(obj))[0][0]
        self.assertEqual(obj.l3, value)
        test.l3.unpack(obj, test.l3.pack(obj))
        self.assertEqual(obj.l3, value)

        obj.l4 = range(2)
        self.assertEqual(obj.l4, [0, 1])
        self.assertRaises(ValueError, obj.l4.__setitem__, 0, 2)
	def test_list_access(self):
		class test(object):
			l = ListStructure("l", structures=[StringStructure("s"), CharacterStructure("c")])
			l2 = ListStructure("l2", structures=[StringStructure("s")])
			l3 = ListStructure("l3", structures=[IntegerStructure("i")])
			l4 = ListStructure("l4", structures=[EnumerationStructure("e", values={'a':0, 'b':1})])
		
		obj = test()


		obj.l = []
		self.assertEquals(len(obj.l), 0)
		self.assertEquals(obj.l, [])


		obj.l = [['abc', '\x00']]
		self.assertEquals(obj.l[0], ['abc', '\x00'])
		self.assertEquals(obj.l, [['abc', '\x00']])
		
		self.assertNotEquals(obj.l, [[]])
		self.assertNotEquals(obj.l, [])
		self.assertNotEquals(obj.l, [[], []])
		#this test differs from the above:
		#assertNotEquals(a,b) asserts not a == b, this asserts a != b
		#these are different statements
		self.assertTrue(obj.l != [])
		
		
		obj.l[0] = ['1', '2']
		obj.l.insert(1, ['3', '4'])
		self.assertEquals(obj.l.pop(1), ['3', '4'])
		del obj.l[0]
		self.assertEqual(len(obj.l), 0)
		obj.l[0:] = [['a', 'b'], ['c', 'd']]
		self.assertEqual(obj.l, [['a', 'b'], ['c', 'd']])
		obj.l.append(['e', 'f'])
		self.assertEqual(obj.l, [['a', 'b'], ['c', 'd'], ['e', 'f']])
		del obj.l
		
		obj.l2 = ["ab", "cd", "ef"]
		self.assertEquals(obj.l2, ["ab", "cd", "ef"])
		self.assertEquals(len(obj.l2), 3)
		obj.l2[1] = "CD"
		self.assertEquals(obj.l2, ["ab", "CD", "ef"])
		obj.l2[1:-1] = ["cd"]
		self.assertEquals(obj.l2, ["ab", "cd", "ef"])
		del obj.l2[1]
		self.assertEquals(obj.l2, ["ab", "ef"])
		self.assertEquals(len(obj.l2), 2)
		
		for i, j in zip(obj.l2, ["ab", "ef"]):
			self.assertEquals(i, j)
		self.assertEquals(obj.l2 + ["gh"], ["ab", "ef", "gh"])
		self.assertEquals(obj.l2 * 2, ["ab", "ef", "ab", "ef"])
		self.assertEquals(2 * obj.l2, ["ab", "ef", "ab", "ef"])
		self.assertTrue("ef" in obj.l2)
		self.assertFalse("ef" not in obj.l2)
		self.assertFalse("CD" in obj.l2)
		self.assertTrue("CD" not in obj.l2)
		obj.l2.append("gh")
		self.assertEqual(obj.l2, ["ab", "ef", "gh"])
		self.assertEqual(list(reversed(obj.l2)), ["gh", "ef", "ab"])
		obj.l2.reverse()
		self.assertEqual(obj.l2, ["gh", "ef", "ab"])
		obj.l2.sort()
		self.assertEqual(obj.l2, ["ab", "ef", "gh"])
		
		obj.l3 = [2]
		self.assertTrue(obj.l3 < [3])
		self.assertTrue(obj.l3 <= [3])
		self.assertTrue(obj.l3 <= [2])
		self.assertTrue(obj.l3 > [1])
		self.assertTrue(obj.l3 >= [1])
		self.assertTrue(obj.l3 >= [2])
		
		
		obj.l3 = range(10)
		self.assertEqual(obj.l3, [0,1,2,3,4,5,6,7,8,9])
		self.assertEqual(obj.l3[1:8], [1,2,3,4,5,6,7])
		self.assertEqual(obj.l3[1:8:2], [1,3,5,7])
		self.assertEqual(obj.l3.count(2), 1)
		self.assertEqual(obj.l3.pop(0), 0)
		obj.l3.insert(0,0)
		self.assertEqual(obj.l3, [0,1,2,3,4,5,6,7,8,9])
		self.assertEqual(obj.l3.index(1), 1)
		obj.l3.extend([10,11,12,13])
		self.assertEqual(obj.l3, [0,1,2,3,4,5,6,7,8,9,10,11,12,13])
		obj.l3.reverse()
		self.assertEqual(obj.l3, [13,12,11,10,9,8,7,6,5,4,3,2,1,0])
		obj.l3.remove(5)
		self.assertEqual(obj.l3, [13,12,11,10,9,8,7,6,4,3,2,1,0])
		obj.l3[0:13:2] = [13,11,9,7,4,2,0]
		self.assertEqual(obj.l3, [13,12,11,10,9,8,7,6,4,3,2,1,0])
		
		#Need a function to test illegal assignment with List
		def assign(object):
			object[1:9:2] = [2]
		
		self.assertRaises(ValueError, assign, obj.l3)
		
		value = unpack(test.l3.xstruct, test.l3.pack(obj))[0][0]
		self.assertEqual(obj.l3, value)
		test.l3.unpack(obj, test.l3.pack(obj))
		self.assertEqual(obj.l3, value)

		obj.l4 = range(2)
		self.assertEqual(obj.l4, [0,1])
		self.assertRaises(ValueError, obj.l4.__setitem__, 0, 2)