| OLD | NEW |
| (Empty) |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import mojom | |
| 6 import mojom_pack | |
| 7 import mojom_test | |
| 8 import sys | |
| 9 | |
| 10 EXPECT_EQ = mojom_test.EXPECT_EQ | |
| 11 EXPECT_TRUE = mojom_test.EXPECT_TRUE | |
| 12 RunTest = mojom_test.RunTest | |
| 13 | |
| 14 | |
| 15 def TestOrdinalOrder(): | |
| 16 errors = 0 | |
| 17 struct = mojom.Struct('test') | |
| 18 struct.AddField('testfield1', mojom.INT32, 2) | |
| 19 struct.AddField('testfield2', mojom.INT32, 1) | |
| 20 ps = mojom_pack.PackedStruct(struct) | |
| 21 | |
| 22 errors += EXPECT_EQ(2, len(ps.packed_fields)) | |
| 23 errors += EXPECT_EQ('testfield2', ps.packed_fields[0].field.name) | |
| 24 errors += EXPECT_EQ('testfield1', ps.packed_fields[1].field.name) | |
| 25 | |
| 26 return errors | |
| 27 | |
| 28 def TestZeroFields(): | |
| 29 errors = 0 | |
| 30 struct = mojom.Struct('test') | |
| 31 ps = mojom_pack.PackedStruct(struct) | |
| 32 errors += EXPECT_EQ(0, len(ps.packed_fields)) | |
| 33 return errors | |
| 34 | |
| 35 | |
| 36 def TestOneField(): | |
| 37 errors = 0 | |
| 38 struct = mojom.Struct('test') | |
| 39 struct.AddField('testfield1', mojom.INT8) | |
| 40 ps = mojom_pack.PackedStruct(struct) | |
| 41 errors += EXPECT_EQ(1, len(ps.packed_fields)) | |
| 42 return errors | |
| 43 | |
| 44 # Pass three tuples. | |
| 45 # |kinds| is a sequence of mojom.Kinds that specify the fields that are to | |
| 46 # be created. | |
| 47 # |fields| is the expected order of the resulting fields, with the integer | |
| 48 # "1" first. | |
| 49 # |offsets| is the expected order of offsets, with the integer "0" first. | |
| 50 def TestSequence(kinds, fields, offsets): | |
| 51 errors = 0 | |
| 52 struct = mojom.Struct('test') | |
| 53 index = 1 | |
| 54 for kind in kinds: | |
| 55 struct.AddField("%d" % index, kind) | |
| 56 index += 1 | |
| 57 ps = mojom_pack.PackedStruct(struct) | |
| 58 num_fields = len(ps.packed_fields) | |
| 59 errors += EXPECT_EQ(len(kinds), num_fields) | |
| 60 for i in xrange(num_fields): | |
| 61 EXPECT_EQ("%d" % fields[i], ps.packed_fields[i].field.name) | |
| 62 EXPECT_EQ(offsets[i], ps.packed_fields[i].offset) | |
| 63 | |
| 64 return errors | |
| 65 | |
| 66 | |
| 67 def TestPaddingPackedInOrder(): | |
| 68 return TestSequence( | |
| 69 (mojom.INT8, mojom.UINT8, mojom.INT32), | |
| 70 (1, 2, 3), | |
| 71 (0, 1, 4)) | |
| 72 | |
| 73 | |
| 74 def TestPaddingPackedOutOfOrder(): | |
| 75 return TestSequence( | |
| 76 (mojom.INT8, mojom.INT32, mojom.UINT8), | |
| 77 (1, 3, 2), | |
| 78 (0, 1, 4)) | |
| 79 | |
| 80 | |
| 81 def TestPaddingPackedOverflow(): | |
| 82 kinds = (mojom.INT8, mojom.INT32, mojom.INT16, mojom.INT8, mojom.INT8) | |
| 83 # 2 bytes should be packed together first, followed by short, then by int. | |
| 84 fields = (1, 4, 3, 2, 5) | |
| 85 offsets = (0, 1, 2, 4, 8) | |
| 86 return TestSequence(kinds, fields, offsets) | |
| 87 | |
| 88 | |
| 89 def TestAllTypes(): | |
| 90 struct = mojom.Struct('test') | |
| 91 array = mojom.Array() | |
| 92 return TestSequence( | |
| 93 (mojom.BOOL, mojom.INT8, mojom.STRING, mojom.UINT8, | |
| 94 mojom.INT16, mojom.DOUBLE, mojom.UINT16, | |
| 95 mojom.INT32, mojom.UINT32, mojom.INT64, | |
| 96 mojom.FLOAT, mojom.STRING, mojom.HANDLE, | |
| 97 mojom.UINT64, mojom.Struct('test'), mojom.Array()), | |
| 98 (1, 2, 4, 5, 7, 3, 6, 8, 9, 10, 11, 13, 12, 14, 15, 16, 17), | |
| 99 (0, 1, 2, 4, 6, 8, 16, 24, 28, 32, 40, 44, 48, 56, 64, 72, 80)) | |
| 100 | |
| 101 | |
| 102 def TestPaddingPackedOutOfOrderByOrdinal(): | |
| 103 errors = 0 | |
| 104 struct = mojom.Struct('test') | |
| 105 struct.AddField('testfield1', mojom.INT8) | |
| 106 struct.AddField('testfield3', mojom.UINT8, 3) | |
| 107 struct.AddField('testfield2', mojom.INT32, 2) | |
| 108 ps = mojom_pack.PackedStruct(struct) | |
| 109 errors += EXPECT_EQ(3, len(ps.packed_fields)) | |
| 110 | |
| 111 # Second byte should be packed in behind first, altering order. | |
| 112 errors += EXPECT_EQ('testfield1', ps.packed_fields[0].field.name) | |
| 113 errors += EXPECT_EQ('testfield3', ps.packed_fields[1].field.name) | |
| 114 errors += EXPECT_EQ('testfield2', ps.packed_fields[2].field.name) | |
| 115 | |
| 116 # Second byte should be packed with first. | |
| 117 errors += EXPECT_EQ(0, ps.packed_fields[0].offset) | |
| 118 errors += EXPECT_EQ(1, ps.packed_fields[1].offset) | |
| 119 errors += EXPECT_EQ(4, ps.packed_fields[2].offset) | |
| 120 | |
| 121 return errors | |
| 122 | |
| 123 | |
| 124 def TestBools(): | |
| 125 errors = 0 | |
| 126 struct = mojom.Struct('test') | |
| 127 struct.AddField('bit0', mojom.BOOL) | |
| 128 struct.AddField('bit1', mojom.BOOL) | |
| 129 struct.AddField('int', mojom.INT32) | |
| 130 struct.AddField('bit2', mojom.BOOL) | |
| 131 struct.AddField('bit3', mojom.BOOL) | |
| 132 struct.AddField('bit4', mojom.BOOL) | |
| 133 struct.AddField('bit5', mojom.BOOL) | |
| 134 struct.AddField('bit6', mojom.BOOL) | |
| 135 struct.AddField('bit7', mojom.BOOL) | |
| 136 struct.AddField('bit8', mojom.BOOL) | |
| 137 ps = mojom_pack.PackedStruct(struct) | |
| 138 errors += EXPECT_EQ(10, len(ps.packed_fields)) | |
| 139 | |
| 140 # First 8 bits packed together. | |
| 141 for i in xrange(8): | |
| 142 pf = ps.packed_fields[i] | |
| 143 errors += EXPECT_EQ(0, pf.offset) | |
| 144 errors += EXPECT_EQ("bit%d" % i, pf.field.name) | |
| 145 errors += EXPECT_EQ(i, pf.bit) | |
| 146 | |
| 147 # Ninth bit goes into second byte. | |
| 148 errors += EXPECT_EQ("bit8", ps.packed_fields[8].field.name) | |
| 149 errors += EXPECT_EQ(1, ps.packed_fields[8].offset) | |
| 150 errors += EXPECT_EQ(0, ps.packed_fields[8].bit) | |
| 151 | |
| 152 # int comes last. | |
| 153 errors += EXPECT_EQ("int", ps.packed_fields[9].field.name) | |
| 154 errors += EXPECT_EQ(4, ps.packed_fields[9].offset) | |
| 155 | |
| 156 return errors | |
| 157 | |
| 158 | |
| 159 def Main(args): | |
| 160 errors = 0 | |
| 161 errors += RunTest(TestZeroFields) | |
| 162 errors += RunTest(TestOneField) | |
| 163 errors += RunTest(TestPaddingPackedInOrder) | |
| 164 errors += RunTest(TestPaddingPackedOutOfOrder) | |
| 165 errors += RunTest(TestPaddingPackedOverflow) | |
| 166 errors += RunTest(TestAllTypes) | |
| 167 errors += RunTest(TestPaddingPackedOutOfOrderByOrdinal) | |
| 168 errors += RunTest(TestBools) | |
| 169 | |
| 170 return errors | |
| 171 | |
| 172 | |
| 173 if __name__ == '__main__': | |
| 174 sys.exit(Main(sys.argv[1:])) | |
| OLD | NEW |