xref: /aosp_15_r20/external/pigweed/pw_tokenizer/py/decode_test.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*61c4878aSAndroid Build Coastguard Worker# Copyright 2022 The Pigweed Authors
3*61c4878aSAndroid Build Coastguard Worker#
4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
6*61c4878aSAndroid Build Coastguard Worker# the License at
7*61c4878aSAndroid Build Coastguard Worker#
8*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
9*61c4878aSAndroid Build Coastguard Worker#
10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
14*61c4878aSAndroid Build Coastguard Worker# the License.
15*61c4878aSAndroid Build Coastguard Worker"""Tests the tokenized string decode module."""
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerfrom datetime import datetime
18*61c4878aSAndroid Build Coastguard Workerimport math
19*61c4878aSAndroid Build Coastguard Workerimport unittest
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Workerimport tokenized_string_decoding_test_data as tokenized_string
22*61c4878aSAndroid Build Coastguard Workerimport varint_test_data
23*61c4878aSAndroid Build Coastguard Workerfrom pw_tokenizer import decode
24*61c4878aSAndroid Build Coastguard Workerfrom pw_tokenizer import encode
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Workerdef error(msg, value=None) -> str:
28*61c4878aSAndroid Build Coastguard Worker    """Formats msg as the message for an argument that failed to parse."""
29*61c4878aSAndroid Build Coastguard Worker    if value is None:
30*61c4878aSAndroid Build Coastguard Worker        return '<[{}]>'.format(msg)
31*61c4878aSAndroid Build Coastguard Worker    return '<[{} ({})]>'.format(msg, value)
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Workerclass TestDecodeTokenized(unittest.TestCase):
35*61c4878aSAndroid Build Coastguard Worker    """Tests decoding tokenized strings with various arguments."""
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker    def test_decode_generated_data(self) -> None:
38*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(len(tokenized_string.TEST_DATA), 100)
39*61c4878aSAndroid Build Coastguard Worker
40*61c4878aSAndroid Build Coastguard Worker        for fmt, decoded, encoded in tokenized_string.TEST_DATA:
41*61c4878aSAndroid Build Coastguard Worker            self.assertEqual(decode.decode(fmt, encoded, True), decoded)
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker    def test_unicode_decode_errors(self) -> None:
44*61c4878aSAndroid Build Coastguard Worker        """Tests unicode errors, which do not occur in the C++ decoding code."""
45*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
46*61c4878aSAndroid Build Coastguard Worker            decode.decode('Why, %c', b'\x01', True),
47*61c4878aSAndroid Build Coastguard Worker            'Why, ' + error('%c ERROR', -1),
48*61c4878aSAndroid Build Coastguard Worker        )
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
51*61c4878aSAndroid Build Coastguard Worker            decode.decode('%sXY%+ldxy%u', b'\x83N\x80!\x01\x02', True),
52*61c4878aSAndroid Build Coastguard Worker            '{}XY{}xy{}'.format(
53*61c4878aSAndroid Build Coastguard Worker                error('%s ERROR', "'N\\x80!'"),
54*61c4878aSAndroid Build Coastguard Worker                error('%+ld SKIPPED', -1),
55*61c4878aSAndroid Build Coastguard Worker                error('%u SKIPPED', 1),
56*61c4878aSAndroid Build Coastguard Worker            ),
57*61c4878aSAndroid Build Coastguard Worker        )
58*61c4878aSAndroid Build Coastguard Worker
59*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
60*61c4878aSAndroid Build Coastguard Worker            decode.decode('%s%lld%9u', b'\x82$\x80\x80', True),
61*61c4878aSAndroid Build Coastguard Worker            '{0}{1}{2}'.format(
62*61c4878aSAndroid Build Coastguard Worker                error("%s ERROR ('$\\x80')"),
63*61c4878aSAndroid Build Coastguard Worker                error('%lld SKIPPED'),
64*61c4878aSAndroid Build Coastguard Worker                error('%9u SKIPPED'),
65*61c4878aSAndroid Build Coastguard Worker            ),
66*61c4878aSAndroid Build Coastguard Worker        )
67*61c4878aSAndroid Build Coastguard Worker
68*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
69*61c4878aSAndroid Build Coastguard Worker            decode.decode('%c', b'\xff\xff\xff\xff\x0f', True),
70*61c4878aSAndroid Build Coastguard Worker            error('%c ERROR', -2147483648),
71*61c4878aSAndroid Build Coastguard Worker        )
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker    def test_ignore_errors(self) -> None:
74*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(decode.decode('Why, %c', b'\x01'), 'Why, %c')
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(decode.decode('%s %d', b'\x01!'), '! %d')
77*61c4878aSAndroid Build Coastguard Worker
78*61c4878aSAndroid Build Coastguard Worker    def test_pointer(self) -> None:
79*61c4878aSAndroid Build Coastguard Worker        """Tests pointer args, which are not natively supported in Python."""
80*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
81*61c4878aSAndroid Build Coastguard Worker            decode.decode('Hello: %p', b'\x00', True), 'Hello: 0x00000000'
82*61c4878aSAndroid Build Coastguard Worker        )
83*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
84*61c4878aSAndroid Build Coastguard Worker            decode.decode('%p%d%d', b'\x02\x80', True),
85*61c4878aSAndroid Build Coastguard Worker            '0x00000001<[%d ERROR]><[%d SKIPPED]>',
86*61c4878aSAndroid Build Coastguard Worker        )
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker    def test_nothing_printed_fails(self) -> None:
89*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%n').format(b'')
90*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker
93*61c4878aSAndroid Build Coastguard Workerclass TestPercentLiteralDecoding(unittest.TestCase):
94*61c4878aSAndroid Build Coastguard Worker    """Tests decoding the %-literal in various invalid situations."""
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard Worker    def test_percent(self) -> None:
97*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%%').format(b'')
98*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
99*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '%')
100*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
101*61c4878aSAndroid Build Coastguard Worker
102*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_leading_plus_fails(self) -> None:
103*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+%').format(b'')
104*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
105*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
106*61c4878aSAndroid Build Coastguard Worker
107*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_leading_negative(self) -> None:
108*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-%').format(b'')
109*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
110*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
111*61c4878aSAndroid Build Coastguard Worker
112*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_leading_space(self) -> None:
113*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% %').format(b'')
114*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
115*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
116*61c4878aSAndroid Build Coastguard Worker
117*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_leading_hashtag(self) -> None:
118*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#%').format(b'')
119*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
120*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
121*61c4878aSAndroid Build Coastguard Worker
122*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_leading_zero(self) -> None:
123*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%0%').format(b'')
124*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
125*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_length(self) -> None:
128*61c4878aSAndroid Build Coastguard Worker        """Test that all length prefixes fail to decode with %."""
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hh%').format(b'')
131*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
132*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
133*61c4878aSAndroid Build Coastguard Worker
134*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%h%').format(b'')
135*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
136*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
137*61c4878aSAndroid Build Coastguard Worker
138*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%l%').format(b'')
139*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
140*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ll%').format(b'')
143*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
144*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%L%').format(b'')
147*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
148*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
149*61c4878aSAndroid Build Coastguard Worker
150*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%j%').format(b'')
151*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
152*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
153*61c4878aSAndroid Build Coastguard Worker
154*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%z%').format(b'')
155*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
156*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
157*61c4878aSAndroid Build Coastguard Worker
158*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%t%').format(b'')
159*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
160*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
161*61c4878aSAndroid Build Coastguard Worker
162*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_width(self):
163*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%9%').format(b'')
164*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_multidigit_width(self):
167*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10%').format(b'')
168*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
169*61c4878aSAndroid Build Coastguard Worker
170*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_star_width(self):
171*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*%').format(b'')
172*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
173*61c4878aSAndroid Build Coastguard Worker
174*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_precision(self):
175*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.5%').format(b'')
176*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
177*61c4878aSAndroid Build Coastguard Worker
178*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_multidigit_precision(self):
179*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.10%').format(b'')
180*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
181*61c4878aSAndroid Build Coastguard Worker
182*61c4878aSAndroid Build Coastguard Worker    def test_percent_with_star_precision(self):
183*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.*%').format(b'')
184*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
185*61c4878aSAndroid Build Coastguard Worker
186*61c4878aSAndroid Build Coastguard Worker
187*61c4878aSAndroid Build Coastguard Worker# pylint: disable=too-many-public-methods
188*61c4878aSAndroid Build Coastguard Workerclass TestIntegerDecoding(unittest.TestCase):
189*61c4878aSAndroid Build Coastguard Worker    """Tests decoding variable-length integers."""
190*61c4878aSAndroid Build Coastguard Worker
191*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d(self) -> None:
192*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%d').format(encode.encode_args(-10))
193*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
194*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
195*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
196*61c4878aSAndroid Build Coastguard Worker
197*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_minus(self) -> None:
198*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-5d').format(encode.encode_args(10))
199*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
200*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10   ')
201*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
202*61c4878aSAndroid Build Coastguard Worker
203*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_plus(self) -> None:
204*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+d').format(encode.encode_args(10))
205*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
206*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+10')
207*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
208*61c4878aSAndroid Build Coastguard Worker
209*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_blank_space(self) -> None:
210*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% d').format(encode.encode_args(10))
211*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
212*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 10')
213*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
214*61c4878aSAndroid Build Coastguard Worker
215*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_plus_and_blank_space_ignores_blank_space(
216*61c4878aSAndroid Build Coastguard Worker        self,
217*61c4878aSAndroid Build Coastguard Worker    ) -> None:
218*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+ d').format(encode.encode_args(10))
219*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
220*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+10')
221*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
222*61c4878aSAndroid Build Coastguard Worker
223*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% +d').format(encode.encode_args(10))
224*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
225*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+10')
226*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
227*61c4878aSAndroid Build Coastguard Worker
228*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_hashtag(self) -> None:
229*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#d').format(encode.encode_args(10))
230*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
231*61c4878aSAndroid Build Coastguard Worker
232*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_zero(self) -> None:
233*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%05d').format(encode.encode_args(10))
234*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
235*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '00010')
236*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
237*61c4878aSAndroid Build Coastguard Worker
238*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_length(self) -> None:
239*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect signed integer decoding."""
240*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhd').format(encode.encode_args(-10))
241*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
242*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
243*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
244*61c4878aSAndroid Build Coastguard Worker
245*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hd').format(encode.encode_args(-10))
246*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
247*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
248*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
249*61c4878aSAndroid Build Coastguard Worker
250*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ld').format(encode.encode_args(-10))
251*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
252*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
253*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
254*61c4878aSAndroid Build Coastguard Worker
255*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lld').format(encode.encode_args(-10))
256*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
257*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
258*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
259*61c4878aSAndroid Build Coastguard Worker
260*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jd').format(encode.encode_args(-10))
261*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
262*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
263*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
264*61c4878aSAndroid Build Coastguard Worker
265*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zd').format(encode.encode_args(-10))
266*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
267*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
268*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
269*61c4878aSAndroid Build Coastguard Worker
270*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%td').format(encode.encode_args(-10))
271*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
272*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
273*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
274*61c4878aSAndroid Build Coastguard Worker
275*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_width(self) -> None:
276*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%5d').format(encode.encode_args(-10))
277*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
278*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '  -10')
279*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
280*61c4878aSAndroid Build Coastguard Worker
281*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_width_and_0_flag(self) -> None:
282*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%05d').format(encode.encode_args(-10))
283*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
284*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-0010')
285*61c4878aSAndroid Build Coastguard Worker
286*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_multidigit_width(self) -> None:
287*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10d').format(encode.encode_args(-10))
288*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
289*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       -10')
290*61c4878aSAndroid Build Coastguard Worker
291*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_star_width(self) -> None:
292*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*d').format(encode.encode_args(10, -10))
293*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
294*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       -10')
295*61c4878aSAndroid Build Coastguard Worker
296*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_missing_width_or_value(self) -> None:
297*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*d').format(encode.encode_args(-10))
298*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
299*61c4878aSAndroid Build Coastguard Worker
300*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_precision(self) -> None:
301*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.5d').format(encode.encode_args(-10))
302*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
303*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-00010')
304*61c4878aSAndroid Build Coastguard Worker
305*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_multidigit_precision(self) -> None:
306*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.10d').format(encode.encode_args(-10))
307*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
308*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-0000000010')
309*61c4878aSAndroid Build Coastguard Worker
310*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_star_precision(self) -> None:
311*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.*d').format(encode.encode_args(10, -10))
312*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
313*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-0000000010')
314*61c4878aSAndroid Build Coastguard Worker
315*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_zero_precision(self) -> None:
316*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.0d').format(encode.encode_args(-10))
317*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
318*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
319*61c4878aSAndroid Build Coastguard Worker
320*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_empty_precision(self) -> None:
321*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.d').format(encode.encode_args(-10))
322*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
323*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
324*61c4878aSAndroid Build Coastguard Worker
325*61c4878aSAndroid Build Coastguard Worker    def test_zero_with_zero_precision(self) -> None:
326*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.0d').format(encode.encode_args(0))
327*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
328*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '')
329*61c4878aSAndroid Build Coastguard Worker
330*61c4878aSAndroid Build Coastguard Worker    def test_zero_with_empty_precision(self) -> None:
331*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.d').format(encode.encode_args(0))
332*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
333*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '')
334*61c4878aSAndroid Build Coastguard Worker
335*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_width_and_precision(self) -> None:
336*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10.5d').format(encode.encode_args(-10))
337*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
338*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '    -00010')
339*61c4878aSAndroid Build Coastguard Worker
340*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_star_width_and_precision(self) -> None:
341*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*.*d').format(
342*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(15, 10, -10)
343*61c4878aSAndroid Build Coastguard Worker        )
344*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
345*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '    -0000000010')
346*61c4878aSAndroid Build Coastguard Worker
347*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_d_with_missing_precision_or_value(self) -> None:
348*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.*d').format(encode.encode_args(-10))
349*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
350*61c4878aSAndroid Build Coastguard Worker
351*61c4878aSAndroid Build Coastguard Worker    def test_64_bit_specifier_workaround(self) -> None:
352*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.u%.*lu%0*lu').format(
353*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0, 0, 0, 0, 0)
354*61c4878aSAndroid Build Coastguard Worker        )
355*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
356*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0')
357*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
358*61c4878aSAndroid Build Coastguard Worker
359*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.u%.*lu%0*lu').format(
360*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0, 0, 1, 9, 0)
361*61c4878aSAndroid Build Coastguard Worker        )
362*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
363*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '1000000000')
364*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
365*61c4878aSAndroid Build Coastguard Worker
366*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.u%.*lu%0*lu').format(
367*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(1, 9, 0, 9, 0)
368*61c4878aSAndroid Build Coastguard Worker        )
369*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
370*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '1000000000000000000')
371*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
372*61c4878aSAndroid Build Coastguard Worker
373*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
374*61c4878aSAndroid Build Coastguard Worker
375*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i(self) -> None:
376*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%i').format(encode.encode_args(-10))
377*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
378*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
379*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
380*61c4878aSAndroid Build Coastguard Worker
381*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_minus(self) -> None:
382*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-5i').format(encode.encode_args(10))
383*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
384*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10   ')
385*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
386*61c4878aSAndroid Build Coastguard Worker
387*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_plus(self) -> None:
388*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+i').format(encode.encode_args(10))
389*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
390*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+10')
391*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
392*61c4878aSAndroid Build Coastguard Worker
393*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_blank_space(self) -> None:
394*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% i').format(encode.encode_args(10))
395*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
396*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 10')
397*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
398*61c4878aSAndroid Build Coastguard Worker
399*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_plus_and_blank_space_ignores_blank_space(
400*61c4878aSAndroid Build Coastguard Worker        self,
401*61c4878aSAndroid Build Coastguard Worker    ) -> None:
402*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+ i').format(encode.encode_args(10))
403*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
404*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+10')
405*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
406*61c4878aSAndroid Build Coastguard Worker
407*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% +i').format(encode.encode_args(10))
408*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
409*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+10')
410*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
411*61c4878aSAndroid Build Coastguard Worker
412*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_hashtag(self) -> None:
413*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#i').format(encode.encode_args(10))
414*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
415*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(10))
416*61c4878aSAndroid Build Coastguard Worker
417*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_zero(self) -> None:
418*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%05i').format(encode.encode_args(10))
419*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
420*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '00010')
421*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
422*61c4878aSAndroid Build Coastguard Worker
423*61c4878aSAndroid Build Coastguard Worker    def test_signed_integer_i_with_length(self) -> None:
424*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect signed integer decoding."""
425*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhi').format(encode.encode_args(-10))
426*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
427*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
428*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
429*61c4878aSAndroid Build Coastguard Worker
430*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hi').format(encode.encode_args(-10))
431*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
432*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
433*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
434*61c4878aSAndroid Build Coastguard Worker
435*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%li').format(encode.encode_args(-10))
436*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
437*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
438*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
439*61c4878aSAndroid Build Coastguard Worker
440*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lli').format(encode.encode_args(-10))
441*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
442*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
443*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
444*61c4878aSAndroid Build Coastguard Worker
445*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ji').format(encode.encode_args(-10))
446*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
447*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
448*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
449*61c4878aSAndroid Build Coastguard Worker
450*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zi').format(encode.encode_args(-10))
451*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
452*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
453*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
454*61c4878aSAndroid Build Coastguard Worker
455*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ti').format(encode.encode_args(-10))
456*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
457*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '-10')
458*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
459*61c4878aSAndroid Build Coastguard Worker
460*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
461*61c4878aSAndroid Build Coastguard Worker
462*61c4878aSAndroid Build Coastguard Worker    def test_unsigned_integer(self) -> None:
463*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%u').format(encode.encode_args(10))
464*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
465*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
466*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
467*61c4878aSAndroid Build Coastguard Worker
468*61c4878aSAndroid Build Coastguard Worker    def test_unsigned_integer_with_hashtag(self) -> None:
469*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#u').format(encode.encode_args(10))
470*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
471*61c4878aSAndroid Build Coastguard Worker
472*61c4878aSAndroid Build Coastguard Worker    def test_unsigned_integer_with_length(self) -> None:
473*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers pass unsigned integer decoding."""
474*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhu').format(encode.encode_args(10))
475*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
476*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
477*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
478*61c4878aSAndroid Build Coastguard Worker
479*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hu').format(encode.encode_args(10))
480*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
481*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
482*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
483*61c4878aSAndroid Build Coastguard Worker
484*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lu').format(encode.encode_args(10))
485*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
486*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
487*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
488*61c4878aSAndroid Build Coastguard Worker
489*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llu').format(encode.encode_args(10))
490*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
491*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
492*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
493*61c4878aSAndroid Build Coastguard Worker
494*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ju').format(encode.encode_args(10))
495*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
496*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
497*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
498*61c4878aSAndroid Build Coastguard Worker
499*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zu').format(encode.encode_args(10))
500*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
501*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
502*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
503*61c4878aSAndroid Build Coastguard Worker
504*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tu').format(encode.encode_args(10))
505*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
506*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
507*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
508*61c4878aSAndroid Build Coastguard Worker
509*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lu').format(encode.encode_args(10))
510*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
511*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '10')
512*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
513*61c4878aSAndroid Build Coastguard Worker
514*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
515*61c4878aSAndroid Build Coastguard Worker
516*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer(self) -> None:
517*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%o').format(encode.encode_args(10))
518*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
519*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
520*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
521*61c4878aSAndroid Build Coastguard Worker
522*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_hashtag(self) -> None:
523*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#o').format(encode.encode_args(10))
524*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
525*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '012')
526*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
527*61c4878aSAndroid Build Coastguard Worker
528*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_hashtag_and_width(self) -> None:
529*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#10o').format(encode.encode_args(10))
530*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
531*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       012')
532*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
533*61c4878aSAndroid Build Coastguard Worker
534*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_hashtag_and_zero_and_width(self) -> None:
535*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#010o').format(encode.encode_args(10))
536*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
537*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0000000012')
538*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
539*61c4878aSAndroid Build Coastguard Worker
540*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_minus_and_hashtag(self) -> None:
541*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#-5o').format(encode.encode_args(10))
542*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
543*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '012  ')
544*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
545*61c4878aSAndroid Build Coastguard Worker
546*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_plus_and_hashtag(self) -> None:
547*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+#o').format(encode.encode_args(10))
548*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
549*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+012')
550*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
551*61c4878aSAndroid Build Coastguard Worker
552*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_space_and_hashtag(self) -> None:
553*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% #o').format(encode.encode_args(10))
554*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
555*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 012')
556*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
557*61c4878aSAndroid Build Coastguard Worker
558*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_zero_and_hashtag(self) -> None:
559*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#05o').format(encode.encode_args(10))
560*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
561*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '00012')
562*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
563*61c4878aSAndroid Build Coastguard Worker
564*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_plus_and_space_and_hashtag_ignores_space(
565*61c4878aSAndroid Build Coastguard Worker        self,
566*61c4878aSAndroid Build Coastguard Worker    ) -> None:
567*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+ #o').format(encode.encode_args(10))
568*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
569*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+012')
570*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
571*61c4878aSAndroid Build Coastguard Worker
572*61c4878aSAndroid Build Coastguard Worker    def test_octal_integer_with_length(self) -> None:
573*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect octal integer decoding."""
574*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hho').format(encode.encode_args(10))
575*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
576*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
577*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
578*61c4878aSAndroid Build Coastguard Worker
579*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ho').format(encode.encode_args(10))
580*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
581*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
582*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
583*61c4878aSAndroid Build Coastguard Worker
584*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lo').format(encode.encode_args(10))
585*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
586*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
587*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
588*61c4878aSAndroid Build Coastguard Worker
589*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llo').format(encode.encode_args(10))
590*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
591*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
592*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
593*61c4878aSAndroid Build Coastguard Worker
594*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jo').format(encode.encode_args(10))
595*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
596*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
597*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
598*61c4878aSAndroid Build Coastguard Worker
599*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zo').format(encode.encode_args(10))
600*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
601*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
602*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
603*61c4878aSAndroid Build Coastguard Worker
604*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%to').format(encode.encode_args(10))
605*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
606*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
607*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
608*61c4878aSAndroid Build Coastguard Worker
609*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lo').format(encode.encode_args(10))
610*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
611*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '12')
612*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
613*61c4878aSAndroid Build Coastguard Worker
614*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
615*61c4878aSAndroid Build Coastguard Worker
616*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_hex_integer(self) -> None:
617*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%x').format(encode.encode_args(10))
618*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
619*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
620*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
621*61c4878aSAndroid Build Coastguard Worker
622*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_hex_integer_with_hashtag(self) -> None:
623*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#x').format(encode.encode_args(10))
624*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
625*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0xa')
626*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
627*61c4878aSAndroid Build Coastguard Worker
628*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_hex_integer_with_length(self) -> None:
629*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect lowercase hex decoding."""
630*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhx').format(encode.encode_args(10))
631*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
632*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
633*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
634*61c4878aSAndroid Build Coastguard Worker
635*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hx').format(encode.encode_args(10))
636*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
637*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
638*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
639*61c4878aSAndroid Build Coastguard Worker
640*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lx').format(encode.encode_args(10))
641*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
642*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
643*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
644*61c4878aSAndroid Build Coastguard Worker
645*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llx').format(encode.encode_args(10))
646*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
647*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
648*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
649*61c4878aSAndroid Build Coastguard Worker
650*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jx').format(encode.encode_args(10))
651*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
652*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
653*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
654*61c4878aSAndroid Build Coastguard Worker
655*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zx').format(encode.encode_args(10))
656*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
657*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
658*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
659*61c4878aSAndroid Build Coastguard Worker
660*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tx').format(encode.encode_args(10))
661*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
662*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
663*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
664*61c4878aSAndroid Build Coastguard Worker
665*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lx').format(encode.encode_args(10))
666*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
667*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'a')
668*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
669*61c4878aSAndroid Build Coastguard Worker
670*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
671*61c4878aSAndroid Build Coastguard Worker
672*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_hex_integer(self) -> None:
673*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%X').format(encode.encode_args(10))
674*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
675*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
676*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
677*61c4878aSAndroid Build Coastguard Worker
678*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_hex_integer_with_hashtag(self) -> None:
679*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#X').format(encode.encode_args(10))
680*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
681*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0XA')
682*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
683*61c4878aSAndroid Build Coastguard Worker
684*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_hex_integer_with_length(self) -> None:
685*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect uppercase hex decoding."""
686*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhX').format(encode.encode_args(10))
687*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
688*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
689*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
690*61c4878aSAndroid Build Coastguard Worker
691*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hX').format(encode.encode_args(10))
692*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
693*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
694*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
695*61c4878aSAndroid Build Coastguard Worker
696*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lX').format(encode.encode_args(10))
697*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
698*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
699*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
700*61c4878aSAndroid Build Coastguard Worker
701*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llX').format(encode.encode_args(10))
702*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
703*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
704*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
705*61c4878aSAndroid Build Coastguard Worker
706*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jX').format(encode.encode_args(10))
707*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
708*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
709*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
710*61c4878aSAndroid Build Coastguard Worker
711*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zX').format(encode.encode_args(10))
712*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
713*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
714*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
715*61c4878aSAndroid Build Coastguard Worker
716*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tX').format(encode.encode_args(10))
717*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
718*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
719*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
720*61c4878aSAndroid Build Coastguard Worker
721*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%LX').format(encode.encode_args(10))
722*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
723*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'A')
724*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
725*61c4878aSAndroid Build Coastguard Worker
726*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
727*61c4878aSAndroid Build Coastguard Worker
728*61c4878aSAndroid Build Coastguard Worker    def test_decode_generated_data(self) -> None:
729*61c4878aSAndroid Build Coastguard Worker        test_data = varint_test_data.TEST_DATA
730*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(len(test_data), 100)
731*61c4878aSAndroid Build Coastguard Worker
732*61c4878aSAndroid Build Coastguard Worker        for signed_spec, signed, unsigned_spec, unsigned, encoded in test_data:
733*61c4878aSAndroid Build Coastguard Worker            self.assertEqual(
734*61c4878aSAndroid Build Coastguard Worker                int(signed),
735*61c4878aSAndroid Build Coastguard Worker                decode.FormatSpec.from_string(signed_spec)
736*61c4878aSAndroid Build Coastguard Worker                .decode(bytearray(encoded))
737*61c4878aSAndroid Build Coastguard Worker                .value,
738*61c4878aSAndroid Build Coastguard Worker            )
739*61c4878aSAndroid Build Coastguard Worker
740*61c4878aSAndroid Build Coastguard Worker            self.assertEqual(
741*61c4878aSAndroid Build Coastguard Worker                int(unsigned),
742*61c4878aSAndroid Build Coastguard Worker                decode.FormatSpec.from_string(unsigned_spec)
743*61c4878aSAndroid Build Coastguard Worker                .decode(bytearray(encoded))
744*61c4878aSAndroid Build Coastguard Worker                .value,
745*61c4878aSAndroid Build Coastguard Worker            )
746*61c4878aSAndroid Build Coastguard Worker
747*61c4878aSAndroid Build Coastguard Worker
748*61c4878aSAndroid Build Coastguard Worker# pylint: disable=too-many-public-methods
749*61c4878aSAndroid Build Coastguard Workerclass TestFloatDecoding(unittest.TestCase):
750*61c4878aSAndroid Build Coastguard Worker    """Tests decoding floating-point values using f or F."""
751*61c4878aSAndroid Build Coastguard Worker
752*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float(self) -> None:
753*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%f').format(encode.encode_args(2.2))
754*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
755*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
756*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
757*61c4878aSAndroid Build Coastguard Worker
758*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_minus(self) -> None:
759*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-10f').format(encode.encode_args(2.2))
760*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
761*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000  ')
762*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
763*61c4878aSAndroid Build Coastguard Worker
764*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_plus(self) -> None:
765*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+f').format(encode.encode_args(2.2))
766*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
767*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+2.200000')
768*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
769*61c4878aSAndroid Build Coastguard Worker
770*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_blank_space(self) -> None:
771*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% f').format(encode.encode_args(2.2))
772*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
773*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 2.200000')
774*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
775*61c4878aSAndroid Build Coastguard Worker
776*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_plus_and_blank_space_ignores_blank_space(
777*61c4878aSAndroid Build Coastguard Worker        self,
778*61c4878aSAndroid Build Coastguard Worker    ) -> None:
779*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+ f').format(encode.encode_args(2.2))
780*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
781*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+2.200000')
782*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
783*61c4878aSAndroid Build Coastguard Worker
784*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% +f').format(encode.encode_args(2.2))
785*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
786*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+2.200000')
787*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
788*61c4878aSAndroid Build Coastguard Worker
789*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_hashtag(self) -> None:
790*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.0f').format(encode.encode_args(2.0))
791*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
792*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2')
793*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
794*61c4878aSAndroid Build Coastguard Worker
795*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#.0f').format(encode.encode_args(2.0))
796*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
797*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.')
798*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
799*61c4878aSAndroid Build Coastguard Worker
800*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_zero(self) -> None:
801*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%010f').format(encode.encode_args(2.2))
802*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
803*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '002.200000')
804*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
805*61c4878aSAndroid Build Coastguard Worker
806*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_length(self) -> None:
807*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect f decoding."""
808*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhf').format(encode.encode_args(2.2))
809*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
810*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
811*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
812*61c4878aSAndroid Build Coastguard Worker
813*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hf').format(encode.encode_args(2.2))
814*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
815*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
816*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
817*61c4878aSAndroid Build Coastguard Worker
818*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lf').format(encode.encode_args(2.2))
819*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
820*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
821*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
822*61c4878aSAndroid Build Coastguard Worker
823*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llf').format(encode.encode_args(2.2))
824*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
825*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
826*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
827*61c4878aSAndroid Build Coastguard Worker
828*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jf').format(encode.encode_args(2.2))
829*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
830*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
831*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
832*61c4878aSAndroid Build Coastguard Worker
833*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zf').format(encode.encode_args(2.2))
834*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
835*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
836*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
837*61c4878aSAndroid Build Coastguard Worker
838*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tf').format(encode.encode_args(2.2))
839*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
840*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
841*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
842*61c4878aSAndroid Build Coastguard Worker
843*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lf').format(encode.encode_args(2.2))
844*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
845*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
846*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
847*61c4878aSAndroid Build Coastguard Worker
848*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_width(self) -> None:
849*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%9f').format(encode.encode_args(2.2))
850*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
851*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 2.200000')
852*61c4878aSAndroid Build Coastguard Worker
853*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_multidigit_width(self) -> None:
854*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10f').format(encode.encode_args(2.2))
855*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
856*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '  2.200000')
857*61c4878aSAndroid Build Coastguard Worker
858*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_star_width(self) -> None:
859*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*f').format(encode.encode_args(10, 2.2))
860*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
861*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '  2.200000')
862*61c4878aSAndroid Build Coastguard Worker
863*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number(self) -> None:
864*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%f').format(encode.encode_args(math.inf))
865*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
866*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
867*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
868*61c4878aSAndroid Build Coastguard Worker
869*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_precision(self) -> None:
870*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.4f').format(encode.encode_args(2.2))
871*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
872*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2000')
873*61c4878aSAndroid Build Coastguard Worker
874*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_multidigit_precision(self) -> None:
875*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.10f').format(encode.encode_args(2.2))
876*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
877*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2000000477')
878*61c4878aSAndroid Build Coastguard Worker
879*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_star_preision(self) -> None:
880*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.*f').format(encode.encode_args(10, 2.2))
881*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
882*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2000000477')
883*61c4878aSAndroid Build Coastguard Worker
884*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_zero_precision(self) -> None:
885*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.0f').format(encode.encode_args(2.2))
886*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
887*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2')
888*61c4878aSAndroid Build Coastguard Worker
889*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_empty_precision(self) -> None:
890*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.f').format(encode.encode_args(2.2))
891*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
892*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2')
893*61c4878aSAndroid Build Coastguard Worker
894*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_width_and_precision(self) -> None:
895*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10.0f').format(encode.encode_args(2.2))
896*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
897*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '         2')
898*61c4878aSAndroid Build Coastguard Worker
899*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_with_star_width_and_star_precision(self) -> None:
900*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*.*f').format(
901*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(20, 10, 2.2)
902*61c4878aSAndroid Build Coastguard Worker        )
903*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
904*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '        2.2000000477')
905*61c4878aSAndroid Build Coastguard Worker
906*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_minus(self) -> None:
907*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-5f').format(
908*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
909*61c4878aSAndroid Build Coastguard Worker        )
910*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
911*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf  ')
912*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
913*61c4878aSAndroid Build Coastguard Worker
914*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_plus(self) -> None:
915*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+f').format(encode.encode_args(math.inf))
916*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
917*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+inf')
918*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
919*61c4878aSAndroid Build Coastguard Worker
920*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_blank_space(self) -> None:
921*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% f').format(encode.encode_args(math.inf))
922*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
923*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' inf')
924*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
925*61c4878aSAndroid Build Coastguard Worker
926*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_plus_and_blank_ignores_blank(
927*61c4878aSAndroid Build Coastguard Worker        self,
928*61c4878aSAndroid Build Coastguard Worker    ) -> None:
929*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+ f').format(
930*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
931*61c4878aSAndroid Build Coastguard Worker        )
932*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
933*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+inf')
934*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
935*61c4878aSAndroid Build Coastguard Worker
936*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% +f').format(
937*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
938*61c4878aSAndroid Build Coastguard Worker        )
939*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
940*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+inf')
941*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
942*61c4878aSAndroid Build Coastguard Worker
943*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_hashtag(self) -> None:
944*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#f').format(encode.encode_args(math.inf))
945*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
946*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
947*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
948*61c4878aSAndroid Build Coastguard Worker
949*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_zero(self) -> None:
950*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%05f').format(
951*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
952*61c4878aSAndroid Build Coastguard Worker        )
953*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
954*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '  inf')
955*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
956*61c4878aSAndroid Build Coastguard Worker
957*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_width(self) -> None:
958*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%9f').format(encode.encode_args(math.inf))
959*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
960*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '      inf')
961*61c4878aSAndroid Build Coastguard Worker
962*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_multidigit_width(self) -> None:
963*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10f').format(
964*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
965*61c4878aSAndroid Build Coastguard Worker        )
966*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
967*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       inf')
968*61c4878aSAndroid Build Coastguard Worker
969*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_star_width(self) -> None:
970*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*f').format(
971*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, math.inf)
972*61c4878aSAndroid Build Coastguard Worker        )
973*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
974*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       inf')
975*61c4878aSAndroid Build Coastguard Worker
976*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_precision(self) -> None:
977*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.4f').format(
978*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
979*61c4878aSAndroid Build Coastguard Worker        )
980*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
981*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
982*61c4878aSAndroid Build Coastguard Worker
983*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_multidigit_precision(self) -> None:
984*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.10f').format(
985*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
986*61c4878aSAndroid Build Coastguard Worker        )
987*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
988*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
989*61c4878aSAndroid Build Coastguard Worker
990*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_star_preision(self) -> None:
991*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.*f').format(
992*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, math.inf)
993*61c4878aSAndroid Build Coastguard Worker        )
994*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
995*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
996*61c4878aSAndroid Build Coastguard Worker
997*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_zero_precision(self) -> None:
998*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.0f').format(
999*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
1000*61c4878aSAndroid Build Coastguard Worker        )
1001*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1002*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
1003*61c4878aSAndroid Build Coastguard Worker
1004*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_empty_precision(self) -> None:
1005*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.f').format(encode.encode_args(math.inf))
1006*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1007*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'inf')
1008*61c4878aSAndroid Build Coastguard Worker
1009*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_width_and_precision(self) -> None:
1010*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10.0f').format(
1011*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(math.inf)
1012*61c4878aSAndroid Build Coastguard Worker        )
1013*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1014*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       inf')
1015*61c4878aSAndroid Build Coastguard Worker
1016*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_float_non_number_with_star_width_and_star_precision(
1017*61c4878aSAndroid Build Coastguard Worker        self,
1018*61c4878aSAndroid Build Coastguard Worker    ) -> None:
1019*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*.*f').format(
1020*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, 0, math.inf)
1021*61c4878aSAndroid Build Coastguard Worker        )
1022*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1023*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       inf')
1024*61c4878aSAndroid Build Coastguard Worker
1025*61c4878aSAndroid Build Coastguard Worker    def test_zero_with_zero_precision(self) -> None:
1026*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.0f').format(encode.encode_args(0.0))
1027*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1028*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0')
1029*61c4878aSAndroid Build Coastguard Worker
1030*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1031*61c4878aSAndroid Build Coastguard Worker
1032*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_float(self) -> None:
1033*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%F').format(encode.encode_args(2.2))
1034*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1035*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1036*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1037*61c4878aSAndroid Build Coastguard Worker
1038*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_float_with_length(self) -> None:
1039*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect F decoding."""
1040*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhF').format(encode.encode_args(2.2))
1041*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1042*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1043*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1044*61c4878aSAndroid Build Coastguard Worker
1045*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hF').format(encode.encode_args(2.2))
1046*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1047*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1048*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1049*61c4878aSAndroid Build Coastguard Worker
1050*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lF').format(encode.encode_args(2.2))
1051*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1052*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1053*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1054*61c4878aSAndroid Build Coastguard Worker
1055*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llF').format(encode.encode_args(2.2))
1056*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1057*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1058*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1059*61c4878aSAndroid Build Coastguard Worker
1060*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jF').format(encode.encode_args(2.2))
1061*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1062*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1063*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1064*61c4878aSAndroid Build Coastguard Worker
1065*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zF').format(encode.encode_args(2.2))
1066*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1067*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1068*61c4878aSAndroid Build Coastguard Worker
1069*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tF').format(encode.encode_args(2.2))
1070*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1071*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1072*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1073*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1074*61c4878aSAndroid Build Coastguard Worker
1075*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%LF').format(encode.encode_args(2.2))
1076*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1077*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000')
1078*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1079*61c4878aSAndroid Build Coastguard Worker
1080*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_float_non_number(self) -> None:
1081*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%F').format(encode.encode_args(math.inf))
1082*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1083*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'INF')
1084*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1085*61c4878aSAndroid Build Coastguard Worker
1086*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_exponential(self) -> None:
1087*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%e').format(encode.encode_args(2.2))
1088*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1089*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1090*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1091*61c4878aSAndroid Build Coastguard Worker
1092*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_exponential_with_length(self) -> None:
1093*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect e decoding."""
1094*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhe').format(encode.encode_args(2.2))
1095*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1096*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1097*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1098*61c4878aSAndroid Build Coastguard Worker
1099*61c4878aSAndroid Build Coastguard Worker        # inclusive-language: disable
1100*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%he').format(encode.encode_args(2.2))
1101*61c4878aSAndroid Build Coastguard Worker        # inclusive-language: enable
1102*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1103*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1104*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1105*61c4878aSAndroid Build Coastguard Worker
1106*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%le').format(encode.encode_args(2.2))
1107*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1108*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1109*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1110*61c4878aSAndroid Build Coastguard Worker
1111*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lle').format(encode.encode_args(2.2))
1112*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1113*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1114*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1115*61c4878aSAndroid Build Coastguard Worker
1116*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%je').format(encode.encode_args(2.2))
1117*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1118*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1119*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1120*61c4878aSAndroid Build Coastguard Worker
1121*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ze').format(encode.encode_args(2.2))
1122*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1123*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1124*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1125*61c4878aSAndroid Build Coastguard Worker
1126*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%te').format(encode.encode_args(2.2))
1127*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1128*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1129*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1130*61c4878aSAndroid Build Coastguard Worker
1131*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Le').format(encode.encode_args(2.2))
1132*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1133*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000e+00')
1134*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1135*61c4878aSAndroid Build Coastguard Worker
1136*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1137*61c4878aSAndroid Build Coastguard Worker
1138*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_exponential(self) -> None:
1139*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%E').format(encode.encode_args(2.2))
1140*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1141*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1142*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1143*61c4878aSAndroid Build Coastguard Worker
1144*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_exponential_with_length(self) -> None:
1145*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect E decoding."""
1146*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhE').format(encode.encode_args(2.2))
1147*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1148*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1149*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1150*61c4878aSAndroid Build Coastguard Worker
1151*61c4878aSAndroid Build Coastguard Worker        # inclusive-language: disable
1152*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hE').format(encode.encode_args(2.2))
1153*61c4878aSAndroid Build Coastguard Worker        # inclusive-language: enable
1154*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1155*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1156*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1157*61c4878aSAndroid Build Coastguard Worker
1158*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lE').format(encode.encode_args(2.2))
1159*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1160*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1161*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1162*61c4878aSAndroid Build Coastguard Worker
1163*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llE').format(encode.encode_args(2.2))
1164*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1165*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1166*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1167*61c4878aSAndroid Build Coastguard Worker
1168*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jE').format(encode.encode_args(2.2))
1169*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1170*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1171*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1172*61c4878aSAndroid Build Coastguard Worker
1173*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zE').format(encode.encode_args(2.2))
1174*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1175*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1176*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1177*61c4878aSAndroid Build Coastguard Worker
1178*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tE').format(encode.encode_args(2.2))
1179*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1180*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1181*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1182*61c4878aSAndroid Build Coastguard Worker
1183*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%LE').format(encode.encode_args(2.2))
1184*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1185*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.200000E+00')
1186*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1187*61c4878aSAndroid Build Coastguard Worker
1188*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1189*61c4878aSAndroid Build Coastguard Worker
1190*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_shortest_take_normal(self) -> None:
1191*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%g').format(encode.encode_args(2.2))
1192*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1193*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1194*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1195*61c4878aSAndroid Build Coastguard Worker
1196*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_shortest_take_exponential(self) -> None:
1197*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%g').format(encode.encode_args(1048580.0))
1198*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1199*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '1.04858e+06')
1200*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1201*61c4878aSAndroid Build Coastguard Worker
1202*61c4878aSAndroid Build Coastguard Worker    def test_lowercase_shortest_with_length(self) -> None:
1203*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect g decoding."""
1204*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhg').format(encode.encode_args(2.2))
1205*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1206*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1207*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1208*61c4878aSAndroid Build Coastguard Worker
1209*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hg').format(encode.encode_args(2.2))
1210*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1211*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1212*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1213*61c4878aSAndroid Build Coastguard Worker
1214*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lg').format(encode.encode_args(2.2))
1215*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1216*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1217*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1218*61c4878aSAndroid Build Coastguard Worker
1219*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llg').format(encode.encode_args(2.2))
1220*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1221*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1222*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1223*61c4878aSAndroid Build Coastguard Worker
1224*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jg').format(encode.encode_args(2.2))
1225*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1226*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1227*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1228*61c4878aSAndroid Build Coastguard Worker
1229*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zg').format(encode.encode_args(2.2))
1230*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1231*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1232*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1233*61c4878aSAndroid Build Coastguard Worker
1234*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tg').format(encode.encode_args(2.2))
1235*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1236*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1237*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1238*61c4878aSAndroid Build Coastguard Worker
1239*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lg').format(encode.encode_args(2.2))
1240*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1241*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1242*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1243*61c4878aSAndroid Build Coastguard Worker
1244*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1245*61c4878aSAndroid Build Coastguard Worker
1246*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_shortest_take_normal(self) -> None:
1247*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%G').format(encode.encode_args(2.2))
1248*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1249*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1250*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1251*61c4878aSAndroid Build Coastguard Worker
1252*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_shortest_take_exponential(self) -> None:
1253*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%G').format(encode.encode_args(1048580.0))
1254*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1255*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '1.04858E+06')
1256*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1257*61c4878aSAndroid Build Coastguard Worker
1258*61c4878aSAndroid Build Coastguard Worker    def test_uppercase_shortest_with_length(self) -> None:
1259*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect G decoding."""
1260*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhG').format(encode.encode_args(2.2))
1261*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1262*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1263*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1264*61c4878aSAndroid Build Coastguard Worker
1265*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hG').format(encode.encode_args(2.2))
1266*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1267*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1268*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1269*61c4878aSAndroid Build Coastguard Worker
1270*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lG').format(encode.encode_args(2.2))
1271*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1272*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1273*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1274*61c4878aSAndroid Build Coastguard Worker
1275*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llG').format(encode.encode_args(2.2))
1276*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1277*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1278*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1279*61c4878aSAndroid Build Coastguard Worker
1280*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jG').format(encode.encode_args(2.2))
1281*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1282*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1283*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1284*61c4878aSAndroid Build Coastguard Worker
1285*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zG').format(encode.encode_args(2.2))
1286*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1287*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1288*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1289*61c4878aSAndroid Build Coastguard Worker
1290*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tG').format(encode.encode_args(2.2))
1291*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1292*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1293*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1294*61c4878aSAndroid Build Coastguard Worker
1295*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%LG').format(encode.encode_args(2.2))
1296*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1297*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '2.2')
1298*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1299*61c4878aSAndroid Build Coastguard Worker
1300*61c4878aSAndroid Build Coastguard Worker
1301*61c4878aSAndroid Build Coastguard Workerclass TestCharDecoding(unittest.TestCase):
1302*61c4878aSAndroid Build Coastguard Worker    """Tests decoding character values."""
1303*61c4878aSAndroid Build Coastguard Worker
1304*61c4878aSAndroid Build Coastguard Worker    def test_char(self) -> None:
1305*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%c').format(encode.encode_args(ord('c')))
1306*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1307*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1308*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1309*61c4878aSAndroid Build Coastguard Worker
1310*61c4878aSAndroid Build Coastguard Worker    def test_char_with_minus(self) -> None:
1311*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-5c').format(
1312*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1313*61c4878aSAndroid Build Coastguard Worker        )
1314*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1315*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c    ')
1316*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1317*61c4878aSAndroid Build Coastguard Worker
1318*61c4878aSAndroid Build Coastguard Worker    def test_char_with_plus(self) -> None:
1319*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+c').format(encode.encode_args(ord('c')))
1320*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1321*61c4878aSAndroid Build Coastguard Worker
1322*61c4878aSAndroid Build Coastguard Worker    def test_char_with_blank_space(self) -> None:
1323*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% c').format(encode.encode_args(ord('c')))
1324*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1325*61c4878aSAndroid Build Coastguard Worker
1326*61c4878aSAndroid Build Coastguard Worker    def test_char_with_hashtag(self) -> None:
1327*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#c').format(encode.encode_args(ord('c')))
1328*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1329*61c4878aSAndroid Build Coastguard Worker
1330*61c4878aSAndroid Build Coastguard Worker    def test_char_with_zero(self) -> None:
1331*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%0c').format(encode.encode_args(ord('c')))
1332*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1333*61c4878aSAndroid Build Coastguard Worker
1334*61c4878aSAndroid Build Coastguard Worker    def test_char_with_length(self) -> None:
1335*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affectchar decoding."""
1336*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhc').format(
1337*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1338*61c4878aSAndroid Build Coastguard Worker        )
1339*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1340*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1341*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1342*61c4878aSAndroid Build Coastguard Worker
1343*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hc').format(encode.encode_args(ord('c')))
1344*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1345*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1346*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1347*61c4878aSAndroid Build Coastguard Worker
1348*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lc').format(encode.encode_args(ord('c')))
1349*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1350*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1351*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1352*61c4878aSAndroid Build Coastguard Worker
1353*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llc').format(
1354*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1355*61c4878aSAndroid Build Coastguard Worker        )
1356*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1357*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1358*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1359*61c4878aSAndroid Build Coastguard Worker
1360*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jc').format(encode.encode_args(ord('c')))
1361*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1362*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1363*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1364*61c4878aSAndroid Build Coastguard Worker
1365*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zc').format(encode.encode_args(ord('c')))
1366*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1367*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1368*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1369*61c4878aSAndroid Build Coastguard Worker
1370*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tc').format(encode.encode_args(ord('c')))
1371*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1372*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1373*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1374*61c4878aSAndroid Build Coastguard Worker
1375*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lc').format(encode.encode_args(ord('c')))
1376*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1377*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1378*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1379*61c4878aSAndroid Build Coastguard Worker
1380*61c4878aSAndroid Build Coastguard Worker    def test_char_with_width(self) -> None:
1381*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%5c').format(encode.encode_args(ord('c')))
1382*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1383*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '    c')
1384*61c4878aSAndroid Build Coastguard Worker
1385*61c4878aSAndroid Build Coastguard Worker    def test_char_with_multidigit_width(self) -> None:
1386*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10c').format(
1387*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1388*61c4878aSAndroid Build Coastguard Worker        )
1389*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1390*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '         c')
1391*61c4878aSAndroid Build Coastguard Worker
1392*61c4878aSAndroid Build Coastguard Worker    def test_char_with_star_width(self) -> None:
1393*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*c').format(
1394*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, ord('c'))
1395*61c4878aSAndroid Build Coastguard Worker        )
1396*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1397*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '         c')
1398*61c4878aSAndroid Build Coastguard Worker
1399*61c4878aSAndroid Build Coastguard Worker    def test_char_with_precision(self) -> None:
1400*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.4c').format(
1401*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1402*61c4878aSAndroid Build Coastguard Worker        )
1403*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1404*61c4878aSAndroid Build Coastguard Worker
1405*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1406*61c4878aSAndroid Build Coastguard Worker
1407*61c4878aSAndroid Build Coastguard Worker    def test_long_char(self) -> None:
1408*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lc').format(encode.encode_args(ord('c')))
1409*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1410*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'c')
1411*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1412*61c4878aSAndroid Build Coastguard Worker
1413*61c4878aSAndroid Build Coastguard Worker    def test_long_char_with_hashtag(self) -> None:
1414*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#lc').format(
1415*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1416*61c4878aSAndroid Build Coastguard Worker        )
1417*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1418*61c4878aSAndroid Build Coastguard Worker
1419*61c4878aSAndroid Build Coastguard Worker    def test_long_char_with_zero(self) -> None:
1420*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%0lc').format(
1421*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(ord('c'))
1422*61c4878aSAndroid Build Coastguard Worker        )
1423*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1424*61c4878aSAndroid Build Coastguard Worker
1425*61c4878aSAndroid Build Coastguard Worker
1426*61c4878aSAndroid Build Coastguard Workerclass TestStringDecoding(unittest.TestCase):
1427*61c4878aSAndroid Build Coastguard Worker    """Tests decoding string values."""
1428*61c4878aSAndroid Build Coastguard Worker
1429*61c4878aSAndroid Build Coastguard Worker    def test_string(self) -> None:
1430*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%s').format(encode.encode_args('hello'))
1431*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1432*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1433*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1434*61c4878aSAndroid Build Coastguard Worker
1435*61c4878aSAndroid Build Coastguard Worker    def test_string_with_minus(self) -> None:
1436*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-6s').format(encode.encode_args('hello'))
1437*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1438*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello ')
1439*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1440*61c4878aSAndroid Build Coastguard Worker
1441*61c4878aSAndroid Build Coastguard Worker    def test_string_with_plus(self) -> None:
1442*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+s').format(encode.encode_args('hello'))
1443*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1444*61c4878aSAndroid Build Coastguard Worker
1445*61c4878aSAndroid Build Coastguard Worker    def test_string_with_blank_space(self) -> None:
1446*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% s').format(encode.encode_args('hello'))
1447*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1448*61c4878aSAndroid Build Coastguard Worker
1449*61c4878aSAndroid Build Coastguard Worker    def test_string_with_hashtag(self) -> None:
1450*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#s').format(encode.encode_args('hello'))
1451*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1452*61c4878aSAndroid Build Coastguard Worker
1453*61c4878aSAndroid Build Coastguard Worker    def test_string_with_zero(self) -> None:
1454*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%0s').format(encode.encode_args('hello'))
1455*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1456*61c4878aSAndroid Build Coastguard Worker
1457*61c4878aSAndroid Build Coastguard Worker    def test_string_with_length(self) -> None:
1458*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect string values (s)."""
1459*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhs').format(encode.encode_args('hello'))
1460*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1461*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1462*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1463*61c4878aSAndroid Build Coastguard Worker
1464*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hs').format(encode.encode_args('hello'))
1465*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1466*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1467*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1468*61c4878aSAndroid Build Coastguard Worker
1469*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ls').format(encode.encode_args('hello'))
1470*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1471*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1472*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1473*61c4878aSAndroid Build Coastguard Worker
1474*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lls').format(encode.encode_args('hello'))
1475*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1476*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1477*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1478*61c4878aSAndroid Build Coastguard Worker
1479*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%js').format(encode.encode_args('hello'))
1480*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1481*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1482*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1483*61c4878aSAndroid Build Coastguard Worker
1484*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zs').format(encode.encode_args('hello'))
1485*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1486*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1487*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1488*61c4878aSAndroid Build Coastguard Worker
1489*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ts').format(encode.encode_args('hello'))
1490*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1491*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1492*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1493*61c4878aSAndroid Build Coastguard Worker
1494*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Ls').format(encode.encode_args('hello'))
1495*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1496*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1497*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1498*61c4878aSAndroid Build Coastguard Worker
1499*61c4878aSAndroid Build Coastguard Worker    def test_string_with_width(self) -> None:
1500*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%6s').format(encode.encode_args('hello'))
1501*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1502*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' hello')
1503*61c4878aSAndroid Build Coastguard Worker
1504*61c4878aSAndroid Build Coastguard Worker    def test_string_with_width_does_not_pad_a_string_with_same_length(
1505*61c4878aSAndroid Build Coastguard Worker        self,
1506*61c4878aSAndroid Build Coastguard Worker    ) -> None:
1507*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%5s').format(encode.encode_args('hello'))
1508*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1509*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1510*61c4878aSAndroid Build Coastguard Worker
1511*61c4878aSAndroid Build Coastguard Worker    def test_string_with_multidigit_width(self) -> None:
1512*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10s').format(encode.encode_args('hello'))
1513*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1514*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '     hello')
1515*61c4878aSAndroid Build Coastguard Worker
1516*61c4878aSAndroid Build Coastguard Worker    def test_string_with_star_width(self) -> None:
1517*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*s').format(
1518*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, 'hello')
1519*61c4878aSAndroid Build Coastguard Worker        )
1520*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1521*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '     hello')
1522*61c4878aSAndroid Build Coastguard Worker
1523*61c4878aSAndroid Build Coastguard Worker    def test_string_with_precision(self) -> None:
1524*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.3s').format(encode.encode_args('hello'))
1525*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1526*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hel')
1527*61c4878aSAndroid Build Coastguard Worker
1528*61c4878aSAndroid Build Coastguard Worker    def test_string_with_multidigit_precision(self) -> None:
1529*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.10s').format(
1530*61c4878aSAndroid Build Coastguard Worker            encode.encode_args('hello')
1531*61c4878aSAndroid Build Coastguard Worker        )
1532*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1533*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1534*61c4878aSAndroid Build Coastguard Worker
1535*61c4878aSAndroid Build Coastguard Worker    def test_string_with_star_precision(self) -> None:
1536*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.*s').format(
1537*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(3, 'hello')
1538*61c4878aSAndroid Build Coastguard Worker        )
1539*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1540*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hel')
1541*61c4878aSAndroid Build Coastguard Worker
1542*61c4878aSAndroid Build Coastguard Worker    def test_string_with_width_and_precision(self) -> None:
1543*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%10.3s').format(
1544*61c4878aSAndroid Build Coastguard Worker            encode.encode_args('hello')
1545*61c4878aSAndroid Build Coastguard Worker        )
1546*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1547*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       hel')
1548*61c4878aSAndroid Build Coastguard Worker
1549*61c4878aSAndroid Build Coastguard Worker    def test_string_with_star_with_and_star_precision(self) -> None:
1550*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*.*s').format(
1551*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, 3, 'hello')
1552*61c4878aSAndroid Build Coastguard Worker        )
1553*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1554*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '       hel')
1555*61c4878aSAndroid Build Coastguard Worker
1556*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1557*61c4878aSAndroid Build Coastguard Worker
1558*61c4878aSAndroid Build Coastguard Worker    def test_long_string(self) -> None:
1559*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%ls').format(encode.encode_args('hello'))
1560*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1561*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, 'hello')
1562*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1563*61c4878aSAndroid Build Coastguard Worker
1564*61c4878aSAndroid Build Coastguard Worker    def test_long_string_with_hashtag(self) -> None:
1565*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#ls').format(encode.encode_args('hello'))
1566*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1567*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args('hello'))
1568*61c4878aSAndroid Build Coastguard Worker
1569*61c4878aSAndroid Build Coastguard Worker    def test_long_string_with_zero(self) -> None:
1570*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%0ls').format(encode.encode_args('hello'))
1571*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1572*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args('hello'))
1573*61c4878aSAndroid Build Coastguard Worker
1574*61c4878aSAndroid Build Coastguard Worker
1575*61c4878aSAndroid Build Coastguard Workerclass TestPointerDecoding(unittest.TestCase):
1576*61c4878aSAndroid Build Coastguard Worker    """Tests decoding pointer values."""
1577*61c4878aSAndroid Build Coastguard Worker
1578*61c4878aSAndroid Build Coastguard Worker    def test_pointer(self) -> None:
1579*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%p').format(
1580*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1581*61c4878aSAndroid Build Coastguard Worker        )
1582*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1583*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0xDEADBEEF')
1584*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1585*61c4878aSAndroid Build Coastguard Worker
1586*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_minus(self) -> None:
1587*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%-12p').format(
1588*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1589*61c4878aSAndroid Build Coastguard Worker        )
1590*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1591*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0xDEADBEEF  ')
1592*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1593*61c4878aSAndroid Build Coastguard Worker
1594*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_plus(self) -> None:
1595*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%+p').format(
1596*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1597*61c4878aSAndroid Build Coastguard Worker        )
1598*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1599*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '+0xDEADBEEF')
1600*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1601*61c4878aSAndroid Build Coastguard Worker
1602*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_blank_space(self) -> None:
1603*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('% p').format(
1604*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1605*61c4878aSAndroid Build Coastguard Worker        )
1606*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1607*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 0xDEADBEEF')
1608*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1609*61c4878aSAndroid Build Coastguard Worker
1610*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_hashtag(self) -> None:
1611*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%#p').format(
1612*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1613*61c4878aSAndroid Build Coastguard Worker        )
1614*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1615*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1616*61c4878aSAndroid Build Coastguard Worker
1617*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_zero(self) -> None:
1618*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%0p').format(
1619*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1620*61c4878aSAndroid Build Coastguard Worker        )
1621*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1622*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1623*61c4878aSAndroid Build Coastguard Worker
1624*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_length(self) -> None:
1625*61c4878aSAndroid Build Coastguard Worker        """Tests that length modifiers do not affect decoding pointers (p)."""
1626*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hhp').format(
1627*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1628*61c4878aSAndroid Build Coastguard Worker        )
1629*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1630*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1631*61c4878aSAndroid Build Coastguard Worker
1632*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%hp').format(
1633*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1634*61c4878aSAndroid Build Coastguard Worker        )
1635*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1636*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1637*61c4878aSAndroid Build Coastguard Worker
1638*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%lp').format(
1639*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1640*61c4878aSAndroid Build Coastguard Worker        )
1641*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1642*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1643*61c4878aSAndroid Build Coastguard Worker
1644*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%llp').format(
1645*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1646*61c4878aSAndroid Build Coastguard Worker        )
1647*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1648*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1649*61c4878aSAndroid Build Coastguard Worker
1650*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%jp').format(
1651*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1652*61c4878aSAndroid Build Coastguard Worker        )
1653*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1654*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1655*61c4878aSAndroid Build Coastguard Worker
1656*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%zp').format(
1657*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1658*61c4878aSAndroid Build Coastguard Worker        )
1659*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1660*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1661*61c4878aSAndroid Build Coastguard Worker
1662*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%tp').format(
1663*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1664*61c4878aSAndroid Build Coastguard Worker        )
1665*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1666*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1667*61c4878aSAndroid Build Coastguard Worker
1668*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%Lp').format(
1669*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1670*61c4878aSAndroid Build Coastguard Worker        )
1671*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1672*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1673*61c4878aSAndroid Build Coastguard Worker
1674*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_width(self) -> None:
1675*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%9p').format(
1676*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1677*61c4878aSAndroid Build Coastguard Worker        )
1678*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1679*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0xDEADBEEF')
1680*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1681*61c4878aSAndroid Build Coastguard Worker
1682*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_multidigit_width(self) -> None:
1683*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%11p').format(
1684*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1685*61c4878aSAndroid Build Coastguard Worker        )
1686*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1687*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 0xDEADBEEF')
1688*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1689*61c4878aSAndroid Build Coastguard Worker
1690*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_star_width(self) -> None:
1691*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*p').format(
1692*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, 0xDEADBEEF)
1693*61c4878aSAndroid Build Coastguard Worker        )
1694*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1695*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0xDEADBEEF')
1696*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1697*61c4878aSAndroid Build Coastguard Worker
1698*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*p').format(
1699*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(15, 0xDEADBEEF)
1700*61c4878aSAndroid Build Coastguard Worker        )
1701*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1702*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '     0xDEADBEEF')
1703*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1704*61c4878aSAndroid Build Coastguard Worker
1705*61c4878aSAndroid Build Coastguard Worker    def test_pointer_with_precision(self) -> None:
1706*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%.10p').format(
1707*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0xDEADBEEF)
1708*61c4878aSAndroid Build Coastguard Worker        )
1709*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1710*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, encode.encode_args(0xDEADBEEF))
1711*61c4878aSAndroid Build Coastguard Worker
1712*61c4878aSAndroid Build Coastguard Worker    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
1713*61c4878aSAndroid Build Coastguard Worker
1714*61c4878aSAndroid Build Coastguard Worker    def test_pointer_0_padding(self) -> None:
1715*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%p').format(
1716*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0x00000000)
1717*61c4878aSAndroid Build Coastguard Worker        )
1718*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1719*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0x00000000')
1720*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1721*61c4878aSAndroid Build Coastguard Worker
1722*61c4878aSAndroid Build Coastguard Worker    def test_pointer_0_with_width(self) -> None:
1723*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%9p').format(
1724*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0x00000000)
1725*61c4878aSAndroid Build Coastguard Worker        )
1726*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1727*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0x00000000')
1728*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1729*61c4878aSAndroid Build Coastguard Worker
1730*61c4878aSAndroid Build Coastguard Worker    def test_pointer_0_with_multidigit_width(self) -> None:
1731*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%11p').format(
1732*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0x00000000)
1733*61c4878aSAndroid Build Coastguard Worker        )
1734*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1735*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, ' 0x00000000')
1736*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1737*61c4878aSAndroid Build Coastguard Worker
1738*61c4878aSAndroid Build Coastguard Worker    def test_pointer_0_with_star_width(self) -> None:
1739*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*p').format(
1740*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(10, 0x00000000)
1741*61c4878aSAndroid Build Coastguard Worker        )
1742*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1743*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '0x00000000')
1744*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1745*61c4878aSAndroid Build Coastguard Worker
1746*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%*p').format(
1747*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(15, 0x00000000)
1748*61c4878aSAndroid Build Coastguard Worker        )
1749*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1750*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.value, '     0x00000000')
1751*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.remaining, b'')
1752*61c4878aSAndroid Build Coastguard Worker
1753*61c4878aSAndroid Build Coastguard Worker
1754*61c4878aSAndroid Build Coastguard Workerclass TestFormattedString(unittest.TestCase):
1755*61c4878aSAndroid Build Coastguard Worker    """Tests scoring how successfully a formatted string decoded."""
1756*61c4878aSAndroid Build Coastguard Worker
1757*61c4878aSAndroid Build Coastguard Worker    def test_no_args(self) -> None:
1758*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('string').format(b'')
1759*61c4878aSAndroid Build Coastguard Worker
1760*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1761*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.score(), (True, True, 0, 0, datetime.max))
1762*61c4878aSAndroid Build Coastguard Worker
1763*61c4878aSAndroid Build Coastguard Worker    def test_one_arg(self) -> None:
1764*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%d').format(encode.encode_args(0))
1765*61c4878aSAndroid Build Coastguard Worker
1766*61c4878aSAndroid Build Coastguard Worker        self.assertTrue(result.ok())
1767*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.score(), (True, True, 0, 1, datetime.max))
1768*61c4878aSAndroid Build Coastguard Worker
1769*61c4878aSAndroid Build Coastguard Worker    def test_missing_args(self) -> None:
1770*61c4878aSAndroid Build Coastguard Worker        result = decode.FormatString('%p%d%d').format(b'\x02\x80')
1771*61c4878aSAndroid Build Coastguard Worker
1772*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(result.ok())
1773*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(result.score(), (False, True, -2, 3, datetime.max))
1774*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(result.score(), result.score(datetime.now()))
1775*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(
1776*61c4878aSAndroid Build Coastguard Worker            result.score(datetime.now()), result.score(datetime.min)
1777*61c4878aSAndroid Build Coastguard Worker        )
1778*61c4878aSAndroid Build Coastguard Worker
1779*61c4878aSAndroid Build Coastguard Worker    def test_compare_score(self) -> None:
1780*61c4878aSAndroid Build Coastguard Worker        all_args_ok = decode.FormatString('%d%d%d').format(
1781*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0, 0, 0)
1782*61c4878aSAndroid Build Coastguard Worker        )
1783*61c4878aSAndroid Build Coastguard Worker        missing_one_arg = decode.FormatString('%d%d%d').format(
1784*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0, 0)
1785*61c4878aSAndroid Build Coastguard Worker        )
1786*61c4878aSAndroid Build Coastguard Worker        missing_two_args = decode.FormatString('%d%d%d').format(
1787*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0)
1788*61c4878aSAndroid Build Coastguard Worker        )
1789*61c4878aSAndroid Build Coastguard Worker        all_args_extra_data = decode.FormatString('%d%d%d').format(
1790*61c4878aSAndroid Build Coastguard Worker            encode.encode_args(0, 0, 0, 1)
1791*61c4878aSAndroid Build Coastguard Worker        )
1792*61c4878aSAndroid Build Coastguard Worker        missing_one_arg_extra_data = decode.FormatString('%d%d%d').format(
1793*61c4878aSAndroid Build Coastguard Worker            b'\0' + b'\x80' * 100
1794*61c4878aSAndroid Build Coastguard Worker        )
1795*61c4878aSAndroid Build Coastguard Worker
1796*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(all_args_ok.score(), missing_one_arg.score())
1797*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(missing_one_arg.score(), missing_two_args.score())
1798*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(
1799*61c4878aSAndroid Build Coastguard Worker            missing_two_args.score(), all_args_extra_data.score()
1800*61c4878aSAndroid Build Coastguard Worker        )
1801*61c4878aSAndroid Build Coastguard Worker        self.assertGreater(
1802*61c4878aSAndroid Build Coastguard Worker            all_args_extra_data.score(), missing_one_arg_extra_data.score()
1803*61c4878aSAndroid Build Coastguard Worker        )
1804*61c4878aSAndroid Build Coastguard Worker
1805*61c4878aSAndroid Build Coastguard Worker
1806*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__':
1807*61c4878aSAndroid Build Coastguard Worker    unittest.main()
1808