xref: /aosp_15_r20/build/bazel/scripts/incremental_build/util_test.py (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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