blob: b9d8d84eed322d97d80b54fcb72647a74c6a16cc [file] [log] [blame]
# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests for util.ir_util."""
import unittest
from compiler.util import ir_pb2
from compiler.util import expression_parser
from compiler.util import ir_util
def _parse_expression(text):
return expression_parser.parse(text)
class IrUtilTest(unittest.TestCase):
"""Tests for the miscellaneous utility functions in ir_util.py."""
def test_is_constant_integer(self):
self.assertTrue(ir_util.is_constant(_parse_expression("6")))
expression = _parse_expression("12")
# The type information should be ignored for constants like this one.
expression.type.integer.CopyFrom(ir_pb2.IntegerType())
self.assertTrue(ir_util.is_constant(expression))
def test_is_constant_boolean(self):
self.assertTrue(ir_util.is_constant(_parse_expression("true")))
expression = _parse_expression("true")
# The type information should be ignored for constants like this one.
expression.type.boolean.CopyFrom(ir_pb2.BooleanType())
self.assertTrue(ir_util.is_constant(expression))
def test_is_constant_enum(self):
self.assertTrue(ir_util.is_constant(ir_pb2.Expression(
constant_reference=ir_pb2.Reference(),
type=ir_pb2.ExpressionType(enumeration=ir_pb2.EnumType(value="12")))))
def test_is_constant_integer_type(self):
self.assertFalse(ir_util.is_constant_type(ir_pb2.ExpressionType(
integer=ir_pb2.IntegerType(
modulus="10",
modular_value="5",
minimum_value="-5",
maximum_value="15"))))
self.assertTrue(ir_util.is_constant_type(ir_pb2.ExpressionType(
integer=ir_pb2.IntegerType(
modulus="infinity",
modular_value="5",
minimum_value="5",
maximum_value="5"))))
def test_is_constant_boolean_type(self):
self.assertFalse(ir_util.is_constant_type(ir_pb2.ExpressionType(
boolean=ir_pb2.BooleanType())))
self.assertTrue(ir_util.is_constant_type(ir_pb2.ExpressionType(
boolean=ir_pb2.BooleanType(value=True))))
self.assertTrue(ir_util.is_constant_type(ir_pb2.ExpressionType(
boolean=ir_pb2.BooleanType(value=False))))
def test_is_constant_enumeration_type(self):
self.assertFalse(ir_util.is_constant_type(ir_pb2.ExpressionType(
enumeration=ir_pb2.EnumType())))
self.assertTrue(ir_util.is_constant_type(ir_pb2.ExpressionType(
enumeration=ir_pb2.EnumType(value="0"))))
def test_is_constant_opaque_type(self):
self.assertFalse(ir_util.is_constant_type(ir_pb2.ExpressionType(
opaque=ir_pb2.OpaqueType())))
def test_constant_value_of_integer(self):
self.assertEqual(6, ir_util.constant_value(_parse_expression("6")))
def test_constant_value_of_none(self):
self.assertIsNone(ir_util.constant_value(ir_pb2.Expression()))
def test_constant_value_of_addition(self):
self.assertEqual(6, ir_util.constant_value(_parse_expression("2+4")))
def test_constant_value_of_subtraction(self):
self.assertEqual(-2, ir_util.constant_value(_parse_expression("2-4")))
def test_constant_value_of_multiplication(self):
self.assertEqual(8, ir_util.constant_value(_parse_expression("2*4")))
def test_constant_value_of_equality(self):
self.assertFalse(ir_util.constant_value(_parse_expression("2 == 4")))
def test_constant_value_of_inequality(self):
self.assertTrue(ir_util.constant_value(_parse_expression("2 != 4")))
def test_constant_value_of_less(self):
self.assertTrue(ir_util.constant_value(_parse_expression("2 < 4")))
def test_constant_value_of_less_or_equal(self):
self.assertTrue(ir_util.constant_value(_parse_expression("2 <= 4")))
def test_constant_value_of_greater(self):
self.assertFalse(ir_util.constant_value(_parse_expression("2 > 4")))
def test_constant_value_of_greater_or_equal(self):
self.assertFalse(ir_util.constant_value(_parse_expression("2 >= 4")))
def test_constant_value_of_and(self):
self.assertFalse(ir_util.constant_value(_parse_expression("true && false")))
self.assertTrue(ir_util.constant_value(_parse_expression("true && true")))
def test_constant_value_of_or(self):
self.assertTrue(ir_util.constant_value(_parse_expression("true || false")))
self.assertFalse(
ir_util.constant_value(_parse_expression("false || false")))
def test_constant_value_of_choice(self):
self.assertEqual(
10, ir_util.constant_value(_parse_expression("false ? 20 : 10")))
self.assertEqual(
20, ir_util.constant_value(_parse_expression("true ? 20 : 10")))
def test_constant_value_of_choice_with_unknown_other_branch(self):
self.assertEqual(
10, ir_util.constant_value(_parse_expression("false ? foo : 10")))
self.assertEqual(
20, ir_util.constant_value(_parse_expression("true ? 20 : foo")))
def test_constant_value_of_maximum(self):
self.assertEqual(10,
ir_util.constant_value(_parse_expression("$max(5, 10)")))
self.assertEqual(10,
ir_util.constant_value(_parse_expression("$max(10)")))
self.assertEqual(
10,
ir_util.constant_value(_parse_expression("$max(5, 9, 7, 10, 6, -100)")))
def test_constant_value_of_boolean(self):
self.assertTrue(ir_util.constant_value(_parse_expression("true")))
self.assertFalse(ir_util.constant_value(_parse_expression("false")))
def test_constant_value_of_enum(self):
self.assertEqual(12, ir_util.constant_value(ir_pb2.Expression(
constant_reference=ir_pb2.Reference(),
type=ir_pb2.ExpressionType(enumeration=ir_pb2.EnumType(value="12")))))
def test_constant_value_of_integer_reference(self):
self.assertEqual(12, ir_util.constant_value(ir_pb2.Expression(
constant_reference=ir_pb2.Reference(),
type=ir_pb2.ExpressionType(
integer=ir_pb2.IntegerType(modulus="infinity",
modular_value="12")))))
def test_constant_value_of_boolean_reference(self):
self.assertTrue(ir_util.constant_value(ir_pb2.Expression(
constant_reference=ir_pb2.Reference(),
type=ir_pb2.ExpressionType(boolean=ir_pb2.BooleanType(value=True)))))
def test_constant_value_of_builtin_reference(self):
self.assertEqual(12, ir_util.constant_value(
ir_pb2.Expression(
builtin_reference=ir_pb2.Reference(
canonical_name=ir_pb2.CanonicalName(object_path=["$foo"]))),
{"$foo": 12}))
def test_constant_value_of_field_reference(self):
self.assertIsNone(ir_util.constant_value(_parse_expression("foo")))
def test_constant_value_of_missing_builtin_reference(self):
self.assertIsNone(ir_util.constant_value(
_parse_expression("$static_size_in_bits"), {"$bar": 12}))
def test_constant_value_of_present_builtin_reference(self):
self.assertEqual(12, ir_util.constant_value(
_parse_expression("$static_size_in_bits"),
{"$static_size_in_bits": 12}))
def test_constant_false_value_of_operator_and_with_missing_value(self):
self.assertIs(False, ir_util.constant_value(
_parse_expression("false && foo"), {"bar": 12}))
self.assertIs(False, ir_util.constant_value(
_parse_expression("foo && false"), {"bar": 12}))
def test_constant_false_value_of_operator_and_known_value(self):
self.assertTrue(ir_util.constant_value(
_parse_expression("true && $is_statically_sized"),
{"$is_statically_sized": True}))
def test_constant_none_value_of_operator_and_with_missing_value(self):
self.assertIsNone(ir_util.constant_value(
_parse_expression("true && foo"), {"bar": 12}))
self.assertIsNone(ir_util.constant_value(
_parse_expression("foo && true"), {"bar": 12}))
def test_constant_false_value_of_operator_or_with_missing_value(self):
self.assertTrue(ir_util.constant_value(
_parse_expression("true || foo"), {"bar": 12}))
self.assertTrue(ir_util.constant_value(
_parse_expression("foo || true"), {"bar": 12}))
def test_constant_none_value_of_operator_or_with_missing_value(self):
self.assertIsNone(ir_util.constant_value(
_parse_expression("foo || false"), {"bar": 12}))
self.assertIsNone(ir_util.constant_value(
_parse_expression("false || foo"), {"bar": 12}))
def test_constant_value_of_operator_plus_with_missing_value(self):
self.assertIsNone(ir_util.constant_value(
_parse_expression("12 + foo"), {"bar": 12}))
def test_is_array(self):
self.assertTrue(
ir_util.is_array(ir_pb2.Type(array_type=ir_pb2.ArrayType())))
self.assertFalse(
ir_util.is_array(ir_pb2.Type(atomic_type=ir_pb2.AtomicType())))
def test_get_attribute(self):
type_def = ir_pb2.TypeDefinition(attribute=[
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=ir_pb2.Expression()),
name=ir_pb2.Word(text="phil")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("true")),
name=ir_pb2.Word(text="bob")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob2")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("true")),
name=ir_pb2.Word(text="bob2"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob3"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word()),
])
self.assertEqual(
ir_pb2.AttributeValue(expression=_parse_expression("true")),
ir_util.get_attribute(type_def.attribute, "bob"))
self.assertEqual(
ir_pb2.AttributeValue(expression=_parse_expression("false")),
ir_util.get_attribute(type_def.attribute, "bob2"))
self.assertEqual(None, ir_util.get_attribute(type_def.attribute, "Bob"))
self.assertEqual(None, ir_util.get_attribute(type_def.attribute, "bob3"))
def test_get_boolean_attribute(self):
type_def = ir_pb2.TypeDefinition(attribute=[
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=ir_pb2.Expression()),
name=ir_pb2.Word(text="phil")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("true")),
name=ir_pb2.Word(text="bob")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob2")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("true")),
name=ir_pb2.Word(text="bob2"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob3"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word()),
])
self.assertTrue(ir_util.get_boolean_attribute(type_def.attribute, "bob"))
self.assertTrue(ir_util.get_boolean_attribute(type_def.attribute,
"bob",
default_value=False))
self.assertFalse(ir_util.get_boolean_attribute(type_def.attribute, "bob2"))
self.assertFalse(ir_util.get_boolean_attribute(type_def.attribute,
"bob2",
default_value=True))
self.assertIsNone(ir_util.get_boolean_attribute(type_def.attribute, "Bob"))
self.assertTrue(ir_util.get_boolean_attribute(type_def.attribute,
"Bob",
default_value=True))
self.assertIsNone(ir_util.get_boolean_attribute(type_def.attribute, "bob3"))
def test_get_integer_attribute(self):
type_def = ir_pb2.TypeDefinition(attribute=[
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType()))),
name=ir_pb2.Word(text="phil")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="20"),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="20",
modulus="infinity")))),
name=ir_pb2.Word(text="bob"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="10"),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="10",
modulus="infinity")))),
name=ir_pb2.Word(text="bob")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="5"),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="5",
modulus="infinity")))),
name=ir_pb2.Word(text="bob2")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="0"),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="0",
modulus="infinity")))),
name=ir_pb2.Word(text="bob2"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="30"),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="30",
modulus="infinity")))),
name=ir_pb2.Word(text="bob3"),
is_default=True),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
function=ir_pb2.Function(
function=ir_pb2.Function.ADDITION,
args=[
ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="100"),
type=ir_pb2.ExpressionType(
integer=ir_pb2.IntegerType(
modular_value="100",
modulus="infinity"))),
ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="100"),
type=ir_pb2.ExpressionType(
integer=ir_pb2.IntegerType(
modular_value="100",
modulus="infinity")))
]),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="200",
modulus="infinity")))),
name=ir_pb2.Word(text="bob4")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(
expression=ir_pb2.Expression(
constant=ir_pb2.NumericConstant(value="40"),
type=ir_pb2.ExpressionType(integer=ir_pb2.IntegerType(
modular_value="40",
modulus="infinity")))),
name=ir_pb2.Word()),
])
self.assertEqual(10,
ir_util.get_integer_attribute(type_def.attribute, "bob"))
self.assertEqual(5,
ir_util.get_integer_attribute(type_def.attribute, "bob2"))
self.assertIsNone(ir_util.get_integer_attribute(type_def.attribute, "Bob"))
self.assertEqual(10, ir_util.get_integer_attribute(type_def.attribute,
"Bob",
default_value=10))
self.assertIsNone(ir_util.get_integer_attribute(type_def.attribute, "bob3"))
self.assertEqual(200, ir_util.get_integer_attribute(type_def.attribute,
"bob4"))
def test_get_duplicate_attribute(self):
type_def = ir_pb2.TypeDefinition(attribute=[
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=ir_pb2.Expression()),
name=ir_pb2.Word(text="phil")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("true")),
name=ir_pb2.Word(text="bob")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word(text="bob")),
ir_pb2.Attribute(
value=ir_pb2.AttributeValue(expression=_parse_expression("false")),
name=ir_pb2.Word()),
])
self.assertRaises(AssertionError, ir_util.get_attribute, type_def.attribute,
"bob")
def test_find_object(self):
ir = ir_pb2.EmbossIr.from_json(
"""{
"module": [
{
"type": [
{
"structure": {
"field": [
{
"name": {
"name": { "text": "field" },
"canonical_name": {
"module_file": "test.emb",
"object_path": [ "Foo", "field" ]
}
}
}
]
},
"name": {
"name": { "text": "Foo" },
"canonical_name": {
"module_file": "test.emb",
"object_path": [ "Foo" ]
}
},
"runtime_parameter": [
{
"name": {
"name": { "text": "parameter" },
"canonical_name": {
"module_file": "test.emb",
"object_path": [ "Foo", "parameter" ]
}
}
}
]
},
{
"enumeration": {
"value": [
{
"name": {
"name": { "text": "QUX" },
"canonical_name": {
"module_file": "test.emb",
"object_path": [ "Bar", "QUX" ]
}
}
}
]
},
"name": {
"name": { "text": "Bar" },
"canonical_name": {
"module_file": "test.emb",
"object_path": [ "Bar" ]
}
}
}
],
"source_file_name": "test.emb"
},
{
"type": [
{
"external": {},
"name": {
"name": { "text": "UInt" },
"canonical_name": {
"module_file": "",
"object_path": [ "UInt" ]
}
}
}
],
"source_file_name": ""
}
]
}""")
# Test that find_object works with any of its four "name" types.
canonical_name_of_foo = ir_pb2.CanonicalName(module_file="test.emb",
object_path=["Foo"])
self.assertEqual(ir.module[0].type[0], ir_util.find_object(
ir_pb2.Reference(canonical_name=canonical_name_of_foo), ir))
self.assertEqual(ir.module[0].type[0], ir_util.find_object(
ir_pb2.NameDefinition(canonical_name=canonical_name_of_foo), ir))
self.assertEqual(ir.module[0].type[0],
ir_util.find_object(canonical_name_of_foo, ir))
self.assertEqual(ir.module[0].type[0],
ir_util.find_object(("test.emb", "Foo"), ir))
# Test that find_object works with objects other than structs.
self.assertEqual(ir.module[0].type[1],
ir_util.find_object(("test.emb", "Bar"), ir))
self.assertEqual(ir.module[1].type[0],
ir_util.find_object(("", "UInt"), ir))
self.assertEqual(ir.module[0].type[0].structure.field[0],
ir_util.find_object(("test.emb", "Foo", "field"), ir))
self.assertEqual(ir.module[0].type[0].runtime_parameter[0],
ir_util.find_object(("test.emb", "Foo", "parameter"), ir))
self.assertEqual(ir.module[0].type[1].enumeration.value[0],
ir_util.find_object(("test.emb", "Bar", "QUX"), ir))
self.assertEqual(ir.module[0], ir_util.find_object(("test.emb",), ir))
self.assertEqual(ir.module[1], ir_util.find_object(("",), ir))
# Test searching for non-present objects.
self.assertIsNone(ir_util.find_object_or_none(("not_test.emb",), ir))
self.assertIsNone(ir_util.find_object_or_none(("test.emb", "NotFoo"), ir))
self.assertIsNone(
ir_util.find_object_or_none(("test.emb", "Foo", "not_field"), ir))
self.assertIsNone(
ir_util.find_object_or_none(("test.emb", "Foo", "field", "no_subfield"),
ir))
self.assertIsNone(
ir_util.find_object_or_none(("test.emb", "Bar", "NOT_QUX"), ir))
self.assertIsNone(
ir_util.find_object_or_none(("test.emb", "Bar", "QUX", "no_subenum"),
ir))
# Test that find_parent_object works with any of its four "name" types.
self.assertEqual(ir.module[0], ir_util.find_parent_object(
ir_pb2.Reference(canonical_name=canonical_name_of_foo), ir))
self.assertEqual(ir.module[0], ir_util.find_parent_object(
ir_pb2.NameDefinition(canonical_name=canonical_name_of_foo), ir))
self.assertEqual(ir.module[0],
ir_util.find_parent_object(canonical_name_of_foo, ir))
self.assertEqual(ir.module[0],
ir_util.find_parent_object(("test.emb", "Foo"), ir))
# Test that find_parent_object works with objects other than structs.
self.assertEqual(ir.module[0],
ir_util.find_parent_object(("test.emb", "Bar"), ir))
self.assertEqual(ir.module[1], ir_util.find_parent_object(("", "UInt"), ir))
self.assertEqual(ir.module[0].type[0],
ir_util.find_parent_object(("test.emb", "Foo", "field"),
ir))
self.assertEqual(ir.module[0].type[1],
ir_util.find_parent_object(("test.emb", "Bar", "QUX"), ir))
def test_hashable_form_of_reference(self):
self.assertEqual(
("t.emb", "Foo", "Bar"),
ir_util.hashable_form_of_reference(ir_pb2.Reference(
canonical_name=ir_pb2.CanonicalName(module_file="t.emb",
object_path=["Foo", "Bar"]))))
self.assertEqual(
("t.emb", "Foo", "Bar"),
ir_util.hashable_form_of_reference(ir_pb2.NameDefinition(
canonical_name=ir_pb2.CanonicalName(module_file="t.emb",
object_path=["Foo", "Bar"]))))
def test_get_base_type(self):
array_type_ir = ir_pb2.Type.from_json(
"""{
"array_type": {
"element_count": { "constant": { "value": "20" } },
"base_type": {
"array_type": {
"element_count": { "constant": { "value": "10" } },
"base_type": {
"atomic_type": {
"reference": { },
"source_location": { "start": { "line": 5 } }
}
},
"source_location": { "start": { "line": 4 } }
}
},
"source_location": { "start": { "line": 3 } }
}
}""")
base_type_ir = array_type_ir.array_type.base_type.array_type.base_type
self.assertEqual(base_type_ir, ir_util.get_base_type(array_type_ir))
self.assertEqual(base_type_ir, ir_util.get_base_type(
array_type_ir.array_type.base_type))
self.assertEqual(base_type_ir, ir_util.get_base_type(base_type_ir))
def test_size_of_type_in_bits(self):
ir = ir_pb2.EmbossIr.from_json(
"""{
"module": [{
"type": [{
"name": {
"name": { "text": "Baz" },
"canonical_name": {
"module_file": "s.emb",
"object_path": ["Baz"]
}
}
}],
"source_file_name": "s.emb"
},
{
"type": [{
"name": {
"name": { "text": "UInt" },
"canonical_name": {
"module_file": "",
"object_path": ["UInt"]
}
}
},
{
"name": {
"name": { "text": "Byte" },
"canonical_name": {
"module_file": "",
"object_path": ["Byte"]
}
},
"attribute": [{
"name": { "text": "fixed_size_in_bits" },
"value": {
"expression": {
"constant": { "value": "8" },
"type": {
"integer": { "modular_value": "8", "modulus": "infinity" }
}
}
}
}]
}],
"source_file_name": ""
}]
}""")
fixed_size_type = ir_pb2.Type.from_json(
"""{
"atomic_type": {
"reference": {
"canonical_name": { "module_file": "", "object_path": ["Byte"] }
}
}
}""")
self.assertEqual(8, ir_util.fixed_size_of_type_in_bits(fixed_size_type, ir))
explicit_size_type = ir_pb2.Type.from_json(
"""{
"atomic_type": {
"reference": {
"canonical_name": { "module_file": "", "object_path": ["UInt"] }
}
},
"size_in_bits": {
"constant": { "value": "32" },
"type": {
"integer": { "modular_value": "32", "modulus": "infinity" }
}
}
}""")
self.assertEqual(32,
ir_util.fixed_size_of_type_in_bits(explicit_size_type, ir))
fixed_size_array = ir_pb2.Type.from_json(
"""{
"array_type": {
"base_type": {
"atomic_type": {
"reference": {
"canonical_name": { "module_file": "", "object_path": ["Byte"] }
}
}
},
"element_count": {
"constant": { "value": "5" },
"type": {
"integer": { "modular_value": "5", "modulus": "infinity" }
}
}
}
}""")
self.assertEqual(40,
ir_util.fixed_size_of_type_in_bits(fixed_size_array, ir))
fixed_size_2d_array = ir_pb2.Type.from_json(
"""{
"array_type": {
"base_type": {
"array_type": {
"base_type": {
"atomic_type": {
"reference": {
"canonical_name": {
"module_file": "",
"object_path": ["Byte"]
}
}
}
},
"element_count": {
"constant": { "value": "5" },
"type": {
"integer": { "modular_value": "5", "modulus": "infinity" }
}
}
}
},
"element_count": {
"constant": { "value": "2" },
"type": {
"integer": { "modular_value": "2", "modulus": "infinity" }
}
}
}
}""")
self.assertEqual(
80, ir_util.fixed_size_of_type_in_bits(fixed_size_2d_array, ir))
automatic_size_array = ir_pb2.Type.from_json(
"""{
"array_type": {
"base_type": {
"array_type": {
"base_type": {
"atomic_type": {
"reference": {
"canonical_name": {
"module_file": "",
"object_path": ["Byte"]
}
}
}
},
"element_count": {
"constant": { "value": "5" },
"type": {
"integer": { "modular_value": "5", "modulus": "infinity" }
}
}
}
},
"automatic": { }
}
}""")
self.assertIsNone(
ir_util.fixed_size_of_type_in_bits(automatic_size_array, ir))
variable_size_type = ir_pb2.Type.from_json(
"""{
"atomic_type": {
"reference": {
"canonical_name": { "module_file": "", "object_path": ["UInt"] }
}
}
}""")
self.assertIsNone(
ir_util.fixed_size_of_type_in_bits(variable_size_type, ir))
no_size_type = ir_pb2.Type.from_json(
"""{
"atomic_type": {
"reference": {
"canonical_name": {
"module_file": "s.emb",
"object_path": ["Baz"]
}
}
}
}""")
self.assertIsNone(ir_util.fixed_size_of_type_in_bits(no_size_type, ir))
def test_field_is_virtual(self):
self.assertTrue(ir_util.field_is_virtual(ir_pb2.Field()))
def test_field_is_not_virtual(self):
self.assertFalse(ir_util.field_is_virtual(
ir_pb2.Field(location=ir_pb2.FieldLocation())))
def test_field_is_read_only(self):
self.assertTrue(ir_util.field_is_read_only(ir_pb2.Field(
write_method=ir_pb2.WriteMethod(read_only=True))))
def test_field_is_not_read_only(self):
self.assertFalse(ir_util.field_is_read_only(
ir_pb2.Field(location=ir_pb2.FieldLocation())))
self.assertFalse(ir_util.field_is_read_only(ir_pb2.Field(
write_method=ir_pb2.WriteMethod())))
if __name__ == "__main__":
unittest.main()