using System;
using Xunit;
using System.IO;
using System.Diagnostics;

namespace test
{

    [Trait("regres", "no")]
    public class NodeTests
    {
        [Fact]
        void TestNodeJsForAnsitohtml ()
        {
            var procStart = new ProcessStartInfo("node", "node_modules/ansi-to-html/bin/ansi-to-html");
            procStart.UseShellExecute = false;
            procStart.RedirectStandardInput = true;
            procStart.RedirectStandardOutput = true;
            procStart.RedirectStandardError = true;
           var proc = Process.Start(procStart);
           proc.StandardInput.WriteLine("\x001b[30mblack\x1b[37mwhite");
           proc.StandardInput.Close();
           while (!proc.StandardOutput.EndOfStream)
            {
                Console.Write(proc.StandardOutput.ReadToEnd());
            }
        }
        
        [Fact]
        void AnsiToHtml()
        {
            var procStart = new ProcessStartInfo("ls", "-l --color=always");
            procStart.UseShellExecute = false;
            procStart.RedirectStandardInput = false;
            procStart.RedirectStandardOutput = true;
            var proc = Process.Start(procStart);
            var encoded = GetStream(proc.StandardOutput); 
            var reader = new StreamReader(encoded);
            var txt = reader.ReadToEnd();
            
            Console.WriteLine(txt);
        }

        public static Stream GetStream(StreamReader reader)
        {
            var procStart = new ProcessStartInfo("node", "node_modules/ansi-to-html/bin/ansi-to-html");
            procStart.UseShellExecute = false;
            procStart.RedirectStandardInput = true;
            procStart.RedirectStandardOutput = true;
            procStart.RedirectStandardError = true;
            var mem = new MemoryStream();
            StreamWriter writer = new StreamWriter(mem);
            var proc = Process.Start(procStart);
            var text = reader.ReadToEnd();
            proc.StandardInput.WriteLine(text);
            proc.StandardInput.Close();
            return proc.StandardOutput.BaseStream;
        }
    }
}
