Пример #1
0
        /// <summary>
        /// Common internal implementation for all 4 constructors above
        /// </summary>
        private FileCompiler(string libraryName, string textName, CobolFile loadedCobolFile, SourceFileProvider sourceFileProvider, IProcessedTokensDocumentProvider documentProvider, ColumnsLayout columnsLayout, ITextDocument textDocument, TypeCobolOptions compilerOptions, SymbolTable customSymbols, bool isCopyFile,
            [CanBeNull] MultilineScanState scanState)
        {
            // 1.a Find the Cobol source file
            CobolFile sourceFile = null;
            if (textName != null)
            {
                if (sourceFileProvider.TryGetFile(libraryName, textName, out sourceFile))
                {
                    CobolFile = sourceFile;
                }
                else
                {
                    throw new Exception(String.Format("Could not find a Cobol source file named {0} in {1}", textName, libraryName));
                }
            }
            // 1.b Register a Cobol source file which was already loaded
            else if(loadedCobolFile != null)
            {
                CobolFile = loadedCobolFile;
            }

            // 2.a Load it in a new text document in memory
            if (textDocument == null)
            {
                TextDocument = new ReadOnlyTextDocument(sourceFile.Name, sourceFile.Encoding, columnsLayout, sourceFile.ReadChars());
            }
            // 2.b Load it in an existing text document in memory
            else if (sourceFile != null)
            {
                TextDocument = textDocument;
                textDocument.LoadChars(sourceFile.ReadChars());
            }
            // 2.c Use a pre-existing text document
            //     - not yet associated with a Cobol source file
            //     - with a Cobol source file already loaded
            else if (sourceFile == null || loadedCobolFile != null)
            {
                TextDocument = textDocument;
            }

            // 3. Prepare the data structures used by the different steps of the compiler
            if (isCopyFile) {
                CompilationResultsForCopy = new CompilationDocument(TextDocument.Source, TextDocument.Lines, compilerOptions, documentProvider, scanState);
                CompilationResultsForCopy.CustomSymbols = customSymbols;
            } else {
                CompilationResultsForProgram = new CompilationUnit(TextDocument.Source, TextDocument.Lines, compilerOptions, documentProvider);
                CompilationResultsForProgram.CustomSymbols = customSymbols;
            }
            CompilerOptions = compilerOptions;
        }
        // -- Project creation and persistence --
        /// <summary>
        /// Create a new Cobol compilation project in a local directory
        /// </summary>
        public CompilationProject(string projectName, string rootDirectory, string[] fileExtensions, Encoding encoding, EndOfLineDelimiter endOfLineDelimiter, int fixedLineLength, ColumnsLayout columnsLayout, TypeCobolOptions compilationOptions)
        {
            Name = projectName;
            RootDirectory = rootDirectory;
            SourceFileProvider = new SourceFileProvider();
            rootDirectoryLibrary = SourceFileProvider.AddLocalDirectoryLibrary(rootDirectory, true, fileExtensions, encoding, endOfLineDelimiter, fixedLineLength);

            Encoding = encoding;
            EndOfLineDelimiter = endOfLineDelimiter;
            FixedLineLength = fixedLineLength;
            ColumnsLayout = columnsLayout;
            CompilationOptions = compilationOptions;

            CobolFiles = new Dictionary<string, CobolFile>();
            CobolTextReferences = new Dictionary<string, CobolFile>();
            CobolProgramCalls = new Dictionary<string, CobolFile>();
        }
Пример #3
0
 /// <summary>
 /// Use a pre-existing text document, already initialized from a Cobol file
 /// </summary>
 public FileCompiler(ITextDocument textDocument, CobolFile loadedCobolFile, SourceFileProvider sourceFileProvider, IProcessedTokensDocumentProvider documentProvider, TypeCobolOptions compilerOptions, bool isCopyFile)
     : this(null, null, null, sourceFileProvider, documentProvider, default(ColumnsLayout), textDocument, compilerOptions, null, isCopyFile)
 {
 }
Пример #4
0
 /// <summary>
 /// Load a Cobol source file in an pre-existing text document
 /// </summary>
 public FileCompiler(string libraryName, string textName, SourceFileProvider sourceFileProvider, IProcessedTokensDocumentProvider documentProvider, ITextDocument textDocument, TypeCobolOptions compilerOptions, bool isCopyFile)
     : this(libraryName, textName, null, sourceFileProvider, documentProvider, default(ColumnsLayout), textDocument, compilerOptions, null, isCopyFile)
 {
 }
Пример #5
0
 /// <summary>
 /// Load a Cobol source file in memory
 /// </summary>
 public FileCompiler(string libraryName, string textName, SourceFileProvider sourceFileProvider, IProcessedTokensDocumentProvider documentProvider, ColumnsLayout columnsLayout, TypeCobolOptions compilerOptions, CodeModel.SymbolTable customSymbols, bool isCopyFile)
     : this(libraryName, textName, null, sourceFileProvider, documentProvider, columnsLayout, null, compilerOptions, customSymbols, isCopyFile)
 {
 }
        public static void Check_ReferenceFormatDocument()
        {
            DocumentFormat docFormat = DocumentFormat.RDZReferenceFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\Text\Samples"),
                false, new string[] { ".cpy" },
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            CobolFile cobolFile;
            if (!fileProvider.TryGetFile("MSVCOUT", out cobolFile))
            {
                throw new Exception("File MSVCOUT.cpy not found");
            }

            // Load the CobolFile in a TextDocument
            ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("MSVCOUT.cpy", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());

            if(textDocument.CharAt(0) != '0')
            {
                throw new Exception("Character at position 0 should be 0");
            }
            if (textDocument.CharAt(88) != 'M')
            {
                throw new Exception("Character at position 88 should be M");
            }
            if (textDocument.CharAt(17899) != '/')
            {
                throw new Exception("Character at position 17899 should be /");
            }
            if (textDocument.CharAt(17919) != '1')
            {
                throw new Exception("Character at position 17191 should be 1");
            }

            if(textDocument.Chars.Skip(88).First() != 'M')
            {
                throw new Exception("Character enumerator after 88 iterations should return M");
            }

            ReadOnlyTextLine line = (ReadOnlyTextLine)textDocument.GetLineByIndex(0);
            if(line.Length != 80 || line.LineIndex != 0 || line.StartOffset != 0 ||
                line.Text != "000010*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-  00001001")
            {
                throw new Exception("Incorrect line at index 0");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByIndex(1);
            if (line.Length != 80 || line.LineIndex != 1 || line.StartOffset != 80 ||
                line.Text != "000020*-Maintenance frame - Created on 14 Oct 2013 at 17:27:08          00002001")
            {
                throw new Exception("Incorrect line at index 1");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByIndex(223);
            if (line.Length != 80 || line.LineIndex != 223 || line.StartOffset != 17840 ||
                line.Text != "002240     05                             PIC X(08) VALUE '/MSVCOUT'.   02010001")
            {
                throw new Exception("Incorrect line at index 223");
            }

            int indexOfCharInLine = -1;
            line = (ReadOnlyTextLine)textDocument.GetLineByOffset(12, out indexOfCharInLine);
            if (line.LineIndex != 0 || indexOfCharInLine != 12)
            {
                throw new Exception("Incorrect line at offset 12");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByOffset(159, out indexOfCharInLine);
            if (line.LineIndex != 1 || indexOfCharInLine != 79)
            {
                throw new Exception("Incorrect line at offset 79");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByOffset(17899, out indexOfCharInLine);
            if (line.LineIndex != 223 || indexOfCharInLine != 59)
            {
                throw new Exception("Incorrect line at offset 17899");
            }

            if (textDocument.Length != 17920)
            {
                throw new Exception("Document should have length 17920");
            }

            if (textDocument.LineCount != 224)
            {
                throw new Exception("Document should have 224 line count");
            }

            if (textDocument.Lines.Count() != 224)
            {
                throw new Exception("Document should have 224 lines");
            }
        }
Пример #7
0
        public static void Check_ASCIICobolFile_FreeTextFormat()
        {
            DocumentFormat docFormat = DocumentFormat.FreeTextFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\File\Samples"),
                false, new string[] { ".cpy" },
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            DummyTextSourceListener textSourceListener = new DummyTextSourceListener();

            CobolFile cobolFile;
            if (fileProvider.TryGetFile("AsciiFreeFormat", out cobolFile))
            {
                // Load the CobolFile in a TextDocument
                ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("AsciiFreeFormat.cpy", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());
                // Send all text lines in one batch to the test observer
                textDocument.TextChanged += textSourceListener.OnTextChanged;
                textDocument.StartSendingChangeEvents();
            }

            TextChangeMap tce1 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.First<TextChange>(), docFormat.ColumnsLayout);
            if (tce1.LineIndex != 0 || tce1.Type != TextChangeType.LineInserted ||
                tce1.NewLineMap.SequenceNumberText != null || tce1.NewLineMap.IndicatorChar != '/' ||
                tce1.NewLineMap.SourceText != "----------------------------------------------------------------" || tce1.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 1 of the ASCII text source (free text format)");
            }

            TextChangeMap tce2 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[4], docFormat.ColumnsLayout);
            if (tce2.LineIndex != 4 || tce2.Type != TextChangeType.LineInserted ||
                tce2.NewLineMap.SequenceNumberText != null || tce2.NewLineMap.IndicatorChar != '*' ||
                tce2.NewLineMap.SourceText != " Comportant TAGs (ou BALISEs) standards/normalisés apposées via  commentaires standards à respecter                             " || tce2.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 5 of the ASCII text source (free text format)");
            }

            TextChangeMap tce3 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[7], docFormat.ColumnsLayout);
            if (tce3.LineIndex != 7 || tce3.Type != TextChangeType.LineInserted ||
                tce3.NewLineMap.SequenceNumberText != null || tce3.NewLineMap.IndicatorChar != ' ' ||
                tce3.NewLineMap.SourceText != "      10                          PIC X(008) VALUE " || tce3.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 8 of the ASCII text source (free text format)");
            }

            TextChangeMap tce4 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[8], docFormat.ColumnsLayout);
            if (tce4.LineIndex != 8 || tce4.Type != TextChangeType.LineInserted ||
                tce4.NewLineMap.SequenceNumberText != null || tce4.NewLineMap.IndicatorChar != ' ' ||
                tce4.NewLineMap.SourceText != " 'MSVCINP '.   " || tce4.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 9 of the ASCII text source (free text format)");
            }

            TextChangeMap tce5 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[13], docFormat.ColumnsLayout);
            if (tce5.LineIndex != 13 || tce5.Type != TextChangeType.LineInserted ||
                tce5.NewLineMap.SequenceNumberText != null || tce5.NewLineMap.IndicatorChar != 'D' ||
                tce5.NewLineMap.SourceText != "       15  :MSVCINP:-AppSessnId           PIC X(064).           " || tce5.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 14 of the ASCII text source (free text format)");
            }

            TextChangeMap tce6 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[18], docFormat.ColumnsLayout);
            if (tce6.LineIndex != 18 || tce6.Type != TextChangeType.LineInserted ||
                tce6.NewLineMap.SequenceNumberText != null || tce6.NewLineMap.IndicatorChar != ' ' ||
                tce6.NewLineMap.SourceText != "    05  FILLER                             PIC X(499).           " || tce6.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 19 of the ASCII text source (free text format)");
            }

            TextChangeMap tce7 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.Last<TextChange>(), docFormat.ColumnsLayout);
            if (tce7.LineIndex != 27 || tce7.Type != TextChangeType.LineInserted ||
                tce7.NewLineMap.SequenceNumberText != null || tce7.NewLineMap.IndicatorChar != 'd' ||
                tce7.NewLineMap.SourceText != "   05                            PIC X(008) VALUE '/MSVCINP'.   " || tce7.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 28 of the ASCII text source (free text format)");
            }
        }
        public static void Check_FreeFormatDocument()
        {
            DocumentFormat docFormat = DocumentFormat.FreeTextFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\Text\Samples"),
                false, new string[] { ".cpy" },
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            CobolFile cobolFile;
            if (!fileProvider.TryGetFile("MSVCINP free format", out cobolFile))
            {
                throw new Exception("File MSVCINP free format.cpy not found");
            }

            // Load the CobolFile in a TextDocument
            ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("MSVCINP free format.cpy", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());

            if (textDocument.CharAt(0) != '/')
            {
                throw new Exception("Character at position 0 should be 0");
            }
            if (textDocument.CharAt(90) != 'a')
            {
                throw new Exception("Character at position 90 should be a");
            }
            if (textDocument.CharAt(2510) != '/')
            {
                throw new Exception("Character at position 2510 should be /");
            }
            if (textDocument.CharAt(2522) != ' ')
            {
                throw new Exception("Character at position 2522 should be space");
            }

            if (textDocument.Chars.Skip(90).First() != 'a')
            {
                throw new Exception("Character enumerator after 90 iterations should return a");
            }

            ReadOnlyTextLine line = (ReadOnlyTextLine)textDocument.GetLineByIndex(0);
            if (line.Length != 65 || line.LineIndex != 0 || line.StartOffset != 0 ||
                line.Text != "/----------------------------------------------------------------")
            {
                throw new Exception("Incorrect line at index 0");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByIndex(1);
            if (line.Length != 96 || line.LineIndex != 1 || line.StartOffset != 65 ||
                line.Text != "* MSVCINP               partie ALLER FIXE des MESSAGES échangés avec tout SERVICE APPLICATIF C14")
            {
                throw new Exception("Incorrect line at index 1");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByIndex(36);
            if (line.Length != 66 || line.LineIndex != 36 || line.StartOffset != 2457 ||
                line.Text != "d    05                            PIC X(008) VALUE '/MSVCINP'.   ")
            {
                throw new Exception("Incorrect line at index 36");
            }

            int indexOfCharInLine = -1;
            line = (ReadOnlyTextLine)textDocument.GetLineByOffset(12, out indexOfCharInLine);
            if (line.LineIndex != 0 || indexOfCharInLine != 12)
            {
                throw new Exception("Incorrect line at offset 12");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByOffset(881, out indexOfCharInLine);
            if (line.LineIndex != 12 || indexOfCharInLine != 5)
            {
                throw new Exception("Incorrect line at offset 981");
            }
            line = (ReadOnlyTextLine)textDocument.GetLineByOffset(2509, out indexOfCharInLine);
            if (line.LineIndex != 36 || indexOfCharInLine != 52)
            {
                throw new Exception("Incorrect line at offset 2509");
            }

            if (textDocument.Length != 2523)
            {
                throw new Exception("Document should have length 2523");
            }

            if (textDocument.LineCount != 37)
            {
                throw new Exception("Document should have 37 line count");
            }

            if (textDocument.Lines.Count() != 37)
            {
                throw new Exception("Document should have 37 lines");
            }
        }
Пример #9
0
        public static void Check_UTF8File()
        {
            DocumentFormat docFormat = new DocumentFormat(Encoding.UTF8, EndOfLineDelimiter.CrLfCharacters, 0, ColumnsLayout.FreeTextFormat);

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\File\Samples"),
                false, null,
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            DummyTextSourceListener textSourceListener = new DummyTextSourceListener();

            string filename = "UTF8Format.txt";
            CobolFile cobolFile;
            if (fileProvider.TryGetFile(filename, out cobolFile))
            {
                // Load the CobolFile in a TextDocument
                ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument(filename, docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());
                // Send all text lines in one batch to the test observer
                textDocument.TextChanged += textSourceListener.OnTextChanged;
                textDocument.StartSendingChangeEvents();
            }

            TextChangeMap tce;
            tce = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.First<TextChange>(), docFormat.ColumnsLayout);
            CheckLine(filename, tce, 0, "english: hello, world");
            tce = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[1], docFormat.ColumnsLayout);
            bool okay = false;
            try { CheckLine(filename, tce, 1, "français: salut, tout le monde"); }
            catch (Exception) { okay = true; }
            if (!okay) throw new Exception("Exception should have been thrown!");
            CheckLine(filename, tce, 1, "arabic: مرحبا بالعالم");
            tce = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[2], docFormat.ColumnsLayout);
            CheckLine(filename, tce, 2, "japanese: こんにちは世界");
        }
Пример #10
0
        public static void Check_EBCDICCobolFileWithUnsupportedChar()
        {
            DocumentFormat docFormat = DocumentFormat.ZOsReferenceFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\File\Samples"),
                false, new string[] { ".txt" },
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            bool exceptionWasThrownWithCorrectMessage = false;

            CobolFile cobolFile;
            if (fileProvider.TryGetFile("EbcdicRefFormatWithBadChars", out cobolFile))
            {
                try
                {
                    // Load the CobolFile in a TextDocument
                    ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("EbcdicRefFormatWithBadChars.TXT", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());
                }
                catch(Exception e)
                {
                    if (e.Message == "The character code 13 in source encoding IBM EBCDIC (France-Euro) found at position 3072 can not be safely converted to the internal Unicode representation : please replace it with the alphanumeric hexadecimal literal X'0D' in the source text")
                    {
                        exceptionWasThrownWithCorrectMessage = true;
                    }
                }
            }

            if(!exceptionWasThrownWithCorrectMessage)
            {
                throw new Exception("Unsupported chars in fixed length EBCDIC source file were not correctly filtered");
            }
        }
Пример #11
0
        public static void Check_EBCDICCobolFile()
        {
            DocumentFormat docFormat = DocumentFormat.ZOsReferenceFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\File\Samples"),
                false, new string[] { ".txt" },
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            DummyTextSourceListener textSourceListener = new DummyTextSourceListener();

            CobolFile cobolFile;
            if (fileProvider.TryGetFile("EbcdicRefFormat", out cobolFile))
            {
                // Load the CobolFile in a TextDocument
                ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("EbcdicRefFormat.TXT", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());
                // Send all text lines in one batch to the test observer
                textDocument.TextChanged += textSourceListener.OnTextChanged;
                textDocument.StartSendingChangeEvents();
            }

            TextChangeMap tce1 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.First<TextChange>(), docFormat.ColumnsLayout);
            if (tce1.LineIndex != 0 || tce1.Type != TextChangeType.LineInserted ||
               tce1.NewLineMap.SequenceNumberText != "000010" || tce1.NewLineMap.IndicatorChar != ' ' ||
               tce1.NewLineMap.SourceText != "CBL DATA(31)                                                      " || tce1.NewLineMap.CommentText != "        ")
            {
                throw new Exception("Error reading line 1 of the EBCDIC text source");
            }

            TextChangeMap tce2 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[9], docFormat.ColumnsLayout);
            if (tce2.LineIndex != 9 || tce2.Type != TextChangeType.LineInserted ||
               tce2.NewLineMap.SequenceNumberText != "000200" || tce2.NewLineMap.IndicatorChar != '*' ||
               tce2.NewLineMap.SourceText != "REMARKS. COPY=(YACMERM YACMCTL).                                 " || tce2.NewLineMap.CommentText != "00600000")
            {
                throw new Exception("Error reading line 10 of the EBCDIC text source");
            }

            TextChangeMap tce3 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[31], docFormat.ColumnsLayout);
            if (tce3.LineIndex != 31 || tce3.Type != TextChangeType.LineInserted ||
               tce3.NewLineMap.SequenceNumberText != "000420" || tce3.NewLineMap.IndicatorChar != ' ' ||
               tce3.NewLineMap.SourceText != "    05  FILLER     PIC XXX    VALUE ' ; '.                       " || tce3.NewLineMap.CommentText != "00860000")
            {
                throw new Exception("Error reading line 32 of the EBCDIC text source");
            }

            TextChangeMap tce4 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.Last<TextChange>(), docFormat.ColumnsLayout);
            if (tce4.LineIndex != 223 || tce4.Type != TextChangeType.LineInserted ||
               tce4.NewLineMap.SequenceNumberText != "002340" || tce4.NewLineMap.IndicatorChar != '*' ||
               tce4.NewLineMap.SourceText != "    CALL 'ILBOABN0' USING LCP-ABND-CODE.                         " || tce4.NewLineMap.CommentText != "02740000")
            {
                throw new Exception("Error reading line 224 of the EBCDIC text source");
            }
        }
Пример #12
0
        public static void Check_ASCIICobolFile_ReferenceFormat()
        {
            DocumentFormat docFormat = DocumentFormat.RDZReferenceFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\File\Samples"),
                false, new string[] { ".cpy" },
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            DummyTextSourceListener textSourceListener = new DummyTextSourceListener();

            CobolFile cobolFile;
            if (fileProvider.TryGetFile("AsciiRefFormat", out cobolFile))
            {
                // Load the CobolFile in a TextDocument
                ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("MSVCOUT.cpy", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());
                // Send all text lines in one batch to the test observer
                textDocument.TextChanged += textSourceListener.OnTextChanged;
                textDocument.StartSendingChangeEvents();
            }

            TextChangeMap tce1 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.First<TextChange>(), docFormat.ColumnsLayout);
            if (tce1.LineIndex != 0 || tce1.Type != TextChangeType.LineInserted ||
                tce1.NewLineMap.SequenceNumberText != "000100" || tce1.NewLineMap.IndicatorChar != '*' ||
                tce1.NewLineMap.SourceText != "----------------------------------------------------------------*" || tce1.NewLineMap.CommentText != "00010000")
            {
                throw new Exception("Error reading line 1 of the ASCII text source (reference format)");
            }

            TextChangeMap tce2 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[114], docFormat.ColumnsLayout);
            if (tce2.LineIndex != 114 || tce2.Type != TextChangeType.LineInserted ||
                tce2.NewLineMap.SequenceNumberText != "001780" || tce2.NewLineMap.IndicatorChar != ' ' ||
                tce2.NewLineMap.SourceText != "            20  FILLER                          PIC X(020).      " || tce2.NewLineMap.CommentText != "01550001")
            {
                throw new Exception("Error reading line 115 of the ASCII text source (reference format)");
            }

            TextChangeMap tce3 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[132], docFormat.ColumnsLayout);
            if (tce3.LineIndex != 132 || tce3.Type != TextChangeType.LineInserted ||
                tce3.NewLineMap.SequenceNumberText != "002030" || tce3.NewLineMap.IndicatorChar != ' ' ||
                tce3.NewLineMap.SourceText != "          15  :MSVCOUT:-DataElm  OCCURS  10  TIMES               " || tce3.NewLineMap.CommentText != "01800001")
            {
                throw new Exception("Error reading line 132 of the ASCII text source (reference format)");
            }

            TextChangeMap tce4 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.Last<TextChange>(), docFormat.ColumnsLayout);
            if (tce4.LineIndex != 147 || tce4.Type != TextChangeType.LineInserted ||
                tce4.NewLineMap.SequenceNumberText != "002240" || tce4.NewLineMap.IndicatorChar != ' ' ||
                tce4.NewLineMap.SourceText != "    05                             PIC X(08) VALUE '/MSVCOUT'.   " || tce4.NewLineMap.CommentText != "02010001")
            {
                throw new Exception("Error reading line 224 of the ASCII text source (reference format)");
            }
        }
Пример #13
0
        public static void Check_ASCIICobolFile_LinuxReferenceFormat()
        {
            DocumentFormat docFormat = DocumentFormat.RDZReferenceFormat;

            SourceFileProvider fileProvider = new SourceFileProvider();
            fileProvider.AddLocalDirectoryLibrary(
                PlatformUtils.GetPathForProjectFile(@"Compiler\File\Samples"),
                false, null,
                docFormat.Encoding, docFormat.EndOfLineDelimiter, docFormat.FixedLineLength);

            DummyTextSourceListener textSourceListener = new DummyTextSourceListener();

            CobolFile cobolFile;
            if (fileProvider.TryGetFile("AsciiLinuxFormat.14", out cobolFile))
            {
                // Load the CobolFile in a TextDocument
                ReadOnlyTextDocument textDocument = new ReadOnlyTextDocument("AsciiLinuxFormat.14", docFormat.Encoding, docFormat.ColumnsLayout, cobolFile.ReadChars());
                // Send all text lines in one batch to the test observer
                textDocument.TextChanged += textSourceListener.OnTextChanged;
                textDocument.StartSendingChangeEvents();
            }

            TextChangeMap tce1 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.First<TextChange>(), docFormat.ColumnsLayout);
            if (tce1.LineIndex != 0 || tce1.Type != TextChangeType.LineInserted ||
                tce1.NewLineMap.SequenceNumberText != null || tce1.NewLineMap.IndicatorChar != ' ' ||
                tce1.NewLineMap.SourceText != null || tce1.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 1 of the ASCII Linux text source (reference format)");
            }

            TextChangeMap tce2 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[5], docFormat.ColumnsLayout);
            if (tce2.LineIndex != 5 || tce2.Type != TextChangeType.LineInserted ||
                tce2.NewLineMap.SequenceNumberText != "      " || tce2.NewLineMap.IndicatorChar != ' ' ||
                tce2.NewLineMap.SourceText != "COPY \"copy.inc\"" || tce2.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 6 of the ASCII Linux text source (reference format)");
            }

            TextChangeMap tce3 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges[7], docFormat.ColumnsLayout);
            if (tce3.LineIndex != 7 || tce3.Type != TextChangeType.LineInserted ||
                tce3.NewLineMap.SequenceNumberText != "      " || tce3.NewLineMap.IndicatorChar != ' ' ||
                tce3.NewLineMap.SourceText != "               LEADING ==NORM== BY ==SECOND==." || tce3.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 8 of the ASCII Linux text source (reference format)");
            }

            TextChangeMap tce4 = new TextChangeMap(textSourceListener.LastTextChangedEvent.TextChanges.Last<TextChange>(), docFormat.ColumnsLayout);
            if (tce4.LineIndex != 13 || tce4.Type != TextChangeType.LineInserted ||
                tce4.NewLineMap.SequenceNumberText != "      " || tce4.NewLineMap.IndicatorChar != ' ' ||
                tce4.NewLineMap.SourceText != "    STOP RUN." || tce4.NewLineMap.CommentText != null)
            {
                throw new Exception("Error reading line 14 of the ASCII Linux text source (reference format)");
            }
        }