示例#1
0
        public ResultCodes Execute(
            TextWriter outputWriter,
            TextWriter errorWriter,
            TextWriter warningWriter,
            TextWriter logWriter,
            CommandContext context)
        {
            var inputFile  = context.GetToken(0);
            var outputFile = context.GetToken(1);
            var platform   = context.GetToken(2);

            if (inputFile == null)
            {
                errorWriter.WriteLine("Source file is not specified.");
                return(ResultCodes.Failure);
            }

            if (outputFile == null)
            {
                errorWriter.WriteLine("Output file is not specified.");
                return(ResultCodes.Failure);
            }

            if (platform == null)
            {
                errorWriter.WriteLine("Platform is not specified.");
                return(ResultCodes.Failure);
            }

            var compiler = new Compiler();

            var flags = CompilerFlags.CreateDefault();

            foreach (var sw in _switches)
            {
                _setFlag(context, flags, sw.Value.Item1, sw.Key);
            }

            var result = compiler.CompileFromSource(
                errorWriter,
                warningWriter,
                logWriter,
                inputFile,
                outputFile,
                platform,
                flags
                );

            if (result.Successful)
            {
                outputWriter.WriteLine("Compilation finished successfully.");
                return(ResultCodes.Successful);
            }

            //preserving the stack-trace.
            var info = ExceptionDispatchInfo.Capture(result.Exception);

            info.Throw();
            return(ResultCodes.Failure);
        }
示例#2
0
        public ResultCodes Execute(
            TextWriter outputWriter,
            TextWriter errorWriter,
            TextWriter warningWriter,
            TextWriter logWriter,
            CommandContext context,
            string sourceCode)
        {
            IPlatform platform;

            var osKind = Environment.OSVersion.Platform;

            if (osKind == PlatformID.Win32NT || osKind == PlatformID.Win32S || osKind == PlatformID.Win32Windows ||
                osKind == PlatformID.WinCE)
            {
                platform = null;
            }
            else
            {
                platform = new UnixBashPlatform();
            }

            var compiler = new Compiler();

            var ctx = compiler.CompileFromSource(
                platform,
                CompilerFlags.CreateDefault(),
                errorWriter,
                warningWriter,
                logWriter,
                TextWriter.Null,
                TextWriter.Null,
                sourceCode
                );

            return(ResultCodes.Successful);
        }
示例#3
0
        public void TestCompiler()
        {
            //try
            {
                Platforms.AddPlatform(new UnixBashPlatform());

                var compiler = new Compiler();
                var result   = compiler.CompileFromSource(
                    Console.Out,
                    Console.Out,
                    Console.Out,
                    "/home/amk/Temp/ShellScript/variables.shellscript",
                    "/home/amk/Temp/ShellScript/variables.sh",
                    "unix-bash",
                    CompilerFlags.CreateDefault()
                    );

                GC.KeepAlive(result);
            }
            //catch (Exception ex)
            {
                Debugger.Break();
            }
        }
        public void TestScripts()
        {
            const string TestScriptsRootDirectoryName = "ShellScript.MSTest";
            const string TestScriptsDirectoryName     = "TestScripts";
            const string TempOutputDirectoryName      = "TestScripts.temp";

            var platforms = new[]
            {
                new UnixBashPlatform()
            };
            var compilerFlags = CompilerFlags.CreateDefault();
            //compilerFlags.WriteShellScriptVersion = false;

            string testScriptsRoot = null;
            string tempOutputRoot  = null;

            var cDir = Environment.CurrentDirectory;

            while (!string.IsNullOrWhiteSpace(cDir))
            {
                if (StringComparer.InvariantCultureIgnoreCase.Equals(Path.GetFileName(cDir),
                                                                     TestScriptsRootDirectoryName))
                {
                    testScriptsRoot = Path.Combine(cDir, TestScriptsDirectoryName);
                    tempOutputRoot  = Path.Combine(cDir, TempOutputDirectoryName);
                    break;
                }

                cDir = Path.GetDirectoryName(cDir);
            }

            if (testScriptsRoot == null)
            {
                Assert.Fail("Test scripts directory not found.");
            }

            foreach (var file in Directory.GetFiles(testScriptsRoot, "*.shellscript", SearchOption.AllDirectories))
            {
                foreach (var platform in platforms)
                {
                    var ext           = platform.Name.ToLower();
                    var assertionFile = $"{Path.GetFileNameWithoutExtension(file)}.{ext}";
                    var outputFile    = $"{Path.GetFileNameWithoutExtension(file)}.{ext}";

                    assertionFile = Path.Combine(testScriptsRoot, assertionFile);
                    outputFile    = Path.Combine(tempOutputRoot, outputFile);

                    if (File.Exists(assertionFile))
                    {
                        using (var logWriter = new StringWriter())
                        {
                            Directory.CreateDirectory(tempOutputRoot);

                            var compiler = new Compiler();
                            compiler.CompileFromSource(file, tempOutputRoot, outputFile,
                                                       platform, compilerFlags, logWriter, logWriter, logWriter);

                            using (var assertionFileStream =
                                       new FileStream(assertionFile, FileMode.Open, FileAccess.Read))
                                using (var outputFileStream = new FileStream(outputFile, FileMode.Open, FileAccess.Read))
                                    using (var assertionReader = new StreamReader(assertionFileStream))
                                        using (var outputReader = new StreamReader(outputFileStream))
                                        {
                                            string assertLine;
                                            string outputLine;

                                            int line = 0;

                                            while ((assertLine = assertionReader.ReadLine()) != null &&
                                                   (outputLine = outputReader.ReadLine()) != null)
                                            {
                                                if (line++ >= 2)
                                                {
                                                    if (assertLine != outputLine)
                                                    {
                                                        Assert.Fail($"Assert failed on {file}");
                                                    }
                                                }
                                            }
                                        }
                        }
                    }
                }
            }
        }