From 97a99e411d640fb6edb02dd9a8d0bc99d91b3e16 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gr=C3=A9gory=20Mantelet?=
 <gregory.mantelet@astro.unistra.fr>
Date: Tue, 30 Jul 2019 11:36:04 +0200
Subject: [PATCH] [ADQL] `FeatureSet.unsupportAll()` must un-support all
 supported features instead of ONLY those listed in `availableFeatures`.

---
 src/adql/parser/feature/FeatureSet.java      | 16 ++++++++--------
 test/adql/parser/feature/TestFeatureSet.java | 14 ++++++++++----
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/adql/parser/feature/FeatureSet.java b/src/adql/parser/feature/FeatureSet.java
index e857e2d..9310c89 100644
--- a/src/adql/parser/feature/FeatureSet.java
+++ b/src/adql/parser/feature/FeatureSet.java
@@ -427,8 +427,8 @@ public class FeatureSet implements Iterable<LanguageFeature> {
 	 * @see #getAvailableFeatures()
 	 */
 	public final void unsupportAll() {
-		// unsupport all available features:
-		for(LanguageFeature feature : availableFeatures)
+		// unsupport all features currently supported:
+		for(LanguageFeature feature : this)
 			unsupport(feature);
 
 		// also unsupport any UDF:
@@ -557,22 +557,22 @@ public class FeatureSet implements Iterable<LanguageFeature> {
 	   ********************************************************************** */
 
 	/*public static final LanguageFeature ILIKE = new LanguageFeature(FeatureType.ADQL_STRING, "ILIKE"); // TODO ILIKE
-	
+
 	public static final LanguageFeature UNION = new LanguageFeature(FeatureType.ADQL_SETS, "UNION"); // TODO UNION
 	public static final LanguageFeature EXCEPT = new LanguageFeature(FeatureType.ADQL_SETS, "EXCEPT"); // TODO EXCEPT
 	public static final LanguageFeature INTERSECT = new LanguageFeature(FeatureType.ADQL_SETS, "INTERSECT");  // TODO INTERSECT
-	
+
 	public static final LanguageFeature WITH = new LanguageFeature(FeatureType.ADQL_COMMON_TABLE, "WITH");  // TODO WITH
-	
+
 	public static final LanguageFeature CAST = new LanguageFeature(FeatureType.ADQL_TYPE, "CAST");  // TODO CAST
-	
+
 	public static final LanguageFeature IN_UNIT = new LanguageFeature(FeatureType.ADQL_UNIT, "IN_UNIT");  // TODO IN_UNIT
-	
+
 	public static final LanguageFeature BIT_AND = new LanguageFeature(FeatureType.ADQL_BITWISE, "BIT_AND");  // TODO BIT_AND
 	public static final LanguageFeature BIT_OR = new LanguageFeature(FeatureType.ADQL_BITWISE, "BIT_OR");  // TODO BIT_OR
 	public static final LanguageFeature BIT_XOR = new LanguageFeature(FeatureType.ADQL_BITWISE, "BIT_XOR");  // TODO BIT_XOR
 	public static final LanguageFeature BIT_NOT = new LanguageFeature(FeatureType.ADQL_BITWISE, "BIT_NOT");  // TODO BIT_NOT
-	
+
 	public static final LanguageFeature OFFSET = new LanguageFeature(FeatureType.ADQL_OFFSET, "OFFSET");  // TODO OFFSET*/
 
 	/** All standard features available.
diff --git a/test/adql/parser/feature/TestFeatureSet.java b/test/adql/parser/feature/TestFeatureSet.java
index 1c273f0..e58fb75 100644
--- a/test/adql/parser/feature/TestFeatureSet.java
+++ b/test/adql/parser/feature/TestFeatureSet.java
@@ -215,11 +215,17 @@ public class TestFeatureSet {
 	public void testUnsupportAll() {
 		FeatureSet set = new FeatureSet(true);
 
+		/* here is a custom Language Feature (i.e. not part of the
+		 * availableFeatures list): */
+		set.support(new LanguageFeature(LanguageFeature.TYPE_UDF, "foo(VARCHAR) -> BOOLEAN", true));
+
+		// unsupport all currently supported features:
 		set.unsupportAll();
-		for(LanguageFeature feat : FeatureSet.availableFeatures) {
-			assertNotNull(feat);
-			assertFalse(set.supportedFeatures.containsKey(feat.type));
-		}
+
+		// ensure the list of supported features is really empty:
+		assertEquals(0, set.supportedFeatures.size());
+
+		// ...and that no non-declared UDF is allowed:
 		assertFalse(set.isAnyUdfAllowed());
 	}
 
-- 
GitLab