[tor-commits] [stem/master] Expanding str_tools unit tests

atagar at torproject.org atagar at torproject.org
Sat Oct 20 23:02:10 UTC 2012


commit e06b76b8ae68446edc3c3123412a514a00e2fba7
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Oct 19 13:33:19 2012 -0700

    Expanding str_tools unit tests
    
    Testing the common edge cases that come to mind, and making a few small fixes.
    I was also missing examples for a couple functions.
---
 stem/util/str_tools.py      |   35 +++++++++++++++++++++-
 test/unit/util/str_tools.py |   68 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 102 insertions(+), 1 deletions(-)

diff --git a/stem/util/str_tools.py b/stem/util/str_tools.py
index b874425..e0a6d3e 100644
--- a/stem/util/str_tools.py
+++ b/stem/util/str_tools.py
@@ -51,6 +51,8 @@ def to_camel_case(label, word_divider = " "):
   
   :param str label: input string to be converted
   :param str word_divider: string used to replace underscores
+  
+  :returns: camel cased string
   """
   
   words = []
@@ -84,6 +86,8 @@ def get_size_label(byte_count, decimal = 0, is_long = False, is_bytes = True):
   :param int decimal: number of decimal digits to be included
   :param bool is_long: expands units label
   :param bool is_bytes: provides units in bytes if true, bits otherwise
+  
+  :returns: str with human readable representation of the size
   """
   
   if is_bytes: return _get_label(SIZE_UNITS_BYTES, byte_count, decimal, is_long)
@@ -113,6 +117,8 @@ def get_time_label(seconds, decimal = 0, is_long = False):
   :param int seconds: number of seconds to be converted
   :param int decimal: number of decimal digits to be included
   :param bool is_long: expands units label
+  
+  :returns: str with human readable representation of the time
   """
   
   return _get_label(TIME_UNITS, seconds, decimal, is_long)
@@ -133,12 +139,14 @@ def get_time_labels(seconds, is_long = False):
   
   :param int seconds: number of seconds to be converted
   :param bool is_long: expands units label
+  
+  :returns: list of strings with human readable representations of the time
   """
   
   time_labels = []
   
   for count_per_unit, _, _ in TIME_UNITS:
-    if seconds >= count_per_unit:
+    if abs(seconds) >= count_per_unit:
       time_labels.append(_get_label(TIME_UNITS, seconds, 0, is_long))
       seconds %= count_per_unit
   
@@ -149,9 +157,24 @@ def get_short_time_label(seconds):
   Provides a time in the following format:
   [[dd-]hh:]mm:ss
   
+  ::
+  
+    >>> get_short_time_label(111)
+    '01:51'
+    
+    >>> get_short_time_label(544100)
+    '6-07:08:20'
+    
   :param int seconds: number of seconds to be converted
+  
+  :returns: str with the short representation for the time
+  
+  :raises: ValueError if the input is negative
   """
   
+  if seconds < 0:
+    raise ValueError("Input needs to be a non-negative integer, got '%i'" % seconds)
+  
   time_comp = {}
   
   for amount, _, label in TIME_UNITS:
@@ -174,8 +197,18 @@ def parse_short_time_label(label):
   cputime and etime fields of ps:
   [[dd-]hh:]mm:ss or mm:ss.ss
   
+  ::
+  
+    >>> parse_short_time_label('01:51')
+    111
+    
+    >>> parse_short_time_label('6-07:08:20')
+    544100
+    
   :param str label: time entry to be parsed
   
+  :returns: int with the number of seconds represented by the label
+  
   :raises: ValueError if input is malformed
   """
   
diff --git a/test/unit/util/str_tools.py b/test/unit/util/str_tools.py
index ce5539f..3d42154 100644
--- a/test/unit/util/str_tools.py
+++ b/test/unit/util/str_tools.py
@@ -31,6 +31,18 @@ class TestStrTools(unittest.TestCase):
     self.assertEquals('1 MB', str_tools.get_size_label(2000000))
     self.assertEquals('1.02 KB', str_tools.get_size_label(1050, 2))
     self.assertEquals('1.025 Kilobytes', str_tools.get_size_label(1050, 3, True))
+    
+    self.assertEquals('0 B', str_tools.get_size_label(0))
+    self.assertEquals('0 Bytes', str_tools.get_size_label(0, is_long = True))
+    self.assertEquals('0.00 B', str_tools.get_size_label(0, 2))
+    self.assertEquals('-10 B', str_tools.get_size_label(-10))
+    self.assertEquals('80 b', str_tools.get_size_label(10, is_bytes = False))
+    
+    # checking that we round down
+    self.assertEquals('23.43 Kb', str_tools.get_size_label(3000, 2, is_bytes = False))
+    
+    self.assertRaises(TypeError, str_tools.get_size_label, None)
+    self.assertRaises(TypeError, str_tools.get_size_label, 'hello world')
   
   def test_get_time_label(self):
     """
@@ -41,6 +53,14 @@ class TestStrTools(unittest.TestCase):
     self.assertEquals('2h', str_tools.get_time_label(10000))
     self.assertEquals('1.0 minute', str_tools.get_time_label(61, 1, True))
     self.assertEquals('1.01 minutes', str_tools.get_time_label(61, 2, True))
+    
+    self.assertEquals('0s', str_tools.get_time_label(0))
+    self.assertEquals('0 seconds', str_tools.get_time_label(0, is_long = True))
+    self.assertEquals('0.00s', str_tools.get_time_label(0, 2))
+    self.assertEquals('-10s', str_tools.get_time_label(-10))
+    
+    self.assertRaises(TypeError, str_tools.get_time_label, None)
+    self.assertRaises(TypeError, str_tools.get_time_label, 'hello world')
   
   def test_get_time_labels(self):
     """
@@ -50,4 +70,52 @@ class TestStrTools(unittest.TestCase):
     # test the pydoc examples
     self.assertEquals(['6m', '40s'], str_tools.get_time_labels(400))
     self.assertEquals(['1 hour', '40 seconds'], str_tools.get_time_labels(3640, True))
+    
+    self.assertEquals([], str_tools.get_time_labels(0))
+    self.assertEquals(['-10s'], str_tools.get_time_labels(-10))
+    
+    self.assertRaises(TypeError, str_tools.get_time_labels, None)
+    self.assertRaises(TypeError, str_tools.get_time_labels, 'hello world')
+  
+  def test_get_short_time_label(self):
+    """
+    Checks the get_short_time_label() function.
+    """
+    
+    # test the pydoc examples
+    self.assertEquals('01:51', str_tools.get_short_time_label(111))
+    self.assertEquals('6-07:08:20', str_tools.get_short_time_label(544100))
+    
+    self.assertEquals('00:00', str_tools.get_short_time_label(0))
+    
+    self.assertRaises(TypeError, str_tools.get_short_time_label, None)
+    self.assertRaises(TypeError, str_tools.get_short_time_label, 'hello world')
+    self.assertRaises(ValueError, str_tools.get_short_time_label, -5)
+  
+  def test_parse_short_time_label(self):
+    """
+    Checks the parse_short_time_label() function.
+    """
+    
+    # test the pydoc examples
+    self.assertEquals(111, str_tools.parse_short_time_label('01:51'))
+    self.assertEquals(544100, str_tools.parse_short_time_label('6-07:08:20'))
+    
+    self.assertEquals(110, str_tools.parse_short_time_label('01:50.62'))
+    self.assertEquals(0, str_tools.parse_short_time_label('00:00'))
+    
+    # these aren't technically valid, but might as well allow unnecessary
+    # digits to be dropped
+    
+    self.assertEquals(300, str_tools.parse_short_time_label('05:0'))
+    self.assertEquals(300, str_tools.parse_short_time_label('5:00'))
+    
+    self.assertRaises(TypeError, str_tools.parse_short_time_label, None)
+    self.assertRaises(TypeError, str_tools.parse_short_time_label, 100)
+    
+    self.assertRaises(ValueError, str_tools.parse_short_time_label, 'blarg')
+    self.assertRaises(ValueError, str_tools.parse_short_time_label, '00')
+    self.assertRaises(ValueError, str_tools.parse_short_time_label, '05:')
+    self.assertRaises(ValueError, str_tools.parse_short_time_label, '05a:00')
+    self.assertRaises(ValueError, str_tools.parse_short_time_label, '-05:00')
 





More information about the tor-commits mailing list