From 39ff3f689b300ad92f10e6bb659b932df31314d1 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Thu, 15 Nov 2018 14:27:30 +0100 Subject: [PATCH 1/3] Add 'count_unique' sanity function * Add the corresponding unit tests. --- reframe/utility/sanity.py | 6 ++++++ unittests/test_sanity_functions.py | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/reframe/utility/sanity.py b/reframe/utility/sanity.py index 18472d3415..a5cdd4f1ef 100644 --- a/reframe/utility/sanity.py +++ b/reframe/utility/sanity.py @@ -709,6 +709,12 @@ def count(iterable): return ret +@deferrable +def count_unique(iterable): + """Return the unique element count of ``iterable``.""" + return builtins.len(set(iterable)) + + @deferrable def glob(pathname, *, recursive=False): """Replacement for the :func:`glob.glob() ` function.""" diff --git a/unittests/test_sanity_functions.py b/unittests/test_sanity_functions.py index 222519628a..4d62d56bec 100644 --- a/unittests/test_sanity_functions.py +++ b/unittests/test_sanity_functions.py @@ -483,6 +483,26 @@ def myrange(n): self.assertEqual(0, sn.count(range(0))) self.assertEqual(0, sn.count(myrange(0))) + def test_count_unique(self): + # Use a custom generator for testing + def my_mod_range(n, mod=2): + for i in range(n): + yield i % mod + + self.assertEqual(4, sn.count_unique([1, 2, 3, 4, 4, 3, 2, 1])) + self.assertEqual(1, sn.count_unique((1, 1, 1))) + self.assertEqual(3, sn.count_unique({1, 2, 3, 2, 3})) + self.assertEqual(3, sn.count_unique({'a': 1, 'b': 2, 'c': 3})) + self.assertEqual(2, sn.count_unique(my_mod_range(10))) + self.assertEqual(3, sn.count_unique(my_mod_range(10, 3))) + + # Test empty sequences + self.assertEqual(0, sn.count_unique([])) + self.assertEqual(0, sn.count_unique({})) + self.assertEqual(0, sn.count_unique(set())) + self.assertEqual(0, sn.count_unique(my_mod_range(0))) + self.assertEqual(0, sn.count_unique(range(0))) + def test_glob(self): filepatt = os.path.join(TEST_RESOURCES_CHECKS, '*.py') self.assertTrue(sn.glob(filepatt)) From 3ecf961229b54fc37aa64d062c22cd3fc9d6aa7c Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Wed, 21 Nov 2018 15:54:05 +0100 Subject: [PATCH 2/3] Address PR comments --- reframe/utility/sanity.py | 4 ++-- unittests/test_sanity_functions.py | 32 +++++++++++++++++++----------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/reframe/utility/sanity.py b/reframe/utility/sanity.py index a5cdd4f1ef..687edd7abb 100644 --- a/reframe/utility/sanity.py +++ b/reframe/utility/sanity.py @@ -710,9 +710,9 @@ def count(iterable): @deferrable -def count_unique(iterable): +def count_uniq(iterable): """Return the unique element count of ``iterable``.""" - return builtins.len(set(iterable)) + return builtins.len(builtins.set(iterable)) @deferrable diff --git a/unittests/test_sanity_functions.py b/unittests/test_sanity_functions.py index 4d62d56bec..c8fd3e7196 100644 --- a/unittests/test_sanity_functions.py +++ b/unittests/test_sanity_functions.py @@ -483,25 +483,33 @@ def myrange(n): self.assertEqual(0, sn.count(range(0))) self.assertEqual(0, sn.count(myrange(0))) - def test_count_unique(self): + def test_count_uniq(self): # Use a custom generator for testing def my_mod_range(n, mod=2): for i in range(n): yield i % mod - self.assertEqual(4, sn.count_unique([1, 2, 3, 4, 4, 3, 2, 1])) - self.assertEqual(1, sn.count_unique((1, 1, 1))) - self.assertEqual(3, sn.count_unique({1, 2, 3, 2, 3})) - self.assertEqual(3, sn.count_unique({'a': 1, 'b': 2, 'c': 3})) - self.assertEqual(2, sn.count_unique(my_mod_range(10))) - self.assertEqual(3, sn.count_unique(my_mod_range(10, 3))) + self.assertEqual(4, sn.count_uniq([1, 2, 3, 4, 4, 3, 2, 1])) + self.assertEqual(1, sn.count_uniq((1, 1, 1))) + self.assertEqual(3, sn.count_uniq({1, 2, 3, 2, 3})) + self.assertEqual(3, sn.count_uniq({'a': 1, 'b': 2, 'c': 3})) + self.assertEqual(2, sn.count_uniq(my_mod_range(10))) + self.assertEqual(3, sn.count_uniq(my_mod_range(10, 3))) # Test empty sequences - self.assertEqual(0, sn.count_unique([])) - self.assertEqual(0, sn.count_unique({})) - self.assertEqual(0, sn.count_unique(set())) - self.assertEqual(0, sn.count_unique(my_mod_range(0))) - self.assertEqual(0, sn.count_unique(range(0))) + self.assertEqual(0, sn.count_uniq([])) + self.assertEqual(0, sn.count_uniq({})) + self.assertEqual(0, sn.count_uniq(set())) + self.assertEqual(0, sn.count_uniq(my_mod_range(0))) + self.assertEqual(0, sn.count_uniq(range(0))) + + # Test deferred expressions + d = [1, 2, 2, 1] + dl = make_deferrable(d) + self.assertEqual(2, sn.count_uniq(dl)) + + d.extend([3, 4, 3]) + self.assertEqual(4, sn.count_uniq(dl)) def test_glob(self): filepatt = os.path.join(TEST_RESOURCES_CHECKS, '*.py') From aa23315cbbb17ae1c3a01bf65a9aa3b21d505a10 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Thu, 22 Nov 2018 08:48:52 +0100 Subject: [PATCH 3/3] Address PR comments (version 2) --- unittests/test_sanity_functions.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/unittests/test_sanity_functions.py b/unittests/test_sanity_functions.py index c8fd3e7196..45a5f89cd3 100644 --- a/unittests/test_sanity_functions.py +++ b/unittests/test_sanity_functions.py @@ -505,11 +505,7 @@ def my_mod_range(n, mod=2): # Test deferred expressions d = [1, 2, 2, 1] - dl = make_deferrable(d) - self.assertEqual(2, sn.count_uniq(dl)) - - d.extend([3, 4, 3]) - self.assertEqual(4, sn.count_uniq(dl)) + self.assertEqual(2, sn.count_uniq(make_deferrable(d))) def test_glob(self): filepatt = os.path.join(TEST_RESOURCES_CHECKS, '*.py')