# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import mojo_unittest
from mojo_bindings import reflection


class GenerationTest(mojo_unittest.MojoTestCase):

  TEST_PACKAGES = [
    'math_calculator_mojom',
    'no_module_mojom',
    'rect_mojom',
    'regression_tests_mojom',
    'sample_factory_mojom',
    'sample_import2_mojom',
    'sample_import_mojom',
    'sample_interfaces_mojom',
    'sample_service_mojom',
    'serialization_test_structs_mojom',
    'test_structs_mojom',
    'validation_test_interfaces_mojom',
  ]

  @staticmethod
  def testGeneration():
    buildable_types = (reflection.MojoStructType, reflection.MojoInterfaceType)
    for module_name in GenerationTest.TEST_PACKAGES:
      module = __import__(module_name)
      for element_name in dir(module):
        element = getattr(module, element_name)
        if isinstance(element, buildable_types):
          # Check struct and interface are buildable
          element()
