/* * JBoss, Home of Professional Open Source. * Copyright 2015, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.cli.parsing.test; import java.io.File; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import org.jboss.as.cli.CommandContext; import org.jboss.as.cli.CommandContextFactory; import org.jboss.as.cli.Util; import org.jboss.as.cli.impl.ValueTypeCompleter; import org.jboss.as.cli.impl.ValueTypeCompleter.CapabilityCompleterFactory; import org.jboss.as.cli.operation.OperationRequestAddress; import org.jboss.as.cli.operation.impl.CapabilityReferenceCompleter; import org.jboss.dmr.ModelNode; import org.junit.Test; /** * * @author Alexey Loubyansky */ public class ValueTypeCompletionTestCase { private static final String role_mapper = "{\n" + " \"type\" => LIST,\n" + " \"description\" => \"The referenced role mappers to aggregate.\",\n" + " \"expressions-allowed\" => false,\n" + " \"required\" => true,\n" + " \"nillable\" => false,\n" + " \"capability-reference\" => \"org.wildfly.security.role-mapper\",\n" + " \"value-type\" => STRING\n" + " }"; private static final String nested_objects = "{\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1_1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1_1_1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1_1_1_1\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop1_1_1_2\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop1_1_1_3\" => {\n" + " \"type\" => BOOLEAN,\n" + " }\n" + " }\n" + " },\n" + " \"prop1_1_2\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1_1_2_1\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop1_1_2_2\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop1_1_2_3\" => {\n" + " \"type\" => BOOLEAN,\n" + " }\n" + " }\n" + " }\n" + " }\n" + " },\n" + " \"prop1_2\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1_2_1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop1_2_1_1\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop1_2_1_2\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop1_2_1_3\" => {\n" + " \"type\" => BOOLEAN,\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " },\n" + " \"prop2\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop2_1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop2_1_1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop2_1_1_1\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop2_1_1_2\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop2_1_1_3\" => {\n" + " \"type\" => BOOLEAN,\n" + " }\n" + " }\n" + " },\n" + " \"prop2_1_2\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop2_1_2_1\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop2_1_2_2\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop2_1_2_3\" => {\n" + " \"type\" => BOOLEAN,\n" + " }\n" + " }\n" + " }\n" + " }\n" + " },\n" + " \"prop2_2\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop2_2_1\" => {\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => {\n" + " \"prop2_2_1_1\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop2_2_1_2\" => {\n" + " \"type\" => BOOLEAN,\n" + " },\n" + " \"prop2_2_1_3\" => {\n" + " \"type\" => BOOLEAN,\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n"; private static final String nested_lists = "{\n" + " \"type\" => LIST,\n" + " \"description\" => \"The defined permission mappings.\",\n" + " \"expressions-allowed\" => false,\n" + " \"required\" => false,\n" + " \"nillable\" => false,\n" + " \"value-type\" => LIST" + " }\n"; private static final String simple_map = "{\n" + " \"type\" => OBJECT,\n" + " \"value-type\" => STRING" + " }\n"; private static final String elytron_simple_permission_mapper_add = "{\n" + " \"type\" => LIST,\n" + " \"description\" => \"The defined permission mappings.\",\n" + " \"expressions-allowed\" => false,\n" + " \"required\" => false,\n" + " \"nillable\" => false,\n" + " \"value-type\" => {\n" + " \"principals\" => {\n" + " \"type\" => LIST,\n" + " \"description\" => \"Principals to compare when mapping permissions, if the identities principal matches any one in the list it is a match.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"value-type\" => STRING\n" + " },\n" + " \"roles\" => {\n" + " \"type\" => LIST,\n" + " \"description\" => \"Roles to compare when mapping permissions, if the identity is a member of any one in the list it is a match.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"value-type\" => STRING\n" + " },\n" + " \"permissions\" => {\n" + " \"type\" => LIST,\n" + " \"description\" => \"The permissions to assign in the event of a match.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => false,\n" + " \"value-type\" => {\n" + " \"class-name\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The fully qualified class name of the permission.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => false,\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " },\n" + " \"module\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The module to use to load the permission.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " },\n" + " \"target-name\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The target name to pass to the permission as it is constructed.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " },\n" + " \"action\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The action to pass to the permission as it is constructed.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }"; private static final String compositeSteps = "{\n" + " \"type\" => LIST,\n" + " \"description\" => \"A list of the operation requests that constitute the composite request.\",\n" + " \"expressions-allowed\" => false,\n" + " \"required\" => true,\n" + " \"nillable\" => false,\n" + " \"value-type\" => OBJECT\n" + " }"; private static final String jgroupsProtocolsAdd = "{\n" + " \"type\" => LIST,\n" + " \"description\" => \"The list of configured protocols for a protocol stack.\",\n" + " \"expressions-allowed\" => false,\n" + " \"required\" => false,\n" + " \"nillable\" => true,\n" + " \"deprecated\" => {\n" + " \"since\" => \"3.0.0\",\n" + " \"reason\" => \"Deprecated. Use separate protocol add operations instead.\"\n" + " },\n" + " \"value-type\" => {\n" + " \"type\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The implementation class for a protocol, which determines protocol functionality.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " },\n" + " \"socket-binding\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"Optional socket binding specification for this protocol layer, used to specify IP interfaces and ports for communication.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"capability-reference\" => \"org.wildfly.network.socket-binding\",\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " },\n" + " \"properties\" => {\n" + " \"type\" => OBJECT,\n" + " \"description\" => \"Optional LIST parameter specifying the protocol list for the stack.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"default\" => {},\n" + " \"value-type\" => STRING\n" + " }\n" + " }\n" + " }"; private static final String loginModulesDescr = "{" + "\"type\" => LIST," + "\"description\" => \"List of authentication modules\"," + "\"expressions-allowed\" => false," + "\"required\" => true," + "\"nillable\" => false," + "\"value-type\" => {" + " \"code\" => {" + " \"description\" => \"Class name of the module to be instantiated.\"," + " \"type\" => BOOLEAN," + " \"nillable\" => false" + " }," + " \"flag\" => {" + " \"description\" => \"The flag controls how the module participates in the overall procedure.\"," + " \"type\" => STRING," + " \"nillable\" => false," + " \"allowed\" => [" + " \"required\"," + " \"requisite\"," + " \"sufficient\"," + " \"optional\"" + " ]" + " }," + " \"module\" => {" + " \"type\" => STRING," + " \"nillable\" => true," + " \"description\" => \"Name of JBoss Module where the login module code is located.\"" + " }," + " \"module-options\" => {" + " \"description\" => \"List of module options containing a name/value pair.\"," + " \"type\" => OBJECT," + " \"value-type\" => STRING," + " \"nillable\" => true" + " }," + " \"aa\" => {" + " \"description\" => \"smth\"," + " \"type\" => OBJECT," + " \"value-type\" => {" + " \"ab1\" => {" + " \"description\" => \"smth\"," + " \"type\" => STRING," + " }," + " \"ab2\" => {" + " \"description\" => \"smth\"," + " \"type\" => STRING," + " }," + " \"ac1\" => {" + " \"description\" => \"smth\"," + " \"type\" => BOOLEAN," + " }" + " }" + " }," + " \"bb\" => {" + " \"description\" => \"smth\"," + " \"type\" => LIST," + " \"value-type\" => {" + " \"bb1\" => {" + " \"description\" => \"smth\"," + " \"type\" => STRING," + " }," + " \"bb2\" => {" + " \"description\" => \"smth\"," + " \"type\" => STRING," + " }," + " \"bc1\" => {" + " \"description\" => \"smth\"," + " \"type\" => STRING," + " }" + " }" + " }," + " \"cc\" => {" + " \"description\" => \"smth\"," + " \"type\" => LIST," + " \"value-type\" => STRING" + " }" + " }" + "}"; private static final String FILTER_DESCRIPTION = "{\n" + " \"type\" => OBJECT,\n" + " \"description\" => \"Defines a simple filter type.\",\n" + " \"expressions-allowed\" => false,\n" + " \"required\" => false,\n" + " \"nillable\" => true,\n" + " \"alternatives\" => [\"filter-spec\"],\n" + " \"deprecated\" => {\n" + " \"since\" => \"1.2.0\",\n" + " \"reason\" => \"Use filter-spec.\"\n" + " },\n" + " \"value-type\" => {\n" + " \"all\" => {\n" + " \"type\" => OBJECT,\n" + " \"description\" => \"A filter consisting of several filters in a chain. If any filter finds the log message to be unloggable,the message will not be logged and subsequent filters will not be checked.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"value-type\" => {\n" + " \"accept\" => {\n" + " \"type\" => BOOLEAN,\n" + " \"description\" => \"Accepts all log messages.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"default\" => true\n" + " },\n" + " \"change-level\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"A filter which modifies the log record with a new level if the nested filter evaluates true for that record.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"allowed\" => [\n" + " \"ALL\",\n" + " \"FINEST\",\n" + " \"FINER\",\n" + " \"TRACE\",\n" + " \"DEBUG\",\n" + " \"FINE\",\n" + " \"CONFIG\",\n" + " \"INFO\",\n" + " \"WARN\",\n" + " \"WARNING\",\n" + " \"ERROR\",\n" + " \"SEVERE\",\n" + " \"FATAL\",\n" + " \"OFF\"\n" + " ]\n" + " },\n" + " \"deny\" => {\n" + " \"type\" => BOOLEAN,\n" + " \"description\" => \"Denys all log messages.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"default\" => true\n" + " },\n" + " \"level\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"A filter which excludes a message with the specified level.\",\n" + " \"expressions-allowed\" => true,\n" + " \"nillable\" => true,\n" + " \"default\" => \"ALL\",\n" + " \"allowed\" => [\n" + " \"ALL\",\n" + " \"FINEST\",\n" + " \"FINER\",\n" + " \"TRACE\",\n" + " \"DEBUG\",\n" + " \"FINE\",\n" + " \"CONFIG\",\n" + " \"INFO\",\n" + " \"WARN\",\n" + " \"WARNING\",\n" + " \"ERROR\",\n" + " \"SEVERE\",\n" + " \"FATAL\",\n" + " \"OFF\"\n" + " ]\n" + " },\n" + " \"level-range\" => {\n" + " \"type\" => OBJECT,\n" + " \"description\" => \"A filter which logs only messages that fall within a level range.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"value-type\" => {\n" + " \"min-level\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The minimum (least severe) level, inclusive.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => false,\n" + " \"allowed\" => [\n" + " \"ALL\",\n" + " \"FINEST\",\n" + " \"FINER\",\n" + " \"TRACE\",\n" + " \"DEBUG\",\n" + " \"FINE\",\n" + " \"CONFIG\",\n" + " \"INFO\",\n" + " \"WARN\",\n" + " \"WARNING\",\n" + " \"ERROR\",\n" + " \"SEVERE\",\n" + " \"FATAL\",\n" + " \"OFF\"\n" + " ]\n" + " },\n" + " \"min-inclusive\" => {\n" + " \"type\" => BOOLEAN,\n" + " \"description\" => \"True if the min-level value is inclusive, false if it is exclusive.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"default\" => true\n" + " },\n" + " \"max-level\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"The maximum (most severe) level, inclusive.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => false,\n" + " \"allowed\" => [\n" + " \"ALL\",\n" + " \"FINEST\",\n" + " \"FINER\",\n" + " \"TRACE\",\n" + " \"DEBUG\",\n" + " \"FINE\",\n" + " \"CONFIG\",\n" + " \"INFO\",\n" + " \"WARN\",\n" + " \"WARNING\",\n" + " \"ERROR\",\n" + " \"SEVERE\",\n" + " \"FATAL\",\n" + " \"OFF\"\n" + " ]\n" + " },\n" + " \"max-inclusive\" => {\n" + " \"type\" => BOOLEAN,\n" + " \"description\" => \"True if the max-level value is inclusive, false if it is exclusive.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"default\" => true\n" + " }\n" + " }\n" + " }" + " }" + " }," + " \"match\" => {\n" + " \"type\" => STRING,\n" + " \"description\" => \"A regular-expression-based filter. Used to exclude log records which match or don't match the expression. The regular expression is checked against the raw (unformatted) message.\",\n" + " \"expressions-allowed\" => false,\n" + " \"nillable\" => true,\n" + " \"min-length\" => 1L,\n" + " \"max-length\" => 2147483647L\n" + " }," + " }" + " }"; private static final String VALUETYPE_WITH_FILES = "{ \"value-type\": \n" + " {\n" + " \"p1_a\": {\n" + " \"type\": \"INT\",\n" + " \"" + Util.FILESYSTEM_PATH + "\": true\n" + " },\n" + " \"p2_a\": {\n" + " \"type\": \"INT\",\n" + " \"" + Util.FILESYSTEM_PATH + "\": true\n" + " },\n" + " \"p3\": {\n" + " \"type\": \"LIST\",\n" + " \"description\": \"\",\n" + " \"value-type\": {\n" + " \"oo_file_a\": {\n" + " \"type\": \"INT\",\n" + " \"" + Util.FILESYSTEM_PATH + "\": true\n" + " },\n" + " \"ii_file\": {\n" + " \"type\": \"STRING\"\n" + " }\n" + " }\n" + " },\n" + " \"p4\": {\n" + " \"type\": \"OBJECT\",\n" + " \"description\": \"\",\n" + " \"value-type\": {\n" + " \"oo_file_a\": {\n" + " \"type\": \"INT\",\n" + " \"" + Util.FILESYSTEM_PATH + "\": true\n" + " },\n" + " \"ii_file\": {\n" + " \"type\": \"STRING\"\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n"; @Test public void testFilter() throws Exception { final ModelNode propDescr = ModelNode.fromString(FILTER_DESCRIPTION); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "{", 0, candidates); assertEquals(Arrays.asList(new String[]{"all", "match"}), candidates); assertEquals(1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{all={", 0, candidates); assertEquals(Arrays.asList(new String[]{"accept", "change-level", "deny", "level", "level-range"}), candidates); assertEquals(6, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{all={change-level=", 0, candidates); assertEquals(Arrays.asList(new String[]{"ALL", "CONFIG", "DEBUG", "ERROR", "FATAL", "FINE", "FINER", "FINEST", "INFO", "OFF", "SEVERE", "TRACE", "WARN", "WARNING"}), candidates); assertEquals(19, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{all={change-level=ALL,deny=true," + "level=ALL,level-range={},match=cds,not={}," + "replace={pattern=cdsc},accept=true", 0, candidates); assertEquals(Arrays.asList("}"), candidates); assertEquals(109, i); } @Test public void testLoginModules() throws Exception { final ModelNode propDescr = ModelNode.fromString(loginModulesDescr); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<String>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "", 0, candidates); assertEquals(Collections.singletonList("["), candidates); assertEquals(0, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[", 0, candidates); assertEquals(Arrays.asList(new String[]{"{"}), candidates); assertEquals(1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{", 0, candidates); assertEquals(Arrays.asList(new String[]{"aa", "bb", "cc", "code", "flag", "module", "module-options"}), candidates); assertEquals(2, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{f", 0, candidates); assertEquals(Collections.singletonList("flag"), candidates); assertEquals(2, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{m", 0, candidates); assertEquals(Arrays.asList(new String[]{"module", "module-options"}), candidates); assertEquals(2, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{module", 0, candidates); assertEquals(Arrays.asList(new String[]{"module", "module-options"}), candidates); assertEquals(2, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{module=", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*7*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{module=m", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*7*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{flag = ", 0, candidates); assertEquals(Arrays.asList(new String[]{"optional", "required", "requisite", "sufficient"}), candidates); assertEquals(8, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{flag= s", 0, candidates); assertEquals(Collections.singletonList("sufficient"), candidates); assertEquals(8, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{flag=requi", 0, candidates); assertEquals(Arrays.asList(new String[]{"required", "requisite"}), candidates); assertEquals(7, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=", 0, candidates); assertEquals(Arrays.asList(new String[]{"false", "true"}), candidates); assertEquals(/*-1*/7, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=t", 0, candidates); assertEquals(Collections.singletonList("true"), candidates); assertEquals(/*-1*/7, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*5*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,", 0, candidates); assertEquals(Arrays.asList(new String[]{"aa", "bb", "cc", "flag", "module", "module-options"}), candidates); assertEquals(12, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,w", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*10*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,module", 0, candidates); assertEquals(Arrays.asList(new String[]{"module", "module-options"}), candidates); assertEquals(12, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,fl", 0, candidates); assertEquals(Arrays.asList(new String[]{"flag"}), candidates); assertEquals(12, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = ", 0, candidates); assertEquals(Arrays.asList(new String[]{"optional", "required", "requisite", "sufficient"}), candidates); assertEquals(18, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = requi", 0, candidates); assertEquals(Arrays.asList(new String[]{"required", "requisite"}), candidates); assertEquals(19, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required", 0, candidates); assertEquals(Arrays.asList(new String[]{","}), candidates); assertEquals(27, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,", 0, candidates); assertEquals(Arrays.asList(new String[]{"aa", "bb", "cc", "module", "module-options"}), candidates); assertEquals(28, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa=", 0, candidates); assertEquals(Arrays.asList(new String[]{"{"}), candidates); assertEquals(31, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab1", "ab2", "ac1"}), candidates); assertEquals(32, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab1", "ab2"}), candidates); assertEquals(32, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab2", "ac1"}), candidates); assertEquals(38, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,a", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab2", "ac1"}), candidates); assertEquals(38, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac", 0, candidates); assertEquals(Arrays.asList(new String[]{"ac1"}), candidates); assertEquals(38, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=", 0, candidates); assertEquals(Arrays.asList(new String[]{"false", "true"}), candidates); assertEquals(/*36*/42, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=s", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=f", 0, candidates); assertEquals(Collections.singletonList("false"), candidates); assertEquals(42, i); //assertEquals(Arrays.asList(new String[]{","}), valueTypeHandler.getCandidates(valueType, "code=Main,flag = required,aa={ab1=1,ac1=2}")); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=false", 0, candidates); assertEquals(Collections.singletonList(","), candidates); assertEquals(47, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=2,", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab2"}), candidates); assertEquals(44, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=2},", 0, candidates); assertEquals(Arrays.asList(new String[]{"bb", "cc", "module", "module-options"}), candidates); assertEquals(45, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=2},bb=", 0, candidates); assertEquals(Arrays.asList(new String[]{"["}), candidates); assertEquals(48, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=2},bb=[{", 0, candidates); assertEquals(Arrays.asList(new String[]{"bb1", "bb2", "bc1"}), candidates); assertEquals(50, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=Main,flag = required,aa={ab1=1,ac1=2},cc=[(", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=\"UsersRoles\",flag=required,module-options=[(", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{}", 0, candidates); assertEquals(Arrays.asList(new String[]{",", "]"}), candidates); assertEquals(3, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required}", 0, candidates); assertEquals(Arrays.asList(new String[]{",", "]"}), candidates); assertEquals(17, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{", 0, candidates); assertEquals(Arrays.asList(new String[]{"aa", "bb", "cc", "code", "flag", "module", "module-options"}), candidates); assertEquals(28, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{f", 0, candidates); assertEquals(Collections.singletonList("flag"), candidates); assertEquals(28, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{m", 0, candidates); assertEquals(Arrays.asList(new String[]{"module", "module-options"}), candidates); assertEquals(28, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{module", 0, candidates); assertEquals(Arrays.asList(new String[]{"module", "module-options"}), candidates); assertEquals(28, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{module=", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*7*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{module=m", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*7*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{flag = ", 0, candidates); assertEquals(Arrays.asList(new String[]{"optional", "required", "requisite", "sufficient"}), candidates); assertEquals(34, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{flag= s", 0, candidates); assertEquals(Collections.singletonList("sufficient"), candidates); assertEquals(34, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{flag=requi", 0, candidates); assertEquals(Arrays.asList(new String[]{"required", "requisite"}), candidates); assertEquals(33, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=", 0, candidates); assertEquals(Arrays.asList(new String[]{"false", "true"}), candidates); assertEquals(/*-1*/33, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=t", 0, candidates); assertEquals(Collections.singletonList("true"), candidates); assertEquals(/*-1*/33, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*5*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,", 0, candidates); assertEquals(Arrays.asList(new String[]{"aa", "bb", "cc", "flag", "module", "module-options"}), candidates); assertEquals(38, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,w", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1 /*10*/, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,module", 0, candidates); assertEquals(Arrays.asList(new String[]{"module", "module-options"}), candidates); assertEquals(38, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,fl", 0, candidates); assertEquals(Arrays.asList(new String[]{"flag"}), candidates); assertEquals(38, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = ", 0, candidates); assertEquals(Arrays.asList(new String[]{"optional", "required", "requisite", "sufficient"}), candidates); assertEquals(44, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = requi", 0, candidates); assertEquals(Arrays.asList(new String[]{"required", "requisite"}), candidates); assertEquals(45, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required", 0, candidates); assertEquals(Arrays.asList(new String[]{","}), candidates); assertEquals(53, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,", 0, candidates); assertEquals(Arrays.asList(new String[]{"aa", "bb", "cc", "module", "module-options"}), candidates); assertEquals(54, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa=", 0, candidates); assertEquals(Arrays.asList(new String[]{"{"}), candidates); assertEquals(57, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab1", "ab2", "ac1"}), candidates); assertEquals(58, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab1", "ab2"}), candidates); assertEquals(58, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab2", "ac1"}), candidates); assertEquals(64, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,a", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab2", "ac1"}), candidates); assertEquals(64, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac", 0, candidates); assertEquals(Arrays.asList(new String[]{"ac1"}), candidates); assertEquals(64, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=", 0, candidates); assertEquals(Arrays.asList(new String[]{"false", "true"}), candidates); assertEquals(/*36*/68, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=s", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=f", 0, candidates); assertEquals(Collections.singletonList("false"), candidates); assertEquals(68, i); //assertEquals(Arrays.asList(new String[]{","}), valueTypeHandler.getCandidates(valueType, "code=Main,flag = required,aa={ab1=1,ac1=2}")); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=false", 0, candidates); assertEquals(Collections.singletonList(","), candidates); assertEquals(73, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=2,", 0, candidates); assertEquals(Arrays.asList(new String[]{"ab2"}), candidates); assertEquals(70, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=2},", 0, candidates); assertEquals(Arrays.asList(new String[]{"bb", "cc", "module", "module-options"}), candidates); assertEquals(71, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=2},bb=", 0, candidates); assertEquals(Arrays.asList(new String[]{"["}), candidates); assertEquals(74, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=Main,flag = required,aa={ab1=1,ac1=2},bb=[{", 0, candidates); assertEquals(Arrays.asList(new String[]{"bb1", "bb2", "bc1"}), candidates); assertEquals(76, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=\"UsersRoles\",flag=required,module-options=[(", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{code=toto,flag=required},{code=\"UsersRoles\",flag=required,module-options=[{", 0, candidates); assertEquals(Collections.emptyList(), candidates); assertEquals(-1, i); candidates.clear(); String cmd = "[{code=toto,flag=required},{code=\"UsersRoles\",flag=required}]"; i = new ValueTypeCompleter(propDescr).complete(null, cmd, 0, candidates); assertEquals(Arrays.asList(cmd), candidates); assertEquals(0, i); } @Test public void testFileSystem() throws Exception { String radical = "valuetype-" + System.currentTimeMillis() + "-test"; File f = new File(radical + ".txt"); f.createNewFile(); try { CommandContext ctx = CommandContextFactory.getInstance().newCommandContext(); ModelNode valueType = ModelNode.fromJSONString(VALUETYPE_WITH_FILES); ValueTypeCompleter completer = new ValueTypeCompleter(valueType); { List<String> candidates = new ArrayList<>(); String content = "{p1_a=" + radical; new ValueTypeCompleter(valueType).complete(ctx, content, content.length() - 1, candidates); assertTrue(candidates.size() == 1); assertTrue(candidates.get(0).equals(f.getName())); } { List<String> candidates = new ArrayList<>(); String content = "{p1_a=toto, p2_a=" + radical; new ValueTypeCompleter(valueType).complete(ctx, content, content.length() - 1, candidates); assertTrue(candidates.size() == 1); assertTrue(candidates.get(0).equals(f.getName())); } { List<String> candidates = new ArrayList<>(); String content = "{p3=[ { oo_file_a=" + radical; new ValueTypeCompleter(valueType).complete(ctx, content, content.length() - 1, candidates); assertTrue(candidates.size() == 1); assertTrue(candidates.get(0).equals(f.getName())); } { List<String> candidates = new ArrayList<>(); String content = "{p3=[ { ii_file=" + radical; new ValueTypeCompleter(valueType).complete(ctx, content, content.length() - 1, candidates); assertTrue(candidates.isEmpty()); } { List<String> candidates = new ArrayList<>(); String content = "{p3=[ { oo_file_a=toto, ii_file=titi }, { oo_file_a=" + radical; new ValueTypeCompleter(valueType).complete(ctx, content, content.length() - 1, candidates); assertTrue(candidates.size() == 1); assertTrue(candidates.get(0).equals(f.getName())); } { List<String> candidates = new ArrayList<>(); String content = "{p4= { ii_file=" + radical; new ValueTypeCompleter(valueType).complete(ctx, content, content.length() - 1, candidates); assertTrue(candidates.isEmpty()); } } finally { f.delete(); } } @Test public void testJgroupsProtocolAdd() throws Exception { final ModelNode propDescr = ModelNode.fromString(jgroupsProtocolsAdd); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<String>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "", 0, candidates); assertEquals(Collections.singletonList("["), candidates); assertEquals(0, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[", 0, candidates); assertEquals(Arrays.asList(new String[]{"{"}), candidates); assertEquals(1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{", 0, candidates); assertEquals(Arrays.asList(new String[]{"properties", "socket-binding", "type"}), candidates); assertEquals(2, i); } @Test public void testCompositeSteps() throws Exception { final ModelNode propDescr = ModelNode.fromString(compositeSteps); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "", 0, candidates); assertEquals(Collections.singletonList("["), candidates); assertEquals(0, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[", 0, candidates); assertEquals(Arrays.asList(new String[]{"{"}), candidates); assertEquals(1, i); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{", 0, candidates); assertTrue(candidates.isEmpty()); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{a", 0, candidates); assertTrue(candidates.isEmpty()); } @Test public void testElytronPermissionMapper() throws Exception { final ModelNode propDescr = ModelNode.fromString(elytron_simple_permission_mapper_add); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "", 0, candidates); assertEquals(Collections.singletonList("["), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[", 0, candidates); assertEquals(Arrays.asList(new String[]{"{"}), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{", 0, candidates); assertEquals(Arrays.asList("permissions", "principals", "roles"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions", 0, candidates); assertEquals(Arrays.asList("permissions="), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=", 0, candidates); assertEquals(Arrays.asList("["), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[", 0, candidates); assertEquals(Arrays.asList("{"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{", 0, candidates); assertEquals(Arrays.asList("action", "class-name", "module", "target-name"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name", 0, candidates); assertEquals(Arrays.asList("class-name="), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",", 0, candidates); assertEquals(Arrays.asList("action", "module", "target-name"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action", 0, candidates); assertEquals(Arrays.asList("action="), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx}", 0, candidates); assertEquals(Arrays.asList(",", "]"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},", 0, candidates); assertEquals(Arrays.asList("{"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{", 0, candidates); assertEquals(Arrays.asList("action", "class-name", "module", "target-name"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}]", 0, candidates); assertEquals(Arrays.asList(","), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}]", 0, candidates); assertEquals(Arrays.asList(","), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],", 0, candidates); assertEquals(Arrays.asList("principals", "roles"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],", 0, candidates); assertEquals(Arrays.asList("principals", "roles"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=", 0, candidates); assertEquals(Arrays.asList("["), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[", 0, candidates); assertEquals(Arrays.asList(), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[]", 0, candidates); assertEquals(Arrays.asList(","), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],", 0, candidates); assertEquals(Arrays.asList("roles"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles", 0, candidates); assertEquals(Arrays.asList("roles="), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=", 0, candidates); assertEquals(Arrays.asList("["), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[", 0, candidates); assertEquals(Arrays.asList(), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]", 0, candidates); assertEquals(Arrays.asList("}"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]}", 0, candidates); assertEquals(Arrays.asList(",", "]"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]},", 0, candidates); assertEquals(Arrays.asList("{"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]},{", 0, candidates); assertEquals(Arrays.asList("permissions", "principals", "roles"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]}," + "{roles=[],permissions=[{", 0, candidates); assertEquals(Arrays.asList("action", "class-name", "module", "target-name"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]}," + "{roles=[],permissions=[{action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc}," + " {action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc},{", 0, candidates); assertEquals(Arrays.asList("action", "class-name", "module", "target-name"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]}," + "{roles=[],permissions=[{action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc}," + " {action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc},{}],", 0, candidates); assertEquals(Arrays.asList("principals"), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]}," + "{roles=[],permissions=[{action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc}," + " {action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc},{}],principals=[]", 0, candidates); assertEquals(Arrays.asList("}"), candidates); candidates.clear(); String cmd = "[{permissions=[{class-name=\"toto\",action=xxx},{}],principals=[],roles=[]}," + "{roles=[],permissions=[{action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc}," + " {action=cdscds,class-name=cdscds,module=cdscds,target-name=njdsc},{}],principals=[]}]"; i = new ValueTypeCompleter(propDescr).complete(null, cmd, 0, candidates); assertEquals(Arrays.asList(cmd), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{roles=", 0, candidates); assertEquals(Arrays.asList("["), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{roles=[", 0, candidates); assertEquals(Arrays.asList(), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{roles=[role=", 0, candidates); assertEquals(Arrays.asList(), candidates); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[{roles=[role=xxx", 0, candidates); assertEquals(Arrays.asList(), candidates); } @Test public void testNestedLists() throws Exception { final ModelNode propDescr = ModelNode.fromString(nested_lists); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "", 0, candidates); assertEquals(Collections.singletonList("["), candidates); assertEquals(i, 0); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[", 0, candidates); assertEquals(Collections.singletonList("["), candidates); assertEquals(i, 1); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[[]", 0, candidates); assertEquals(Arrays.asList(",", "]"), candidates); assertEquals(i, 3); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[[],", 0, candidates); assertEquals(Arrays.asList("["), candidates); assertEquals(i, 4); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[[],[]", 0, candidates); assertEquals(Arrays.asList(",", "]"), candidates); assertEquals(i, 6); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "[[],[123,qwert,dscds],", 0, candidates); assertEquals(Arrays.asList("["), candidates); assertEquals(i, 22); candidates.clear(); String cmd = "[[],[123,qwert,dscds]]"; i = new ValueTypeCompleter(propDescr).complete(null, cmd, 0, candidates); assertEquals(Arrays.asList(cmd), candidates); assertEquals(i, 0); } @Test public void testNestedObjects() throws Exception { final ModelNode propDescr = ModelNode.fromString(nested_objects); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=", 0, candidates); assertEquals(Arrays.asList("false", "true"), candidates); assertEquals(i, 40); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true", 0, candidates); assertEquals(Arrays.asList(","), candidates); assertEquals(i, 44); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,", 0, candidates); assertEquals(Arrays.asList("prop1_1_1_2", "prop1_1_1_3"), candidates); assertEquals(i, 45); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true", 0, candidates); assertEquals(Arrays.asList("}"), candidates); assertEquals(i, 79); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",", 0, candidates); assertEquals(Arrays.asList("prop1_1_2"), candidates); assertEquals(i, 81); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2=", 0, candidates); assertEquals(Arrays.asList("{"), candidates); assertEquals(i, 91); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={", 0, candidates); assertEquals(Arrays.asList("prop1_1_2_1", "prop1_1_2_2", "prop1_1_2_3"), candidates); assertEquals(i, 92); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=", 0, candidates); assertEquals(Arrays.asList("false", "true"), candidates); assertEquals(i, 139); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false", 0, candidates); assertEquals(Arrays.asList("}"), candidates); assertEquals(i, 144); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}", 0, candidates); assertEquals(Arrays.asList("}"), candidates); assertEquals(i, 145); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}}", 0, candidates); assertEquals(Arrays.asList(","), candidates); assertEquals(i, 146); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}},", 0, candidates); assertEquals(Arrays.asList("prop1_2"), candidates); assertEquals(i, 147); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}}," + "prop1_2={}", 0, candidates); assertEquals(Arrays.asList("}"), candidates); assertEquals(i, 157); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}}," + "prop1_2={}},", 0, candidates); assertEquals(Arrays.asList("prop2"), candidates); assertEquals(i, 159); candidates.clear(); i = new ValueTypeCompleter(propDescr).complete(null, "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}}," + "prop1_2={}},prop2={}", 0, candidates); assertEquals(Arrays.asList("}"), candidates); assertEquals(i, 167); candidates.clear(); String cmd = "{prop1={prop1_1={prop1_1_1={prop1_1_1_1=true,prop1_1_1_2=false,prop1_1_1_3=true}" + ",prop1_1_2={prop1_1_2_1=true,prop1_1_2_2=false,prop1_1_2_3=false}}," + "prop1_2={}},prop2={}}"; i = new ValueTypeCompleter(propDescr).complete(null, cmd, 0, candidates); assertEquals(Arrays.asList(cmd), candidates); // Is one, due to logic when lastStateChar is '}' assertEquals(i, 1); } @Test public void testMap() throws Exception { final ModelNode propDescr = ModelNode.fromString(simple_map); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); int i; i = new ValueTypeCompleter(propDescr).complete(null, "", 0, candidates); assertEquals(Arrays.asList("{"), candidates); assertEquals(i, 0); } private static class TestCapabilityReferenceCompleter extends CapabilityReferenceCompleter { private final List<String> capabilities; public TestCapabilityReferenceCompleter(List<String> capabilities) { super(new CandidatesProvider() { @Override public Collection<String> getAllCandidates(CommandContext ctx) { return capabilities; } }); this.capabilities = capabilities; } @Override public List<String> getCapabilityReferenceNames(CommandContext ctx, OperationRequestAddress address, String staticPart) { return capabilities; } } @Test public void testListCapabilities() throws Exception { final ModelNode propDescr = ModelNode.fromString(role_mapper); assertTrue(propDescr.isDefined()); final List<String> candidates = new ArrayList<>(); List<String> capabilities = new ArrayList<>(); CapabilityCompleterFactory factory = (OperationRequestAddress address, String staticPart) -> { return new TestCapabilityReferenceCompleter(capabilities); }; int i; i = new ValueTypeCompleter(propDescr, factory).complete(null, "", 0, candidates); assertEquals(Arrays.asList("["), candidates); assertEquals(i, 0); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[", 0, candidates); assertEquals(Arrays.asList("]"), candidates); assertEquals(i, 1); capabilities.add("coco"); capabilities.add("prefMapper001"); capabilities.add("prefMapper002"); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[", 0, candidates); assertEquals(capabilities, candidates); assertEquals(i, 1); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[p", 0, candidates); assertEquals(Arrays.asList("prefMapper001", "prefMapper002"), candidates); assertEquals(i, 1); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001", 0, candidates); assertEquals(Arrays.asList(","), candidates); assertEquals(i, 14); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,", 0, candidates); assertEquals(Arrays.asList("coco", "prefMapper002"), candidates); assertEquals(i, 15); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,c", 0, candidates); assertEquals(Arrays.asList("coco"), candidates); assertEquals(i, 15); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,coco", 0, candidates); assertEquals(Arrays.asList(","), candidates); assertEquals(i, 19); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,coco,", 0, candidates); assertEquals(Arrays.asList("prefMapper002"), candidates); assertEquals(i, 20); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,coco,c", 0, candidates); assertEquals(Arrays.asList(), candidates); assertEquals(i, -1); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,coco,p", 0, candidates); assertEquals(Arrays.asList("prefMapper002"), candidates); assertEquals(i, 20); candidates.clear(); i = new ValueTypeCompleter(propDescr, factory).complete(null, "[prefMapper001,coco,prefMapper002", 0, candidates); assertEquals(Arrays.asList("]"), candidates); assertEquals(i, 33); } }