示例#1
0
 // Compile the given code and return the error count.
 public static Compiler HelperCompile(string [] code, FortranOptions opts)
 {
     Compiler comp = new Compiler(opts);
     comp.CompileString(code);
     Assert.AreEqual(0, comp.Messages.ErrorCount);
     return comp;
 }
示例#2
0
        public void ParseConstantDivisionByZero()
        {
            string [] code = new [] {
                "      FUNCTION TEST",
                "        INTEGER I",
                "        I = 10/0",
                "        RETURN I",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(1, comp.Messages.Count);
            Assert.AreEqual(MessageCode.DIVISIONBYZERO, comp.Messages[0].Code);
            Assert.AreEqual(3, comp.Messages[0].Line);
        }
示例#3
0
        public void ParseVerifyAssignments()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      INTEGER A,C",
                "      REAL B",
                "      A = 12",
                "      B = 4.67",
                "      B = A",
                "      C = 12.78",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.Count);
        }
示例#4
0
        public void ValidateExceedMaximumContinuationLines()
        {
            string [] code = new [] {
                "      INTEGER A,",
                "     1B,",
                "     2C,",
                "     3D,",
                "     4E,",
                "     5F,",
                "     6G,",
                "     7H,",
                "     8I,",
                "     9J,",
                "     AK,",
                "     BL,",
                "     CM,",
                "     DN,",
                "     EO,",
                "     FP,",
                "     GQ,",
                "     HR,",
                "     IS,",
                "     JT",
                "     KU"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(1, comp.Messages.ErrorCount);
            Assert.AreEqual(21, comp.Messages[0].Line);
            Assert.AreEqual(MessageCode.TOOMANYCONTINUATION, comp.Messages[0].Code);
        }
示例#5
0
        public void ParseVerifyBadLogicalAssignment()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      IMPLICIT NONE",
                "      LOGICAL L1,L2",
                "      L1 = 12",
                "      L2 = 9.67",
                "      L1 = 'Ch'",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(3, comp.Messages.Count);
            Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[0].Code);
            Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[1].Code);
            Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[2].Code);
        }
示例#6
0
        public void ParseVerifyTypeFormats()
        {
            string [] code = new [] {
                "      INTEGER A",
                "      REAL B",
                "      CHARACTER C*5,D",
                "      DOUBLE PRECISION E",
                "      LOGICAL F,G,H"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.ErrorCount);
        }
示例#7
0
        public void ParseVerifyRedefinitions()
        {
            string [] code = new [] {
                "      INTEGER A",
                "      REAL B",
                "      CHARACTER B",
                "      DOUBLE PRECISION B",
                "      LOGICAL F,G,H"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(2, comp.Messages.ErrorCount);
            Assert.AreEqual(MessageCode.IDENTIFIERREDEFINITION, comp.Messages[0].Code);
            Assert.AreEqual(3, comp.Messages[0].Line);
            Assert.AreEqual(MessageCode.IDENTIFIERREDEFINITION, comp.Messages[1].Code);
            Assert.AreEqual(4, comp.Messages[1].Line);
        }
示例#8
0
        public void ArithDivisionByZero()
        {
            string [] code = new [] {
                "      FUNCTION ITEST",
                "        INTEGER I,J",
                "        I = 10",
                "        J = 0",
                "        RETURN I/J",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.ErrorCount);
            Assert.Throws(typeof(System.DivideByZeroException), delegate { comp.Execute("ITEST"); });
        }
示例#9
0
        public void ParseVerifyImplicitOrdering()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      IMPLICIT LOGICAL(L)",
                "      IMPLICIT NONE",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(1, comp.Messages.Count);
            Assert.AreEqual(MessageCode.TOKENNOTPERMITTED, comp.Messages[0].Code);
        }
示例#10
0
        public void ParseVerifyImplicitNone()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      IMPLICIT NONE",
                "      INTEGER A",
                "      A = 20",
                "      B = A",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(1, comp.Messages.Count);
            Assert.AreEqual(MessageCode.UNDEFINEDVARIABLE, comp.Messages[0].Code);
            Assert.AreEqual(5, comp.Messages[0].Line);
        }
示例#11
0
        public void ParseVerifyImplicit1()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      IMPLICIT INTEGER(A-Z)",
                "      A = 20",
                "      B = A",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.Count);
        }
示例#12
0
        public void ParseVerifyIllegalChar()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      INTEGER A",
                "      CHARACTER B",
                "      B = 'A'",
                "      A = B",
                "      B = 89",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(2, comp.Messages.Count);
            Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[0].Code);
            Assert.AreEqual(5, comp.Messages[0].Line);
            Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[1].Code);
            Assert.AreEqual(6, comp.Messages[1].Line);
        }
示例#13
0
        public void ParseVerifyExpressionCollapsing()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      IMPLICIT NONE",
                "      INTEGER A(12+34), B(90-10), C(4-2:9-3)",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.ErrorCount);
        }
示例#14
0
        public void ParseVerifyConstantAssignment()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      PARAMETER (I=12)",
                "      I = 45",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(1, comp.Messages.Count);
            Assert.AreEqual(MessageCode.CANNOTASSIGNTOCONST, comp.Messages[0].Code);
            Assert.AreEqual(3, comp.Messages[0].Line);
        }
示例#15
0
        public void ValidateMaximumContinuationLines()
        {
            string [] code = new [] {
                "      INTEGER A,",
                "     1B,",
                "     2C,",
                "     3D,",
                "     4E,",
                "     5F,",
                "     6G,",
                "     7H,",
                "     8I,",
                "     9J,",
                "     AK,",
                "     BL,",
                "     CM,",
                "     DN,",
                "     EO,",
                "     FP,",
                "     GQ,",
                "     HR,",
                "     IS,",
                "     JT"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.ErrorCount);
        }
示例#16
0
        public void ParseVerifyLogicalAssignment()
        {
            string [] code = new [] {
                "      PROGRAM PARSETEST",
                "      IMPLICIT NONE",
                "      LOGICAL L1,L2",
                "      L1 = .TRUE.",
                "      L2 = .FALSE.",
                "      L1 = L2",
                "      L1 = 90 .GT. 45",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(0, comp.Messages.Count);
        }
示例#17
0
        public void ArrayVerifyIllegalDeclaration()
        {
            string [] code = new [] {
                "      PROGRAM FOO",
                "      INTEGER MAXVAL",
                "      REAL ARRAY(MAXVAL)",
                "      ARRAY(2) = 4.2",
                "      TEST=FOO(ARRAY,MAXVAL)",
                "      END"
            };

            Compiler comp = new Compiler(new FortranOptions());
            comp.CompileString(code);
            Assert.AreEqual(1, comp.Messages.ErrorCount);
            Assert.AreEqual(MessageCode.ARRAYILLEGALBOUNDS, comp.Messages[0].Code);
            Assert.AreEqual(3, comp.Messages[0].Line);
        }