From 17372e1a422be7bcd117b9c4fe71f47c80f2d3b7 Mon Sep 17 00:00:00 2001 From: Jamie Sanson Date: Wed, 6 May 2026 09:52:39 +0100 Subject: [PATCH 1/4] Update testFromJson test check integer parsing --- .../ab/config/parser/GsonConfigParserTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java b/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java index ec02aaad0..c048a2642 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java +++ b/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java @@ -404,19 +404,22 @@ public void testToJson() { @Test public void testFromJson() { - String json = "{\"k1\":\"v1\",\"k2\":3.5,\"k3\":true}"; + String json = "{\"k1\":\"v1\",\"k2\":3.5,\"k3\":true,\"k4\":12345}"; Map expectedMap = new HashMap<>(); expectedMap.put("k1", "v1"); expectedMap.put("k2", 3.5); expectedMap.put("k3", true); + expectedMap.put("k4", 12345L); GsonConfigParser parser = new GsonConfigParser(); - Map map = null; + Map map = null; try { map = parser.fromJson(json, Map.class); - assertEquals(map, expectedMap); + for (String key : map.keySet()) { + assertEquals(expectedMap.get(key), map.get(key)); + } } catch (JsonParseException e) { fail("Parse to map failed: " + e.getMessage()); } From 16d38ef69f48a0648e9babfe18897682f7ca9752 Mon Sep 17 00:00:00 2001 From: Jamie Sanson Date: Wed, 6 May 2026 09:53:22 +0100 Subject: [PATCH 2/4] Apply Gson's LONG_OR_DOUBLE ObjectToNumber policy --- .../java/com/optimizely/ab/config/parser/GsonConfigParser.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/GsonConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/GsonConfigParser.java index 314f2dd23..61af8e6f2 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/GsonConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/GsonConfigParser.java @@ -20,6 +20,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; import com.optimizely.ab.config.DatafileProjectConfig; import com.optimizely.ab.config.Experiment; import com.optimizely.ab.config.FeatureFlag; @@ -37,6 +38,7 @@ final public class GsonConfigParser implements ConfigParser { public GsonConfigParser() { this(new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .registerTypeAdapter(Audience.class, new AudienceGsonDeserializer()) .registerTypeAdapter(TypedAudience.class, new AudienceGsonDeserializer()) .registerTypeAdapter(Experiment.class, new ExperimentGsonDeserializer()) From 8e5ff5e94e5dedd5095894ebf26bc63b48dd374a Mon Sep 17 00:00:00 2001 From: Jamie Sanson Date: Wed, 6 May 2026 10:06:45 +0100 Subject: [PATCH 3/4] Update OptimizelyJSONWithGsonParserTest to demonstrate Long parsing --- .../OptimizelyJSONWithGsonParserTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java b/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java index ebbed4bf5..ab1c9019e 100644 --- a/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java +++ b/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java @@ -50,21 +50,24 @@ public void testGetValueWithNotMatchingType() throws JsonParseException { @Test public void testIntegerProcessing() throws JsonParseException { - // GSON parser toMap() adds ".0" to all integers + // GSON parser toMap() converts integers to longs String json = "{\"k1\":1,\"k2\":2.5,\"k3\":{\"kk1\":3,\"kk2\":4.0}}"; Map m2 = new HashMap(); - m2.put("kk1", 3.0); + m2.put("kk1", 3L); m2.put("kk2", 4.0); Map m1 = new HashMap(); - m1.put("k1", 1.0); + m1.put("k1", 1L); m1.put("k2", 2.5); m1.put("k3", m2); OptimizelyJSON oj1 = new OptimizelyJSON(json, getParser()); - assertEquals(oj1.toMap(), m1); + Map ojMap = oj1.toMap(); + for (String key : m1.keySet()) { + assertEquals(m1.get(key), ojMap.get(key)); + } } @Test From 1062edf32d6340f97c277cf60134a5ce1a96d00a Mon Sep 17 00:00:00 2001 From: Jamie Sanson Date: Wed, 6 May 2026 10:26:33 +0100 Subject: [PATCH 4/4] Remove element-wise comparison in tests --- .../optimizely/ab/config/parser/GsonConfigParserTest.java | 4 +--- .../ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java | 5 +---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java b/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java index c048a2642..5e1dca11c 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java +++ b/core-api/src/test/java/com/optimizely/ab/config/parser/GsonConfigParserTest.java @@ -417,9 +417,7 @@ public void testFromJson() { Map map = null; try { map = parser.fromJson(json, Map.class); - for (String key : map.keySet()) { - assertEquals(expectedMap.get(key), map.get(key)); - } + assertEquals(expectedMap, map); } catch (JsonParseException e) { fail("Parse to map failed: " + e.getMessage()); } diff --git a/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java b/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java index ab1c9019e..5cc7246bc 100644 --- a/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java +++ b/core-api/src/test/java/com/optimizely/ab/optimizelyjson/OptimizelyJSONWithGsonParserTest.java @@ -64,10 +64,7 @@ public void testIntegerProcessing() throws JsonParseException { m1.put("k3", m2); OptimizelyJSON oj1 = new OptimizelyJSON(json, getParser()); - Map ojMap = oj1.toMap(); - for (String key : m1.keySet()) { - assertEquals(m1.get(key), ojMap.get(key)); - } + assertEquals(oj1.toMap(), m1); } @Test