@@ -2510,6 +2510,181 @@ flakySuite('Disk File Service', function () {
25102510 assert . ok ( error ) ;
25112511 } ) ;
25122512
2513+ test ( 'appendFile' , async ( ) => {
2514+ return testAppendFile ( ) ;
2515+ } ) ;
2516+
2517+ test ( 'appendFile - unbuffered' , async ( ) => {
2518+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite | FileSystemProviderCapabilities . FileAppend ) ;
2519+
2520+ return testAppendFile ( ) ;
2521+ } ) ;
2522+
2523+ test ( 'appendFile - buffered' , async ( ) => {
2524+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileOpenReadWriteClose | FileSystemProviderCapabilities . FileAppend ) ;
2525+
2526+ return testAppendFile ( ) ;
2527+ } ) ;
2528+
2529+ async function testAppendFile ( ) {
2530+ let event : FileOperationEvent ;
2531+ disposables . add ( service . onDidRunOperation ( e => event = e ) ) ;
2532+
2533+ const resource = URI . file ( join ( testDir , 'small.txt' ) ) ;
2534+
2535+ const content = readFileSync ( resource . fsPath ) . toString ( ) ;
2536+ assert . strictEqual ( content , 'Small File' ) ;
2537+
2538+ const appendContent = ' - Appended!' ;
2539+ await service . appendFile ( resource , VSBuffer . fromString ( appendContent ) ) ;
2540+
2541+ assert . ok ( event ! ) ;
2542+ assert . strictEqual ( event ! . resource . fsPath , resource . fsPath ) ;
2543+ assert . strictEqual ( event ! . operation , FileOperation . WRITE ) ;
2544+
2545+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , 'Small File - Appended!' ) ;
2546+ }
2547+
2548+ test ( 'appendFile (readable)' , async ( ) => {
2549+ return testAppendFileReadable ( ) ;
2550+ } ) ;
2551+
2552+ test ( 'appendFile (readable) - unbuffered' , async ( ) => {
2553+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite | FileSystemProviderCapabilities . FileAppend ) ;
2554+
2555+ return testAppendFileReadable ( ) ;
2556+ } ) ;
2557+
2558+ test ( 'appendFile (readable) - buffered' , async ( ) => {
2559+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileOpenReadWriteClose | FileSystemProviderCapabilities . FileAppend ) ;
2560+
2561+ return testAppendFileReadable ( ) ;
2562+ } ) ;
2563+
2564+ async function testAppendFileReadable ( ) {
2565+ const resource = URI . file ( join ( testDir , 'small.txt' ) ) ;
2566+
2567+ const content = readFileSync ( resource . fsPath ) . toString ( ) ;
2568+ assert . strictEqual ( content , 'Small File' ) ;
2569+
2570+ const appendContent = ' - Appended via readable!' ;
2571+ await service . appendFile ( resource , bufferToReadable ( VSBuffer . fromString ( appendContent ) ) ) ;
2572+
2573+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , 'Small File - Appended via readable!' ) ;
2574+ }
2575+
2576+ test ( 'appendFile (stream)' , async ( ) => {
2577+ return testAppendFileStream ( ) ;
2578+ } ) ;
2579+
2580+ test ( 'appendFile (stream) - unbuffered' , async ( ) => {
2581+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite | FileSystemProviderCapabilities . FileAppend ) ;
2582+
2583+ return testAppendFileStream ( ) ;
2584+ } ) ;
2585+
2586+ test ( 'appendFile (stream) - buffered' , async ( ) => {
2587+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileOpenReadWriteClose | FileSystemProviderCapabilities . FileAppend ) ;
2588+
2589+ return testAppendFileStream ( ) ;
2590+ } ) ;
2591+
2592+ async function testAppendFileStream ( ) {
2593+ const resource = URI . file ( join ( testDir , 'small.txt' ) ) ;
2594+
2595+ const content = readFileSync ( resource . fsPath ) . toString ( ) ;
2596+ assert . strictEqual ( content , 'Small File' ) ;
2597+
2598+ const appendContent = ' - Appended via stream!' ;
2599+ await service . appendFile ( resource , bufferToStream ( VSBuffer . fromString ( appendContent ) ) ) ;
2600+
2601+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , 'Small File - Appended via stream!' ) ;
2602+ }
2603+
2604+ test ( 'appendFile - creates file if not exists' , async ( ) => {
2605+ return testAppendFileCreatesFile ( ) ;
2606+ } ) ;
2607+
2608+ test ( 'appendFile - creates file if not exists (unbuffered)' , async ( ) => {
2609+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite | FileSystemProviderCapabilities . FileAppend ) ;
2610+
2611+ return testAppendFileCreatesFile ( ) ;
2612+ } ) ;
2613+
2614+ test ( 'appendFile - creates file if not exists (buffered)' , async ( ) => {
2615+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileOpenReadWriteClose | FileSystemProviderCapabilities . FileAppend ) ;
2616+
2617+ return testAppendFileCreatesFile ( ) ;
2618+ } ) ;
2619+
2620+ async function testAppendFileCreatesFile ( ) {
2621+ const resource = URI . file ( join ( testDir , 'appendfile-new.txt' ) ) ;
2622+
2623+ assert . strictEqual ( existsSync ( resource . fsPath ) , false ) ;
2624+
2625+ const content = 'Initial content via append' ;
2626+ await service . appendFile ( resource , VSBuffer . fromString ( content ) ) ;
2627+
2628+ assert . strictEqual ( existsSync ( resource . fsPath ) , true ) ;
2629+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , content ) ;
2630+ }
2631+
2632+ test ( 'appendFile - multiple appends' , async ( ) => {
2633+ return testAppendFileMultiple ( ) ;
2634+ } ) ;
2635+
2636+ test ( 'appendFile - multiple appends (unbuffered)' , async ( ) => {
2637+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite | FileSystemProviderCapabilities . FileAppend ) ;
2638+
2639+ return testAppendFileMultiple ( ) ;
2640+ } ) ;
2641+
2642+ test ( 'appendFile - multiple appends (buffered)' , async ( ) => {
2643+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileOpenReadWriteClose | FileSystemProviderCapabilities . FileAppend ) ;
2644+
2645+ return testAppendFileMultiple ( ) ;
2646+ } ) ;
2647+
2648+ async function testAppendFileMultiple ( ) {
2649+ const resource = URI . file ( join ( testDir , 'appendfile-multiple.txt' ) ) ;
2650+
2651+ await service . appendFile ( resource , VSBuffer . fromString ( 'Line 1\n' ) ) ;
2652+ await service . appendFile ( resource , VSBuffer . fromString ( 'Line 2\n' ) ) ;
2653+ await service . appendFile ( resource , VSBuffer . fromString ( 'Line 3\n' ) ) ;
2654+
2655+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , 'Line 1\nLine 2\nLine 3\n' ) ;
2656+ }
2657+
2658+ test ( 'appendFile - fallback when provider does not support append' , async ( ) => {
2659+ // Remove FileAppend capability to force fallback path
2660+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite ) ;
2661+
2662+ const resource = URI . file ( join ( testDir , 'small.txt' ) ) ;
2663+
2664+ const content = readFileSync ( resource . fsPath ) . toString ( ) ;
2665+ assert . strictEqual ( content , 'Small File' ) ;
2666+
2667+ const appendContent = ' - Appended via fallback!' ;
2668+ await service . appendFile ( resource , VSBuffer . fromString ( appendContent ) ) ;
2669+
2670+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , 'Small File - Appended via fallback!' ) ;
2671+ } ) ;
2672+
2673+ test ( 'appendFile - fallback creates file if not exists' , async ( ) => {
2674+ // Remove FileAppend capability to force fallback path
2675+ setCapabilities ( fileProvider , FileSystemProviderCapabilities . FileReadWrite ) ;
2676+
2677+ const resource = URI . file ( join ( testDir , 'appendfile-fallback-new.txt' ) ) ;
2678+
2679+ assert . strictEqual ( existsSync ( resource . fsPath ) , false ) ;
2680+
2681+ const content = 'Initial content via fallback append' ;
2682+ await service . appendFile ( resource , VSBuffer . fromString ( content ) ) ;
2683+
2684+ assert . strictEqual ( existsSync ( resource . fsPath ) , true ) ;
2685+ assert . strictEqual ( readFileSync ( resource . fsPath ) . toString ( ) , content ) ;
2686+ } ) ;
2687+
25132688 test ( 'read - mixed positions' , async ( ) => {
25142689 const resource = URI . file ( join ( testDir , 'lorem.txt' ) ) ;
25152690
0 commit comments