@@ -680,6 +680,61 @@ export class LuaLoopTests
680680 + "the TupleReturn decorator." ) ;
681681 }
682682
683+ @Test ( "forof forwarded lua iterator" )
684+ public forofForwardedLuaIterator ( ) : void {
685+ const code =
686+ `const arr = ["a", "b", "c"];
687+ /** @luaIterator */
688+ function luaIter(): Iterable<string> {
689+ let i = 0;
690+ function iter() { return arr[i++]; }
691+ return iter as any;
692+ }
693+ /** @luaIterator */
694+ function forward(): Iterable<string> {
695+ return luaIter();
696+ }
697+ let result = "";
698+ for (let a of forward()) { result += a; }
699+ return result;` ;
700+ const compilerOptions = {
701+ luaLibImport : LuaLibImportKind . Require ,
702+ luaTarget : LuaTarget . Lua53 ,
703+ target : ts . ScriptTarget . ES2015 ,
704+ } ;
705+ const result = util . transpileAndExecute ( code , compilerOptions ) ;
706+ Expect ( result ) . toBe ( "abc" ) ;
707+ }
708+
709+ @Test ( "forof forwarded lua iterator with tupleReturn" )
710+ public forofForwardedLuaIteratorWithTupleReturn ( ) : void {
711+ const code =
712+ `const arr = ["a", "b", "c"];
713+ /** @luaIterator */
714+ /** @tupleReturn */
715+ function luaIter(): Iterable<[string, string]> {
716+ let i = 0;
717+ /** @tupleReturn */
718+ function iter() { return arr[i] && [i.toString(), arr[i++]] || []; }
719+ return iter as any;
720+ }
721+ /** @luaIterator */
722+ /** @tupleReturn */
723+ function forward(): Iterable<[string, string]> {
724+ return luaIter();
725+ }
726+ let result = "";
727+ for (let [a, b] of forward()) { result += a + b; }
728+ return result;` ;
729+ const compilerOptions = {
730+ luaLibImport : LuaLibImportKind . Require ,
731+ luaTarget : LuaTarget . Lua53 ,
732+ target : ts . ScriptTarget . ES2015 ,
733+ } ;
734+ const result = util . transpileAndExecute ( code , compilerOptions ) ;
735+ Expect ( result ) . toBe ( "0a1b2c" ) ;
736+ }
737+
683738 @TestCase ( "while (a < b) { i++; }" )
684739 @TestCase ( "do { i++; } while (a < b)" )
685740 @TestCase ( "for (let i = 0; i < 3; i++) {}" )
0 commit comments