Browse Source

Surface.write_triangular: no longer update attribute `creation_datetime`

Fabian Peter Hammerle 5 years ago
parent
commit
c8088e5319
3 changed files with 28 additions and 12 deletions
  1. 7 8
      freesurfer_surface/__init__.py
  2. 5 0
      tests/test_line_segment.py
  3. 16 4
      tests/test_surface.py

+ 7 - 8
freesurfer_surface/__init__.py

@@ -318,23 +318,22 @@ class Surface:
             surface._read_triangular(surface_file)
         return surface
 
-    def _triangular_creation_datetime_strftime(self) -> bytes:
-        padded_day = '{:>2}'.format(self.creation_datetime.day)
-        fmt = self._DATETIME_FORMAT.replace('%d', padded_day)
+    @classmethod
+    def _triangular_strftime(cls, creation_datetime: datetime.datetime) -> bytes:
+        padded_day = '{:>2}'.format(creation_datetime.day)
+        fmt = cls._DATETIME_FORMAT.replace('%d', padded_day)
         with setlocale('C'):
-            return self.creation_datetime.strftime(fmt).encode()
+            return creation_datetime.strftime(fmt).encode()
 
     def write_triangular(self, surface_file_path: str,
                          creation_datetime: typing.Optional[datetime.datetime] = None):
         if creation_datetime is None:
-            self.creation_datetime = datetime.datetime.now()
-        else:
-            self.creation_datetime = creation_datetime
+            creation_datetime = datetime.datetime.now()
         with open(surface_file_path, 'wb') as surface_file:
             surface_file.write(
                 self._MAGIC_NUMBER
                 + b'created by ' + self.creator
-                + b' on ' + self._triangular_creation_datetime_strftime()
+                + b' on ' + self._triangular_strftime(creation_datetime)
                 + b'\n\n'
                 + struct.pack('>II', len(self.vertices), len(self.triangles))
             )

+ 5 - 0
tests/test_line_segment.py

@@ -5,3 +5,8 @@ def test_eq():
     assert _LineSegment((67018, 67019)) == _LineSegment((67018, 67019))
     assert _LineSegment((67018, 67019)) == _LineSegment((67019, 67018))
     assert _LineSegment((67019, 67018)) == _LineSegment((67018, 67019))
+
+
+def test_repr():
+    assert repr(_LineSegment((67018, 67019))) \
+        == '_LineSegment(vertex_indices=(67018, 67019))'

+ 16 - 4
tests/test_surface.py

@@ -64,11 +64,9 @@ def test_read_triangular_locale():
     (datetime.datetime(2019, 5, 9, 22, 37, 41), b'Thu May  9 22:37:41 2019'),
     (datetime.datetime(2019, 4, 24, 23, 29, 22), b'Wed Apr 24 23:29:22 2019'),
 ])
-def test_triangular_creation_datetime_strftime(creation_datetime, expected_str):
-    surface = Surface()
-    surface.creation_datetime = creation_datetime
+def test_triangular_strftime(creation_datetime, expected_str):
     # pylint: disable=protected-access
-    assert expected_str == surface._triangular_creation_datetime_strftime()
+    assert expected_str == Surface._triangular_strftime(creation_datetime)
 
 
 def test_read_write_triangular_same(tmpdir):
@@ -81,6 +79,20 @@ def test_read_write_triangular_same(tmpdir):
             assert expected_file.read() == output_file.read()
 
 
+def test_read_write_datetime(tmpdir):
+    surface = Surface.read_triangular(SURFACE_FILE_PATH)
+    original_creation_datetime = surface.creation_datetime
+
+    output_path = tmpdir.join('surface')
+    surface.write_triangular(output_path)
+    assert original_creation_datetime == surface.creation_datetime
+    new_surface = Surface.read_triangular(output_path)
+    assert new_surface.creation_datetime > original_creation_datetime
+    assert datetime.datetime.now() > new_surface.creation_datetime
+    assert (datetime.datetime.now() - new_surface.creation_datetime) \
+            < datetime.timedelta(seconds=20)
+
+
 def test_write_read_triangular_same(tmpdir):
     expected_surface = Surface()
     expected_surface.creator = b'pytest'