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) ); }) })); })));
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); }
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);