JStylerObjTest.java

package net.minidev.json;

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

import java.io.StringWriter;
import org.junit.jupiter.api.Test;

public class JStylerObjTest {

  @Test
  public void testIsSpace() {
    assertTrue(JStylerObj.isSpace(' '));
    assertTrue(JStylerObj.isSpace('\t'));
    assertTrue(JStylerObj.isSpace('\n'));
    assertTrue(JStylerObj.isSpace('\r'));

    assertFalse(JStylerObj.isSpace('a'));
    assertFalse(JStylerObj.isSpace('1'));
    assertFalse(JStylerObj.isSpace(':'));
  }

  @Test
  public void testIsSpecialChar() {
    assertTrue(JStylerObj.isSpecialChar('\b'));
    assertTrue(JStylerObj.isSpecialChar('\f'));
    assertTrue(JStylerObj.isSpecialChar('\n'));

    assertFalse(JStylerObj.isSpecialChar('a'));
    assertFalse(JStylerObj.isSpecialChar('\t'));
    assertFalse(JStylerObj.isSpecialChar('\r'));
  }

  @Test
  public void testIsSpecialOpen() {
    assertTrue(JStylerObj.isSpecialOpen('{'));
    assertTrue(JStylerObj.isSpecialOpen('['));
    assertTrue(JStylerObj.isSpecialOpen(','));
    assertTrue(JStylerObj.isSpecialOpen(':'));

    assertFalse(JStylerObj.isSpecialOpen('}'));
    assertFalse(JStylerObj.isSpecialOpen(']'));
    assertFalse(JStylerObj.isSpecialOpen('a'));
  }

  @Test
  public void testIsSpecialClose() {
    assertTrue(JStylerObj.isSpecialClose('}'));
    assertTrue(JStylerObj.isSpecialClose(']'));
    assertTrue(JStylerObj.isSpecialClose(','));
    assertTrue(JStylerObj.isSpecialClose(':'));

    assertFalse(JStylerObj.isSpecialClose('{'));
    assertFalse(JStylerObj.isSpecialClose('['));
    assertFalse(JStylerObj.isSpecialClose('a'));
  }

  @Test
  public void testIsSpecial() {
    assertTrue(JStylerObj.isSpecial('{'));
    assertTrue(JStylerObj.isSpecial('['));
    assertTrue(JStylerObj.isSpecial('}'));
    assertTrue(JStylerObj.isSpecial(']'));
    assertTrue(JStylerObj.isSpecial(','));
    assertTrue(JStylerObj.isSpecial(':'));
    assertTrue(JStylerObj.isSpecial('\''));
    assertTrue(JStylerObj.isSpecial('"'));

    assertFalse(JStylerObj.isSpecial('a'));
    assertFalse(JStylerObj.isSpecial('1'));
    assertFalse(JStylerObj.isSpecial(' '));
  }

  @Test
  public void testIsUnicode() {
    assertTrue(JStylerObj.isUnicode('\u0000'));
    assertTrue(JStylerObj.isUnicode('\u001F'));
    assertTrue(JStylerObj.isUnicode('\u007F'));
    assertTrue(JStylerObj.isUnicode('\u009F'));
    assertTrue(JStylerObj.isUnicode('\u2000'));
    assertTrue(JStylerObj.isUnicode('\u20FF'));

    assertFalse(JStylerObj.isUnicode('a'));
    assertFalse(JStylerObj.isUnicode('Z'));
    assertFalse(JStylerObj.isUnicode('1'));
    assertFalse(JStylerObj.isUnicode(' '));
  }

  @Test
  public void testIsKeyword() {
    assertTrue(JStylerObj.isKeyword("null"));
    assertTrue(JStylerObj.isKeyword("true"));
    assertTrue(JStylerObj.isKeyword("false"));
    assertTrue(JStylerObj.isKeyword("NaN"));

    assertFalse(JStylerObj.isKeyword("NULL"));
    assertFalse(JStylerObj.isKeyword("TRUE"));
    assertFalse(JStylerObj.isKeyword("FALSE"));
    assertFalse(JStylerObj.isKeyword("hello"));
    assertFalse(JStylerObj.isKeyword("a"));
    assertFalse(JStylerObj.isKeyword("ab"));
    assertFalse(JStylerObj.isKeyword(""));
  }

  @Test
  public void testMPSimpleMustBeProtect() {
    JStylerObj.MustProtect mp = JStylerObj.MP_SIMPLE;

    assertFalse(mp.mustBeProtect(null));

    assertTrue(mp.mustBeProtect(""));
    assertTrue(mp.mustBeProtect(" text"));
    assertTrue(mp.mustBeProtect("text "));
    assertTrue(mp.mustBeProtect(" text "));

    assertTrue(mp.mustBeProtect("123"));
    assertTrue(mp.mustBeProtect("-456"));
    assertTrue(mp.mustBeProtect("0"));

    assertTrue(mp.mustBeProtect("null"));
    assertTrue(mp.mustBeProtect("true"));
    assertTrue(mp.mustBeProtect("false"));
    assertTrue(mp.mustBeProtect("NaN"));

    assertTrue(mp.mustBeProtect("text{"));
    assertTrue(mp.mustBeProtect("text["));
    assertTrue(mp.mustBeProtect("text\""));
    assertTrue(mp.mustBeProtect("text'"));

    assertTrue(mp.mustBeProtect("text\n"));
    assertTrue(mp.mustBeProtect("text\t"));
    assertTrue(mp.mustBeProtect("text "));

    assertTrue(mp.mustBeProtect("text\u0001"));

    assertFalse(mp.mustBeProtect("hello"));
    assertFalse(mp.mustBeProtect("world"));
    assertFalse(mp.mustBeProtect("test"));
    assertFalse(mp.mustBeProtect("a"));
  }

  @Test
  public void testMPTrueMustBeProtect() {
    JStylerObj.MustProtect mp = JStylerObj.MP_TRUE;

    assertTrue(mp.mustBeProtect("anything"));
    assertTrue(mp.mustBeProtect(""));
    assertTrue(mp.mustBeProtect("hello"));
    assertTrue(mp.mustBeProtect("123"));
    assertTrue(mp.mustBeProtect(null));
  }

  @Test
  public void testMPAggressiveMustBeProtect() {
    JStylerObj.MustProtect mp = JStylerObj.MP_AGGRESIVE;

    assertFalse(mp.mustBeProtect(null));

    assertTrue(mp.mustBeProtect(""));
    assertTrue(mp.mustBeProtect(" text"));
    assertTrue(mp.mustBeProtect("text "));

    assertTrue(mp.mustBeProtect("null"));
    assertTrue(mp.mustBeProtect("true"));
    assertTrue(mp.mustBeProtect("false"));
    assertTrue(mp.mustBeProtect("NaN"));

    assertTrue(mp.mustBeProtect("123"));
    assertTrue(mp.mustBeProtect("-456"));
    assertTrue(mp.mustBeProtect("3.14"));
    assertTrue(mp.mustBeProtect("1.23e5"));
    assertTrue(mp.mustBeProtect("1.23E-5"));
    assertTrue(mp.mustBeProtect("1.23e+5"));

    assertTrue(mp.mustBeProtect("{text"));
    assertTrue(mp.mustBeProtect("text}"));
    assertTrue(mp.mustBeProtect("text,"));

    assertTrue(mp.mustBeProtect("text\u0001"));

    assertFalse(mp.mustBeProtect("hello"));
    assertFalse(mp.mustBeProtect("world"));
    assertFalse(mp.mustBeProtect("a"));
    assertFalse(mp.mustBeProtect("abc123def"));
  }

  @Test
  public void testMPAggressiveNumberLike() {
    JStylerObj.MustProtect mp = JStylerObj.MP_AGGRESIVE;

    assertTrue(mp.mustBeProtect("0"));
    assertTrue(mp.mustBeProtect("123"));
    assertTrue(mp.mustBeProtect("-456"));
    assertTrue(mp.mustBeProtect("3.14"));
    assertTrue(mp.mustBeProtect("1e5"));
    assertTrue(mp.mustBeProtect("1E5"));
    assertTrue(mp.mustBeProtect("1e+5"));
    assertTrue(mp.mustBeProtect("1e-5"));
    assertTrue(mp.mustBeProtect("1.23e5"));
    assertTrue(mp.mustBeProtect("1.23E-5"));

    assertFalse(mp.mustBeProtect("1e"));
    assertFalse(mp.mustBeProtect("1E"));
    assertFalse(mp.mustBeProtect("123abc"));
    assertFalse(mp.mustBeProtect("12.34.56"));
  }

  @Test
  public void testEscapeLTStringProtector() {
    JStylerObj.StringProtector protector = JStylerObj.ESCAPE_LT;
    StringWriter writer = new StringWriter();

    protector.escape("hello\"world", writer);
    assertTrue(writer.toString().contains("hello\\\"world"));

    writer = new StringWriter();
    protector.escape("line1\nline2", writer);
    assertTrue(writer.toString().contains("line1\\nline2"));

    writer = new StringWriter();
    protector.escape("tab\there", writer);
    assertTrue(writer.toString().contains("tab\\there"));

    writer = new StringWriter();
    protector.escape("back\\slash", writer);
    assertTrue(writer.toString().contains("back\\\\slash"));

    writer = new StringWriter();
    protector.escape("backspace\b", writer);
    assertTrue(writer.toString().contains("backspace\\b"));

    writer = new StringWriter();
    protector.escape("formfeed\f", writer);
    assertTrue(writer.toString().contains("formfeed\\f"));

    writer = new StringWriter();
    protector.escape("carriage\rreturn", writer);
    assertTrue(writer.toString().contains("carriage\\rreturn"));

    writer = new StringWriter();
    protector.escape("unicode\u0001char", writer);
    assertTrue(writer.toString().contains("unicode\\u0001char"));
  }

  @Test
  public void testEscape4WebStringProtector() {
    JStylerObj.StringProtector protector = JStylerObj.ESCAPE4Web;
    StringWriter writer = new StringWriter();

    protector.escape("hello/world", writer);
    assertTrue(writer.toString().contains("hello\\/world"));

    writer = new StringWriter();
    protector.escape("hello\"world", writer);
    assertTrue(writer.toString().contains("hello\\\"world"));

    writer = new StringWriter();
    protector.escape("line1\nline2", writer);
    assertTrue(writer.toString().contains("line1\\nline2"));

    writer = new StringWriter();
    protector.escape("unicode\u0001char", writer);
    assertTrue(writer.toString().contains("unicode\\u0001char"));
  }

  @Test
  public void testEscapeUnicodeCharacters() {
    JStylerObj.StringProtector protector = JStylerObj.ESCAPE_LT;
    StringWriter writer = new StringWriter();

    protector.escape("\u0000\u001F\u007F\u009F", writer);
    String result = writer.toString();
    assertTrue(result.contains("\\u0000"));
    assertTrue(result.contains("\\u001F"));
    assertTrue(result.contains("\\u007F"));
    assertTrue(result.contains("\\u009F"));
  }

  @Test
  public void testEscapeUnicodeRange2000() {
    JStylerObj.StringProtector protector = JStylerObj.ESCAPE_LT;
    StringWriter writer = new StringWriter();

    protector.escape("\u2000\u20FF", writer);
    String result = writer.toString();
    assertTrue(result.contains("\\u2000"));
    assertTrue(result.contains("\\u20FF"));
  }

  @Test
  public void testEscapeNormalCharacters() {
    JStylerObj.StringProtector protector = JStylerObj.ESCAPE_LT;
    StringWriter writer = new StringWriter();

    protector.escape("Hello World 123!", writer);
    String result = writer.toString();
    assertTrue(result.equals("Hello World 123!"));
  }

  @Test
  public void testMPSimpleDigitStarting() {
    JStylerObj.MustProtect mp = JStylerObj.MP_SIMPLE;

    assertTrue(mp.mustBeProtect("0abc"));
    assertTrue(mp.mustBeProtect("1test"));
    assertTrue(mp.mustBeProtect("9xyz"));
    assertTrue(mp.mustBeProtect("-5abc"));

    assertFalse(mp.mustBeProtect("a123"));
    assertFalse(mp.mustBeProtect("test"));
  }

  @Test
  public void testConstants() {
    assertTrue(JStylerObj.MP_SIMPLE instanceof JStylerObj.MustProtect);
    assertTrue(JStylerObj.MP_TRUE instanceof JStylerObj.MustProtect);
    assertTrue(JStylerObj.MP_AGGRESIVE instanceof JStylerObj.MustProtect);
    assertTrue(JStylerObj.ESCAPE_LT instanceof JStylerObj.StringProtector);
    assertTrue(JStylerObj.ESCAPE4Web instanceof JStylerObj.StringProtector);
  }
}