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