using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTests{
    public static class TestUtils{
        private static readonly HashSet<string> CreatedFiles = new HashSet<string>();

        public static void WriteText(string file, string text){
            DeleteFileOnExit(file);
            File.WriteAllText(file, text, Encoding.UTF8);
        }

        public static void WriteLines(string file, IEnumerable<string> lines){
            DeleteFileOnExit(file);
            File.WriteAllLines(file, lines, Encoding.UTF8);
        }

        public static FileStream WriteFile(string file){
            DeleteFileOnExit(file);
            return new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None);
        }

        public static string ReadText(string file){
            try{
                return File.ReadAllText(file, Encoding.UTF8);
            }catch(Exception){
                return string.Empty;
            }
        }

        public static IEnumerable<string> ReadLines(string file){
            try{
                return File.ReadLines(file, Encoding.UTF8);
            }catch(Exception){
                return Enumerable.Empty<string>();
            }
        }

        public static FileStream ReadFile(string file){
            return new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None);
        }

        public static void DeleteFileOnExit(string file){
            CreatedFiles.Add(file);
        }
        
        [TestClass]
        public static class Cleanup{
            [AssemblyCleanup]
            public static void DeleteFilesOnExit(){
                foreach(string file in CreatedFiles){
                    try{
                        File.Delete(file);
                    }catch(Exception){
                        // ignore
                    }
                }
            }
        }
    }
}