public void TestCdInvalidDirecory()
        {
            var fs = FileSystemMock();
            fs.IsCurrentDirectory = false;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("cd /a/b");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual("/> Directory /a/b does not exist", mocks.FakeOutLine(true));
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestCdRemoveSlashAtEnd()
        {
            var fs = FileSystemMock();
            fs.IsCurrentDirectory = true;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("cd /a/b/");
                mocks.FakeInLine("cd /");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual("/> Directory changed", mocks.FakeOutLine(true));
                Assert.AreEqual("/a/b> Directory changed", mocks.FakeOutLine());
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestMkdir()
        {
            var fs = FileSystemMock();
            fs.FolderExists = true;
            fs.IsCurrentDirectory = true;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("mkdir test/blub/bla");
                mocks.FakeInLine("mkdir /test/blub/xxx");
                mocks.FakeInLine("cd /test");
                mocks.FakeInLine("mkdir aaa/bbb");

                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual("/> Directory /test/blub/bla created", mocks.FakeOutLine(true));
                Assert.AreEqual("/> Directory /test/blub/xxx created", mocks.FakeOutLine());
                mocks.FakeOutLine(); // skip cd output
                Assert.AreEqual(string.Format("{0}Directory /test/aaa/bbb created", c.Prompt), mocks.FakeOutLine());
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestPrintVFSException()
        {
            var fs = FileSystemMock();
            fs.ThrowException = new VFSException("OMG! It's not a bug, it's a feature!");

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("ls");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual("/> An error occurred: OMG! It's not a bug, it's a feature!", mocks.FakeOutLine(true));
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestLs()
        {
            var fs = FileSystemMock();
            fs.FolderExists = true;

            fs.CurrentFolders = new List<string> { "Bla", "blurb", "xxx" };
            fs.CurrentFiles = new List<string> { "Aaa", "Nanananana" };

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("ls /");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(string.Format("{0}Found 3 directories:", c.Prompt), mocks.FakeOutLine(true));
                Assert.AreEqual("Bla", mocks.FakeOutLine());
                Assert.AreEqual("blurb", mocks.FakeOutLine());
                Assert.AreEqual("xxx", mocks.FakeOutLine());
                Assert.AreEqual("Found 2 files:", mocks.FakeOutLine());
                Assert.AreEqual("Aaa", mocks.FakeOutLine());
                Assert.AreEqual("Nanananana", mocks.FakeOutLine());
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestLsNotExisting()
        {
            var fs = FileSystemMock();
            fs.FolderExists = false;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("ls test");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(string.Format("{0}File or directory does not exist", c.Prompt), mocks.FakeOutLine(true));
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestImportWrongParameters()
        {
            var fs = FileSystemMock();
            fs.FolderExists = false;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("import blub");
                mocks.FakeInLine(@"import bl""ub");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(string.Format("{0}Please provide two parameters. E.g. import \"C:\\host system\\path\" /to/dest", c.Prompt), mocks.FakeOutLine(true));
                Assert.AreEqual(string.Format("{0}Please provide two parameters. E.g. import \"C:\\host system\\path\" /to/dest", c.Prompt), mocks.FakeOutLine());
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestImport()
        {
            var fs = FileSystemMock();
            fs.FolderExists = false;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine(@"import C:\a /bla/a");
                mocks.FakeInLine(@"import ""C:\test folder\xxx"" /bla/xxx");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(string.Format("{0}Imported \"C:\\a\" to \"/bla/a\"", c.Prompt), mocks.FakeOutLine(true));
                Assert.AreEqual(string.Format("{0}Imported \"C:\\test folder\\xxx\" to \"/bla/xxx\"", c.Prompt), mocks.FakeOutLine());
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }
        public void TestHelp()
        {
            var fs = FileSystemMock();
            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("help");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(string.Format("{0}Available commands:", c.Prompt), mocks.FakeOutLine(true));
                Assert.AreEqual("cd", mocks.FakeOutLine());
                Assert.AreEqual("delete", mocks.FakeOutLine());
                Assert.AreEqual("exists", mocks.FakeOutLine());
                Assert.AreEqual("exit", mocks.FakeOutLine());
                Assert.AreEqual("export", mocks.FakeOutLine());
                Assert.AreEqual("help", mocks.FakeOutLine());
                Assert.AreEqual("import", mocks.FakeOutLine());
                Assert.AreEqual("ls", mocks.FakeOutLine());
                Assert.AreEqual("mkdir", mocks.FakeOutLine());
                Assert.AreEqual(c.Prompt + "kthxbye", mocks.FakeOutLine());
            }
        }
        public void TestExit()
        {
            var fs = FileSystemMock();
            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(c.Prompt + "kthxbye", mocks.FakeOutLine(true));
            }
        }
        public void TestExistsYes()
        {
            var fs = FileSystemMock();
            fs.FolderExists = true;

            using (var mocks = new InOutMocks())
            {
                mocks.FakeInLine("exists test/blub/bla");
                mocks.FakeInLine("exit", true);

                var c = new ConsoleApplication(new ConsoleApplicationSettings(mocks.In, mocks.Out), fs);
                c.Run();
                Assert.AreEqual(string.Format("{0}Yes", c.Prompt), mocks.FakeOutLine(true));
                Assert.AreEqual(string.Format("{0}kthxbye", c.Prompt), mocks.FakeOutLine());
            }
        }