# 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 expression_parser
from compiler.util import ir_pb2
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.FunctionMapping.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()
