package adql.db; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.StringBufferInputStream; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import adql.db.STCS.CoordSys; import adql.db.STCS.Flavor; import adql.db.STCS.Frame; import adql.db.STCS.RefPos; import adql.db.STCS.Region; import adql.db.STCS.RegionType; import adql.parser.ADQLParser; import adql.parser.ParseException; import adql.query.operand.ADQLColumn; import adql.query.operand.ADQLOperand; import adql.query.operand.NegativeOperand; import adql.query.operand.NumericConstant; import adql.query.operand.Operation; import adql.query.operand.OperationType; import adql.query.operand.StringConstant; import adql.query.operand.function.geometry.BoxFunction; import adql.query.operand.function.geometry.CircleFunction; import adql.query.operand.function.geometry.ContainsFunction; import adql.query.operand.function.geometry.GeometryFunction; import adql.query.operand.function.geometry.GeometryFunction.GeometryValue; import adql.query.operand.function.geometry.PointFunction; import adql.query.operand.function.geometry.PolygonFunction; import adql.query.operand.function.geometry.RegionFunction; @SuppressWarnings("deprecation") public class TestSTCS { @BeforeClass public static void setUpBeforeClass() throws Exception{} @AfterClass public static void tearDownAfterClass() throws Exception{} @Before public void setUp() throws Exception{} @After public void tearDown() throws Exception{} @Test public void buildRegion(){ // Special values: try{ new Region((GeometryFunction)null); fail(); }catch(Exception e){ assertTrue(e instanceof NullPointerException); assertEquals("Missing geometry to convert into STCS.Region!", e.getMessage()); } try{ new Region((Region)null); fail(); }catch(Exception e){ assertTrue(e instanceof NullPointerException); assertEquals("Missing region to NOT select!", e.getMessage()); } try{ new Region(new ContainsFunction(new GeometryValue<GeometryFunction>(new RegionFunction(new StringConstant("position 1 2"))), new GeometryValue<GeometryFunction>(new RegionFunction(new StringConstant("circle 0 1 4"))))); fail(); }catch(Exception e){ assertTrue(e instanceof IllegalArgumentException); assertEquals("Unknown region type! Only geometrical function PointFunction, CircleFunction, BoxFunction, PolygonFunction and RegionFunction are allowed.", e.getMessage()); } // Allowed values (1 test for each type of region): try{ Region r = new Region(new PointFunction(new StringConstant(""), new NumericConstant(1.2), new NegativeOperand(new NumericConstant(2.3)))); assertEquals(RegionType.POSITION, r.type); assertEquals("", r.coordSys.toSTCS()); assertEquals(1, r.coordinates.length); assertEquals(2, r.coordinates[0].length); assertEquals(1.2, r.coordinates[0][0], 0); assertEquals(-2.3, r.coordinates[0][1], 0); assertEquals(Double.NaN, r.radius, 0); assertEquals(Double.NaN, r.width, 0); assertEquals(Double.NaN, r.height, 0); assertNull(r.regions); assertEquals("POSITION 1.2 -2.3", r.toSTCS()); r = new Region(new CircleFunction(new StringConstant("ICRS"), new NumericConstant(1.2), new NegativeOperand(new NumericConstant(2.3)), new NumericConstant(5))); assertEquals(RegionType.CIRCLE, r.type); assertEquals("ICRS", r.coordSys.toSTCS()); assertEquals(1, r.coordinates.length); assertEquals(2, r.coordinates[0].length); assertEquals(1.2, r.coordinates[0][0], 0); assertEquals(-2.3, r.coordinates[0][1], 0); assertEquals(5, r.radius, 0); assertEquals(Double.NaN, r.width, 0); assertEquals(Double.NaN, r.height, 0); assertNull(r.regions); assertEquals("CIRCLE ICRS 1.2 -2.3 5.0", r.toSTCS()); r = new Region(new BoxFunction(new StringConstant("ICRS heliocenter"), new NumericConstant(1.2), new NegativeOperand(new NumericConstant(2.3)), new NumericConstant(5), new NumericConstant(4.6))); assertEquals(RegionType.BOX, r.type); assertEquals("ICRS HELIOCENTER", r.coordSys.toSTCS()); assertEquals(1, r.coordinates.length); assertEquals(2, r.coordinates[0].length); assertEquals(1.2, r.coordinates[0][0], 0); assertEquals(-2.3, r.coordinates[0][1], 0); assertEquals(Double.NaN, r.radius, 0); assertEquals(5, r.width, 0); assertEquals(4.6, r.height, 0); assertNull(r.regions); assertEquals("BOX ICRS HELIOCENTER 1.2 -2.3 5.0 4.6", r.toSTCS()); r = new Region(new PolygonFunction(new StringConstant("cartesian2"), new ADQLOperand[]{new NumericConstant(1.2),new NegativeOperand(new NumericConstant(2.3)),new NumericConstant(5),new NumericConstant(4.6),new NegativeOperand(new NumericConstant(.89)),new NumericConstant(1)})); assertEquals(RegionType.POLYGON, r.type); assertEquals("CARTESIAN2", r.coordSys.toSTCS()); assertEquals(3, r.coordinates.length); assertEquals(2, r.coordinates[0].length); assertEquals(1.2, r.coordinates[0][0], 0); assertEquals(-2.3, r.coordinates[0][1], 0); assertEquals(5, r.coordinates[1][0], 0); assertEquals(4.6, r.coordinates[1][1], 0); assertEquals(-0.89, r.coordinates[2][0], 0); assertEquals(1, r.coordinates[2][1], 0); assertEquals(Double.NaN, r.radius, 0); assertEquals(Double.NaN, r.width, 0); assertEquals(Double.NaN, r.height, 0); assertNull(r.regions); assertEquals("POLYGON CARTESIAN2 1.2 -2.3 5.0 4.6 -0.89 1.0", r.toSTCS()); r = new Region(new RegionFunction(new StringConstant("position ICrs 1.2 -2.3"))); assertEquals(RegionType.POSITION, r.type); assertEquals("ICRS", r.coordSys.toSTCS()); assertEquals(1, r.coordinates.length); assertEquals(2, r.coordinates[0].length); assertEquals(1.2, r.coordinates[0][0], 0); assertEquals(-2.3, r.coordinates[0][1], 0); assertEquals(Double.NaN, r.radius, 0); assertEquals(Double.NaN, r.width, 0); assertEquals(Double.NaN, r.height, 0); assertNull(r.regions); assertEquals("POSITION ICRS 1.2 -2.3", r.toSTCS()); r = new Region(new RegionFunction(new StringConstant("Union ICRS (Polygon 1 4 2 4 2 5 1 5 Polygon 3 4 4 4 4 5 3 5)"))); assertEquals(RegionType.UNION, r.type); assertEquals("ICRS", r.coordSys.toSTCS()); assertNull(r.coordinates); assertEquals(Double.NaN, r.radius, 0); assertEquals(Double.NaN, r.width, 0); assertEquals(Double.NaN, r.height, 0); assertEquals(2, r.regions.length); assertEquals("UNION ICRS (POLYGON 1.0 4.0 2.0 4.0 2.0 5.0 1.0 5.0 POLYGON 3.0 4.0 4.0 4.0 4.0 5.0 3.0 5.0)", r.toString()); // inner region 1 Region innerR = r.regions[0]; assertEquals(RegionType.POLYGON, innerR.type); assertEquals("", innerR.coordSys.toSTCS()); assertEquals(4, innerR.coordinates.length); assertEquals(2, innerR.coordinates[0].length); assertEquals(1, innerR.coordinates[0][0], 0); assertEquals(4, innerR.coordinates[0][1], 0); assertEquals(2, innerR.coordinates[1][0], 0); assertEquals(4, innerR.coordinates[1][1], 0); assertEquals(2, innerR.coordinates[2][0], 0); assertEquals(5, innerR.coordinates[2][1], 0); assertEquals(1, innerR.coordinates[3][0], 0); assertEquals(5, innerR.coordinates[3][1], 0); assertEquals(Double.NaN, innerR.radius, 0); assertEquals(Double.NaN, innerR.width, 0); assertEquals(Double.NaN, innerR.height, 0); assertNull(innerR.regions); assertEquals("POLYGON 1.0 4.0 2.0 4.0 2.0 5.0 1.0 5.0", innerR.toSTCS()); // inner region 2 innerR = r.regions[1]; assertEquals(RegionType.POLYGON, innerR.type); assertEquals("", innerR.coordSys.toSTCS()); assertEquals(4, innerR.coordinates.length); assertEquals(2, innerR.coordinates[0].length); assertEquals(3, innerR.coordinates[0][0], 0); assertEquals(4, innerR.coordinates[0][1], 0); assertEquals(4, innerR.coordinates[1][0], 0); assertEquals(4, innerR.coordinates[1][1], 0); assertEquals(4, innerR.coordinates[2][0], 0); assertEquals(5, innerR.coordinates[2][1], 0); assertEquals(3, innerR.coordinates[3][0], 0); assertEquals(5, innerR.coordinates[3][1], 0); assertEquals(Double.NaN, innerR.radius, 0); assertEquals(Double.NaN, innerR.width, 0); assertEquals(Double.NaN, innerR.height, 0); assertNull(innerR.regions); assertEquals("POLYGON 3.0 4.0 4.0 4.0 4.0 5.0 3.0 5.0", innerR.toSTCS()); r = new Region(new RegionFunction(new StringConstant("NOT(CIRCLE ICRS 1.2 -2.3 5)"))); assertEquals(RegionType.NOT, r.type); assertNull(r.coordSys); assertNull(r.coordinates); assertEquals(Double.NaN, r.radius, 0); assertEquals(Double.NaN, r.width, 0); assertEquals(Double.NaN, r.height, 0); assertEquals(1, r.regions.length); assertEquals("NOT(CIRCLE ICRS 1.2 -2.3 5.0)", r.toSTCS()); // inner region innerR = r.regions[0]; assertEquals(RegionType.CIRCLE, innerR.type); assertEquals("ICRS", innerR.coordSys.toSTCS()); assertEquals(1, innerR.coordinates.length); assertEquals(2, innerR.coordinates[0].length); assertEquals(1.2, innerR.coordinates[0][0], 0); assertEquals(-2.3, innerR.coordinates[0][1], 0); assertEquals(5, innerR.radius, 0); assertEquals(Double.NaN, innerR.width, 0); assertEquals(Double.NaN, innerR.height, 0); assertNull(innerR.regions); assertEquals("CIRCLE ICRS 1.2 -2.3 5.0", innerR.toSTCS()); }catch(Exception e){ e.printStackTrace(System.err); fail(); } // Test with incorrect syntaxes: try{ new Region(new PointFunction(new StringConstant(""), new StringConstant("1.2"), new NegativeOperand(new NumericConstant(2.3)))); fail("The first coordinate is a StringConstant rather than a NumericConstant!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Can not convert into STC-S a non numeric argument (including ADQLColumn and Operation)!", e.getMessage()); } try{ new Region(new PointFunction(new NumericConstant(.65), new NumericConstant(1.2), new NegativeOperand(new NumericConstant(2.3)))); fail("The coordinate system is a NumericConstant rather than a StringConstant!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("A coordinate system must be a string literal: \"0.65\" is not a string operand!", e.getMessage()); } try{ new Region(new PointFunction(new StringConstant(""), null, new NegativeOperand(new NumericConstant(2.3)))); fail("The first coordinate is missing!"); }catch(Exception e){ assertTrue(e instanceof NullPointerException); assertEquals("The POINT function must have non-null coordinates!", e.getMessage()); } try{ new Region(new RegionFunction(new StringConstant(""))); fail("Missing STC-S expression!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Missing STC-S expression to parse!", e.getMessage()); } try{ new Region(new RegionFunction(new StringConstant("MyRegion HERE 1.2"))); fail("Totally incorrect region type!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Unknown STC region type: \"MYREGION\"!", e.getMessage()); } try{ new Region(new RegionFunction((new ADQLParser(new StringBufferInputStream("'POSITION ' || coordinateSys || ' ' || ra || ' ' || dec"))).StringExpression())); fail("String concatenation can not be managed!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Can not convert into STC-S a non string argument (including ADQLColumn and Concatenation)!", e.getMessage()); } try{ new Region(new PointFunction(new ADQLColumn("coordSys"), new NumericConstant(1), new NumericConstant(2))); fail("Columns can not be managed!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Can not convert into STC-S a non string argument (including ADQLColumn and Concatenation)!", e.getMessage()); } try{ new Region(new PointFunction(new StringConstant("ICRS"), new Operation(new NumericConstant(2), OperationType.MULT, new NumericConstant(5)), new NumericConstant(2))); fail("Operations can not be managed!"); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Can not convert into STC-S a non numeric argument (including ADQLColumn and Operation)!", e.getMessage()); } } @Test public void parseCoordSys(){ // GOOD SYNTAXES: try{ CoordSys p; // Default coordinate system (should be then interpreted as local coordinate system): for(String s : new String[]{null,""," "}){ p = STCS.parseCoordSys(s); assertEquals(Frame.UNKNOWNFRAME, p.frame); assertEquals(RefPos.UNKNOWNREFPOS, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertTrue(p.isDefault()); } // Just a frame: p = STCS.parseCoordSys("ICRS"); assertEquals(Frame.ICRS, p.frame); assertEquals(RefPos.UNKNOWNREFPOS, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); // Just a reference position: p = STCS.parseCoordSys("LSR"); assertEquals(Frame.UNKNOWNFRAME, p.frame); assertEquals(RefPos.LSR, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); // Just a flavor: p = STCS.parseCoordSys("CARTESIAN2"); assertEquals(Frame.UNKNOWNFRAME, p.frame); assertEquals(RefPos.UNKNOWNREFPOS, p.refpos); assertEquals(Flavor.CARTESIAN2, p.flavor); assertFalse(p.isDefault()); // Frame + RefPos: p = STCS.parseCoordSys("ICRS LSR"); assertEquals(Frame.ICRS, p.frame); assertEquals(RefPos.LSR, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); // Frame + Flavor: p = STCS.parseCoordSys("ICRS SPHERICAL2"); assertEquals(Frame.ICRS, p.frame); assertEquals(RefPos.UNKNOWNREFPOS, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); // RefPos + Flavor: p = STCS.parseCoordSys("HELIOCENTER SPHERICAL2"); assertEquals(Frame.UNKNOWNFRAME, p.frame); assertEquals(RefPos.HELIOCENTER, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); // Frame + RefPos + Flavor p = STCS.parseCoordSys("ICRS GEOCENTER SPHERICAL2"); assertEquals(Frame.ICRS, p.frame); assertEquals(RefPos.GEOCENTER, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); // Lets try in a different case: p = STCS.parseCoordSys("icrs Geocenter SpheriCAL2"); assertEquals(Frame.ICRS, p.frame); assertEquals(RefPos.GEOCENTER, p.refpos); assertEquals(Flavor.SPHERICAL2, p.flavor); assertFalse(p.isDefault()); }catch(Exception e){ e.printStackTrace(System.err); fail(); } // WRONG SYNTAXES: try{ STCS.parseCoordSys("HOME"); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Incorrect syntax: \"HOME\" was unexpected! Expected syntax: \"[(ECLIPTIC|FK4|FK5|J2000|GALACTIC|ICRS|UNKNOWNFRAME)] [(BARYCENTER|GEOCENTER|HELIOCENTER|LSR|TOPOCENTER|RELOCATABLE|UNKNOWNREFPOS)] [(CARTESIAN2|CARTESIAN3|SPHERICAL2)]\" ; an empty string is also allowed and will be interpreted as the coordinate system locally used.", e.getMessage()); } // With wrong reference position: try{ STCS.parseCoordSys("ICRS HOME SPHERICAL2"); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Incorrect syntax: \"HOME SPHERICAL2\" was unexpected! Expected syntax: \"[(ECLIPTIC|FK4|FK5|J2000|GALACTIC|ICRS|UNKNOWNFRAME)] [(BARYCENTER|GEOCENTER|HELIOCENTER|LSR|TOPOCENTER|RELOCATABLE|UNKNOWNREFPOS)] [(CARTESIAN2|CARTESIAN3|SPHERICAL2)]\" ; an empty string is also allowed and will be interpreted as the coordinate system locally used.", e.getMessage()); } // With a cartesian flavor: try{ STCS.parseCoordSys("ICRS CARTESIAN2"); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("a coordinate system expressed with a cartesian flavor MUST have an UNKNOWNFRAME and UNKNOWNREFPOS!", e.getMessage()); } try{ STCS.parseCoordSys("LSR CARTESIAN3"); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("a coordinate system expressed with a cartesian flavor MUST have an UNKNOWNFRAME and UNKNOWNREFPOS!", e.getMessage()); } try{ CoordSys p = STCS.parseCoordSys("CARTESIAN2"); assertEquals(Frame.UNKNOWNFRAME, p.frame); assertEquals(RefPos.UNKNOWNREFPOS, p.refpos); assertEquals(Flavor.CARTESIAN2, p.flavor); p = STCS.parseCoordSys("CARTESIAN3"); assertEquals(Frame.UNKNOWNFRAME, p.frame); assertEquals(RefPos.UNKNOWNREFPOS, p.refpos); assertEquals(Flavor.CARTESIAN3, p.flavor); }catch(Exception e){ e.printStackTrace(System.err); fail(); } // Without spaces: try{ STCS.parseCoordSys("icrsGeocentercarteSIAN2"); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Incorrect syntax: \"icrsGeocentercarteSIAN2\" was unexpected! Expected syntax: \"[(ECLIPTIC|FK4|FK5|J2000|GALACTIC|ICRS|UNKNOWNFRAME)] [(BARYCENTER|GEOCENTER|HELIOCENTER|LSR|TOPOCENTER|RELOCATABLE|UNKNOWNREFPOS)] [(CARTESIAN2|CARTESIAN3|SPHERICAL2)]\" ; an empty string is also allowed and will be interpreted as the coordinate system locally used.", e.getMessage()); } } @Test public void serializeCoordSys(){ try{ assertEquals("", STCS.toSTCS((CoordSys)null)); assertEquals("", STCS.toSTCS(new CoordSys())); assertEquals("", STCS.toSTCS(new CoordSys(null, null, null))); assertEquals("", STCS.toSTCS(new CoordSys(Frame.DEFAULT, RefPos.DEFAULT, Flavor.DEFAULT))); assertEquals("", STCS.toSTCS(new CoordSys(Frame.UNKNOWNFRAME, RefPos.UNKNOWNREFPOS, Flavor.SPHERICAL2))); assertEquals("", STCS.toSTCS(new CoordSys(null))); assertEquals("", STCS.toSTCS(new CoordSys(""))); assertEquals("", STCS.toSTCS(new CoordSys(" \n\r"))); assertEquals("ICRS", STCS.toSTCS(new CoordSys(Frame.ICRS, null, null))); assertEquals("ICRS", STCS.toSTCS(new CoordSys(Frame.ICRS, RefPos.DEFAULT, Flavor.DEFAULT))); assertEquals("ICRS", STCS.toSTCS(new CoordSys(Frame.ICRS, RefPos.UNKNOWNREFPOS, Flavor.SPHERICAL2))); assertEquals("GEOCENTER", STCS.toSTCS(new CoordSys(null, RefPos.GEOCENTER, null))); assertEquals("GEOCENTER", STCS.toSTCS(new CoordSys(Frame.DEFAULT, RefPos.GEOCENTER, Flavor.DEFAULT))); assertEquals("GEOCENTER", STCS.toSTCS(new CoordSys(Frame.UNKNOWNFRAME, RefPos.GEOCENTER, Flavor.SPHERICAL2))); assertEquals("CARTESIAN3", STCS.toSTCS(new CoordSys(null, null, Flavor.CARTESIAN3))); assertEquals("CARTESIAN3", STCS.toSTCS(new CoordSys(Frame.DEFAULT, RefPos.UNKNOWNREFPOS, Flavor.CARTESIAN3))); assertEquals("CARTESIAN3", STCS.toSTCS(new CoordSys(Frame.UNKNOWNFRAME, RefPos.UNKNOWNREFPOS, Flavor.CARTESIAN3))); assertEquals("ICRS GEOCENTER", STCS.toSTCS(new CoordSys(Frame.ICRS, RefPos.GEOCENTER, null))); assertEquals("ICRS GEOCENTER", STCS.toSTCS(new CoordSys(Frame.ICRS, RefPos.GEOCENTER, Flavor.DEFAULT))); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS SPHERICAL2", new CoordSys().toFullSTCS()); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS SPHERICAL2", new CoordSys("").toFullSTCS()); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS SPHERICAL2", new CoordSys(null).toFullSTCS()); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS SPHERICAL2", new CoordSys(" \n\t").toFullSTCS()); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS SPHERICAL2", new CoordSys(null, null, null).toFullSTCS()); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS SPHERICAL2", new CoordSys(Frame.DEFAULT, RefPos.DEFAULT, Flavor.DEFAULT).toFullSTCS()); assertEquals("ICRS UNKNOWNREFPOS SPHERICAL2", new CoordSys(Frame.ICRS, null, null).toFullSTCS()); assertEquals("ICRS UNKNOWNREFPOS SPHERICAL2", new CoordSys(Frame.ICRS, RefPos.DEFAULT, Flavor.DEFAULT).toFullSTCS()); assertEquals("UNKNOWNFRAME GEOCENTER SPHERICAL2", new CoordSys(Frame.UNKNOWNFRAME, RefPos.GEOCENTER, Flavor.DEFAULT).toFullSTCS()); assertEquals("UNKNOWNFRAME UNKNOWNREFPOS CARTESIAN3", new CoordSys(Frame.DEFAULT, RefPos.DEFAULT, Flavor.CARTESIAN3).toFullSTCS()); assertEquals("ICRS GEOCENTER SPHERICAL2", new CoordSys(Frame.ICRS, RefPos.GEOCENTER, Flavor.DEFAULT).toFullSTCS()); }catch(ParseException pe){ pe.printStackTrace(System.err); fail(); } } @Test public void parseRegion(){ // TESTS WITH NO STC-S: try{ STCS.parseRegion(null); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Missing STC-S expression to parse!", e.getMessage()); } try{ STCS.parseRegion(""); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Missing STC-S expression to parse!", e.getMessage()); } try{ STCS.parseRegion(" \n\r"); fail(); }catch(Exception e){ assertTrue(e instanceof ParseException); assertEquals("Missing STC-S expression to parse!", e.getMessage()); } // TESTS WITH A VALID EXPRESSION, EACH OF A DIFFERENT REGION TYPE: String[] expressions = new String[]{" Position GALACTIC 10 20","Circle ICRS GEOCENTER 10 20 0.5 ","BOX cartesian2 3 3 2 2","Polygon 1 4 2 4 2 5 1 5","Union ICRS (Polygon 1 4 2 4 2 5 1 5 Polygon 3 4 4 4 4 5 3 5)","INTERSECTION ICRS (Polygon 1 4 2 4 2 5 1 5 Polygon 3 4 4 4 4 5 3 5)","NOT(Circle ICRS GEOCENTER 10 20 0.5)"}; try{ for(String e : expressions) STCS.parseRegion(e); }catch(Exception ex){ ex.printStackTrace(System.err); fail(); } // TEST WITH A MISSING PARAMETER: expressions = new String[]{" Position GALACTIC 10 ","BOX cartesian2 3 3 2","NOT()"}; for(String e : expressions){ try{ STCS.parseRegion(e); fail(); }catch(Exception ex){ assertTrue(ex instanceof ParseException); assertTrue(ex.getMessage().startsWith("Unexpected End Of Expression! Expected syntax: \"")); } } // TEST WITH A WRONG COORDINATE SYSTEM (since it is optional in all these expressions, it will be considered as a coordinate...which is of course, not the case): try{ STCS.parseRegion("Circle HERE 10 20 0.5 "); fail(); }catch(Exception ex){ assertTrue(ex instanceof ParseException); assertTrue(ex.getMessage().startsWith("Incorrect syntax: a coordinates pair (2 numerics separated by one or more spaces) was expected! Expected syntax: \"CIRCLE <coordSys> <coordPair> <radius>\", where coordPair=\"<numeric> <numeric>\", radius=\"<numeric>\" and coordSys=\"[(ECLIPTIC|FK4|FK5|J2000|GALACTIC|ICRS|UNKNOWNFRAME)] [(BARYCENTER|GEOCENTER|HELIOCENTER|LSR|TOPOCENTER|RELOCATABLE|UNKNOWNREFPOS)] [(CARTESIAN2|CARTESIAN3|SPHERICAL2)]\" ; an empty string is also allowed and will be interpreted as the coordinate system locally used.")); } // TEST WITH EITHER A WRONG NUMERIC (L in lower case instead of 1) OR A MISSING OPENING PARENTHESIS: expressions = new String[]{"Polygon 1 4 2 4 2 5 l 5","Union ICRS Polygon 1 4 2 4 2 5 1 5 Polygon 3 4 4 4 4 5 3 5)"}; for(String e : expressions){ try{ STCS.parseRegion(e); fail(); }catch(Exception ex){ assertTrue(ex instanceof ParseException); assertTrue(ex.getMessage().startsWith("Incorrect syntax: ")); } } } }