openVirus icon indicating copy to clipboard operation
openVirus copied to clipboard

`ami3` `picocli` parsing error creates `ClassCastException`

Open petermr opened this issue 5 years ago • 5 comments
trafficstars

petermr avatar Jun 08 '20 10:06 petermr

In the test

	@Test
	public void testInclude() {
		String cmd = null;
		File cProjectDir = new File(SRC_TEST_AMI, "battery10");
		CProject project = new CProject(cProjectDir);

		cmd = "-p " + project
				+ " -vv"
				+ " --inputname raw"
				+ " image"
				+ " --include minp=500|maxpf=0.1"
				+ "";

		AbstractAMITool imageTool = (AbstractAMITool) AMI.execute(AMIPixelTool.class, cmd);

	}

This correctly creates an error message

Invalid value for option '--include' (<ImageParameters=String>): expected one of [match, minheight, maxheight, minwidth, maxwidth, minpixf, maxpixf, minpix, maxpix, strings] (case-sensitive) but was 'minp'
Usage: ami image [OPTIONS]
Try 'ami image --help' for more information.

but also throws an Exception (when run in Eclipse)

java.lang.ClassCastException: org.contentmine.ami.tools.AMI cannot be cast to org.contentmine.ami.tools.AbstractAMITool
	at org.contentmine.ami.tools.AMIImageTest.testInclude(AMIImageTest.java:762)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

When the command completes OK we (presumably) get the correct class returned.

petermr avatar Jun 08 '20 10:06 petermr

Hard to Reproduce

I cannot reproduce this, perhaps because the test data is not committed? When I run the test I see this:

not found: cProject must be existing directory or have directory parent: 
\Users\pm286\workspace\cmdev\ami3\src\test\resources\org\contentmine\ami\battery10 (C:\Users\pm286\workspace\cmdev\ami3\src\test\resources\org\contentmine\ami\battery10

My suspicions

The test essentially executes this command:

ami [options] image --include minpix=500|maxpixf=0.1|graytol=20

... but then receives the initialized command object like this:

AMI.execute(AMIPixelTool.class, cmd);

Looking at the image command, this is defined by the AMIImageTool, not by the AMIPixelTool, which defines command pixel.

So, either the command should be ami [options] pixel ..., or the command object should be AMIImageTool:

// no need to cast: AMIImageTool extends AbstractAMITool
AMIImageTool imageTool =  AMI.execute(AMIImageTool.class, cmd);

remkop avatar Jun 10 '20 06:06 remkop

Thanks. I thought I had committed the data. Will check. Not till tomorrow...

petermr avatar Jun 10 '20 06:06 petermr

Was this resolved and can this ticket be closed?

remkop avatar Jul 07 '20 05:07 remkop

Not sure it's been resolved... It tended to happen on parse errors. I'll try to repeat the problem. If I can't we'll close it.

On Tue, Jul 7, 2020 at 6:25 AM Remko Popma [email protected] wrote:

Was this resolved and can this ticket be closed?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/petermr/openVirus/issues/61#issuecomment-654609539, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAFTCS7UEMEGPSX45FPGBL3R2KWTPANCNFSM4NYJDKMQ .

-- Peter Murray-Rust Founder ContentMine.org and Reader Emeritus in Molecular Informatics Dept. Of Chemistry, University of Cambridge, CB2 1EW, UK

petermr avatar Jul 07 '20 10:07 petermr