diff --git a/src/main/java/org/scijava/command/CommandModuleItem.java b/src/main/java/org/scijava/command/CommandModuleItem.java index 7be4d3e9f..ba30ecd65 100644 --- a/src/main/java/org/scijava/command/CommandModuleItem.java +++ b/src/main/java/org/scijava/command/CommandModuleItem.java @@ -190,6 +190,11 @@ public Number getStepSize() { } } + @Override + public String getFormat() { + return getParameter().format(); + } + @Override public int getColumnCount() { return getParameter().columns(); diff --git a/src/main/java/org/scijava/module/AbstractModuleItem.java b/src/main/java/org/scijava/module/AbstractModuleItem.java index da260b12a..42c088af3 100644 --- a/src/main/java/org/scijava/module/AbstractModuleItem.java +++ b/src/main/java/org/scijava/module/AbstractModuleItem.java @@ -265,6 +265,11 @@ public Number getStepSize() { return NumberUtils.toNumber("1", getType()); } + @Override + public String getFormat(){ + return null; + } + @Override public int getColumnCount() { return 6; diff --git a/src/main/java/org/scijava/module/ModuleItem.java b/src/main/java/org/scijava/module/ModuleItem.java index 4abd391ea..68946ac7a 100644 --- a/src/main/java/org/scijava/module/ModuleItem.java +++ b/src/main/java/org/scijava/module/ModuleItem.java @@ -205,4 +205,6 @@ public interface ModuleItem extends BasicDetails { /** Sets the item's current value with respect to the given module. */ void setValue(Module module, T value); + /** Gets the item's format*/ + String getFormat(); } diff --git a/src/main/java/org/scijava/plugin/Parameter.java b/src/main/java/org/scijava/plugin/Parameter.java index ac24dd5e6..0b3f67fb7 100644 --- a/src/main/java/org/scijava/plugin/Parameter.java +++ b/src/main/java/org/scijava/plugin/Parameter.java @@ -152,6 +152,9 @@ /** Defines the step size to use (numeric parameters only). */ String stepSize() default ""; + /** Defines the format to use */ + String format() default ""; + /** Defines the list of possible values (multiple choice text fields only). */ String[] choices() default {}; diff --git a/src/main/java/org/scijava/widget/DefaultWidgetModel.java b/src/main/java/org/scijava/widget/DefaultWidgetModel.java index ffb19061f..999987275 100644 --- a/src/main/java/org/scijava/widget/DefaultWidgetModel.java +++ b/src/main/java/org/scijava/widget/DefaultWidgetModel.java @@ -262,6 +262,11 @@ public boolean isNumber() { return Types.isNumber(getItem().getType()); } + @Override + public String getFormat() { + return item.getFormat(); + } + @Override public boolean isBoolean() { return Types.isBoolean(getItem().getType()); diff --git a/src/main/java/org/scijava/widget/WidgetModel.java b/src/main/java/org/scijava/widget/WidgetModel.java index 80f033de0..120f2126b 100644 --- a/src/main/java/org/scijava/widget/WidgetModel.java +++ b/src/main/java/org/scijava/widget/WidgetModel.java @@ -175,6 +175,11 @@ public interface WidgetModel extends Contextual { */ boolean isNumber(); + /** + * Gets the format for the value of the model. + */ + String getFormat(); + /** * Gets whether the input is a boolean type (i.e., {@link Boolean} or * {@code boolean}). diff --git a/src/test/java/org/scijava/command/InvalidCommandTest.java b/src/test/java/org/scijava/command/InvalidCommandTest.java index 8ab7b7c53..8a38d49c8 100644 --- a/src/test/java/org/scijava/command/InvalidCommandTest.java +++ b/src/test/java/org/scijava/command/InvalidCommandTest.java @@ -60,21 +60,6 @@ public void setUp() { commandService = ctx.getService(CommandService.class); } - @Test - public void testValid() { - final CommandInfo info = commandService.getCommand(ValidCommand.class); - assertNotNull(info); - assertTrue(info.isValid()); - - final List problems = info.getProblems(); - assertNotNull(problems); - assertEquals(0, problems.size()); - - final Number stepSize = info.getInput("x").getStepSize(); - assertNotNull(stepSize); - assertEquals(10, stepSize.intValue()); - } - @Test public void testInvalid() { final CommandInfo info = commandService.getCommand(InvalidCommand.class); diff --git a/src/test/java/org/scijava/command/ValidNumberCommandTest.java b/src/test/java/org/scijava/command/ValidNumberCommandTest.java new file mode 100644 index 000000000..478031fdb --- /dev/null +++ b/src/test/java/org/scijava/command/ValidNumberCommandTest.java @@ -0,0 +1,101 @@ +/* + * #%L + * SciJava Common shared library for SciJava software. + * %% + * Copyright (C) 2009 - 2020 SciJava developers. + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ + +package org.scijava.command; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.scijava.Context; +import org.scijava.ItemIO; +import org.scijava.ValidityProblem; +import org.scijava.plugin.Parameter; +import org.scijava.plugin.Plugin; + +/** + * Test commands for verifying that invalid module parameters are dealt with + * using proper error handling. + * + * @author Curtis Rueden + */ +public class ValidNumberCommandTest { + + private CommandService commandService; + + @Before + public void setUp() { + Context ctx = new Context(CommandService.class); + commandService = ctx.getService(CommandService.class); + } + + @Test + public void testValid() { + final CommandInfo info = commandService.getCommand(ValidCommand.class); + assertNotNull(info); + assertTrue(info.isValid()); + + final List problems = info.getProblems(); + assertNotNull(problems); + assertEquals(0, problems.size()); + + final Number stepSize = info.getInput("x").getStepSize(); + final String format = info.getInput("x").getFormat(); + assertNotNull(stepSize); + assertEquals(10, stepSize.intValue()); + assertEquals("0.000000", format); + } + + + // -- Helper classes -- + + /** A perfectly valid command! */ + @Plugin(type = Command.class) + public static class ValidCommand implements Command { + + @Parameter(stepSize = "10", format = "0.000000") + private double x; + + @Parameter(type = ItemIO.OUTPUT) + private String validOutput; + + @Override + public void run() { + validOutput = "ValidCommand: success!"; + } + + } + + +}