diff --git a/tests/test_data_buildings_dk.py b/tests/test_data_buildings_dk.py
new file mode 100644
index 0000000000000000000000000000000000000000..280c990245eaca8f2b3766e9c88d911eccc26168
--- /dev/null
+++ b/tests/test_data_buildings_dk.py
@@ -0,0 +1,139 @@
+# imports
+
+# standard
+
+import math
+import random
+from numbers import Real
+from statistics import mean
+
+import geopandas as gpd
+
+# *****************************************************************************
+# *****************************************************************************
+
+# local, internal
+from src.topupopt.data.gis.utils import read_gdf_file
+from src.topupopt.data.buildings.dk import heat
+from src.topupopt.data.buildings.dk import bbr
+
+# *****************************************************************************
+# *****************************************************************************
+
+class TestDataBuildingsDK:
+
+    # *************************************************************************
+    # *************************************************************************
+    
+    def test_demand_dict(self):
+        
+        # heat_demand_dict_by_building_entrance
+        
+        osm_data_filename = 'tests/data/gdf_osm.gpkg'
+        building_data_filename = 'tests/data/gdf_buildings.gpkg'
+        bdg_gdf_container_columns = ('ejerskaber','koordinater','bygningspunkt')
+        number_time_intervals = 12
+        min_to_max_ratio = 0.1
+        intraperiod_time_interval_duration = [
+            30*24*3600
+            for i in range(number_time_intervals)
+            ]
+        annual_heat_demand_scenario = 1000
+        total_area = 1000
+        air_temperature_scenario = [10 for i in range(number_time_intervals)]
+        
+        gdf_osm = gpd.read_file(osm_data_filename)
+        gdf_osm.set_index(['element_type', 'osmid'], drop=True, inplace=True)
+    
+        gdf_buildings = read_gdf_file(
+            filename=building_data_filename,
+            packed_columns=bdg_gdf_container_columns,
+            index='index'
+            )
+        
+        # order by state
+        
+        heat_demand_dict = heat.heat_demand_dict_by_building_entrance(
+            gdf_osm=gdf_osm,
+            gdf_buildings=gdf_buildings,
+            number_intervals=number_time_intervals,
+            time_interval_durations=intraperiod_time_interval_duration,
+            bdg_min_to_max_ratio={
+                index: min_to_max_ratio for index in gdf_buildings.index
+                },
+            bdg_specific_demand={
+                index: annual_heat_demand_scenario/total_area 
+                for index in gdf_buildings.index
+                },
+            bdg_demand_phase_shift=None,
+            avg_state=air_temperature_scenario,
+            state_correlates_with_output=False
+            )
+        assert type(heat_demand_dict) == dict
+        assert len(heat_demand_dict) == len(gdf_osm)
+        
+        # no state preference, use phase shift
+    
+        heat_demand_dict2 = heat.heat_demand_dict_by_building_entrance(
+            gdf_osm=gdf_osm,
+            gdf_buildings=gdf_buildings,
+            number_intervals=number_time_intervals,
+            time_interval_durations=intraperiod_time_interval_duration,
+            bdg_min_to_max_ratio={
+                index: min_to_max_ratio for index in gdf_buildings.index
+                },
+            bdg_specific_demand={
+                index: annual_heat_demand_scenario/total_area 
+                for index in gdf_buildings.index
+                },
+            bdg_demand_phase_shift={
+                index: 2*math.pi*random.random() for index in gdf_buildings.index
+                },
+            avg_state=None,
+            state_correlates_with_output=False
+            )
+        assert type(heat_demand_dict2) == dict
+        assert len(heat_demand_dict2) == len(gdf_osm)
+        
+        # total heating area
+        
+        heating_area = heat.total_heating_area(gdf_osm, gdf_buildings)
+        assert isinstance(heating_area, Real)
+        assert math.isclose(heating_area, 100882, abs_tol=1e-3)
+    
+    # *************************************************************************
+    # *************************************************************************
+    
+    # def test_bbr(self):
+        
+    #     # test get_bbr_building_data_geodataframe
+        
+    #     osm_data_filename = 'tests/data/gdf_osm.gpkg'
+                
+    #     gdf_osm = gpd.read_file(osm_data_filename)
+    #     gdf_osm.set_index(['element_type', 'osmid'], drop=True, inplace=True)
+        
+    #     error_raised = False
+    #     try:
+    #         gdf_buildings, drop_list = bbr.get_bbr_building_data_geodataframe(
+    #             list(gdf_osm[heat.label_osm_entrance_id]),
+    #             None,
+    #             None,
+    #             None)
+    #     except UnboundLocalError:
+    #         error_raised = True
+    #     assert error_raised
+        
+    #     # drop the rows with no data
+    #     gdf_osm = gdf_osm.drop(
+    #         index=[
+    #             (gdf_osm[
+    #                 gdf_osm[
+    #                     heat.label_osm_entrance_id
+    #                     ]==bdg_entrance_id].index)[0]
+    #             for bdg_entrance_id in drop_list
+    #             ]
+    #         )
+
+# *****************************************************************************
+# *****************************************************************************
\ No newline at end of file