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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
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) ); }
public void ClassNameFollowedByBracketsInNewStatementResultsInCompileTimeError() { var source = "c = new C1()"; Assert.Throws <Exception>(() => { WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies); }); }
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) ); }
public void ReDimBeforeConstForSameNameInSameScopeResultsInNameRedefinedError() { var source = @" ReDim a(1) CONST a = 1 " ; Assert.Throws <NameRedefinedException>(() => WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies) ); }
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) ); }
public void DescendingLoopWithoutExplicitStepIsOptimisedOut() { var source = @" Dim i: For i = 5 To 1 Next " ; Assert.Equal( new string[0], WithoutScaffoldingTranslator.GetTranslatedStatements(source, WithoutScaffoldingTranslator.DefaultConsoleExternalDependencies) ); }