From 31ea6f83de79ad152e287ac75d648febcec42e45 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Sat, 18 Apr 2020 12:46:49 +0200
Subject: [PATCH] [refactor] add test coverage tool. improve coverage for
 slicer and coordinates 3D

---
 extreme_data/edf_data/__init__.py             |  0
 ...ence_between_reanalysis_and_simulations.py |  2 +-
 root_utils.py                                 |  6 ++++
 run_test_coverage.py                          | 29 +++++++++++++++++++
 .../alps_station_3D_coordinates.py            |  7 +++--
 .../slicer/abstract_slicer.py                 |  2 +-
 .../test_coordinates.py                       |  6 ++++
 .../test_slicer.py                            |  1 +
 8 files changed, 48 insertions(+), 5 deletions(-)
 create mode 100644 extreme_data/edf_data/__init__.py
 create mode 100644 run_test_coverage.py

diff --git a/extreme_data/edf_data/__init__.py b/extreme_data/edf_data/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/projection_snow_load/main_difference_between_reanalysis_and_simulations.py b/projects/projection_snow_load/main_difference_between_reanalysis_and_simulations.py
index c152e7d1..40930a83 100644
--- a/projects/projection_snow_load/main_difference_between_reanalysis_and_simulations.py
+++ b/projects/projection_snow_load/main_difference_between_reanalysis_and_simulations.py
@@ -6,7 +6,7 @@ from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualiz
 import matplotlib.pyplot as plt
 
 
-def test():
+def run_plot():
     study = CrocusSnowLoad3Days(altitude=1200)
     study_visualizer = StudyVisualizer(study)
     study_visualizer.visualize_max_graphs_poster('Queyras', altitude='noope', snow_abbreviation="ok", color='red')
diff --git a/root_utils.py b/root_utils.py
index 2305a67c..8f112131 100644
--- a/root_utils.py
+++ b/root_utils.py
@@ -1,5 +1,7 @@
 import datetime
 import os.path as op
+import subprocess
+
 from cached_property import cached_property
 
 VERSION = datetime.datetime.now()
@@ -10,6 +12,10 @@ for c in [' ', ':', '-']:
 NB_CORES = 7
 
 
+def terminal_command(command_str):
+    return subprocess.check_output(command_str.split()).decode("utf-8").split('\n')
+
+
 def get_root_path() -> str:
     return op.dirname(op.abspath(__file__))
 
diff --git a/run_test_coverage.py b/run_test_coverage.py
new file mode 100644
index 00000000..620caa4d
--- /dev/null
+++ b/run_test_coverage.py
@@ -0,0 +1,29 @@
+import os.path as op
+from root_utils import terminal_command, get_root_path
+
+"""
+To run all my test do:  python -m unittest
+
+Test coverage is only in the professional version of pycharm.
+To configure the extent of my coverage: modify the .coveragerc
+To run test coverage in the terminal: coverage run -m unittest
+Then a hidden file .coverage is create at the root
+To create a html file from it do: coverage html
+Then open the htlmcov/index.html in your browser
+"""
+
+
+def run_test_coverage():
+    if op.exists(op.join(get_root_path(), "coverage_html_report")):
+        terminal_command("rm -r coverage_html_report")
+    terminal_command("coverage run -m unittest")
+
+
+def display_last_test_coverage():
+    terminal_command("coverage html")
+    terminal_command("firefox coverage_html_report/index.html &")
+
+
+if __name__ == '__main__':
+    # run_test_coverage()
+    display_last_test_coverage()
diff --git a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py
index 8007bfd9..c7e405e9 100644
--- a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py
+++ b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py
@@ -23,7 +23,7 @@ class AlpsStation3DCoordinates(AbstractSpatialCoordinates):
         return super().from_csv(csv_path)
 
     @classmethod
-    def transform_txt_into_csv(cls):
+    def transform_txt_into_csv(cls, create_csv=True):
         filepath = op.join(cls.FULL_PATH, 'original data', 'coord-lambert2.txt')
         station_to_coordinates = {}
         with open(filepath, 'r') as f:
@@ -35,8 +35,9 @@ class AlpsStation3DCoordinates(AbstractSpatialCoordinates):
         df = pd.DataFrame.from_dict(data=station_to_coordinates, orient='index',
                                     columns=[cls.COORDINATE_X, cls.COORDINATE_Y, cls.COORDINATE_Z])
         filepath = op.join(cls.FULL_PATH, 'coord-lambert2.csv')
-        assert not op.exists(filepath)
-        df.to_csv(filepath)
+        if create_csv:  # pragma: no cover
+            assert not op.exists(filepath)
+            df.to_csv(filepath)
 
 
 class AlpsStation3DCoordinatesWithAnisotropy(AlpsStation3DCoordinates):
diff --git a/spatio_temporal_dataset/slicer/abstract_slicer.py b/spatio_temporal_dataset/slicer/abstract_slicer.py
index cb6d98a5..e5357d52 100644
--- a/spatio_temporal_dataset/slicer/abstract_slicer.py
+++ b/spatio_temporal_dataset/slicer/abstract_slicer.py
@@ -46,7 +46,7 @@ class AbstractSlicer(object):
                 for f, name in [(len, 'Total'), (sum, 'train')]:
                     msg += "{}: {} ".format(name, f(s))
                 msg += ' / '
-        if show:
+        if show:  # pragma: no cover
             print(msg)
         return msg
 
diff --git a/test/test_spatio_temporal_dataset/test_coordinates.py b/test/test_spatio_temporal_dataset/test_coordinates.py
index c589a606..bd5a883d 100644
--- a/test/test_spatio_temporal_dataset/test_coordinates.py
+++ b/test/test_spatio_temporal_dataset/test_coordinates.py
@@ -31,6 +31,12 @@ from test.test_utils import load_test_spatiotemporal_coordinates, load_test_spat
     load_test_temporal_coordinates, load_test_1D_and_2D_spatial_coordinates
 
 
+class TestCoordinatesUtils(unittest.TestCase):
+
+    def test_csv_creation(self):
+        AlpsStation3DCoordinatesWithAnisotropy.transform_txt_into_csv(create_csv=False)
+
+
 class TestSpatialCoordinates(unittest.TestCase):
     DISPLAY = False
 
diff --git a/test/test_spatio_temporal_dataset/test_slicer.py b/test/test_spatio_temporal_dataset/test_slicer.py
index 119f667c..716ace5e 100644
--- a/test/test_spatio_temporal_dataset/test_slicer.py
+++ b/test/test_spatio_temporal_dataset/test_slicer.py
@@ -46,6 +46,7 @@ class TestSlicerForDataset(unittest.TestCase):
         assert self.complete_shape is not None
         for train_split_ratio, data_shape in train_split_ratio_to_observation_shape.items():
             for dataset in self.load_datasets(train_split_ratio):
+                dataset.slicer.summary(show=False)
                 self.assertEqual(self.complete_shape, self.get_shape(dataset, Split.all))
                 for split in ALL_SPLITS_EXCEPT_ALL:
                     if split in dataset.slicer.splits:
-- 
GitLab