def testUnitUniverseGetFindings(self): context = findings_lib.FileContext('{0}/file.yaml'.format(_GOOD_PATH)) folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFinding( findings_lib.InconsistentFileLocationError('', context)) namespace = folder.local_namespace namespace.AddFinding( findings_lib.DuplicateUnitDefinitionError( unit_lib.Unit('unit', 'measurement'), 'namespace')) unit = unit_lib.Unit('unit', 'measurement') unit.AddFinding( findings_lib.UnknownUnitTagError(unit.name, 'tag', context)) namespace.InsertUnit(unit) unit_universe = unit_lib.UnitUniverse([folder]) findings = unit_universe.GetFindings() self.assertLen(findings, 3) self.assertTrue( unit_universe.HasFindingTypes([ findings_lib.InconsistentFileLocationError, findings_lib.DuplicateUnitDefinitionError, findings_lib.UnknownUnitTagError, ])) self.assertFalse(unit_universe.IsValid())
def CreateUnitFolder(folderpath, parent_namespace): unit_folder = unit_lib.UnitFolder(folderpath, parent_namespace) if subfield_universe: unit_folder.local_namespace.subfields = ( subfield_universe.GetSubfieldsMap( unit_folder.local_namespace.namespace)) return unit_folder
def testUnitFolderAddInvalidUnitFails(self): folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddUnit('invalid', unit_lib.Unit('bad-unit')) self.assertIsNone( folder.local_namespace.GetUnitsForMeasurement('invalid')) self.assertIsInstance(folder.GetFindings()[0], findings_lib.InvalidUnitNameError)
def testConfigUniverseGetUnitsForMeasurement(self): folder = unit_lib.UnitFolder('units/anyfolder') namespace = folder.local_namespace namespace.InsertUnit( unit_lib.Unit('degrees_celsius', 'temperature', False)) namespace.InsertUnit(unit_lib.Unit('kelvin', 'temperature', True)) unit_universe = unit_lib.UnitUniverse([folder]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=None, field_universe=None, entity_type_universe=None, state_universe=None, connection_universe=None, unit_universe=unit_universe) units = config_universe.GetUnitsForMeasurement( 'zone_temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement('temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement( '/zone_temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement('/temperature_sensor') self.assertSameElements(['degrees_celsius', 'kelvin'], units) units = config_universe.GetUnitsForMeasurement('pressure_sensor') self.assertIsNone(units) units = config_universe.GetUnitsForMeasurement( 'discharge_fan_lost_power_alarm') self.assertIsNone(units)
def testConfigUniverseGetUnitsForMeasurementMultipleNoUnits(self): doc = { 'powerfactor': [{ 'no_units': 'STANDARD' }, 'another_one'], 'voltageratio': [{ 'no_units': 'STANDARD' }], } folder = unit_lib.UnitFolder('units/anyfolder') folder.AddFromConfig([doc], 'units/anyfolder/units.yaml') unit_universe = unit_lib.UnitUniverse([folder]) config_universe = presubmit_validate_types_lib.ConfigUniverse( subfield_universe=None, field_universe=None, entity_type_universe=None, state_universe=None, connection_universe=None, unit_universe=unit_universe) units1 = config_universe.GetUnitsForMeasurement('powerfactor_sensor') units2 = config_universe.GetUnitsForMeasurement('voltageratio_sensor') self.assertSameElements(['no_units', 'another_one'], units1) self.assertSameElements(['no_units'], units2)
def testUnitFolderAddFromConfigTooFewStandardUnits(self): doc = { 'temperature': ['kelvins', 'degrees_celsius'], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) self.assertIsInstance(folder.GetFindings()[0], findings_lib.StandardUnitCountError)
def testUnitFolderAddDuplicateUnitFails(self): folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddUnit(unit_lib.Unit('unit', 'measurement')) self.assertIn('unit', folder.local_namespace.units) self.assertEmpty(folder.local_namespace.GetFindings()) folder.AddUnit(unit_lib.Unit('unit', 'duplicate')) self.assertIsInstance(folder.local_namespace.GetFindings()[0], findings_lib.DuplicateUnitDefinitionError)
def testUnitUniverseGetUnitsMap(self): folder = unit_lib.UnitFolder(_GOOD_PATH) namespace = folder.local_namespace namespace.InsertUnit( unit_lib.Unit('degrees_celsius', 'temperature', False)) namespace.InsertUnit(unit_lib.Unit('kelvins', 'temperature', True)) unit_universe = unit_lib.UnitUniverse([folder]) units = unit_universe.GetUnitsMap('mynamespace') self.assertIn('degrees_celsius', units) self.assertIn('kelvins', units)
def testUnitFolderAddFromConfigUnknownUnitTag(self): doc = { 'temperature': [{ 'kelvins': 'STANDARD' }, { 'wrong': 'BAD_TAG' }], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) self.assertIsInstance(folder.GetFindings()[0], findings_lib.UnknownUnitTagError)
def testUnitFolderAddFromConfigInvalidUnitFormat(self): doc = { 'temperature': [{ 'kelvins': 'STANDARD' }, { 'something': 'oops', 'huh': 'what' }], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) self.assertIsInstance(folder.GetFindings()[0], findings_lib.InvalidUnitFormatError)
def testUnitUniverseGetUnitsForMeasurement(self): folder = unit_lib.UnitFolder(_GOOD_PATH) namespace = folder.local_namespace namespace.InsertUnit('temperature', unit_lib.Unit('degrees_celsius', False)) namespace.InsertUnit('temperature', unit_lib.Unit('kelvins', True)) namespace.InsertUnit('percent', unit_lib.Unit('percent', True)) unit_universe = unit_lib.UnitUniverse([folder]) units = unit_universe.GetUnitsForMeasurement('temperature', 'mynamespace') self.assertCountEqual(['degrees_celsius', 'kelvins'], units)
def testUnitFolderAddFromConfigAliasIsAlias(self): doc = { 'distance': [{ 'meters': 'STANDARD' }, 'feet'], 'length': 'distance', 'level': 'length', } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) self.assertIsInstance(folder.local_namespace.GetFindings()[0], findings_lib.MeasurementAliasIsAliasedError)
def testUnitFolderAddFromConfigBadAliasBase(self): doc = { 'length': 'invalid', 'distance': [{ 'meters': 'STANDARD' }, 'feet'], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) self.assertIsInstance( folder.local_namespace.GetFindings()[0], findings_lib.UnrecognizedMeasurementAliasBaseError)
def testUnitFolderAddFromConfig(self): doc = { 'temperature': [{ 'kelvins': 'STANDARD' }, 'degrees_celsius'], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) units = folder.local_namespace.GetUnitsForMeasurement('temperature') self.assertEmpty(folder.GetFindings()) self.assertCountEqual(['kelvins', 'degrees_celsius'], units) self.assertEqual(units['kelvins'], unit_lib.Unit('kelvins', True)) self.assertEqual(units['degrees_celsius'], unit_lib.Unit('degrees_celsius', False))
def testFindingAddedForInvalidNamespace(self): folder = unit_lib.UnitFolder(_GOOD_PATH) namespace = folder.local_namespace namespace.parent_namespace = unit_lib.UnitNamespace('fake_parent') namespace.InsertUnit('temperature', unit_lib.Unit('degrees_celsius', False)) unit_universe = unit_lib.UnitUniverse([folder]) findings_universe = findings_lib.FindingsUniverse([folder]) findings = findings_universe.GetFindings() self.assertLen(findings, 1) self.assertTrue( unit_universe.HasFindingTypes( [findings_lib.InvalidUnitNamespaceError])) self.assertFalse(unit_universe.IsValid())
def testUnitFolderAddFromConfigMultipleNoUnits(self): doc = { 'powerfactor': [{ 'no_units': 'STANDARD' }, 'another_one'], 'voltageratio': [{ 'no_units': 'STANDARD' }], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) units = folder.local_namespace.units self.assertEmpty(folder.GetFindings()) expected = [ 'no_units_powerfactor', 'another_one', 'no_units_voltageratio' ] self.assertCountEqual(expected, units)
def testUnitFolderAddFromConfigMeasurementAlias(self): doc = { 'length': 'distance', 'distance': [{ 'meters': 'STANDARD' }, 'feet'], } folder = unit_lib.UnitFolder(_GOOD_PATH) expected_units = ['meters', 'feet'] folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) distance_units = folder.local_namespace.GetUnitsForMeasurement( 'distance') length_units = folder.local_namespace.GetUnitsForMeasurement('length') self.assertEmpty(folder.local_namespace.GetFindings()) self.assertCountEqual(expected_units, distance_units) self.assertCountEqual(expected_units, length_units)
def testUnitFolderAddFromConfigMultipleNoUnits(self): doc = { 'powerfactor': [{ 'no_units': 'STANDARD' }, 'another_one'], 'voltageratio': [{ 'no_units': 'STANDARD' }], } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc], '{0}/file.yaml'.format(_GOOD_PATH)) pf_units = folder.local_namespace.GetUnitsForMeasurement('powerfactor') vr_units = folder.local_namespace.GetUnitsForMeasurement( 'voltageratio') self.assertEmpty(folder.GetFindings()) self.assertCountEqual(['no_units', 'another_one'], pf_units) self.assertCountEqual(['no_units'], vr_units)
def testUnitFolderAddFromConfigDuplicateAlias(self): doc_1 = { 'distance': [{ 'yards': 'STANDARD' }, 'inches'], 'level': 'distance', } doc_2 = { 'length': [{ 'meters': 'STANDARD' }, 'feet'], 'level': 'length', } folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddFromConfig([doc_1, doc_2], '{0}/file.yaml'.format(_GOOD_PATH)) self.assertIsInstance(folder.local_namespace.GetFindings()[0], findings_lib.DuplicateMeasurementAliasError)
def testUnitFolderAddInvalidUnitFails(self): folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddUnit(unit_lib.Unit('bad-unit', 'invalid')) self.assertNotIn('bad-unit', folder.local_namespace.units) self.assertIsInstance(folder.GetFindings()[0], findings_lib.IllegalCharacterError)
def testUnitFolderAddValidUnit(self): folder = unit_lib.UnitFolder(_GOOD_PATH) folder.AddUnit(unit_lib.Unit('unit', 'measurement')) self.assertIn('unit', folder.local_namespace.units) self.assertEmpty(folder.GetFindings())
def create_simplified_universe( ) -> presubmit_validate_types_lib.ConfigUniverse: """Creates a simplified test universe with minimal configuration for testing. Returns: config_universe a partially defined ConfigUniverse """ # constant universes state_universe = states.STATE_UNIVERSE connection_universe = connections.CONNECTION_UNIVERSE subfield_universe = subfields.SUBFIELD_UNIVERSE # update unit folder with subfield_universe unit_folder = unit_lib.UnitFolder(folderpath='units') unit_folder.local_namespace.subfields = subfield_universe.GetSubfieldsMap( unit_folder.local_namespace.namespace) unit_folder.AddFromConfig(config_filename='units/units.yaml', documents=[units.UNIT_DOCUMENT]) unit_universe = unit_lib.UnitUniverse(folders=[unit_folder]) # subfield universe has to validate unit universe subfield_universe.ValidateUnits(unit_universe) # field universe depends on subfield and state universes field_folder = field_lib.FieldFolder(folderpath='fields') field_folder.local_namespace.subfields = subfield_universe.GetSubfieldsMap( field_folder.local_namespace.namespace) field_folder.local_namespace.states = state_universe.GetStatesMap( field_folder.local_namespace.namespace) field_folder.AddFromConfig(config_filename='fields/telemetry_fields.yaml', documents=[fields.TELEMETRY_FIELDS_DOCUMENT]) field_folder.AddFromConfig(config_filename='fields/metadata_fields.yaml', documents=[fields.METADATA_FIELDS_DOCUMENT]) field_universe = field_lib.FieldUniverse(folders=[field_folder]) # entity type universe depends on field universe global_type_folder = entity_type_lib.EntityTypeFolder( folderpath='entity_types', field_universe=field_universe) facilities_type_folder = entity_type_lib.EntityTypeFolder( folderpath='FACILITIES/entity_types', field_universe=field_universe) hvac_type_folder = entity_type_lib.EntityTypeFolder( folderpath='HVAC/entity_types', field_universe=field_universe) global_type_folder.AddFromConfig( config_filename='entity_types/global.yaml', documents=[types.GLOBAL_TYPES_DOCUMENT]) facilities_type_folder.AddFromConfig( config_filename='FACILITIES/entity_types/Facilities.yaml', documents=[types.FACILITIES_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/ANALYSIS.yaml', documents=[types.HVAC_ANALYSIS_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/ABSTRACT.yaml', documents=[types.HVAC_ABSTRACT_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/CHWS.yaml', documents=[types.HVAC_CHWS_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/GENERALTYPES.yaml', documents=[types.HVAC_GENERAL_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/SDC.yaml', documents=[types.HVAC_SDC_TYPES_DOCUMENT]) hvac_type_folder.AddFromConfig( config_filename='HVAC/entity_types/DMP.yaml', documents=[types.HVAC_DMP_TYPES_DOCUMENT]) entity_type_universe = entity_type_lib.EntityTypeUniverse( entity_type_folders=[ global_type_folder, facilities_type_folder, hvac_type_folder ]) config_universe = presubmit_validate_types_lib.ConfigUniverse( entity_type_universe=entity_type_universe, field_universe=field_universe, subfield_universe=subfield_universe, state_universe=state_universe, connection_universe=connection_universe, unit_universe=unit_universe) # call this to expand inherited fields namespace_validator.NamespaceValidator( config_universe.GetEntityTypeNamespaces()) return config_universe