From d363661a7e65e2bd83d6da99230d27cb593436ed Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 4 Sep 2008 22:11:13 +0000 Subject: complete rationalization of unit tests that we currently run --- .../ScriptEngine/Shared/CodeTools/CompilerTest.cs | 153 +++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 OpenSim/Tests/Region/ScriptEngine/Shared/CodeTools/CompilerTest.cs (limited to 'OpenSim/Tests/Region/ScriptEngine/Shared/CodeTools/CompilerTest.cs') diff --git a/OpenSim/Tests/Region/ScriptEngine/Shared/CodeTools/CompilerTest.cs b/OpenSim/Tests/Region/ScriptEngine/Shared/CodeTools/CompilerTest.cs new file mode 100644 index 0000000..7725d8d --- /dev/null +++ b/OpenSim/Tests/Region/ScriptEngine/Shared/CodeTools/CompilerTest.cs @@ -0,0 +1,153 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System.IO; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using Microsoft.CSharp; +using NUnit.Framework; +using OpenSim.Region.ScriptEngine.Shared.CodeTools; + +namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests +{ + /// + /// Tests the LSL compiler. Among other things, test that error messages + /// generated by the C# compiler can be mapped to prper lines/columns in + /// the LSL source. + /// + [TestFixture] + public class CompilerTest + { + private string m_testDir; + private CSharpCodeProvider m_CSCodeProvider; + private CompilerParameters m_compilerParameters; + private CompilerResults m_compilerResults; + + /// + /// Creates a temporary directory where build artifacts are stored. + /// + [TestFixtureSetUp] + public void Init() + { + m_testDir = Path.Combine(Path.GetTempPath(), "opensim_compilerTest_" + Path.GetRandomFileName()); + + if (!Directory.Exists(m_testDir)) + { + // Create the temporary directory for housing build artifacts. + Directory.CreateDirectory(m_testDir); + } + + // Create a CSCodeProvider and CompilerParameters. + m_CSCodeProvider = new CSharpCodeProvider(); + m_compilerParameters = new CompilerParameters(); + + string rootPath = Path.Combine(Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory), "bin"); + m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.dll")); + m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll")); + m_compilerParameters.GenerateExecutable = false; + } + + /// + /// Removes the temporary build directory and any build artifacts + /// inside it. + /// + [TestFixtureTearDown] + public void CleanUp() + { + if (Directory.Exists(m_testDir)) + { + // Blow away the temporary directory with artifacts. + Directory.Delete(m_testDir, true); + } + } + + /// + /// Test the C# compiler error message can be mapped to the correct + /// line/column in the LSL source when an undeclared variable is used. + /// + //[Test] + public void TestUseUndeclaredVariable() + { + m_compilerParameters.OutputAssembly = Path.Combine(m_testDir, Path.GetRandomFileName() + ".dll"); + + string input = @"default +{ + state_entry() + { + integer y = x + 3; + } +}"; + + CSCodeGenerator cg = new CSCodeGenerator(); + string output = "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\n" + + "namespace SecondLife { " + + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass {\n" + + "public Script() { } " + + cg.Convert(input) + + "} }\n"; + Dictionary, KeyValuePair> positionMap = cg.PositionMap; + + m_compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); + + Assert.AreEqual(new KeyValuePair(5, 21), + positionMap[new KeyValuePair(m_compilerResults.Errors[0].Line, m_compilerResults.Errors[0].Column)]); + } + + /// + /// Test that a string can be cast to string and another string + /// concatenated. + /// + //[Test] + public void TestCastAndConcatString() + { + m_compilerParameters.OutputAssembly = Path.Combine(m_testDir, Path.GetRandomFileName() + ".dll"); + + string input = @"string s = "" a string""; + +default +{ + state_entry() + { + key gAvatarKey = llDetectedKey(0); + string tmp = (string) gAvatarKey + s; + llSay(0, tmp); + } +}"; + + CSCodeGenerator cg = new CSCodeGenerator(); + string output = "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\n" + + "namespace SecondLife { " + + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass {\n" + + "public Script() { } " + + cg.Convert(input) + + "} }\n"; + m_compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); + + Assert.AreEqual(0, m_compilerResults.Errors.Count); + } + } +} -- cgit v1.1