示例#1
0
        public void ByRefFunctionArgumentRequiresSpecialTreatmentIfDirectlyUsedElsewhereAsAnArrayAsByRefArgument()
        {
            var source   = @"
				Function F1(a)
					F2 a(0)
				End Function

				Function F2(a)
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1(ref object a)",
                "{",
                "    object retVal1 = null;",
                "    object byrefalias2 = a;",
                "    try",
                "    {",
                "        _.CALL(this, _outer, \"F2\", _.ARGS.RefIfArray(byrefalias2, _.ARGS.Val((Int16)0)));",
                "    }",
                "    finally { a = byrefalias2; }",
                "    return retVal1;",
                "}",
                "public object f2(ref object a)",
                "{",
                "    return null;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
        public void ErrorTrappingDoesNotAffectChildScopes()
        {
            var source   = @"
				On Error Resume Next
				Func1
				Function Func1()
					WScript.Echo ""Test1""
				End Function
			"            ;
            var expected = @"
				var errOn1 = _.GETERRORTRAPPINGTOKEN();
				_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn1);
				_.HANDLEERROR(errOn1, () => {
					_.CALL(this, _outer, ""Func1"");
				});
				_.RELEASEERRORTRAPPINGTOKEN(errOn1);
				public object func1()
				{
					object retVal2 = null;
					_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Test1""));
					return retVal2;
				}"                ;

            Assert.Equal(
                SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#3
0
        public void DeclaredVariableInOutermostScopeShouldBeAccessedFromThereWhenRequiredWithinFunction()
        {
            var source   = @"
				Dim i
				Test1
				Function Test1()
					WScript.Echo i
				End Function
			"            ;
            var expected = new[]
            {
                "_.CALL(this, _outer, \"Test1\");",
                "public object test1()",
                "{",
                "    object retVal1 = null;",
                "    _.CALL(this, _env.wscript, \"Echo\", _.ARGS.Ref(_outer.i, v2 => { _outer.i = v2; }));",
                "    return retVal1;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#4
0
        public void UndeclaredVariablesShouldNotBeFlushedAtForBlockEnd()
        {
            var source   = @"
				Function F1
					For i = 1 To 5
						WScript.Echo j
					Next
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1()",
                "{",
                "    object retVal1 = null;",
                "    object j = null; /* Undeclared in source */",
                "    object i = null; /* Undeclared in source */",
                "    for (i = (Int16)1; _.StrictLTE(i, 5); i = _.ADD(i, (Int16)1))",
                "    {",
                "        _.CALL(this, _env.wscript, \"Echo\", _.ARGS.Ref(j, v2 => { j = v2; }));",
                "    }",
                "    return retVal1;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
        public void FlatStatementSetWithMiddleOneErrorTrapped()
        {
            var source   = @"
				WScript.Echo ""Test1""
				On Error Resume Next
				WScript.Echo ""Test2""
				On Error Goto 0
				WScript.Echo ""Test3""
			"            ;
            var expected = @"
				var errOn1 = _.GETERRORTRAPPINGTOKEN();
				_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Test1""));
				_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn1);
				_.HANDLEERROR(errOn1, () => {
					_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Test2""));
				});
				_.STOPERRORTRAPPINGANDCLEARANYERROR(errOn1);
				_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Test3""));
				_.RELEASEERRORTRAPPINGTOKEN(errOn1);"                ;

            Assert.Equal(
                SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#6
0
        public void DeclaredVariableWithinFunctionsShouldBeRestrictedInScopeToThatFunction()
        {
            var source   = @"
				Test1
				Function Test1()
					Dim i
					WScript.Echo i
				End Function
			"            ;
            var expected = new[]
            {
                "_.CALL(this, _outer, \"Test1\");",
                "public object test1()",
                "{",
                "    object retVal1 = null;",
                "    object i = null;",
                "    _.CALL(this, _env.wscript, \"Echo\", _.ARGS.Ref(i, v2 => { i = v2; }));",
                "    return retVal1;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#7
0
        public void AscendingLoopWithImplicitStepAndErrorTrappingEnabled()
        {
            var source   = @"
				On Error Resume Next
				For i = 1 To 10
					WScript.Echo i
				Next
			"            ;
            var expected = new[]
            {
                "var errOn1 = _.GETERRORTRAPPINGTOKEN();",
                "_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn1);",
                "_env.i = (Int16)1;",
                "while (true)",
                "{",
                "   _.HANDLEERROR(errOn1, () => {",
                "       _.CALL(this, _env.wscript, \"Echo\", _.ARGS.Ref(_env.i, v2 => { _env.i = v2; }));",
                "   });",
                "   var continueLoop3 = false;",
                "   _.HANDLEERROR(errOn1, () => {",
                "       _env.i = _.ADD(_env.i, (Int16)1);",
                "       continueLoop3 = _.StrictLTE(_env.i, 10);",
                "   });",
                "   if (!continueLoop3)",
                "       break;",
                "}",
                "_.RELEASEERRORTRAPPINGTOKEN(errOn1);"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
            public void RepeatedReDimInFunction()
            {
                var source   = @"
                    Function F1()
                        Dim a
                        ReDim a(0)
                        ReDim a(1)
                        ReDim a(2)
                    End Function";
                var expected = @"
                    public object f1()
                    {
                      object retVal1 = null;
                      object a = null;
                      a = _.NEWARRAY(new object[] { (Int16)0 });
                      a = _.NEWARRAY(new object[] { (Int16)1 });
                      a = _.NEWARRAY(new object[] { (Int16)2 });
                      return retVal1;
                   }";

                Assert.Equal(
                    SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                    WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                    );
            }
        public void ReDimsWithinFunctionCanPointToImplicitlyDeclaredOuterMostScopeVariables()
        {
            var source   = @"
                a = 1
                Function F1()
                    ReDim a(2) ' This refers to the implicitly-declared variable ""a"" in the outermost scope
                End Function
                Class C1
                    Private c
                    Function CF1()
                        ReDim a(3) ' This refers to the implicitly-declared variable ""a"" in the outermost scope
                        ReDim b(3) ' There is no reference for this to relate to, so it acts as new explicit variable declaration
                        ReDim c(3) ' This refers to the explicitly-declared variable ""c"" in the containing class
                    End Function
                End Class";
            var expected = @"
                _env.a = (Int16)1;
                public object f1()
                {
                    object retVal1 = null;
                    _env.a = _.NEWARRAY(new object[] { (Int16)2 }); // This refers to the implicitly-declared variable ""a"" in the outermost scope
                    return retVal1;
                }
                [ComVisible(true)]
                [SourceClassName(""C1"")]
                public sealed class c1
                {
                    private readonly IProvideVBScriptCompatFunctionalityToIndividualRequests _;
                    private readonly EnvironmentReferences _env;
                    private readonly GlobalReferences _outer;
                    public c1(IProvideVBScriptCompatFunctionalityToIndividualRequests compatLayer, EnvironmentReferences env, GlobalReferences outer)
                    {
                        if (compatLayer == null)
                            throw new ArgumentNullException(""compatLayer"");
                        if (env == null)
                            throw new ArgumentNullException(""env"");
                        if (outer == null)
                            throw new ArgumentNullException(""outer"");
                        _ = compatLayer;
                        _env = env;
                        _outer = outer;
                        c = null;
                    }
                    private object c { get; set; }
                    public object cf1()
                    {
                        object retVal2 = null;
                        object b = null;
                        _env.a = _.NEWARRAY(new object[] { (Int16)3 }); // This refers to the implicitly-declared variable ""a"" in the outermost scope
                        b = _.NEWARRAY(new object[] { (Int16)3 }); // There is no reference for this to relate to, so it acts as new explicit variable declaration
                        c = _.NEWARRAY(new object[] { (Int16)3 }); // This refers to the explicitly-declared variable ""c"" in the containing class
                        return retVal2;
                    }
                }";

            Assert.Equal(
                SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#10
0
        public void IfTheOnlyExecutableStatementIsReturnValueThenTranslateIntoSingleReturnStatementUnlessRefAliasMappingsRequired()
        {
            var source   = @"
				PUBLIC FUNCTION F1(a)
					F1 = F2(a)
				END FUNCTION
				PUBLIC FUNCTION F2(a)
				END FUNCTION
			"            ;
            var expected = new[]
            {
                "public object f1(ref object a)",
                "{",
                "    object retVal2 = null;",
                "    object byrefalias4 = a;",
                "    try",
                "    {",
                "        retVal2 = _.VAL(_.CALL(this, _outer, \"F2\", _.ARGS.Ref(byrefalias4, v5 => { byrefalias4 = v5; })));",
                "    }",
                "    finally { a = byrefalias4; }",
                "    return retVal2;",
                "}",
                "public object f2(ref object a)",
                "{",
                "    return null;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#11
0
        public void ParentFunctionNameMustBeMappedOnToReturnValueNameWhenPassedAsArgumentToOtherFunction()
        {
            var source   = @"
				Function F1(x)
					If IsEmpty(F1) Then
						F1 = True
					End If
				End Function

				Function F2(x)
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1(ref object x)",
                "{",
                "	object retVal1 = null;",
                "	if (_.IF(_.ISEMPTY(retVal1)))",
                "	{",
                "		retVal1 = true;",
                "	}",
                "	return retVal1;",
                "}",
                "public object f2(ref object x)",
                "{",
                "	return null;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#12
0
        public void ByRefFunctionArgumentMustBeMappedToReadOnlyAliasIfReferencedInReadOnlyMannerWithinPotentiallyErrorTrappingStatement()
        {
            var source   = @"
				Function F1(a)
					On Error Resume Next
					WScript.Echo a.Name
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1(ref object a)",
                "{",
                "    object retVal1 = null;",
                "    var errOn2 = _.GETERRORTRAPPINGTOKEN();",
                "    _.STARTERRORTRAPPINGANDCLEARANYERROR(errOn2);",
                "    object byrefalias3 = a;",
                "    _.HANDLEERROR(errOn2, () => {",
                "        _.CALL(this, _env.wscript, \"Echo\", _.ARGS.Val(_.CALL(this, byrefalias3, \"Name\")));",
                "    });",
                "    _.RELEASEERRORTRAPPINGTOKEN(errOn2);",
                "    return retVal1;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#13
0
        public void ByRefFunctionArgumentNeedNotBeMappedToAnAliasIfForcedInToByValWhenPassedToNextFunction()
        {
            var source   = @"
				Function F1(a)
					F2 (a)
				End Function

				Function F2(a)
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1(ref object a)",
                "{",
                "    object retVal1 = null;",
                "    _.CALL(this, _outer, \"F2\", _.ARGS.Val(a));",
                "    return retVal1;",
                "}",
                "public object f2(ref object a)",
                "{",
                "    return null;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#14
0
        public void ByRefFunctionArgumentRequiresNoSpecialTreatmentIfAccessAsFunctionOrArray()
        {
            var source   = @"
				Function F1(a)
					F2 a()
				End Function

				Function F2(a)
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1(ref object a)",
                "{",
                "    object retVal1 = null;",
                "    _.CALL(this, _outer, \"F2\", _.ARGS.Val(_.CALL(this, a, _.ARGS.ForceBrackets())));",
                "    return retVal1;",
                "}",
                "public object f2(ref object a)",
                "{",
                "    return null;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#15
0
        public void ByRefArgumentRequireByRefArgumentMappingWhenPassedIndirectlyToBuiltInFunction()
        {
            var source   = @"
				Function F1(x)
					WScript.Echo TypeName(F2(x))
				End Function

				Function F2(x)
					F2 = x
				End Function"                ;
            var expected = @"
				public object f1(ref object x)
				{
					object retVal1 = null;
					object byrefalias2 = x;
					try
					{
						_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(_.TYPENAME(_.CALL(this, _outer, ""F2"", _.ARGS.Ref(byrefalias2, v3 => { byrefalias2 = v3; })))));
					}
					finally { x = byrefalias2; }
					return retVal1;
				}

				public object f2(ref object x)
				{
					return _.VAL(x);
				}"                ;

            Assert.Equal(
                expected.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
        public void TranslateErrRaiseIntoAppropriateSupportFunction()
        {
            var source   = @"
				Err.Raise vbObjectError
				Err.Raise vbObjectError, ""Source""
				Err.Raise vbObjectError, ""Source"", ""Test""
				Err.Raise vbObjectError, ""Source"", ""Test"", ""Bonus Argument""
				Err.Clear
				Err.Clear()
				Err.Clear ""Bonus Argument""
			"            ;
            var expected = @"
				_.RAISEERROR(VBScriptConstants.vbObjectError);
				_.RAISEERROR(VBScriptConstants.vbObjectError, ""Source"");
				_.RAISEERROR(VBScriptConstants.vbObjectError, ""Source"", ""Test"");
				_.CALL(this, _, ""RAISEERROR"", _.ARGS.Val(VBScriptConstants.vbObjectError).Val(""Source"").Val(""Test"").Val(""Bonus Argument""));
				_.CLEARANYERROR();
				_.CLEARANYERROR();
				_.CALL(this, _, ""CLEARANYERROR"", _.ARGS.Val(""Bonus Argument""));"                ;

            Assert.Equal(
                SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#17
0
        public void ByRefArgumentWillRequireByRefArgumentMappingWhenPassedDirectlyToBuiltInFunctionIfErrorTrappingMayBeEnabled()
        {
            var source   = @"
				Function F1(x)
					On Error Resume Next
					WScript.Echo TypeName(x)
				End Function"                ;
            var expected = @"
				public object f1(ref object x)
				{
					object retVal1 = null;
					var errOn2 = _.GETERRORTRAPPINGTOKEN();
					_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn2);
					object byrefalias3 = x;
					try
					{
						_.HANDLEERROR(errOn2, () => {
							_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(_.TYPENAME(byrefalias3)));
						});
					}
					finally { x = byrefalias3; }
					_.RELEASEERRORTRAPPINGTOKEN(errOn2);
					return retVal1;
				}"                ;

            Assert.Equal(
                expected.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
        public void IfValueSettingStatementTargetIsByRefArgumentOfContainingFunctionThenAnyByRefMappingMustBeTwoWay()
        {
            // 2016-03-09 DWR: It's important that the ON ERROR RESUME NEXT comes after the value setting statement since the translation process is not
            // currently clever enough to determine that this means that error-trapping could never apply to the value setting statement - the fact that
            // there IS some error-handling within the function scope means that the translation process goes on the assumption that it's possible that
            // the error-handling might impact the value-setting (this is something that could be improved in the future since it would result in more
            // succinct code in places where there is error-handling within the same scope but which it can be proved can never apply to a particular
            // statement).
            var source   = @"
				Function F1(x)
					Set x = Nothing
					On Error Resume Next
				End Function
			"            ;
            var expected = @"
				public object f1(ref object x)
				{
					object retVal1 = null;
					var errOn2 = _.GETERRORTRAPPINGTOKEN();
					object byrefalias3 = x;
					try
					{
						byrefalias3 = VBScriptConstants.Nothing;
					}
					finally { x = byrefalias3; }
					_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn2);
					_.RELEASEERRORTRAPPINGTOKEN(errOn2);
					return retVal1;
				}"                ;

            Assert.Equal(
                SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#19
0
        public void RuntimeVariableLoopBoundariesAndStep()
        {
            var source   = @"
				For i = a To b Step c
				Next
			"            ;
            var expected = new[]
            {
                "var loopEnd1 = _.NUM(_env.b);",
                "var loopStep2 = _.NUM(_env.c);",
                "var loopStart3 = _.NUM(_env.a, loopEnd1, loopStep2);",
                "if ((_.StrictLTE(loopStart3, loopEnd1) && _.StrictGTE(loopStep2, 0))",
                "|| (_.StrictGT(loopStart3, loopEnd1) && _.StrictLT(loopStep2, 0)))",
                "{",
                "for (_env.i = loopStart3;",
                "    (_.StrictGTE(loopStep2, 0) && _.StrictLTE(_env.i, loopEnd1)) || (_.StrictLT(loopStep2, 0) && _.StrictGTE(_env.i, loopEnd1));",
                "     _env.i = _.ADD(_env.i, loopStep2))",
                "{",
                "}",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
        public void IfBlockStatementsMustBeWrappedInErrorHandlingIfWithinFunctionWithOnErrorResumeNextBeforeIfBlock()
        {
            var source   = @"
				Function F1(ByVal value)
					On Error Resume Next
					If True Then
						F1 = DateValue(value)
					End If
					On Error Goto 0
				End Function
			"            ;
            var expected = @"
				public object f1(object value)
				{
					object retVal1 = null;
					var errOn2 = _.GETERRORTRAPPINGTOKEN();
					_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn2);
					if (_.IF(() => true, errOn2))
					{
						_.HANDLEERROR(errOn2, () => {
							retVal1 = _.DATEVALUE(value);
						});
					}
					_.STOPERRORTRAPPINGANDCLEARANYERROR(errOn2);
					_.RELEASEERRORTRAPPINGTOKEN(errOn2);
					return retVal1;
				}"                ;

            Assert.Equal(
                SplitOnNewLinesSkipFirstLineAndTrimAll(expected).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#21
0
        public void ByteLoopStartAndEndAndStepValuesWillGetByteLoopVariable()
        {
            var source   = @"
				Dim i: For i = CByte(1) To CByte(5) Step CByte(1)
				Next
			"            ;
            var expected = new[]
            {
                "var loopEnd1 = _.CBYTE(5);",
                "var loopStep2 = _.CBYTE(1);",
                "var loopStart3 = _.NUM(_.CBYTE(1), loopEnd1, loopStep2);",
                "if ((_.StrictLTE(loopStart3, loopEnd1) && _.StrictGTE(loopStep2, 0))",
                "|| (_.StrictGT(loopStart3, loopEnd1) && _.StrictLT(loopStep2, 0)))",
                "{",
                "    for (_outer.i = loopStart3;",
                "        (_.StrictGTE(loopStep2, 0) && _.StrictLTE(_outer.i, loopEnd1)) || (_.StrictLT(loopStep2, 0) && _.StrictGTE(_outer.i, loopEnd1));",
                "         _outer.i = _.ADD(_outer.i, loopStep2))",
                "    {",
                "    }",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
            public void ByRefFunctionArgumentDoesNotRequireSpecialTreatmentIfUsedInConditionsAsByValArgument()
            {
                var source   = @"
					Function F1(a)
						If F2(a.Name) Then
						End If
					End Function

					Function F2(a)
					End Function
				"                ;
                var expected = new[]
                {
                    "public object f1(ref object a)",
                    "{",
                    "    object retVal1 = null;",
                    "    if (_.IF(_.CALL(this, _outer, \"F2\", _.ARGS.Val(_.CALL(this, a, \"Name\")))))",
                    "    {",
                    "    }",
                    "    return retVal1;",
                    "}",
                    "public object f2(ref object a)",
                    "{",
                    "    return null;",
                    "}"
                };

                Assert.Equal(
                    expected.Select(s => s.Trim()).ToArray(),
                    WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                    );
            }
示例#23
0
        public void ByRefFunctionArgumentNeedNotBeMappedToAnAliasIfIndirectlyAccessedOutsideOfErrorTrapping()
        {
            var source   = @"
				Function F1(a)
					F2 a.Name
				End Function

				Function F2(a)
				End Function
			"            ;
            var expected = new[]
            {
                "public object f1(ref object a)",
                "{",
                "    object retVal1 = null;",
                "    _.CALL(this, _outer, \"F2\", _.ARGS.Val(_.CALL(this, a, \"Name\")));",
                "    return retVal1;",
                "}",
                "public object f2(ref object a)",
                "{",
                "    return null;",
                "}"
            };

            Assert.Equal(
                expected.Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#24
0
        public void AllowSpecialCharactersToBeUsedAsStringsInSelectCases()
        {
            var source = @"
				Select Case x
					Case ""(""
						WScript.Echo ""Open""
					Case "")""
						WScript.Echo ""Close""
					Case "",""
						WScript.Echo ""Split""
				End Select"                ;

            var expected = @"
				if (_.IF(_.EQ(_env.x, ""("")))
				{
					_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Open""));
				}
				else if (_.IF(_.EQ(_env.x, "")"")))
				{
					_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Close""));
				}
				else if (_.IF(_.EQ(_env.x, "","")))
				{
					_.CALL(this, _env.wscript, ""Echo"", _.ARGS.Val(""Split""));
				}"                ;

            Assert.Equal(
                expected.Replace(Environment.NewLine, "\n").Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#25
0
        public void IfByRefArgumentIsRequiredForLoopConstraintsAndIsPassedToBuiltInFunctionByRefThenNoByRefMappingRequired()
        {
            var source = @"
				Function F1(ByRef x)
					Dim i: For i = 1 To UBOUND(x)
					Next
				End Function"                ;

            var expected = @"
				public object f1(ref object x)
				{
					object retVal1 = null;
					object i = null;
					var loopEnd2 = _.UBOUND(x);
					var loopStart3 = _.NUM((Int16)1, loopEnd2);
					if (_.StrictLTE(loopStart3, loopEnd2))
					{
						for (i = loopStart3; _.StrictLTE(i, loopEnd2); i = _.ADD(i, (Int16)1))
						{
						}
					}
					return retVal1;
				}"                ;

            Assert.Equal(
                expected.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Select(s => s.Trim()).Where(s => s != "").ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#26
0
        public void ClassNameFollowedByBracketsInNewStatementResultsInCompileTimeError()
        {
            var source = "c = new C1()";

            Assert.Throws <Exception>(() =>
            {
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies);
            });
        }
示例#27
0
        public void StringValuesAreCorrectlyEscaped()
        {
            var source   = "const name = \"test\"";
            var expected = "_outer.name = \"test\";";

            Assert.Equal(
                expected.Replace(Environment.NewLine, "\n").Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#28
0
        public void ReDimBeforeConstForSameNameInSameScopeResultsInNameRedefinedError()
        {
            var source = @"
				ReDim a(1)
				CONST a = 1
			"            ;

            Assert.Throws <NameRedefinedException>(() =>
                                                   WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                                                   );
        }
示例#29
0
        public void IfByRefArgumentIsRequiredForKnownReadOnlyLoopConstraintsAndLoopWrappedInErrorTrappingThenReadOnlyByRefMappingRequired()
        {
            var source = @"
				Function F1(ByRef x)
					On Error Resume Next
					Dim i: For i = 1 To x + 1
					Next
				End Function"                ;

            var expected = @"
				public object f1(ref object x)
				{
					object retVal1 = null;
					var errOn2 = _.GETERRORTRAPPINGTOKEN();
					object i = null;
					_.STARTERRORTRAPPINGANDCLEARANYERROR(errOn2);
					object loopEnd4 = 0, loopStart5 = 0;
					var loopConstraintsInitialised6 = false;
					object byrefalias3 = x;
					_.HANDLEERROR(errOn2, () => {
						loopEnd4 = _.NUM(_.ADD(byrefalias3, (Int16)1));
						loopStart5 = _.NUM((Int16)1);
						if ((loopStart5 is DateTime) || (loopStart5 is Decimal))
							i = loopStart5;
						loopStart5 = _.NUM((Int16)1, loopEnd4);
						loopConstraintsInitialised6 = true;
					});
					if (_.StrictLTE(loopStart5, loopEnd4))
					{
						if (loopConstraintsInitialised6)
							i = loopStart5;
						while (true)
						{
							if (!loopConstraintsInitialised6)
								break;
							var continueLoop7 = false;
							_.HANDLEERROR(errOn2, () => {
								i = _.ADD(i, (Int16)1);
								continueLoop7 = _.StrictLTE(i, loopEnd4);
							});
							if (!continueLoop7)
								break;
						}
					}
					_.RELEASEERRORTRAPPINGTOKEN(errOn2);
					return retVal1;
				}"                ;

            Assert.Equal(
                expected.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Select(s => s.Trim()).Where(s => s != "").ToArray(),
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }
示例#30
0
        public void DescendingLoopWithoutExplicitStepIsOptimisedOut()
        {
            var source = @"
				Dim i: For i = 5 To 1
				Next
			"            ;

            Assert.Equal(
                new string[0],
                WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies)
                );
        }