def two_buildings(): pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('OfficeFloorBig', [room2d_3]) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story.multiplier = 3 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.6)) story_big.multiplier = 4 building_big = Building('OfficeBuildingBig', [story_big]) building_big.separate_top_bottom_floors() tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building, building_big], [tree_canopy]) return model
def test_to_dict(): """Test the Building to_dict method.""" pts_1 = (Point3D(0, 0, 2), Point3D(10, 0, 2), Point3D(10, 10, 2), Point3D(0, 10, 2)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 5) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('Office_Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.set_outdoor_shading_parameters(Overhang(1)) story.multiplier = 4 building = Building('Office_Building', [story]) building.separate_top_bottom_floors() bd = building.to_dict() assert bd['type'] == 'Building' assert bd['identifier'] == 'Office_Building' assert bd['display_name'] == 'Office_Building' assert 'unique_stories' in bd assert len(bd['unique_stories']) == 3 assert 'properties' in bd assert bd['properties']['type'] == 'BuildingProperties'
def test_check_duplicate_construction_set_identifiers(): """Test the check_duplicate_construction_set_identifiers method.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 for room in story.room_2ds: room.properties.energy.program_type = office_program room.properties.energy.add_default_ideal_air() building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() constr_set = ConstructionSet('Attic Construction Set') polyiso = EnergyMaterial('PolyIso', 0.2, 0.03, 43, 1210, 'MediumRough') roof_constr = OpaqueConstruction('Attic Roof Construction', [roof_membrane, polyiso, wood]) floor_constr = OpaqueConstruction('Attic Floor Construction', [wood, insulation, wood]) constr_set.floor_set.interior_construction = floor_constr constr_set.roof_ceiling_set.exterior_construction = roof_constr building.unique_room_2ds[ -1].properties.energy.construction_set = constr_set building.unique_room_2ds[ -2].properties.energy.construction_set = constr_set tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building], [tree_canopy]) assert model.properties.energy.check_duplicate_construction_set_identifiers( False) constr_set2 = ConstructionSet('Attic Construction Set') building.unique_room_2ds[ -2].properties.energy.construction_set = constr_set2 assert not model.properties.energy.check_duplicate_construction_set_identifiers( False) with pytest.raises(ValueError): model.properties.energy.check_duplicate_construction_set_identifiers( True)
def default_building(): pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story.multiplier = 3 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() return building
def test_check_duplicate_program_type_identifiers(): """Test the check_duplicate_program_type_identifiers method.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 for room in story.room_2ds: room.properties.energy.program_type = office_program room.properties.energy.add_default_ideal_air() building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() attic_program_type = plenum_program.duplicate() attic_program_type.identifier = 'Attic Space' schedule = ScheduleRuleset.from_constant_value('Always Dim', 1, schedule_types.fractional) lighting = Lighting('Attic Lighting', 3, schedule) attic_program_type.lighting = lighting building.unique_room_2ds[ -1].properties.energy.program_type = attic_program_type building.unique_room_2ds[ -2].properties.energy.program_type = attic_program_type tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building], [tree_canopy]) assert model.properties.energy.check_duplicate_program_type_identifiers( False) attic_program_type.unlock() attic_program_type.identifier = office_program.identifier attic_program_type.lock() assert not model.properties.energy.check_duplicate_program_type_identifiers( False) with pytest.raises(ValueError): model.properties.energy.check_duplicate_program_type_identifiers(True)
def building_simple(directory): """Generate simple Building sample.""" pts_1 = (Point3D(0, 0, 0), Point3D(0, 10, 0), Point3D(10, 10, 0), Point3D(10, 0, 0)) pts_2 = (Point3D(10, 0, 0), Point3D(10, 10, 0), Point3D(20, 10, 0), Point3D(20, 0, 0)) pts_3 = (Point3D(0, 10, 0), Point3D(0, 20, 0), Point3D(10, 20, 0), Point3D(10, 10, 0)) pts_4 = (Point3D(10, 10, 0), Point3D(10, 20, 0), Point3D(20, 20, 0), Point3D(20, 10, 0)) pts_5 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_6 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_7 = (Point3D(0, 0, 6), Point3D(0, 10, 6), Point3D(10, 10, 6), Point3D(10, 0, 6)) room2d_1 = Room2D('Office 1', Face3D(pts_1), 3) room2d_2 = Room2D('Office 2', Face3D(pts_2), 3) room2d_3 = Room2D('Office 3', Face3D(pts_3), 3) room2d_4 = Room2D('Office 4', Face3D(pts_4), 3) room2d_5 = Room2D('Office 5', Face3D(pts_5), 3) room2d_6 = Room2D('Office 6', Face3D(pts_6), 3) room2d_7 = Room2D('Office 7', Face3D(pts_7), 3) story_1 = Story('Office Floor 1', [room2d_1, room2d_2, room2d_3, room2d_4]) story_2 = Story('Office Floor 2', [room2d_5, room2d_6]) story_3 = Story('Office Floor 3', [room2d_7]) story_1.solve_room_2d_adjacency(0.01) story_2.solve_room_2d_adjacency(0.01) story_1.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story_2.set_outdoor_window_parameters(SimpleWindowRatio(0.35)) story_3.set_outdoor_window_parameters(SimpleWindowRatio(0.6)) building = Building('Office Building', [story_1, story_2, story_3]) building.separate_top_bottom_floors() dest_file = os.path.join(directory, 'building_simple.json') with open(dest_file, 'w') as fp: json.dump(building.to_dict(True), fp, indent=4)
def two_buildings_with_terrain(): pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('OfficeFloorBig', [room2d_3]) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story.multiplier = 3 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.6)) story_big.multiplier = 4 building_big = Building('OfficeBuildingBig', [story_big]) building_big.separate_top_bottom_floors() tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building, building_big], [tree_canopy]) ter_geo = Face3D( (Point3D(0, 0, 0), Point3D(30, 0, 0), Point3D(30, 30, 0), Point3D(0, 30, 3))) terrain = Terrain([ter_geo]) model.properties.uwg.terrain = terrain model.properties.uwg.traffic.watts_per_area = 7 model.properties.uwg.tree_coverage_fraction = 0.25 model.properties.uwg.grass_coverage_fraction = 0.4 return model
def test_building_window_shading_parameters(): """Test the Building set_outdoor_window_parameters method.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('Office_Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.multiplier = 4 building = Building('Office_Building', [story]) assert building.exterior_aperture_area == 0 assert building.unique_room_2ds[0].window_parameters[2] is None ashrae_base = SimpleWindowRatio(0.4) story.set_outdoor_window_parameters(ashrae_base) assert building.exterior_aperture_area == 60 * 4 * 4 * 0.4 assert building.unique_room_2ds[0].window_parameters[2] == ashrae_base assert building.unique_room_2ds[0].shading_parameters[2] is None overhang = Overhang(1) story.set_outdoor_shading_parameters(overhang) assert building.unique_room_2ds[0].shading_parameters[2] == overhang assert len(building.unique_stories) == 1 assert len(building.all_stories()) == 4 assert len(building.unique_room_2ds) == 4 building.separate_top_bottom_floors() assert len(building.unique_stories) == 3 assert len(set(story.identifier for story in building.unique_stories)) == 3 assert len(building.all_stories()) == 4 assert len(building.unique_room_2ds) == 12
def custom_building(): pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story.multiplier = 3 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() building.properties.uwg.program == 'MidriseApartment' building.properties.uwg.vintage == 'Pre1980' building.properties.uwg.fract_heat_to_canyon == 1.0 building.properties.uwg.shgc == 0.6 building.properties.uwg.wall_albedo == 0.3 building.properties.uwg.roof_albedo == 0.5 building.properties.uwg.roof_veg_fraction == 0.3 return building
def test_to_from_dict(): """Test the to/from dict of Building objects.""" pts_1 = (Point3D(0, 0, 2), Point3D(10, 0, 2), Point3D(10, 10, 2), Point3D(0, 10, 2)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 5) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('Office_Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.set_outdoor_shading_parameters(Overhang(1)) story.multiplier = 4 building = Building('Office_Building', [story]) building.separate_top_bottom_floors() building_dict = building.to_dict() new_building = Building.from_dict(building_dict) assert isinstance(new_building, Building) assert new_building.to_dict() == building_dict
def test_building_basement(): """Test the initialization of Building objects and the setting of a basement.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('Office_Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.multiplier = 4 building = Building('Office_Building_1234', [story]) building.display_name = 'Office Building' building.separate_top_bottom_floors() # this should yield 3 story objects building.unique_stories[0].make_underground( ) # make the first floor a basement story.set_outdoor_window_parameters( SimpleWindowRatio(0.4)) # windows on top floors assert not building.unique_stories[0].is_above_ground assert building.height == 15 assert building.story_count == 4 assert building.story_count_above_ground == 3 assert building.height_from_first_floor == 12 assert building.height_above_ground == 9 assert building.exterior_wall_area == 60 * 4 * 3
def model_complete_simple(directory): """Generate simple Model sample.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) room2d_1 = Room2D('Office 1', Face3D(pts_1), 3) room2d_2 = Room2D('Office 2', Face3D(pts_2), 3) story = Story('Office Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 for room in story.room_2ds: room.properties.energy.program_type = office_program room.properties.energy.add_default_ideal_air() building = Building('Office Building', [story]) building.separate_top_bottom_floors() attic_program_type = plenum_program.duplicate() attic_program_type.name = 'Attic Space' schedule = ScheduleRuleset.from_constant_value('Always Dim', 1, schedule_types.fractional) lighting = Lighting('Attic Lighting', 3, schedule) attic_program_type.lighting = lighting building.unique_room_2ds[ -1].properties.energy.program_type = attic_program_type building.unique_room_2ds[ -2].properties.energy.program_type = attic_program_type constr_set = ConstructionSet('Attic Construction Set') polyiso = EnergyMaterial('PolyIso', 0.2, 0.03, 43, 1210, 'MediumRough') roof_constr = OpaqueConstruction('Attic Roof Construction', [roof_membrane, polyiso, wood]) floor_constr = OpaqueConstruction('Attic Floor Construction', [wood, insulation, wood]) constr_set.floor_set.interior_construction = floor_constr constr_set.roof_ceiling_set.exterior_construction = roof_constr building.unique_room_2ds[ -1].properties.energy.construction_set = constr_set building.unique_room_2ds[ -2].properties.energy.construction_set = constr_set tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('Tree Canopy', [tree_canopy_geo1, tree_canopy_geo2]) bright_leaves = ShadeConstruction('Bright Light Leaves', 0.5, 0.5, True) tree_canopy.properties.energy.construction = bright_leaves tree_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) tree_canopy.properties.energy.transmittance_schedule = tree_trans model = Model('New Development', [building], [tree_canopy]) model.north_angle = 15 dest_file = os.path.join(directory, 'model_complete_simple.json') with open(dest_file, 'w') as fp: json.dump(model.to_dict(), fp, indent=4)
def test_to_honeybee(): """Test the Model to_honeybee method.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('OfficeFloorBig', [room2d_3]) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_big.multiplier = 4 building_big = Building('OfficeBuildingBig', [story_big]) building_big.separate_top_bottom_floors() attic_program_type = plenum_program.duplicate() attic_program_type.identifier = 'Attic Space' schedule = ScheduleRuleset.from_constant_value('Always Dim', 1, schedule_types.fractional) lighting = Lighting('Attic Lighting', 3, schedule) attic_program_type.lighting = lighting building.unique_room_2ds[ -1].properties.energy.program_type = attic_program_type building.unique_room_2ds[ -2].properties.energy.program_type = attic_program_type constr_set = ConstructionSet('Attic Construction Set') polyiso = EnergyMaterial('PolyIso', 0.2, 0.03, 43, 1210, 'MediumRough') roof_constr = OpaqueConstruction('Attic Roof Construction', [roof_membrane, polyiso, wood]) floor_constr = OpaqueConstruction('Attic Floor Construction', [wood, insulation, wood]) constr_set.floor_set.interior_construction = floor_constr constr_set.roof_ceiling_set.exterior_construction = roof_constr building.unique_room_2ds[ -1].properties.energy.construction_set = constr_set building.unique_room_2ds[ -2].properties.energy.construction_set = constr_set tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) bright_leaves = ShadeConstruction('Bright Light Leaves', 0.5, 0.5, True) tree_canopy.properties.energy.construction = bright_leaves tree_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) tree_canopy.properties.energy.transmittance_schedule = tree_trans model = Model('NewDevelopment', [building, building_big], [tree_canopy]) hb_models = model.to_honeybee('Building', 10, False, tolerance=0.01) assert len(hb_models) == 2 assert polyiso in hb_models[0].properties.energy.materials assert roof_constr in hb_models[0].properties.energy.constructions assert floor_constr in hb_models[0].properties.energy.constructions assert constr_set in hb_models[0].properties.energy.construction_sets assert hb_models[0].rooms[ -1].properties.energy.construction_set == constr_set assert polyiso not in hb_models[1].properties.energy.materials assert roof_constr not in hb_models[1].properties.energy.constructions assert floor_constr not in hb_models[1].properties.energy.constructions assert constr_set not in hb_models[1].properties.energy.construction_sets assert schedule in hb_models[0].properties.energy.schedules assert attic_program_type in hb_models[0].properties.energy.program_types assert hb_models[0].rooms[ -1].properties.energy.program_type == attic_program_type assert schedule not in hb_models[1].properties.energy.schedules assert attic_program_type not in hb_models[ 1].properties.energy.program_types assert bright_leaves in hb_models[0].properties.energy.constructions assert tree_trans in hb_models[0].properties.energy.schedules assert hb_models[0].orphaned_shades[ -1].properties.energy.construction == bright_leaves assert hb_models[0].orphaned_shades[ -1].properties.energy.transmittance_schedule == tree_trans assert bright_leaves not in hb_models[-1].properties.energy.constructions assert tree_trans not in hb_models[-1].properties.energy.schedules