[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/git-thinh/ClearScript/master/ClearScriptTest/AccessContextTest.cs [Back]  [Original]

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

using System;
using System.Diagnostics.CodeAnalysis;
using Microsoft.ClearScript.Util.Test;
using Microsoft.ClearScript.V8;
using Microsoft.VisualStudio.TestTools.UnitTesting;

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-zlib-x64.dll")]
    [DeploymentItem("v8-zlib-ia32.dll")]
    [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", Justification = "Test classes use TestCleanupAttribute for deterministic teardown.")]
    public class AccessContextTest : ClearScriptTest
    {
        #region setup / teardown

        private ScriptEngine engine;

        [TestInitialize]
        public void TestInitialize()
        {
            engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging);

            engine.AddHostType(typeof(AccessContextTestBase));
            engine.AddHostType(typeof(AccessContextTestObject));

            engine.Script.dateTime = DateTime.Now;
            engine.Script.timeSpan = TimeSpan.Zero;
            engine.Script.testBase = new AccessContextTestBase();
            engine.Script.testObject = new AccessContextTestBase();
        }

        [TestCleanup]
        public void TestCleanup()
        {
            engine.Dispose();
            BaseTestCleanup();
        }

        #endregion

        #region test methods

        // ReSharper disable InconsistentNaming

        [TestMethod, TestCategory("AccessContest")]
        public void AccessContext_Constructors()
        {
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase()"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(123)"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase('foo')"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(dateTime)"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(timeSpan)"));

            engine.AccessContext = GetType();
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase()"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(123)"), typeof(AccessContextTestBase));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase('foo')"));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(dateTime)"), typeof(AccessContextTestBase));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(timeSpan)"));

            engine.AccessContext = typeof(AccessContextTestObject);
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase()"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(123)"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase('foo')"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(dateTime)"), typeof(AccessContextTestBase));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(timeSpan)"));

            engine.AccessContext = typeof(AccessContextTestBase);
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase()"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(123)"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase('foo')"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(dateTime)"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(timeSpan)"), typeof(AccessContextTestBase));

            engine.AccessContext = typeof(AccessContextTestBase.PublicNestedType);
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase()"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(123)"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase('foo')"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(dateTime)"), typeof(AccessContextTestBase));
            Assert.IsInstanceOfType(engine.Evaluate("new AccessContextTestBase(timeSpan)"), typeof(AccessContextTestBase));

            engine.AccessContext = null;
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase()"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(123)"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase('foo')"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(dateTime)"));
            TestUtil.AssertException(() => engine.Evaluate("new AccessContextTestBase(timeSpan)"));
        }

        [TestMethod, TestCategory("AccessContest")]
        public void AccessContext_Events()
        {
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateEvent"), typeof(Undefined));

            engine.AccessContext = GetType();
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateEvent"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestObject);
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateEvent"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestBase);
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateEvent"), typeof(EventSource));

            engine.AccessContext = typeof(AccessContextTestBase.PublicNestedType);
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalEvent"), typeof(EventSource));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateEvent"), typeof(EventSource));

            engine.AccessContext = null;
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalEvent"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateEvent"), typeof(Undefined));
        }

        [TestMethod, TestCategory("AccessContest")]
        public void AccessContext_Fields()
        {
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.privateField"), typeof(Undefined));

            engine.AccessContext = GetType();
            Assert.IsNull(engine.Evaluate("testBase.PublicField"));
            Assert.IsNull(engine.Evaluate("testBase.InternalField"));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedField"), typeof(Undefined));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalField"));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.privateField"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestObject);
            Assert.IsNull(engine.Evaluate("testBase.PublicField"));
            Assert.IsNull(engine.Evaluate("testBase.InternalField"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedField"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalField"));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.privateField"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestBase);
            Assert.IsNull(engine.Evaluate("testBase.PublicField"));
            Assert.IsNull(engine.Evaluate("testBase.InternalField"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedField"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalField"));
            Assert.IsNull(engine.Evaluate("testBase.privateField"));

            engine.AccessContext = typeof(AccessContextTestBase.PublicNestedType);
            Assert.IsNull(engine.Evaluate("testBase.PublicField"));
            Assert.IsNull(engine.Evaluate("testBase.InternalField"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedField"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalField"));
            Assert.IsNull(engine.Evaluate("testBase.privateField"));

            engine.AccessContext = null;
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalField"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.privateField"), typeof(Undefined));
        }

        [TestMethod, TestCategory("AccessContest")]
        public void AccessContext_Methods()
        {
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateMethod"), typeof(Undefined));

            engine.AccessContext = GetType();
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateMethod"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestObject);
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateMethod"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestBase);
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateMethod"), typeof(HostMethod));

            engine.AccessContext = typeof(AccessContextTestBase.PublicNestedType);
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalMethod"), typeof(HostMethod));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateMethod"), typeof(HostMethod));

            engine.AccessContext = null;
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalMethod"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateMethod"), typeof(Undefined));
        }

        [TestMethod, TestCategory("AccessContest")]
        public void AccessContext_Properties()
        {
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateProperty"), typeof(Undefined));

            engine.AccessContext = GetType();
            Assert.IsNull(engine.Evaluate("testBase.PublicProperty"));
            Assert.IsNull(engine.Evaluate("testBase.InternalProperty"));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedProperty"), typeof(Undefined));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalProperty"));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateProperty"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestObject);
            Assert.IsNull(engine.Evaluate("testBase.PublicProperty"));
            Assert.IsNull(engine.Evaluate("testBase.InternalProperty"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedProperty"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalProperty"));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateProperty"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestBase);
            Assert.IsNull(engine.Evaluate("testBase.PublicProperty"));
            Assert.IsNull(engine.Evaluate("testBase.InternalProperty"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedProperty"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalProperty"));
            Assert.IsNull(engine.Evaluate("testBase.PrivateProperty"));

            engine.AccessContext = typeof(AccessContextTestBase.PublicNestedType);
            Assert.IsNull(engine.Evaluate("testBase.PublicProperty"));
            Assert.IsNull(engine.Evaluate("testBase.InternalProperty"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedProperty"));
            Assert.IsNull(engine.Evaluate("testBase.ProtectedInternalProperty"));
            Assert.IsNull(engine.Evaluate("testBase.PrivateProperty"));

            engine.AccessContext = null;
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PublicProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.InternalProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.ProtectedInternalProperty"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("testBase.PrivateProperty"), typeof(Undefined));
        }

        [TestMethod, TestCategory("AccessContest")]
        public void AccessContext_NestedTypes()
        {
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PublicNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.InternalNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedInternalNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PrivateNestedType"), typeof(Undefined));

            engine.AccessContext = GetType();
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PublicNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.InternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedInternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PrivateNestedType"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestObject);
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PublicNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.InternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedInternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PrivateNestedType"), typeof(Undefined));

            engine.AccessContext = typeof(AccessContextTestBase);
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PublicNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.InternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedInternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PrivateNestedType"), typeof(HostType));

            engine.AccessContext = typeof(AccessContextTestBase.PublicNestedType);
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PublicNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.InternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedInternalNestedType"), typeof(HostType));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PrivateNestedType"), typeof(HostType));

            engine.AccessContext = null;
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PublicNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.InternalNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.ProtectedInternalNestedType"), typeof(Undefined));
            Assert.IsInstanceOfType(engine.Evaluate("AccessContextTestBase.PrivateNestedType"), typeof(Undefined));
        }

        // ReSharper restore InconsistentNaming

        #endregion
    }
}

Web Proxy Viewer  |  New URL  |  Original Page