@@ -166,7 +166,10 @@ def test_addition_of_enclosing_on_entry(
166166 used_enclosing = _figure_out_added_enclosing (changed_value , value )
167167
168168 # Assert correct enclosing was added
169- if reuse_previous_enclosing and metadata_enclosing is not None :
169+ can_safely_reuse_metadata = metadata_enclosing != "no-enclosing" or (
170+ isinstance (value , int ) or value .isdigit ()
171+ )
172+ if reuse_previous_enclosing and metadata_enclosing is not None and can_safely_reuse_metadata :
170173 expected_enclosing = metadata_enclosing
171174 elif (isinstance (value , int ) or value .isdigit ()) and not enclose_ints :
172175 expected_enclosing = "no-enclosing"
@@ -417,8 +420,53 @@ def test_string_reference_roundtrip():
417420
418421 assert "month = jan" in written
419422 assert 'pages = intro # "--" # outro' in written
420- # Ints are still enclosed by the default unparse stack
421- assert "year = {2019}" in written
423+ # The default unparse stack also retains the integer's bare source style.
424+ assert "year = 2019" in written
425+
426+
427+ def test_default_roundtrip_reuses_parsed_value_enclosures ():
428+ """Ordinary writing retains quote, brace, and safe bare source choices."""
429+ library = bibtexparser .parse_string (
430+ '@article{key, quoted="Quoted", braced={Braced}, year=2019}'
431+ )
432+
433+ written = bibtexparser .write_string (library )
434+
435+ assert 'quoted = "Quoted"' in written
436+ assert "braced = {Braced}" in written
437+ assert "year = 2019" in written
438+
439+
440+ def test_edit_reuses_quoted_and_braced_enclosures ():
441+ """Changing a value must not also replace its established safe enclosure style."""
442+ library = bibtexparser .parse_string ('@article{key, quoted="Before", braced={Before}}' )
443+ library .entries [0 ]["quoted" ] = "After"
444+ library .entries [0 ]["braced" ] = "After"
445+
446+ written = bibtexparser .write_string (library )
447+
448+ assert 'quoted = "After"' in written
449+ assert "braced = {After}" in written
450+
451+
452+ def test_editing_bare_integer_to_text_falls_back_to_braces ():
453+ """Stale bare metadata cannot make an edited ordinary string invalid BibTeX."""
454+ library = bibtexparser .parse_string ("@article{key, year=2019}" )
455+ library .entries [0 ]["year" ] = "forthcoming soon"
456+
457+ written = bibtexparser .write_string (library )
458+
459+ assert "year = {forthcoming soon}" in written
460+
461+
462+ def test_new_field_without_enclosure_metadata_uses_braces ():
463+ """Source-style reuse does not change the safe default for programmatic values."""
464+ library = bibtexparser .parse_string ('@article{key, title="Existing"}' )
465+ library .entries [0 ]["note" ] = "New value"
466+
467+ written = bibtexparser .write_string (library )
468+
469+ assert "note = {New value}" in written
422470
423471
424472# TODO round-trip tests (removal -> addition -> removal)
0 commit comments