def test_parse_dates_and_times(self): assert fred.loads('2000-10-30') == date(2000, 10, 30) assert fred.loads('12:52:21.123') == time(12, 52, 21, 123000) assert fred.loads('12:32:21.123456') == time(12, 32, 21, 123456) assert fred.loads('2001-12-21_12:32:21.123456') == datetime( 2001, 12, 21, 12, 32, 21, 123456) assert fred.loads('2001-12-21T12:32:21.123456') == datetime( 2001, 12, 21, 12, 32, 21, 123456) assert fred.loads('12:32:21.123456Z') == time(12, 32, 21, 123456, timezone.utc) assert fred.loads('12:32:21.123+03:00') == time( 12, 32, 21, 123000, timezone(timedelta(hours=3)))
def test_enclosed_tag_parsing(self): src = '(tag)' assert list(lex(src)) == ['(', 'tag', ')'] assert fred.loads(src) == Tag('tag') src = '(tag attr="value")' assert list(lex(src)) == ['(', 'tag', 'attr', '=', '"value"', ')'] assert fred.loads(src) == Tag('tag', attr='value') src = '(tag $value)' assert list(lex(src)) == ['(', 'tag', '$value', ')'] assert fred.loads(src) == Tag('tag', Symbol('value')) assert fred.loads('(tag "string")') == Tag('tag', 'string') src = '(tag attr="attr" $value)' assert list( lex(src)) == ['(', 'tag', 'attr', '=', '"attr"', '$value', ')'] assert fred.loads(src) == Tag('tag', Symbol('value'), attr='attr') src = '(tag attr="attr" "value")' assert list( lex(src)) == ['(', 'tag', 'attr', '=', '"attr"', '"value"', ')'] assert fred.loads(src) == Tag('tag', 'value', attr='attr')
def test_can_load_from_bytes(self): assert loads(b'42') == 42 assert load(io.BytesIO(b'42')) == 42
def test_detect_invalid_encoding_in_documents(self): with pytest.raises(ValueError): loads('\ufeff[1 2 3]') with pytest.raises(TypeError): loads(Symbol('42'))
def test_round_trips_random_fred(self, data): src = dumps(data) assert loads(src) == data
def test_encoder_produces_valid_fred_syntax(self, src): assert isinstance(loads(src), fred.decoder.FREDTypes)
def test_round_trip_strings(self, data): src = dumps(data) print(repr(src)) assert loads(src) == data, src
def test_string_lexing(self): assert fred.loads('""') == '' assert fred.loads('"abc"') == 'abc' assert fred.loads('"abc def"') == 'abc def' assert fred.loads(r'"abc\bdef"') == 'abc\bdef' assert fred.loads(r'"abc\fdef"') == 'abc\fdef' assert fred.loads(r'"abc\ndef"') == 'abc\ndef' assert fred.loads(r'"abc\rdef"') == 'abc\rdef' assert fred.loads(r'"abc\tdef"') == 'abc\tdef' assert fred.loads(r'"abc\"def"') == 'abc"def' assert fred.loads(r'"abc\\def"') == 'abc\\def' assert fred.loads(r'"abc\/def"') == 'abc/def' assert fred.loads(r'"\u00E1"') == 'á' assert fred.loads(r'"\u{E1}"') == 'á' assert fred.loads(r'"\uD801\uDC37"') == '\U00010437' assert fred.loads(r'"\uD834\uDD1E"') == '\U0001D11E' assert fred.loads(r'"\u{000000E1}"') == 'á'
def test_byte_string_lexing(self): assert fred.loads('``') == b'' assert fred.loads('`abc`') == b'abc' assert fred.loads('`abc def`') == b'abc def' assert fred.loads(r'`abc\bdef`') == b'abc\bdef' assert fred.loads(r'`abc\fdef`') == b'abc\fdef' assert fred.loads(r'`abc\ndef`') == b'abc\ndef' assert fred.loads(r'`abc\rdef`') == b'abc\rdef' assert fred.loads(r'`abc\tdef`') == b'abc\tdef' assert fred.loads(r'`abc\`def`') == b'abc`def' assert fred.loads(r'`abc\\def`') == b'abc\\def' assert fred.loads(r'`abc\/def`') == b'abc/def' assert fred.loads(r'`\x61`') == b'a'
def test_atomic(self): # Constants assert fred.loads('true') is True assert fred.loads('false') is False assert fred.loads('null') is None # Integers assert fred.loads('10') == 10 assert fred.loads('-11') == -11 assert fred.loads('0b10') == 2 assert fred.loads('-0b11') == -3 assert fred.loads('0o10') == 8 assert fred.loads('-0o11') == -9 assert fred.loads('0x10') == 16 assert fred.loads('-0x11') == -17 # Floats nan = fred.loads('nan') assert isinstance(nan, float) and nan != nan assert fred.loads('inf') == float('inf') assert fred.loads('-inf') == float('-inf') assert fred.loads('10.0') == 10.0 assert fred.loads('-11.0') == -11.0 assert fred.loads('1e1') == 10.0 assert fred.loads('-1e1') == -10.0 assert fred.loads('1.25e2') == 125.0 assert fred.loads('1.25e-2') == 0.0125 # Strings assert fred.loads('"abc"') == 'abc' assert fred.loads('"abc def"') == 'abc def'
def test_invalid_syntax(self, invalid): with pytest.raises(FREDDecodeError): fred.loads(invalid)
def test_invalid_dates_and_times(self, invalid): with pytest.raises(FREDDecodeError): fred.loads(invalid)
def test_invalid_byte_strings(self, invalid): with pytest.raises(FREDDecodeError): fred.loads(invalid)
def test_can_load_schema_example(self, schema_src, person_decl): fred: Tag = loads(schema_src) parsed = parse_schema(fred) assert parsed.id == 'tests' assert parsed.exported == ['Person'] assert parsed.declarations == {'Person': person_decl}