// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Microsoft.ClearScript.V8;
using Microsoft.VisualStudio.TestTools.UnitTesting;
// ReSharper disable HeuristicUnreachableCode
namespace Microsoft.ClearScript.Test
{
[TestClass]
[DeploymentItem("ClearScriptV8-64.dll")]
[DeploymentItem("ClearScriptV8-32.dll")]
[DeploymentItem("v8-x64.dll")]
[DeploymentItem("v8-ia32.dll")]
[DeploymentItem("v8-base-x64.dll")]
[DeploymentItem("v8-base-ia32.dll")]
[DeploymentItem("v8-libcpp-x64.dll")]
[DeploymentItem("v8-libcpp-ia32.dll")]
[SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", Justification = "Test classes use TestCleanupAttribute for deterministic teardown.")]
public class HostVariableTest : ClearScriptTest
{
#region setup / teardown
private ScriptEngine engine;
[TestInitialize]
public void TestInitialize()
{
engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging);
engine.AddHostObject("clr", HostItemFlags.GlobalMembers, new HostTypeCollection("mscorlib", "System", "System.Core"));
engine.AddHostObject("host", new HostFunctions());
}
[TestCleanup]
public void TestCleanup()
{
engine.Dispose();
BaseTestCleanup();
}
#endregion
#region test methods
// ReSharper disable InconsistentNaming
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_out()
{
var value = new Random();
var dict = new Dictionary { { "key", value } };
engine.AddHostObject("dict", dict);
engine.Execute("var value = host.newVar(System.Random); var found = dict.TryGetValue('key', value.out); var result = value.value;");
Assert.IsTrue(engine.Script.found);
Assert.AreSame(value, engine.Script.result);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_out_Enum()
{
const DayOfWeek value = DayOfWeek.Wednesday;
var dict = new Dictionary { { "key", value } };
engine.AddHostObject("dict", dict);
engine.Execute("var value = host.newVar(System.DayOfWeek); var found = dict.TryGetValue('key', value.out); var result = value.value;");
Assert.IsTrue(engine.Script.found);
Assert.AreEqual(value, engine.Script.result);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_out_Scalar()
{
const double value = Math.E;
var dict = new Dictionary { { "key", value } };
engine.AddHostObject("dict", dict);
engine.Execute("var value = host.newVar(System.Double); var found = dict.TryGetValue('key', value.out); var result = value.value;");
Assert.IsTrue(engine.Script.found);
Assert.AreEqual(value, engine.Script.result);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_out_Struct()
{
var value = DateTime.UtcNow;
var dict = new Dictionary { { "key", value } };
engine.AddHostObject("dict", dict);
engine.Execute("var value = host.newVar(System.DateTime); var found = dict.TryGetValue('key', value.out); var result = value.value;");
Assert.IsTrue(engine.Script.found);
Assert.AreEqual(value, engine.Script.result);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_ref()
{
var inputValue = new Random();
engine.AddHostObject("test", this);
engine.AddHostObject("inValue", inputValue);
engine.Execute("var value = host.newVar(inValue); var returnValue = test.TestMethod(value.ref); var result = value.value;");
Assert.AreEqual(engine.Script.result, default(Random));
Assert.AreSame(inputValue, engine.Script.returnValue);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_ref_Enum()
{
const DayOfWeek inputValue = DayOfWeek.Thursday;
engine.AddHostObject("test", this);
engine.AddHostObject("inValue", inputValue);
engine.Execute("var value = host.newVar(inValue); var returnValue = test.TestMethod(value.ref); var result = value.value;");
Assert.AreEqual(engine.Script.result, default(DayOfWeek));
Assert.AreEqual(inputValue, engine.Script.returnValue);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_ref_Scalar()
{
const double inputValue = Math.PI;
engine.AddHostObject("test", this);
engine.Script.inValue = inputValue;
engine.Execute("var value = host.newVar(inValue); var returnValue = test.TestMethod(value.ref); var result = value.value;");
Assert.AreEqual(engine.Script.result, default(Double));
Assert.AreEqual(inputValue, engine.Script.returnValue);
}
[TestMethod, TestCategory("HostVariable")]
public void HostVariable_ref_Struct()
{
var inputValue = DateTime.UtcNow;
engine.AddHostObject("test", this);
engine.AddHostObject("inValue", inputValue);
engine.Execute("var value = host.newVar(inValue); var returnValue = test.TestMethod(value.ref); var result = value.value;");
Assert.AreEqual(engine.Script.result, default(DateTime));
Assert.AreEqual(inputValue, engine.Script.returnValue);
}
// ReSharper restore InconsistentNaming
#endregion
#region miscellaneous
// ReSharper disable UnusedMember.Local
public T TestMethod(ref T value, T outValue = default(T))
{
var inValue = value;
value = outValue;
return inValue;
}
// ReSharper restore UnusedMember.Local
#endregion
}
}