Adds a __repr__ to graph.
[pyutils.git] / tests / string_utils_test.py
1 #!/usr/bin/env python3
2
3 # © Copyright 2021-2022, Scott Gasch
4
5 """string_utils unittest."""
6
7 import unittest
8
9 from pyutils import bootstrap
10 from pyutils import string_utils as su
11 from pyutils import unittest_utils as uu
12 from pyutils.ansi import bg, fg, reset
13
14
15 @uu.check_all_methods_for_perf_regressions()
16 class TestStringUtils(unittest.TestCase):
17     def test_is_none_or_empty(self):
18         self.assertTrue(su.is_none_or_empty(None))
19         self.assertTrue(su.is_none_or_empty(""))
20         self.assertTrue(su.is_none_or_empty("\n"))
21         self.assertTrue(su.is_none_or_empty('       '))
22         self.assertTrue(su.is_none_or_empty('     \n  \r  \t     '))
23         self.assertFalse(su.is_none_or_empty("Covfefe"))
24         self.assertFalse(su.is_none_or_empty("1234"))
25
26     def test_is_string(self):
27         self.assertTrue(su.is_string("test"))
28         self.assertTrue(su.is_string(""))
29         self.assertFalse(su.is_string(bytes(0x1234)))
30         self.assertFalse(su.is_string(1234))
31
32     def test_is_empty_string(self):
33         self.assertTrue(su.is_empty_string(''))
34         self.assertTrue(su.is_empty_string('    \t\t  \n    \r      '))
35         self.assertFalse(su.is_empty_string(' this is a test '))
36         self.assertFalse(su.is_empty_string(22))
37
38     def test_is_full_string(self):
39         self.assertFalse(su.is_full_string(''))
40         self.assertFalse(su.is_full_string('    \t\t  \n    \r      '))
41         self.assertTrue(su.is_full_string(' this is a test '))
42         self.assertFalse(su.is_full_string(22))
43
44     def test_is_number(self):
45         self.assertTrue(su.is_number("1234"))
46         self.assertTrue(su.is_number("-1234"))
47         self.assertTrue(su.is_number("1234.55"))
48         self.assertTrue(su.is_number("-1234.55"))
49         self.assertTrue(su.is_number("+1234"))
50         self.assertTrue(su.is_number("+1234.55"))
51         self.assertTrue(su.is_number("-0.8485996602e10"))
52         self.assertTrue(su.is_number("-0.8485996602E10"))
53         self.assertFalse(su.is_number("-0.8485996602t10"))
54         self.assertFalse(su.is_number("  1234  "))
55         self.assertFalse(su.is_number(" 1234"))
56         self.assertFalse(su.is_number("1234 "))
57         self.assertFalse(su.is_number("fifty"))
58
59     def test_is_integer_number(self):
60         self.assertTrue(su.is_integer_number("1234"))
61         self.assertTrue(su.is_integer_number("-1234"))
62         self.assertFalse(su.is_integer_number("1234.55"))
63         self.assertFalse(su.is_integer_number("-1234.55"))
64         self.assertTrue(su.is_integer_number("+1234"))
65         self.assertTrue(su.is_integer_number("0x1234"))
66         self.assertTrue(su.is_integer_number("0xdeadbeef"))
67         self.assertFalse(su.is_integer_number("+1234.55"))
68         self.assertTrue(su.is_octal_integer_number("+0o777"))
69         self.assertFalse(su.is_integer_number("-0.8485996602e10"))
70         self.assertFalse(su.is_integer_number("-0.8485996602E10"))
71         self.assertFalse(su.is_integer_number("-0.8485996602t10"))
72         self.assertFalse(su.is_integer_number("  1234  "))
73         self.assertFalse(su.is_integer_number(" 1234"))
74         self.assertFalse(su.is_integer_number("1234 "))
75         self.assertFalse(su.is_integer_number("fifty"))
76
77     def test_is_hexidecimal_integer_number(self):
78         self.assertTrue(su.is_hexidecimal_integer_number("0x1234"))
79         self.assertTrue(su.is_hexidecimal_integer_number("0X1234"))
80         self.assertTrue(su.is_hexidecimal_integer_number("0x1234D"))
81         self.assertTrue(su.is_hexidecimal_integer_number("0xF1234"))
82         self.assertTrue(su.is_hexidecimal_integer_number("0xe1234"))
83         self.assertTrue(su.is_hexidecimal_integer_number("0x1234a"))
84         self.assertTrue(su.is_hexidecimal_integer_number("0xdeadbeef"))
85         self.assertTrue(su.is_hexidecimal_integer_number("-0xdeadbeef"))
86         self.assertTrue(su.is_hexidecimal_integer_number("+0xdeadbeef"))
87         self.assertFalse(su.is_hexidecimal_integer_number("0xH1234"))
88         self.assertFalse(su.is_hexidecimal_integer_number("0x1234H"))
89         self.assertFalse(su.is_hexidecimal_integer_number("nine"))
90
91     def test_is_octal_integer_number(self):
92         self.assertTrue(su.is_octal_integer_number("0o111"))
93         self.assertTrue(su.is_octal_integer_number("0O111"))
94         self.assertTrue(su.is_octal_integer_number("-0o111"))
95         self.assertTrue(su.is_octal_integer_number("+0o777"))
96         self.assertFalse(su.is_octal_integer_number("-+0o111"))
97         self.assertFalse(su.is_octal_integer_number("0o181"))
98         self.assertFalse(su.is_octal_integer_number("0o1a1"))
99         self.assertFalse(su.is_octal_integer_number("one"))
100
101     def test_is_binary_integer_number(self):
102         self.assertTrue(su.is_binary_integer_number("0b10100101110"))
103         self.assertTrue(su.is_binary_integer_number("+0b10100101110"))
104         self.assertTrue(su.is_binary_integer_number("-0b10100101110"))
105         self.assertTrue(su.is_binary_integer_number("0B10100101110"))
106         self.assertTrue(su.is_binary_integer_number("+0B10100101110"))
107         self.assertTrue(su.is_binary_integer_number("-0B10100101110"))
108         self.assertFalse(su.is_binary_integer_number("-0B10100101110  "))
109         self.assertFalse(su.is_binary_integer_number("  -0B10100101110"))
110         self.assertFalse(su.is_binary_integer_number("-0B10100 101110"))
111         self.assertFalse(su.is_binary_integer_number("0b10100201110"))
112         self.assertFalse(su.is_binary_integer_number("0b10100101e110"))
113         self.assertFalse(su.is_binary_integer_number("fred"))
114
115     def test_to_int(self):
116         self.assertEqual(su.to_int("1234"), 1234)
117         self.assertEqual(su.to_int("0x1234"), 4660)
118         self.assertEqual(su.to_int("0o777"), 511)
119         self.assertEqual(su.to_int("0b111"), 7)
120
121     def test_is_decimal_number(self):
122         self.assertTrue(su.is_decimal_number('4.3'))
123         self.assertTrue(su.is_decimal_number('.3'))
124         self.assertTrue(su.is_decimal_number('0.3'))
125         self.assertFalse(su.is_decimal_number('3.'))
126         self.assertTrue(su.is_decimal_number('3.0'))
127         self.assertTrue(su.is_decimal_number('3.0492949249e20'))
128         self.assertFalse(su.is_decimal_number('3'))
129         self.assertFalse(su.is_decimal_number('0x11'))
130
131     def test_strip_escape_sequences(self):
132         s = f' {fg("red")}  this is a test  {bg("white")}  this is a test  {reset()}  '
133         self.assertEqual(
134             su.strip_escape_sequences(s),
135             '   this is a test    this is a test    ',
136         )
137         s = ' this is another test '
138         self.assertEqual(su.strip_escape_sequences(s), s)
139
140     def test_is_url(self):
141         self.assertTrue(su.is_url("http://host.domain/uri/uri#shard?param=value+s"))
142         self.assertTrue(su.is_url("http://127.0.0.1/uri/uri#shard?param=value+s"))
143         self.assertTrue(
144             su.is_url("http://user:[email protected]:81/uri/uri#shard?param=value+s")
145         )
146         self.assertTrue(su.is_url("ftp://127.0.0.1/uri/uri"))
147
148     def test_is_email(self):
149         self.assertTrue(su.is_email('[email protected]'))
150         self.assertTrue(su.is_email('[email protected]'))
151         self.assertFalse(su.is_email('@yahoo.com'))
152         self.assertFalse(su.is_email('indubidibly'))
153         self.assertFalse(su.is_email('[email protected]'))
154
155     def test_suffix_string_to_number(self):
156         self.assertEqual(1024, su.suffix_string_to_number('1Kb'))
157         self.assertEqual(1024 * 1024, su.suffix_string_to_number('1Mb'))
158         self.assertEqual(1024, su.suffix_string_to_number('1k'))
159         self.assertEqual(1024, su.suffix_string_to_number('1kb'))
160         self.assertEqual(None, su.suffix_string_to_number('1Jl'))
161         self.assertEqual(None, su.suffix_string_to_number('undeniable'))
162
163     def test_number_to_suffix_string(self):
164         self.assertEqual('1.0Kb', su.number_to_suffix_string(1024))
165         self.assertEqual('1.0Mb', su.number_to_suffix_string(1024 * 1024))
166         self.assertEqual('123', su.number_to_suffix_string(123))
167
168     def test_is_credit_card(self):
169         self.assertTrue(su.is_credit_card('4242424242424242'))
170         self.assertTrue(su.is_credit_card('5555555555554444'))
171         self.assertTrue(su.is_credit_card('378282246310005'))
172         self.assertTrue(su.is_credit_card('6011111111111117'))
173         self.assertTrue(su.is_credit_card('4000000360000006'))
174         self.assertFalse(su.is_credit_card('8000000360110099'))
175         self.assertFalse(su.is_credit_card(''))
176
177     def test_is_camel_case(self):
178         self.assertFalse(su.is_camel_case('thisisatest'))
179         self.assertTrue(su.is_camel_case('thisIsATest'))
180         self.assertFalse(su.is_camel_case('this_is_a_test'))
181
182     def test_is_snake_case(self):
183         self.assertFalse(su.is_snake_case('thisisatest'))
184         self.assertFalse(su.is_snake_case('thisIsATest'))
185         self.assertTrue(su.is_snake_case('this_is_a_test'))
186
187     def test_sprintf_context(self):
188         with su.SprintfStdout() as buf:
189             print("This is a test.")
190             print("This is another one.")
191         self.assertEqual('This is a test.\nThis is another one.\n', buf())
192
193
194 if __name__ == '__main__':
195     bootstrap.initialize(unittest.main)()