public void ConverterExposesStaticAndInstanceEvents()
        {
            var script = @"
var count = 0;
Foo.addEventListener('myStaticEvent', () => { count++; });
var myFoo = new Foo();
myFoo.addEventListener('myEvent', () => { count++; });
myFoo.bonk();
export default count;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsNumber>(script);
                        Assert.Equal(2, result.ToInt32());
                    }
                }
            }
        }
Beispiel #2
0
        public void ConverterDoesNotIncludeIgnoredProperties()
        {
            var script = @"
Foo.myStaticProperty = 'test123';
var myFoo = new Foo();
export default myFoo;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        HasIgnoredProperties.MyStaticProperty = "Not Set";
                        ctx.Converter.TryFromObject(ctx, typeof(HasIgnoredProperties), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsObject>(script);
                        Assert.Equal("Not Set", HasIgnoredProperties.MyStaticProperty);
                        Assert.Equal("undefined", result["myProperty"].ToString());
                    }
                }
            }
        }
        public void CallingRemoveAllEventListenerWithNullThisThrows()
        {
            var script = @"
var myFoo = new Foo();
myFoo.removeAllEventListeners.call(null, 'myEvent');
export default result;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasMultipleEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule <JsBoolean>(script);
                        });
                    }
                }
            }
        }
        public void ConverterDoesNotIncludeIgnoredEvents()
        {
            var script = @"
var count = 0;
Foo.addEventListener('myStaticEvent', () => { count++; });
var myFoo = new Foo();
var result = myFoo.addEventListener('myEvent', () => { count++; });
export default result;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasIgnoredEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsBoolean>(script);
                        Assert.False(result.ToBoolean());
                    }
                }
            }
        }
        public void AttemptingToRemoveUnRegisteredEventReturnsFalse()
        {
            var script = @"
var count = 0;
var dracula = 0;
var myFoo = new Foo();
var incCount = () => { count++; };
var incDrac = () => { dracula++; };
myFoo.addEventListener('mySuperEvent', incCount);
var result = myFoo.removeEventListener('mySuperEvent', incDrac);

export default result;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasMultipleEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsBoolean>(script);
                        Assert.False(result);
                    }
                }
            }
        }
        public void WhenRemovingAllEventListenersEventTypeMustBeSpecified()
        {
            var script = @"
var myFoo = new Foo();
myFoo.removeAllEventListeners('', () => {});

export default '123';
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasMultipleEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule <JsObject>(script);
                        });
                    }
                }
            }
        }
        public void WhenRemovingEventListenersEventTypeMustBeSpecified()
        {
            var script = @"
var count = 0;
var dracula = 0;
var myFoo = new Foo();
var incCount = () => { count++; };
var incDrac = () => { dracula++; };
myFoo.addEventListener('mySuperEvent', incCount);
myFoo.addEventListener('mySuperEvent', incDrac);
myFoo.bonk();

myFoo.removeEventListener('', incCount);
myFoo.bonk();

export default { count, dracula };
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasMultipleEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule <JsObject>(script);
                        });
                    }
                }
            }
        }
Beispiel #8
0
        public void ConverterUsesPropertyAttributesForNaming()
        {
            var script = @"
Foo.mySuperStaticProperty = 'test123';
var myFoo = new Foo();
myFoo.myProperty = '123Test';
export default myFoo;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        HasNamedProperties.MyStaticProperty = "Not Set";
                        ctx.Converter.TryFromObject(ctx, typeof(HasNamedProperties), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsObject>(script);
                        Assert.Equal("test123", HasNamedProperties.MyStaticProperty);
                        Assert.Equal("Not Set", result["mySuperProperty"].ToString());
                    }
                }
            }
        }
        public void JsModulesThatRejectPromisesWillThrow()
        {
            var script = @"
var result = new Promise((resolve, reject) => {
        reject('No. Bad.');
    });
export default result;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime(JavaScriptRuntimeAttributes.None))
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        Assert.Throws <JsScriptException>(() =>
                        {
                            try
                            {
                                var result = ctx.EvaluateModule(script);
                            }
                            catch (JsScriptException ex)
                            {
                                Assert.Equal("No. Bad.", ex.Message);
                                throw;
                            }
                        });
                    }
                }
            }
        }
        public void JsModulesCanBeDynamicallyProvided()
        {
            var script       = @"
import banana from 'banana';
export default 'hello, world! ' + banana;
";
            var bananaModule = new BaristaScriptModule("banana")
            {
                Script = @"
export default 'banana';
"
            };

            ModuleLoader.RegisterModule(bananaModule);

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        var result = ctx.EvaluateModule(script);

                        Assert.True(result.ToString() == "hello, world! banana");
                    }
                }
            }
        }
        public void CanRemoveIndividualEvents()
        {
            var script = @"
var count = 0;
var dracula = 0;
var myFoo = new Foo();
var incCount = () => { count++; };
var incDrac = () => { dracula++; };
myFoo.addEventListener('mySuperEvent', incCount);
myFoo.addEventListener('mySuperEvent', incDrac);
myFoo.bonk();

myFoo.removeEventListener('mySuperEvent', incCount);
myFoo.bonk();

export default { count, dracula };
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasMultipleEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsObject>(script);
                        Assert.Equal(1, result["count"].ToInt32());
                        Assert.Equal(2, result["dracula"].ToInt32());
                    }
                }
            }
        }
        public void JsModulesCanUseResourceStrings()
        {
            var script       = @"
import banana from 'banana';
export default 'hello, world! ' + banana;
";
            var bananaModule = new BaristaResourceScriptModule("banana", Properties.Resources.ResourceManager)
            {
                ResourceName = "String1"
            };

            ModuleLoader.RegisterModule(bananaModule);

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        var result = ctx.EvaluateModule(script);

                        Assert.Equal("hello, world! hello, world!", result.ToString());
                    }
                }
            }
        }
        public void BaristaModuleThrowsIfNameNotSpecified()
        {
            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var converter           = m_provider.GetRequiredService <IBaristaConversionStrategy>();
                    var moduleRecordFactory = m_provider.GetRequiredService <IBaristaModuleRecordFactory>();
                    var moduleLoader        = m_provider.GetRequiredService <IBaristaModuleLoader>();

                    using (ctx.Scope())
                    {
                        var specifier    = ctx.CreateString("");
                        var moduleHandle = rt.Engine.JsInitializeModuleRecord(JavaScriptModuleRecord.Invalid, specifier.Handle);

                        try
                        {
                            Assert.Throws <ArgumentNullException>(() =>
                            {
                                var mod = new BaristaModuleRecord(null, specifier.Handle, null, rt.Engine, ctx, moduleRecordFactory, moduleLoader, moduleHandle);
                            });
                        }
                        finally
                        {
                            //Without disposing of the moduleHandle, the runtime *will* crash the process.
                            moduleHandle.Dispose();
                        }
                    }
                }
            }

            Assert.True(true);
        }
        public void BaristaModuleCanReferenceItself()
        {
            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var converter           = m_provider.GetRequiredService <IBaristaConversionStrategy>();
                    var moduleRecordFactory = m_provider.GetRequiredService <IBaristaModuleRecordFactory>();
                    var moduleLoader        = m_provider.GetRequiredService <IBaristaModuleLoader>();

                    using (ctx.Scope())
                    {
                        var specifier    = ctx.CreateString("");
                        var moduleHandle = rt.Engine.JsInitializeModuleRecord(JavaScriptModuleRecord.Invalid, specifier.Handle);

                        try
                        {
                            var mod = new BaristaModuleRecord("foo", specifier.Handle, null, rt.Engine, ctx, moduleRecordFactory, moduleLoader, moduleHandle);
                            mod.ParseModuleSource("import foo from 'foo'; export default 'hello, world!'");
                            Assert.True(mod.IsReady);
                        }
                        finally
                        {
                            //Without disposing of the moduleHandle, the runtime *will* crash the process.
                            moduleHandle.Dispose();
                        }
                    }
                }
            }

            Assert.True(true);
        }
Beispiel #15
0
 public void JsModulesCannotBeEvaluatedWhenContextIsDisposed()
 {
     using (var rt = BaristaRuntimeFactory.CreateRuntime())
     {
         using (var ctx = rt.CreateContext())
         {
             ctx.Dispose();
             Assert.Throws <ObjectDisposedException>(() =>
             {
                 ctx.EvaluateModule("export default 'asdf';");
             });
         }
     }
 }
 public void ConverterUsesMethodAttributesForNaming()
 {
     using (var rt = BaristaRuntimeFactory.CreateRuntime())
     {
         using (var ctx = rt.CreateContext())
         {
             using (ctx.Scope())
             {
                 ctx.Converter.TryFromObject(ctx, typeof(HasNamedMethods), out JsValue value);
                 var foo = value as JsFunction;
                 Assert.Equal("function () { [native code] }", foo["mySuperStaticMethod"].ToString());
                 var fooInstance = foo.Construct();
                 Assert.Equal("function () { [native code] }", fooInstance["mySuperMethod"].ToString());
             }
         }
     }
 }
 public void ConverterDoesNotIncludeIgnoredMethods()
 {
     using (var rt = BaristaRuntimeFactory.CreateRuntime())
     {
         using (var ctx = rt.CreateContext())
         {
             using (ctx.Scope())
             {
                 ctx.Converter.TryFromObject(ctx, typeof(HasIgnoredMethods), out JsValue value);
                 var foo = value as JsFunction;
                 Assert.Equal("undefined", foo["myStaticMethod"].ToString());
                 var fooInstance = foo.Construct();
                 Assert.Equal("undefined", fooInstance["myMethod"].ToString());
             }
         }
     }
 }
Beispiel #18
0
        public void JsModulesWillExecuteEvenWithoutATaskQueue()
        {
            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                var converter               = m_provider.GetRequiredService <IBaristaConversionStrategy>();
                var valueFactoryBuilder     = m_provider.GetRequiredService <IBaristaValueFactoryBuilder>();
                var moduleRecordFactory     = m_provider.GetRequiredService <IBaristaModuleRecordFactory>();
                IPromiseTaskQueue taskQueue = null;

                var contextHandle = rt.Engine.JsCreateContext(rt.Handle);
                using (var ctx = new BaristaContext(rt.Engine, valueFactoryBuilder, converter, moduleRecordFactory, taskQueue, contextHandle))
                {
                    var result = ctx.EvaluateModule("export default 'foo';");
                    Assert.Equal("foo", result.ToString());
                }
                Assert.True(contextHandle.IsClosed);
            }
        }
Beispiel #19
0
        public void JsModulesCanBeEvaluated()
        {
            var script = @"
export default 'hello, world!';
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        var result = ctx.EvaluateModule(script);
                        Assert.True(result.ToString() == "hello, world!");
                    }
                }
            }
        }
Beispiel #20
0
        public void BaristaModulesCanReturnJsValues()
        {
            var script             = @"
        import helloworld from 'hello_world';
        export default helloworld;
        ";
            var myHelloWorldModule = new HelloWorldModule();

            ModuleLoader.RegisterModule(myHelloWorldModule);

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule(script);

                    Assert.Equal("Hello, World!", result.ToString());
                }
            }
        }
Beispiel #21
0
        public void JsModulesWithErrorsWillThrow()
        {
            var script = @"
export default asdf@11;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule(script);
                        });
                    }
                }
            }
        }
Beispiel #22
0
        public void BaristaModulesCanReturnSafeHandles()
        {
            var script          = @"
        import reverse from 'reverse';
        export default reverse('hello, world!');
        ";
            var myReverseModule = new ReverseModule();

            ModuleLoader.RegisterModule(myReverseModule);

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule(script);

                    Assert.Equal("!dlrow ,olleh", result.ToString());
                }
            }
        }
Beispiel #23
0
        public void JsModulesThatImportUnknownModulesWillThrow()
        {
            var script = @"
import soAmazing from 'myModule';
export default soAmazing;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime(JavaScriptRuntimeAttributes.None))
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule(script);
                        });
                    }
                }
            }
        }
Beispiel #24
0
        public void BaristaModulesCanReturnNativeObjects()
        {
            var script          = @"
        import fourtytwo from 'FourtyTwo';
        export default fourtytwo;
        ";
            var fourtyTwoModule = new FourtyTwoModule();

            ModuleLoader.RegisterModule(fourtyTwoModule);

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule <JsNumber>(script);

                    Assert.NotNull(result);
                    Assert.Equal(42, result.ToInt32());
                }
            }
        }
        public void JsModulesContainingPromisesCanBeEvaluated()
        {
            var script = @"
var result = new Promise((resolve, reject) => {
        resolve('hello, world!');
    });
export default result;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime(JavaScriptRuntimeAttributes.None))
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        var result = ctx.EvaluateModule(script);
                        Assert.True(result.ToString() == "hello, world!");
                    }
                }
            }
        }
Beispiel #26
0
        public void BaristaFawltyModulesWillThrow()
        {
            var script       = @"
        import derp from 'Fawlty';
        export default derp;
        ";
            var fawltyModule = new FawltyModule();

            ModuleLoader.RegisterModule(fawltyModule);

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    Assert.Throws <JsScriptException>(() =>
                    {
                        var result = ctx.EvaluateModule <JsNumber>(script);
                    });
                }
            }
        }
        public void MustSpecifyANameToRegisterAndRemoveListeners()
        {
            var script  = @"
var count = 0;
var myFoo = new Foo();
myFoo.addEventListener('', () => { count++; });
export default count;
";
            var script2 = @"
var count = 0;
var myFoo = new Foo();
myFoo.addEventListener('foo', () => { count++; });
myFoo.removeAllListeners('', () => { count++; });
export default count;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasInstanceEvents), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule <JsNumber>(script);
                        });

                        ctx.CurrentScope.GetAndClearException();

                        Assert.Throws <JsScriptException>(() =>
                        {
                            var result = ctx.EvaluateModule <JsNumber>(script2);
                        });
                    }
                }
            }
        }
Beispiel #28
0
        public void MultipleModulesCanBeRegisteredAndUsed()
        {
            var script = @"
        import helloWorld from 'hello_world';
        import fourtytwo from 'FourtyTwo';
        export default helloWorld + ' ' + fourtytwo;
        ";

            ModuleLoader.RegisterModule(new FourtyTwoModule());
            ModuleLoader.RegisterModule(new HelloWorldModule());

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule <JsString>(script);

                    Assert.NotNull(result);
                    Assert.Equal("Hello, World! 42", result.ToString());
                }
            }
        }
Beispiel #29
0
        public void ConverterExposesIndexerPropertiesThatThrowIfInsufficientArguments()
        {
            var script = @"
var myFoo = new Foo();
var thing = myFoo.getItemAt();
export default myFoo;
";

            var script1 = @"
var myFoo = new Foo();
myFoo.setItemAt(1);
export default myFoo;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasIndexerProperty), out JsValue value);
                        ctx.GlobalObject["Foo"] = (value as JsObject);

                        Assert.Throws <JsScriptException>(() =>
                        {
                            ctx.EvaluateModule <JsObject>(script);
                        });

                        ctx.CurrentScope.GetAndClearException();

                        Assert.Throws <JsScriptException>(() =>
                        {
                            ctx.EvaluateModule <JsObject>(script1);
                        });
                    }
                }
            }
        }
        public void ProjectedMethodsWillBeCalledEvenIfExcessArgumentsSupplied()
        {
            var script = @"
var myFoo = new Foo();
myFoo.callHome('123', '456', '789');
export default myFoo;
";

            using (var rt = BaristaRuntimeFactory.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    using (ctx.Scope())
                    {
                        ctx.Converter.TryFromObject(ctx, typeof(HasMultipleMethods), out JsValue value);
                        ctx.GlobalObject["Foo"] = value;

                        var result = ctx.EvaluateModule <JsObject>(script);
                        Assert.Equal("Called String", result["whichMethod"].ToString());
                    }
                }
            }
        }