Esempio n. 1
0
        public void Next()
        {
            It("should return a promise for an IteratorResult object", () => {
                EcmaValue g = new GeneratorFunction(EmptyGenerator);
                IEnumerable <EcmaValue> g1_()
                {
                    yield return(Yield.Many(g.Call()));
                }
                EcmaValue g1 = new AsyncGeneratorFunction(g1_);
                EcmaValue p  = g1.Call().Invoke("next");
                p.Invoke("then", Intercept(result => {
                    VerifyIteratorResult(result, true);
                }));
                That(p, Is.InstanceOf(Global.Promise));
                VerifyPromiseSettled();
            });

            It("should reject promise if getter `done` abrupt completes", () => {
                EcmaValue thrownError = Error.Construct();
                EcmaValue obj         = CreateObject((Symbol.Iterator, FunctionLiteral(() => {
                    return(CreateObject(new {
                        next = FunctionLiteral(() => {
                            return CreateObject(
                                ("done", get: () => Keywords.Throw(thrownError), set: null),
                                ("value", get: () => 1, set: null)
                                );
                        })
                    }));
                })));
Esempio n. 2
0
        public void AsyncIterator(RuntimeFunction asyncIterator)
        {
            IsUnconstructableFunctionWLength(asyncIterator, "[Symbol.asyncIterator]", 0);

            AsyncGeneratorFunction generator = new AsyncGeneratorFunction(EmptyGenerator);
            EcmaValue iterProto = Object.Invoke("getPrototypeOf", Object.Invoke("getPrototypeOf", generator.Prototype));

            That(iterProto, Has.OwnProperty(Symbol.AsyncIterator, asyncIterator, EcmaPropertyAttributes.DefaultMethodProperty));

            EcmaValue thisValue = Object.Construct();

            Case(thisValue, thisValue);
        }
Esempio n. 3
0
        public void Next(RuntimeFunction next)
        {
            (EcmaValue _, EcmaValue AsyncGeneratorPrototype) = GetGeneratorAndPrototype();
            IsUnconstructableFunctionWLength(next, "next", 1);
            That(AsyncGeneratorPrototype, Has.OwnProperty("next", next, EcmaPropertyAttributes.DefaultMethodProperty));

            It("should return a promise for an IteratorResult object", () => {
                EcmaValue g      = new AsyncGeneratorFunction(EmptyGenerator);
                EcmaValue iter   = g.Call();
                EcmaValue result = iter.Invoke("next");
                result.Invoke("then", Intercept(v => {
                    VerifyIteratorResult(v, true);
                }));
                That(result, Is.InstanceOf(Global.Promise));
                VerifyPromiseSettled();
            });

            It("should not throw exception while iterator is in state executing", () => {
                EcmaValue iter           = default;
                EcmaValue executionorder = 0;
                EcmaValue valueisset     = false;

                IEnumerable <EcmaValue> g_()
                {
                    iter.Invoke("next").Invoke("then", Intercept(result => {
                        That(valueisset, Is.True, "variable valueisset should be set to true");
                        That(++executionorder, Is.EqualTo(2));
                        VerifyIteratorResult(result, false, 2);
                    }), UnexpectedReject);

                    valueisset = true;

                    yield return(1);

                    yield return(2);
                }
                EcmaValue g = new AsyncGeneratorFunction(g_);
                iter        = g.Call();

                iter.Invoke("next").Invoke("then", Intercept(result => {
                    That(++executionorder, Is.EqualTo(1));
                    VerifyIteratorResult(result, false, 1);

                    iter.Invoke("next").Invoke("then", Intercept(result_ => {
                        That(++executionorder, Is.EqualTo(3));
                        VerifyIteratorResult(result_, true);
                    }));
                }), UnexpectedReject);

                VerifyPromiseSettled();
            });

            It("should request from iterator processed in order using then", () => {
                EcmaValue yieldOrder         = 0;
                EcmaValue resolveLatePromise = default;
                EcmaValue resolveLater       = FunctionLiteral(() => {
                    return(Global.Promise.Construct(FunctionLiteral(resolve => {
                        resolveLatePromise = resolve;
                    })));
                });

                IEnumerable <EcmaValue> g_()
                {
                    yield return(resolveLater.Call());

                    yield return(++yieldOrder);
                }
                EcmaValue g    = new AsyncGeneratorFunction(g_);
                EcmaValue iter = g.Call();
                That(yieldOrder, Is.Zero);

                EcmaValue item1 = iter.Invoke("next");
                EcmaValue item2 = iter.Invoke("next");
                EcmaValue item3 = iter.Invoke("next");

                EcmaValue resolvedorder = 0;
                item1.Invoke("then", Intercept(result => {
                    resolvedorder++;
                    That(resolvedorder, Is.EqualTo(1));
                    VerifyIteratorResult(result, false, 1);
                }));
                item2.Invoke("then", Intercept(result => {
                    resolvedorder++;
                    That(resolvedorder, Is.EqualTo(2));
                    VerifyIteratorResult(result, false, 2);
                }));
                item3.Invoke("then", Intercept(result => {
                    resolvedorder++;
                    That(resolvedorder, Is.EqualTo(3));
                    VerifyIteratorResult(result, true);
                }));

                resolveLatePromise.Call(default, ++yieldOrder);