using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Renci.SshNet.Tests.Classes
{
    [TestClass]
    public class RemotePathShellQuoteTransformationTest
    {
        private IRemotePathTransformation _transformation;
        [TestInitialize]
        public void SetUp()
        {
            _transformation = new RemotePathShellQuoteTransformation();
        }
        /// 
        /// Test cases from triple-slash comments
        /// 
        [TestMethod]
        public void Mixed()
        {
            Assert.AreEqual("'/var/log/auth.log'", _transformation.Transform("/var/log/auth.log"));
            Assert.AreEqual("'/var/mp3/Guns N'\"'\"' Roses'", _transformation.Transform("/var/mp3/Guns N' Roses"));
            Assert.AreEqual("'/var/garbage'\\!'/temp'", _transformation.Transform("/var/garbage!/temp"));
            Assert.AreEqual("'/var/would be '\"'\"'kewl'\"'\"\\!', not?'", _transformation.Transform("/var/would be 'kewl'!, not?"));
            Assert.AreEqual("''", _transformation.Transform(string.Empty));
            Assert.AreEqual("'Hello \"World\"'", _transformation.Transform("Hello \"World\""));
        }
        [TestMethod]
        public void Null()
        {
            const string path = null;
            try
            {
                _transformation.Transform(path);
                Assert.Fail();
            }
            catch (ArgumentNullException ex)
            {
                Assert.IsNull(ex.InnerException);
                Assert.AreEqual("path", ex.ParamName);
            }
        }
        [TestMethod]
        public void Ampersand_Embedded()
        {
            const string path = "You&Me";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'You&Me'", actual);
        }
        [TestMethod]
        public void Ampersand_Leading()
        {
            const string path = "&Or";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'&Or'", actual);
        }
        [TestMethod]
        public void Ampersand_LeadingAndTrailing()
        {
            const string path = "&Or&";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'&Or&'", actual);
        }
        [TestMethod]
        public void Ampersand_Trailing()
        {
            const string path = "And&";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'And&'", actual);
        }
        [TestMethod]
        public void Asterisk_Embedded()
        {
            const string path = "Love*Hate";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Love*Hate'", actual);
        }
        [TestMethod]
        public void Asterisk_Leading()
        {
            const string path = "*Times";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'*Times'", actual);
        }
        [TestMethod]
        public void Asterisk_LeadingAndTrailing()
        {
            const string path = "*WAR*";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'*WAR*'", actual);
        }
        [TestMethod]
        public void Asterisk_Trailing()
        {
            const string path = "Censor*";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Censor*'", actual);
        }
        [TestMethod]
        public void Backslash_Embedded()
        {
            const string path = "Hello\\World";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Hello\\World'", actual);
        }
        [TestMethod]
        public void Backslash_Leading()
        {
            const string path = "\\Hello";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'\\Hello'", actual);
        }
        [TestMethod]
        public void Backslash_LeadingAndTrailing()
        {
            const string path = "\\Hello\\";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'\\Hello\\'", actual);
        }
        [TestMethod]
        public void Backslash_Trailing()
        {
            const string path = "HelloWorld\\";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'HelloWorld\\'", actual);
        }
        [TestMethod]
        public void Backtick_Embedded()
        {
            const string path = "back`tick";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'back`tick'", actual);
        }
        [TestMethod]
        public void Backtick_Leading()
        {
            const string path = "`front";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'`front'", actual);
        }
        [TestMethod]
        public void Backtick_LeadingAndTrailing()
        {
            const string path = "`FrontAndBack`";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'`FrontAndBack`'", actual);
        }
        [TestMethod]
        public void Backtick_Trailing()
        {
            const string path = "back`";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'back`'", actual);
        }
        [TestMethod]
        public void Circumflex_Embedded()
        {
            const string path = "You^Me";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'You^Me'", actual);
        }
        [TestMethod]
        public void Circumflex_Leading()
        {
            const string path = "^Or";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'^Or'", actual);
        }
        [TestMethod]
        public void Circumflex_LeadingAndTrailing()
        {
            const string path = "^Or^";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'^Or^'", actual);
        }
        [TestMethod]
        public void Circumflex_Trailing()
        {
            const string path = "And^";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'And^'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Close_Embedded()
        {
            const string path = "Halo}Devine";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Halo}Devine'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Close_Leading()
        {
            const string path = "}Open";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'}Open'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Close_LeadingAndTrailing()
        {
            const string path = "}Closed}";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'}Closed}'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Close_Trailing()
        {
            const string path = "Finish}";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Finish}'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Open_Embedded()
        {
            const string path = "Halo{Devine";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Halo{Devine'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Open_Leading()
        {
            const string path = "{Open";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'{Open'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Open_LeadingAndTrailing()
        {
            const string path = "{Closed{";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'{Closed{'", actual);
        }
        [TestMethod]
        public void CurlyBrackets_Open_Trailing()
        {
            const string path = "Finish{";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Finish{'", actual);
        }
        [TestMethod]
        public void Dollar_Embedded()
        {
            const string path = "IGiveYouOne$ForYourThoughts";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'IGiveYouOne$ForYourThoughts'", actual);
        }
        [TestMethod]
        public void Dollar_Leading()
        {
            const string path = "$Blues";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'$Blues'", actual);
        }
        [TestMethod]
        public void Dollar_LeadingAndTrailing()
        {
            const string path = "$SUM$";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'$SUM$'", actual);
        }
        [TestMethod]
        public void Dollar_Trailing()
        {
            const string path = "NotCravingForMore$";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'NotCravingForMore$'", actual);
        }
        [TestMethod]
        public void DoubleQuote_Embedded()
        {
            const string path = "DoNot\"MeOnThis";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'DoNot\"MeOnThis'", actual);
        }
        [TestMethod]
        public void DoubleQuote_Leading()
        {
            const string path = "\"OrNotToQuote";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'\"OrNotToQuote'", actual);
        }
        [TestMethod]
        public void DoubleQuote_LeadingAndTrailing()
        {
            const string path = "\"OrNotTo\"";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'\"OrNotTo\"'", actual);
        }
        [TestMethod]
        public void DoubleQuote_Trailing()
        {
            const string path = "Famous\"";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Famous\"'", actual);
        }
        [TestMethod]
        public void Equals_Embedded()
        {
            const string path = "You=Me";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'You=Me'", actual);
        }
        [TestMethod]
        public void Equals_Leading()
        {
            const string path = "=Or";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'=Or'", actual);
        }
        [TestMethod]
        public void Equals_LeadingAndTrailing()
        {
            const string path = "=Or=";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'=Or='", actual);
        }
        [TestMethod]
        public void Equals_Trailing()
        {
            const string path = "And=";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'And='", actual);
        }
        [TestMethod]
        public void ExclamationMark_Embedded_Single()
        {
            const string path = "/var/garbage!/temp";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'/var/garbage'\\!'/temp'", actual);
        }
        [TestMethod]
        public void ExclamationMark_Embedded_Sequence()
        {
            const string path = "/var/garbage!!/temp";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'/var/garbage'\\!\\!'/temp'", actual);
        }
        [TestMethod]
        public void ExclamationMark_Leading()
        {
            const string path = "!Error";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("\\!'Error'", actual);
        }
        [TestMethod]
        public void ExclamationMark_LeadingAndTrailing()
        {
            const string path = "!ignore!";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("\\!'ignore'\\!", actual);
        }
        [TestMethod]
        public void ExclamationMark_Trailing()
        {
            const string path = "Done!";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Done'\\!", actual);
        }
        [TestMethod]
        public void GreaterThan_Embedded()
        {
            const string path = "You>Me";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'You>Me'", actual);
        }
        [TestMethod]
        public void GreaterThan_Leading()
        {
            const string path = ">Or";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'>Or'", actual);
        }
        [TestMethod]
        public void GreaterThan_LeadingAndTrailing()
        {
            const string path = ">Or>";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'>Or>'", actual);
        }
        [TestMethod]
        public void GreaterThan_Trailing()
        {
            const string path = "And>";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'And>'", actual);
        }
        [TestMethod]
        public void Hash_Embedded()
        {
            const string path = "Smoke#EveryDay";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Smoke#EveryDay'", actual);
        }
        [TestMethod]
        public void Hash_Leading()
        {
            const string path = "#4Ever";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'#4Ever'", actual);
        }
        [TestMethod]
        public void Hash_LeadingAndTrailing()
        {
            const string path = "#4Ever#";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'#4Ever#'", actual);
        }
        [TestMethod]
        public void Hash_Trailing()
        {
            const string path = "Legalize#";
            var actual = _transformation.Transform(path);
            Assert.AreEqual("'Legalize#'", actual);
        }
        [TestMethod]
        public void LessThan_Embedded()
        {
            const string path = "You