TestInvalidNumber.java

package net.minidev.json.test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;

import net.minidev.json.JSONObject;
import net.minidev.json.JSONStyle;
import net.minidev.json.JSONValue;
import org.junit.jupiter.api.Test;

/**
 * test invalid number that will be handle ad string
 *
 * @author uriel
 */
public class TestInvalidNumber {

  private void validFloatAsFloat(String test) {
    JSONObject o = new JSONObject();
    o.put("a", test);
    String comp = JSONValue.toJSONString(o, JSONStyle.MAX_COMPRESS);
    assertEquals("{a:\"" + test + "\"}", comp);
    o = JSONValue.parse(comp, JSONObject.class);
    Object convertedValue = o.get("a");
    assertEquals(convertedValue, test, "Should handle valid number '" + test + "' as number");
  }

  private void invalidFloatAsText(String test) {
    JSONObject o = new JSONObject();
    o.put("a", test);
    String comp = JSONValue.toJSONString(o, JSONStyle.MAX_COMPRESS);
    assertEquals("{a:" + test + "}", comp);
    o = JSONValue.parse(comp, JSONObject.class);
    Object convertedValue = o.get("a");
    assertEquals(convertedValue, test, "should handle invalid number '" + test + "' as string");
  }

  @Test
  public void testF1() {
    validFloatAsFloat("51e88");
  }

  @Test
  public void testF2() {
    validFloatAsFloat("51e+88");
  }

  @Test
  public void testF3() {
    validFloatAsFloat("51e-88");
  }

  @Test
  public void testF4() {
    invalidFloatAsText("51ee88");
  }

  @Test
  public void testCVE_2021_27568() {
    try {
      JSONValue.parseWithException("{a:-.}");
      assertFalse(true, "should Throws Exception before");
    } catch (Exception e) {
      assertEquals(e.getMessage(), "Unexpected token -. at position 5.", "should throw EOF");
    }

    try {
      JSONValue.parseWithException("{a:2e+}");
      assertFalse(true, "should Throws Exception before");
    } catch (Exception e) {
      assertEquals(e.getMessage(), "Unexpected token 2e+ at position 6.", "should throw EOF");
    }

    try {
      JSONValue.parseWithException("{a:[45e-}");
      assertFalse(true, "should Throws Exception before");
    } catch (Exception e) {
      assertEquals(e.getMessage(), "Unexpected End Of File position 8: EOF", "should throw EOF");
    }
  }
}