scope test_LeftArrowScriptAutoCompleter svoid test_LeftArrowScriptAutoCompleter() { new GazelleV_LeftArrowScriptParser parser; LeftArrowScriptAutoCompleter completer = new(parser); // simple test for completing global function name completer.globalMethodNames = -> ll("add", "pat", "lol"); completer.parser.noImports(); assertEmpty(completer.parser.globalClassNames()); completer.seek("a", 1); assertEqualsVerbose("a", completer.typedCharacters()); assertEqualsVerbose(ll("add", "pat", "false"), completer.getCompletions()); // test that completed word is not shown as suggestion parser = new GazelleV_LeftArrowScriptParser; completer = new LeftArrowScriptAutoCompleter(parser); completer.globalMethodNames = -> ll("add", "pat", "lol"); completer.parser.importedPackages = -> null; // to suppress class names being returned completer.seek("add", 3); assertFalseVerbose(contains(completer.getCompletions(), "add")); // test for standard function arguments (untyped, will break when // we introduce typing) parser = new GazelleV_LeftArrowScriptParser; completer = new LeftArrowScriptAutoCompleter(parser); completer.globalMethodNames = -> ll("add", "pat", "lol"); completer.parser.importedPackages = -> null; // to suppress class names being returned completer.seek("add ", 4); assertContainsAll(completer.getCompletions(), ll("true", "false", "null")); // complete class name for (S text : ll("Mat", "Mat ")) { parser = new GazelleV_LeftArrowScriptParser; // restore class finding completer = new LeftArrowScriptAutoCompleter(parser); completer.seek(printQuoted(+text), 3); var completions = completer.getCompletions(); pnlReversed(takeFirst(10, completions)); assertEquals(0, indexOf(completions, "Math")); } // same after "new" parser = new GazelleV_LeftArrowScriptParser; // restore class finding completer = new LeftArrowScriptAutoCompleter(parser); completer.seek(print("new Inte"), 8); var completions = completer.getCompletions(); pnlReversed(takeFirst(10, completions)); assertEquals(0, indexOf(completions, "Integer")); // find inner classes of global function container parser = new GazelleV_LeftArrowScriptParser; // restore class finding parser.allowTheWorld(FunctionContainer.class); completer = new LeftArrowScriptAutoCompleter(parser); completer.seek(print("MyN"), 3); completions = completer.getCompletions(); pnlReversed(takeFirst(10, completions)); assertEquals(0, indexOf(completions, "MyName")); // auto-complete global script-defined functions parser = new GazelleV_LeftArrowScriptParser; parser.functionDefs.put("hello", new GazelleV_LeftArrowScript.FunctionDef); completer = new LeftArrowScriptAutoCompleter(parser); completer.seekEnd("he"); completions = completer.getCompletions(); assertContains(completions, "hello"); testVars(); testMethodsOfNewInstance(); printWithPrecedingNL("Auto-completer works!"); } svoid #testVars { // auto-complete variable names var parser = new GazelleV_LeftArrowScriptParser; parser.noImports(); var completer = new LeftArrowScriptAutoCompleter(parser); completer.seekEnd("a <- 1\n"); pnl("knowVarsByTokenIdx", completer.knownVarsByTokenIdx); assertSetsEqual(print(listPlus(completer.predefinedExpressions(), "a")), print(completer.getCompletions())); } svoid #testMethodsOfNewInstance { var parser = new GazelleV_LeftArrowScriptParser; parser.noImports(); var completer = new LeftArrowScriptAutoCompleter(parser); completer.seekEnd("new Double, "); assertContains(print(completer.getCompletions()), "doubleValue"); } sclass #FunctionContainer { class MyName {} }