package com.itemanalysis.jmetrik.commandbuilder; import com.itemanalysis.jmetrik.stats.irt.estimation.IrtItemCalibrationCommand; import org.junit.Ignore; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import static org.junit.Assert.*; public class MegaCommandTest { @Ignore @Test public void megaCommandSplitTest1(){ MegaCommand command = new MegaCommand("descriptives"); MegaOption option = new MegaOption("display", "Show minimum value", OptionType.SELECT_ALL_OPTION); SelectFromListValueChecker checker = new SelectFromListValueChecker(); checker.addPermittedValue("min"); checker.addPermittedValue("max"); checker.addPermittedValue("mean"); checker.addPermittedValue("sd"); option.setValueChecker(checker); command.addOption(option); option = new MegaOption("variables", "Variables to be analyzed", OptionType.FREE_LIST_OPTION); command.addOption(option); option = new MegaOption("data", "Data table", OptionType.ARGUMENT_VALUE_OPTION_LIST); option.addArgument("db", "Name of database", true); option.addArgument("table", "Name of database table", true); command.addOption(option); System.out.println("BEFORE SPLITTING TEXT"); System.out.println(command.paste()); System.out.println(); String text = "descriptives{\n" + "display(min, mean);\n" + "variables(item1, item2, item3);\n" + "data(db=mydb, table = mytable);\n" + "}"; command.split(text); System.out.println("AFTER SPLITTING TEXT"); System.out.println(command.paste()); MegaOption temp = command.getOption("display"); assertTrue(temp.containsValue("min")); assertTrue(temp.containsValue("mean")); assertFalse(temp.containsValue("max")); assertFalse(temp.containsValue("sd")); temp = command.getOption("data"); assertTrue(temp.getValueAt("db", "default").equals("mydb")); assertTrue(temp.getValueAt("table", "default").equals("mytable")); temp = command.getOption("variables"); String[] defaultValues = {"d1", "d2", "d3"}; String[] s = temp.getValues(defaultValues); assertTrue(s[0].equals("item1")); assertTrue(s[1].equals("item2")); assertTrue(s[2].equals("item3")); } @Ignore @Test public void megaCommandRepeatedOptionTest(){ MegaCommand command = new MegaCommand("scoring"); MegaOption option = new MegaOption("key1", "Variable names", OptionType.ARGUMENT_VALUE_OPTION_LIST, false); option.addArgument("variables", "Name of variables to be scored", true); option.addArgument("options", "Response option values", true); option.addArgument("scores", "Response option scores", true); option.addValueAt("variables", "var1"); option.addValueAt("variables", "var2"); option.addValueAt("variables", "var3"); option.addValueAt("variables", "var4"); option.addValueAt("options", "A"); option.addValueAt("options", "B"); option.addValueAt("options", "C"); option.addValueAt("options", "D"); option.addValueAt("scores", "0"); option.addValueAt("scores", "1"); option.addValueAt("scores", "0"); option.addValueAt("scores", "0"); command.addOption(option); option = new MegaOption("key2", "Variable names", OptionType.ARGUMENT_VALUE_OPTION_LIST, false); option.addArgument("variables", "Name of variables to be scored", true); option.addArgument("options", "Response option values", true); option.addArgument("scores", "Response option scores", true); option.addValueAt("variables", "var6"); option.addValueAt("variables", "var7"); option.addValueAt("variables", "var8"); option.addValueAt("variables", "var9"); option.addValueAt("options", "A"); option.addValueAt("options", "B"); option.addValueAt("options", "C"); option.addValueAt("options", "D"); option.addValueAt("scores", "1"); option.addValueAt("scores", "0"); option.addValueAt("scores", "0"); option.addValueAt("scores", "0"); command.addOption(option); option = new MegaOption("key3", "Variable names", OptionType.ARGUMENT_VALUE_OPTION_LIST, false); option.addArgument("variables", "Name of variables to be scored", true); option.addArgument("options", "Response option values", true); option.addArgument("scores", "Response option scores", true); option.addValueAt("variables", "var10"); option.addValueAt("variables", "var11"); option.addValueAt("variables", "var12"); option.addValueAt("variables", "var13"); option.addValueAt("options", "A"); option.addValueAt("options", "B"); option.addValueAt("options", "C"); option.addValueAt("options", "D"); option.addValueAt("scores", "0"); option.addValueAt("scores", "0"); option.addValueAt("scores", "1"); option.addValueAt("scores", "1"); command.addOption(option); System.out.println(command.paste()); System.out.println(); System.out.println(command.getHelpText()); String[] defaultValues = {"1","1","1","1"}; MegaOption mo = command.getOption("key1"); String[] v = mo.getValuesAt("options", defaultValues); assertTrue(v[0].equals("A")); assertTrue(v[1].equals("B")); assertTrue(v[2].equals("C")); assertTrue(v[3].equals("D")); assertFalse(v[3].equals("A")); } @Ignore @Test public void megaCommandRepeatedOptionSplitTest(){ MegaCommand command = new MegaCommand("scoring", "This is an example of a scoring command. It has multiple keys but each one has a unique name." + "The objects must be added so that the text can be parsed correctly. This description" + "is written to be very long so that I can check the output on teh help text."); MegaOption option = new MegaOption("key1", "Variable names", OptionType.ARGUMENT_VALUE_OPTION_LIST, false); option.addArgument("variables", "Name of variables to be scored", true); option.addArgument("options", "Response option values", true); option.addArgument("scores", "Response option scores", true); command.addOption(option); option = new MegaOption("key2", "Variable names", OptionType.ARGUMENT_VALUE_OPTION_LIST, false); option.addArgument("variables", "Name of variables to be scored", true); option.addArgument("options", "Response option values", true); option.addArgument("scores", "Response option scores", true); command.addOption(option); option = new MegaOption("key3", "Variable names", OptionType.ARGUMENT_VALUE_OPTION_LIST, false); option.addArgument("variables", "Name of variables to be scored", true); option.addArgument("options", "Response option values", true); option.addArgument("scores", "Response option scores", true); command.addOption(option); String text = "scoring{\n" + " key1(options=(A, B, C, D), scores=(1,0,0,0), variables=(i1, i2, i3) );\n" + " key2(options=(A, B, C, D), scores=(0,1,0,0), variables=(i4, i5, i6) );\n" + " key3(options=(A, B, C, D), scores=(0,0,1,0), variables=(i7, i8, i9, i10) );\n" + "}"; System.out.println(command.getHelpText()); System.out.println(); System.out.println(); System.out.println("BEFORE SPLIT:"); System.out.println(command.paste()); System.out.println(); command.split(text); System.out.println("AFTER SPLIT:"); System.out.println(command.paste()); System.out.println(); System.out.println(command.getHelpText()); String[] defaultValues = {"1","1","1","1"}; MegaOption mo = command.getOption("key1"); String[] v = mo.getValuesAt("options", defaultValues); assertTrue(v[0].equals("A")); assertTrue(v[1].equals("B")); assertTrue(v[2].equals("C")); assertTrue(v[3].equals("D")); assertFalse(v[3].equals("A")); } public MegaCommand getIrtCommand(int maxGroups){ MegaCommand cmd = new MegaCommand("irt", "IRT item calibration"); MegaOption data = new MegaOption("data", "Data informaiton", OptionType.ARGUMENT_VALUE_OPTION_LIST, true); data.addArgument("db", "Database name", true); data.addArgument("table", "Database table name", true); cmd.addOption(data); MegaOption converge = new MegaOption("converge", "EM algorithm convergence criteria", OptionType.ARGUMENT_VALUE_OPTION_LIST); converge.addArgument("maxiter", "Maximum number of EM cycles", false); converge.addArgument("tol", "Convergence criterion 0 <= tol < 1", false); cmd.addOption(converge); MegaOption numberOfGroups = new MegaOption("groups", "Number of item groups", OptionType.FREE_OPTION); cmd.addOption(numberOfGroups); MegaOption group = null; for(int i=0;i<maxGroups;i++){ group = new MegaOption("group"+(i+1), "Item information for group " + (i+1), OptionType.ARGUMENT_VALUE_OPTION_LIST, i==0); group.addArgument("variables", "Items that belong to this group", true); group.addArgument("model", "Item response model for this group", true); group.addArgument("ncat", "Number of categories for items in this group", true); group.addArgument("start", "Starting values e.g. (par1, par2, par3. The order is very important. " + "3PL order is aparam, bparam, cparam. 4PL order is aparam, bparam, cparam, uparam. " + "GPCM order is step1, step2, ...", false); //Prior information group.addArgument("aprior", "Discrimination prior specification e.g. (name, par1, par2). " + "Possible names are beta, normal, and lognormal. The parameter order is important. " + "beta order is shape1, shape2, lower bound, upper bound. normal order is mean, sd. " + "lognormal order is logmean, logsd.", false); group.addArgument("bprior", "Difficulty/step prior specification e.g. (name, par1, par2)"+ "Possible names are beta, normal, and lognormal. The parameter order is important." + "beta order is shape1, shape2, lower bound, upper bound." + "normal order is mean, sd." + "lognormal order is logmean, logsd.", false); group.addArgument("cprior", "Lower asymptote prior specification e.g. (name, par1, par2)"+ "Possible names are beta, normal, and lognormal. The parameter order is important." + "beta order is shape1, shape2, lower bound, upper bound." + "normal order is mean, sd." + "lognormal order is logmean, logsd.", false); group.addArgument("uprior", "Upper asymptote prior specification e.g. (name, par1, par2)"+ "Possible names are beta, normal, and lognormal. The parameter order is important." + "beta order is shape1, shape2, lower bound, upper bound." + "normal order is mean, sd." + "lognormal order is logmean, logsd.", false); //fixed value flags group.addArgument("afixed", "Do not estimate discrimination parameter. Fix it to start value", false); group.addArgument("bfixed", "Do not estimate difficulty/step parameter. Fix it to start value", false); group.addArgument("cfixed", "Do not estimate lower asymptote parameter. Fix it to start value", false); group.addArgument("ufixed", "Do not estimate upper asymptote parameter. Fix it to start value", false); cmd.addOption(group); } return cmd; } @Ignore @Test public void irtCommandTest(){ MegaCommand cmd = getIrtCommand(1); System.out.println(cmd.paste()); System.out.println(); System.out.println(cmd.getHelpText()); } @Ignore @Test public void IrtParseTest1(){ String commandText = "irt{\n" + " data(db = mydb, table = exam1);\n" + " group1(bprior = (normal, 0, 1), aprior = (beta, 1, 2, 3, 4), model = 3PL, start = (1.0,0.0,0.05), ncat = 2, variables = (item1, item2, item3));\n" + " group2(bprior = (normal, 0, 1), aprior = (beta, 1, 2, 3, 4), model = GPCM, ncat = 4, variables = (item5, item6, item7));\n" + " converge(maxiter = 1000, tol = 0.0001);\n" + " groups(2);\n" + "}"; MegaCommand cmd = getIrtCommand(2); cmd.split(commandText); System.out.println(cmd.paste()); String[] dv = {"1"}; String[] test = cmd.getOption("group1").getValuesAt("aprior", dv); System.out.println("APRIOR: " + Arrays.toString(test)); test = cmd.getOption("group1").getValuesAt("start", dv); System.out.println("START: " + Arrays.toString(test)); System.out.println("GROUP1-MODEL: " + cmd.getOption("group1").getValueAt("model", "dv")); System.out.println("GROUP2-MODEL: " + cmd.getOption("group2").getValueAt("model", "dv")); } @Ignore @Test public void commandHelpTest(){ IrtItemCalibrationCommand command = new IrtItemCalibrationCommand(); System.out.println(command.getHelpText()); } }