1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Workerimport datetime 15*7594170eSAndroid Build Coastguard Workerimport unittest 16*7594170eSAndroid Build Coastguard Workerfrom pathlib import Path 17*7594170eSAndroid Build Coastguard Worker 18*7594170eSAndroid Build Coastguard Workerfrom util import groupby 19*7594170eSAndroid Build Coastguard Workerfrom util import hhmmss 20*7594170eSAndroid Build Coastguard Workerfrom util import next_path 21*7594170eSAndroid Build Coastguard Workerfrom util import period_to_seconds 22*7594170eSAndroid Build Coastguard Worker 23*7594170eSAndroid Build Coastguard Worker 24*7594170eSAndroid Build Coastguard Workerclass UtilTest(unittest.TestCase): 25*7594170eSAndroid Build Coastguard Worker def test_groupby(self): 26*7594170eSAndroid Build Coastguard Worker x1 = {"g": "b", "id": 1} 27*7594170eSAndroid Build Coastguard Worker x2 = {"g": "a", "id": 2} 28*7594170eSAndroid Build Coastguard Worker x3 = {"g": "b", "id": 3} 29*7594170eSAndroid Build Coastguard Worker grouped = groupby([x1, x2, x3], lambda x: x["g"]) 30*7594170eSAndroid Build Coastguard Worker self.assertEqual(grouped, {"b": [x1, x3], "a": [x2]}) 31*7594170eSAndroid Build Coastguard Worker self.assertEqual(list(grouped.keys()), ["b", "a"], "insertion order maintained") 32*7594170eSAndroid Build Coastguard Worker 33*7594170eSAndroid Build Coastguard Worker def test_next_path(self): 34*7594170eSAndroid Build Coastguard Worker examples = [ 35*7594170eSAndroid Build Coastguard Worker ("output", "output-001"), 36*7594170eSAndroid Build Coastguard Worker ("output-1", "output-002"), 37*7594170eSAndroid Build Coastguard Worker ("output-09", "output-010"), 38*7594170eSAndroid Build Coastguard Worker ("output-010", "output-011"), 39*7594170eSAndroid Build Coastguard Worker ("output-999", "output-1000"), 40*7594170eSAndroid Build Coastguard Worker ] 41*7594170eSAndroid Build Coastguard Worker for pattern, expected in examples: 42*7594170eSAndroid Build Coastguard Worker with self.subTest(msg=pattern, pattern=pattern, expected=expected): 43*7594170eSAndroid Build Coastguard Worker generator = next_path(Path(pattern)) 44*7594170eSAndroid Build Coastguard Worker n = next(generator) 45*7594170eSAndroid Build Coastguard Worker self.assertEqual(n, Path(expected)) 46*7594170eSAndroid Build Coastguard Worker 47*7594170eSAndroid Build Coastguard Worker def test_hhmmss(self): 48*7594170eSAndroid Build Coastguard Worker decimal_precision_examples = [ 49*7594170eSAndroid Build Coastguard Worker (datetime.timedelta(seconds=(2 * 60 + 5)), "02:05.000"), 50*7594170eSAndroid Build Coastguard Worker (datetime.timedelta(seconds=(3600 + 23 * 60 + 45.897898)), "1:23:45.898"), 51*7594170eSAndroid Build Coastguard Worker ] 52*7594170eSAndroid Build Coastguard Worker non_decimal_precision_examples = [ 53*7594170eSAndroid Build Coastguard Worker (datetime.timedelta(seconds=(2 * 60 + 5)), "02:05"), 54*7594170eSAndroid Build Coastguard Worker (datetime.timedelta(seconds=(3600 + 23 * 60 + 45.897898)), "1:23:46"), 55*7594170eSAndroid Build Coastguard Worker ] 56*7594170eSAndroid Build Coastguard Worker for ts, expected in decimal_precision_examples: 57*7594170eSAndroid Build Coastguard Worker with self.subTest(ts=ts, expected=expected): 58*7594170eSAndroid Build Coastguard Worker self.assertEqual(hhmmss(ts, decimal_precision=True), expected) 59*7594170eSAndroid Build Coastguard Worker for ts, expected in non_decimal_precision_examples: 60*7594170eSAndroid Build Coastguard Worker with self.subTest(ts=ts, expected=expected): 61*7594170eSAndroid Build Coastguard Worker self.assertEqual(hhmmss(ts, decimal_precision=False), expected) 62*7594170eSAndroid Build Coastguard Worker 63*7594170eSAndroid Build Coastguard Worker def test_period_to_seconds(self): 64*7594170eSAndroid Build Coastguard Worker examples = [ 65*7594170eSAndroid Build Coastguard Worker ("02:05.000", 2 * 60 + 5), 66*7594170eSAndroid Build Coastguard Worker ("1:23:45.898", 3600 + 23 * 60 + 45.898), 67*7594170eSAndroid Build Coastguard Worker ("1.898", 1.898), 68*7594170eSAndroid Build Coastguard Worker ("0.3", 0.3), 69*7594170eSAndroid Build Coastguard Worker ("0", 0), 70*7594170eSAndroid Build Coastguard Worker ("0:00", 0), 71*7594170eSAndroid Build Coastguard Worker ("0:00:00", 0), 72*7594170eSAndroid Build Coastguard Worker ("", 0), 73*7594170eSAndroid Build Coastguard Worker ] 74*7594170eSAndroid Build Coastguard Worker for ts, expected in examples: 75*7594170eSAndroid Build Coastguard Worker with self.subTest(ts=ts, expected=expected): 76*7594170eSAndroid Build Coastguard Worker self.assertEqual(period_to_seconds(ts), expected) 77*7594170eSAndroid Build Coastguard Worker 78*7594170eSAndroid Build Coastguard Worker 79*7594170eSAndroid Build Coastguard Workerif __name__ == "__main__": 80*7594170eSAndroid Build Coastguard Worker unittest.main() 81